Подсчет OrderProfit.

 
Собственно задача такая - знаю цену/время открытия ордера, цену/время закрытия и т.п. - надо подсчитать то, что подсчитывает OrderProfit().
Но только без использования собственно OrderProfit().. Хотя бы даже и без учета свопов и комиссий. Хотя лучше, конечно, с ними.
Может кто уже решал задачку, чтоб не изобретать очередное двухколесное чудо?
 
// ф-ция minri, доработанная мной
/////////////////////////////////////////////////////////////////////////////////
/**/ double lotlib_LotCost ( string _Symbol )
/////////////////////////////////////////////////////////////////////////////////
{
    if ( MarketInfo ( _Symbol, MODE_BID ) <= 0 ) { return(-1.0); }
    double Cost = -1.0;
 
    string FirstPart  = StringSubstr( _Symbol, 0, 3 );
    string SecondPart = StringSubstr( _Symbol, 3, 3 );
 
    double Base = MarketInfo ( _Symbol, MODE_LOTSIZE ) * MarketInfo ( _Symbol, MODE_POINT );
    if ( SecondPart == "USD" )
    { Cost = Base; }
    else
    {
        if ( FirstPart == "USD" )
        { Cost = Base / MarketInfo ( _Symbol, MODE_BID ); }
        else
        {
            if ( MarketInfo( "USD" + SecondPart, MODE_BID ) > 0 )
            { Cost = Base / MarketInfo( "USD" + SecondPart, MODE_BID ); }
            else
            { Cost = Base * MarketInfo( SecondPart + "USD", MODE_BID ); }
        }
    }
return( NormalizeDouble(Cost, 2) );
}
Для бай-позиций:
OrderProfit() = lotlib_LotCost( OrderSymbol() ) * OrderLots() * (OrderClosePrice() - OrderOpenPrice());

Для селл-позиций:
OrderProfit() = lotlib_LotCost( OrderSymbol() ) * OrderLots() * (OrderOpenPrice()-OrderClosePrice());
 
Для подсчета свопа надо использовать MarketInfo( OrderSymbol(), MODE_SWAPLONG ) и MarketInfo( OrderSymbol(), MODE_SWAPSHORT ) и умножать его на количество "ночевок" позиции (не забывая про "тройную ночь").
 
komposter:
Для подсчета свопа надо использовать MarketInfo( OrderSymbol(), MODE_SWAPLONG ) и MarketInfo( OrderSymbol(), MODE_SWAPSHORT ) и умножать его на количество "ночевок" позиции (не забывая про "тройную ночь").
спасибо огромное, опробую!
 
в строчке
double Base = MarketInfo ( _Symbol, MODE_LOTSIZE ) * MarketInfo ( _Symbol, MODE_POINT );
не понял, зачем умножать на
MarketInfo ( _Symbol, MODE_POINT );
 
Не помню =)
Сделай тестового эксперта, который будет принтить профит по моей формуле.
Потом убери *Point и сравни =)
 
убрал. Считает правильнее :)
 
max_cpr:
убрал. Считает правильнее :)

Господа, мне для поднятой темы на 'Уровень безубытка цены для множества ордеров' нужно как база то же самое, посчитать профит позиции для любой цены. Всё-таки (пока не проверял) формула в lotlib_LotCost верна, или требует доработки?
 
chv:
Господа, мне для поднятой темы на 'Уровень безубытка цены для множества ордеров' нужно как база то же самое, посчитать профит позиции для любой цены. Всё-таки (пока не проверял) формула в lotlib_LotCost верна, или требует доработки?
Насколько я знаю, формула правильная.
А проверить сложно? ;)
 

Почему мой код считает не правильно?

double profit_1, profit_2;

void start()
  {
  double tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE);

  for(int i = OrdersTotal()-1; i >= 0;i--)
    {
    if(!OrderSelect(i,SELECT_BY_POS)) continue;
    if(OrderSymbol()!=Symbol() || OrderType() >= 2) continue;
    if(OrderType() == 0)
      {
      profit_1 += (OrderClosePrice() - OrderOpenPrice())/Point*tickvalue*OrderLots() + OrderSwap();
      profit_2 += OrderProfit()+OrderSwap();
      }
    if(OrderType() == 1)
      {
      profit_1 += (OrderOpenPrice() - OrderClosePrice())/Point*tickvalue*OrderLots() + OrderSwap();
      profit_2 += OrderProfit()+OrderSwap();
      }
    }
  
  Alert(profit_1,"   ",profit_2);
  }

//комиссий нет, пара евро-доллар?
 
fore-x:

Почему мой код считает не правильно?


Формулы у Вас странные. Может попытаетесь в одном значении считать прибыль
Причина обращения: