Как вычислить профит ордера

 

Требуется вычислить математически профит ордера при заданых условиях:

знаем цену открытия ордера, лот ордера, знаем текущую цену - нужно вычислить на основе этих данных профит или убыток у заданого ордера.

(стандартную функцию вычисления профита OrderProfit() в мт не предлагать)

 
А стандартная функция гугль - чем не подходит?
 
double Profit = OrderLots() *  MathAbs((OrderOpenPrice() - Bid)/Point);

 
Alex5757000 >>:

спасибо

 
Skymer >>:

спасибо


Ну Вы же понимаете, что это немного неправильная формула, т.к. здесь присутствует ф-ия MathAbs(), то прибыль будет только со знаком +. Иначе ее нужно убрать, и поменять местами OrderOpenPrice() и Bid() отдельно для BUY и SELL. Для BUY : Bid - OrderOpenPrice  , если не ошибаюсь..
 
Alex5757000 писал(а) >>

Еще на стоимость пункта надо умножать - double PointValue=MarketInfo(Symbol(),MODE_TICKVALUE)*(MarketInfo(Symbol(),MODE_POINT)/MarketInfo(Symbol(),MODE_TICKSIZE));

 
             switch(OrderType())                         // По типу ордера
              {
               case 0 :                         // Ордер Buy
                 double prof = OrderLots() *  ((NormalizeDouble(ObjectGet("VirtualStopLoss",OBJPROP_PRICE1),Digits) - OrderOpenPrice())/Point) * 
MarketInfo(Symbol(),MODE_TICKVALUE)*(MarketInfo(Symbol(),MODE_POINT)/MarketInfo(Symbol(),MODE_TICKSIZE));
                                         
                  break;                        // Выход из switch
               case 1 :                         // Ордер Sell
                        prof = OrderLots() *  ((NormalizeDouble(OrderOpenPrice() - ObjectGet("VirtualStopLoss",OBJPROP_PRICE1),Digits))/Point) * 
MarketInfo(Symbol(),MODE_TICKVALUE)*(MarketInfo(Symbol(),MODE_POINT)/MarketInfo(Symbol(),MODE_TICKSIZE));
                                   
                  break;                        // Выход из switch


               }
Как заставить этот код учитывать спред?
 
Integer >>:

Еще на стоимость пункта надо умножать - double PointValue=MarketInfo(Symbol(),MODE_TICKVALUE)*(MarketInfo(Symbol(),MODE_POINT)/MarketInfo(Symbol(),MODE_TICKSIZE));

а эта стоимость пункта по этой формуле рассчитается для 1 лота ?

как посчитать стоимость пункта для произвольного размера лота?

 
Skymer писал(а) >>

а эта стоимость пункта по этой формуле рассчитается для 1 лота ?

как посчитать стоимость пункта для произвольного размера лота?

Да. Для одного лота. Значит для лота 0.1 будет в 10 раз меньше - просто умножать на лот.

 
Graff писал(а) >>
Как заставить этот код учитывать спред?

Наверно надо правильные цены использовать. Бай открывается по аск, закрывается по бид, селл открывается по бид, закрывается по аск.

 
Проблема возникает когда тип ордера покупка и ObjectGet("VirtualStopLoss",OBJPROP_PRICE1) меньше цены открытия ордера(не учитывается спред.), когда ObjectGet("VirtualStopLoss",OBJPROP_PRICE1) больше цены открытия ордера - все нормально. Та же проблема с ордером на продажу