Как посчитать прибыль позиции в МТ?

 

Здравствуйте!

В который раз ищу ответ на свой вопрос и не смог найти что-нибудь рабочее

в кодобазе есть индикатор "Уровень безубытка (ProfitLine) - индикатор для MetaTrader 4"

https://www.mql5.com/ru/code/10007

попробовал использовать его, сложно сказать, но не правильно он считает одновременно открытые разнонаправленные ордера (BUY и SELL)

попробовал самостоятельно написать вот такую ф-цию:

int GetProfitPips(int magic_){
   double prBuy=0.0, prSell=0.0, koef = MathPow(10,Digits+2);                                                    //*MarketInfo(OrderSymbol(),MODE_TICKVALUE);
   int prS_ = 0,prB_ = 0;
   int k=OrdersTotal(); string sym = Symbol();
   for(int i=0; i<k; i++){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if((OrderSymbol()==sym))
               if(OrderMagicNumber()==magic_)
                  switch(OrderType()){
                                       case OP_BUY:   prBuy+= (Bid - OrderOpenPrice())*OrderLots()*koef;break;
                                       case OP_SELL: prSell+= (OrderOpenPrice() - Ask)*OrderLots()*koef;break;
               }
     }
     prB_ = int(prBuy); prS_ = int(prSell);
return(prB_+prS_);}

проверял на валютных парах - работает корректно и на 5-тизнаке и на 4-хзнаке

но коэффициент (переменная koef ) я подобрал экспериментальным путем, а в теории 

koef = MarketInfo(OrderSymbol(),MODE_TICKVALUE) /  MarketInfo(OrderSymbol(), MODE_POINT)

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

Заранее благодарен!

Уровень безубытка (ProfitLine)
Уровень безубытка (ProfitLine)
  • голосов: 32
  • 2010.11.30
  • Evgeniy Trofimov
  • www.mql5.com
- Количество прибыли, которую необходимо получить при пересечении линии безубытка. - Идентификатор открытых сделок, принимаемых для анализа. - Имя линии безубытка покупок...
 
int  pipsProfitOrder = (int)MathFloor( ( OrderProfit() + OrderSwap() + OrderCommission() ) / (SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE)*OrderLots()) )
 
Konstantin Nikitinint  pipsProfitOrder = (int)MathFloor( ( OrderProfit() + OrderSwap() + OrderCommission() ) / (SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE)*OrderLots()) )

не, не прокатит такая формула, много "костылей":

1. OrderProfit() - возвращает в валюте депозита, если счет рублевый, то и значение OrderProfit() будет плавать в зависимости от курса RUR

2. OrderSwap() - нужно проверять как считает свопы сервер, если сервер считает свопы в пп, то ваша формула будет врать и потом трудно найти почему на одном инструменте работает, а на другом нет

мой пример корректно считает прибыль в пп, но хочу найти правильное решение этой задачи - универсальное решение , к примеру,для покупок 1 лотом: "(Bid - OrderOpenPrice()) *OrderLots() " и так чтобы можно было на любом инструменте гарантированно иметь правильный результат вне зависимости от объема ордера и количества ордеров и типов ордеров (BUY/SELL) на одном инструменте

 
Igor Makanu:

не, не прокатит такая формула, много "костылей":

1. OrderProfit() - возвращает в валюте депозита, если счет рублевый, то и значение OrderProfit() будет плавать в зависимости от курса RUR

2. OrderSwap() - нужно проверять как считает свопы сервер, если сервер считает свопы в пп, то ваша формула будет врать и потом трудно найти почему на одном инструменте работает, а на другом нет

мой пример корректно считает прибыль в пп, но хочу найти правильное решение этой задачи - универсальное решение , к примеру,для покупок 1 лотом: "(Bid - OrderOpenPrice()) *OrderLots() " и так чтобы можно было на любом инструменте гарантированно иметь правильный результат вне зависимости от объема ордера и количества ордеров и типов ордеров (BUY/SELL) на одном инструменте

OrderSwap()+OrderCommision() надо суммировать в отдельную сумму (они __уже__ начислены и не имеют отношения к объёму ордера) и потом на её основе, TICK_VALUE и суммы лотов корректировать среднюю позицию. Каждый день

 
Maxim Kuznetsov:

OrderSwap()+OrderCommision() надо суммировать в отдельную сумму (они __уже__ начислены и не имеют отношения к объёму ордера) и потом на её основе, TICK_VALUE и суммы лотов корректировать среднюю позицию. Каждый день

ну дайте пример в коде Ваших мыслей, у меня реальная проблема найти правильный расчет прибыли позиции с разнонаправленными ордерами в МТ4 

как позиция считается в МТ5?  - должна же быть формула основанная на переменных окружения торгового терминала по конкретному инструменту!

 
Igor Makanu:

ну дайте пример в коде Ваших мыслей, реально проблема найти правильный расчет прибыли позиции с разнонаправленными ордерами в МТ4 

как позиция считается в МТ5?  - должна же быть формула основанная на переменных окружения торгового терминала по конкретному инструменту!

пример в коде вы сами дали прямо в исходном посте. Там ВСЁ есть. Что-же вы его не читали-то ?

https://www.mql5.com/go?link=https://www.mql5.com/ru/code/10007

Уровень безубытка (ProfitLine)
Уровень безубытка (ProfitLine)
  • голосов: 32
  • 2010.11.30
  • Evgeniy Trofimov
  • www.mql5.com
- Количество прибыли, которую необходимо получить при пересечении линии безубытка. - Идентификатор открытых сделок, принимаемых для анализа. - Имя линии безубытка покупок...
 
Maxim Kuznetsov:

пример в коде вы сами дали прямо в исходном посте. Там ВСЁ есть. Что-же вы его не читали-то ?

https://www.mql5.com/go?link=https://www.mql5.com/ru/code/10007

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

double ProfitPrice(string fSymbol, int fType, int fMagic=0, double MyProfit=0.0)

вторую версию этого индикатора не стал даже проверять, написал свою ф-цию  (в шапке топика), моя ф-ция считает корректно

но вопрос именно в принципах расчета прибыли позиции ордеров в пп используя переменные окружения терминал МТ4 

как склеить в логическую цепочку ))) значения TICK_VALUE, Point и пр