Как MetaTrader 5 считает прибыль?

 

Запускаем простой  скрипт:

//+------------------------------------------------------------------+
//|                                                       profit.mq5 |
//+------------------------------------------------------------------+
string com;
string Sy[28]={"EURGBP","EURAUD","EURNZD","EURUSD","EURCAD","EURCHF","EURJPY","GBPAUD","GBPNZD","GBPUSD",
              "GBPCAD","GBPCHF","GBPJPY","AUDNZD","AUDUSD","AUDCAD","AUDCHF","AUDJPY","NZDUSD","NZDCAD",
              "NZDCHF","NZDJPY","USDCAD","USDCHF","USDJPY","CADCHF","CADJPY","CHFJPY"};
double a[28],b[28],BuyPlus[28],BuyMinus[28],SellPlus[28],SellMinus[28];
double diff=0.001;

void OnStart()
  {com="";
   for(int i=0;i<28;i++)
      {b[i]=SymbolInfoDouble(Sy[i],SYMBOL_BID);a[i]=SymbolInfoDouble(Sy[i],SYMBOL_ASK);
       OrderCalcProfit(ORDER_TYPE_BUY,Sy[i],1.0,a[i],a[i]+diff,BuyPlus[i]);
       OrderCalcProfit(ORDER_TYPE_BUY,Sy[i],1.0,a[i],a[i]-diff,BuyMinus[i]);
       OrderCalcProfit(ORDER_TYPE_SELL,Sy[i],1.0,b[i],b[i]+diff,SellPlus[i]);
       OrderCalcProfit(ORDER_TYPE_SELL,Sy[i],1.0,b[i],b[i]-diff,SellMinus[i]);
       
       com=com+"\n"+Sy[i]+"  BuyPlus="  +DoubleToString(BuyPlus[i],4)
                         +"  BuyMinus=" +DoubleToString(BuyMinus[i],4)
                         +"  SellPlus=" +DoubleToString(SellPlus[i],4)
                         +"  SellMinus="+DoubleToString(SellMinus[i],4);
      }//for
   Comment(com);
  }//start

 Ошибка ясно забележимая...

Проблем наверно  произходит из  SYMBOL_TRADE_TICK_VALUE_PROFIT  и  SYMBOL_TRADE_TICK_VALUE_LOSS.

Надо будеть     SYMBOL_TRADE_TICK_VALUE_LONG    и   SYMBOL_TRADE_TICK_VALUE_SHORT.

Поиск показал что-то интересно:

 

Renat:

Я вчера, когда смотрел код, неверно выразился по поводу разной стоимость пункта в зависимости от направления.

Точнее сказать, что TickValue при конвертации в целевую валюту зависит от того, убыточна она или нет. То есть, если мы получили убыток в 1 пипс, то нам надо его выкупить по цене Ask, а если прибыль в 1 пипс, то продать по цене Bid.


 

 Ето неправильно, конечно. Для шорт-позиции цени наоборот....

 

Я очень надеюс, что ошибка неволная!  Поправите, пожалуйста! 

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

К сожалению, вопрос не заявлен четко и нет вывода из предложенного примера. Не понятно - что именно указано как ошибка.

Сформулируйте свой вопрос точно, приложите полученные результаты и укажите, где в них ошибка, пожалуйста.

Например, укажите, где тут ошибка:

EURGBP  BuyPlus=158.40000000  BuyMinus=-158.48000000  SellPlus=-158.48000000  SellMinus=158.40000000  Profit=1.58398000  Loss=1.58482000

Я добавил значения SYMBOL_TRADE_TICK_VALUE_PROFIT и SYMBOL_TRADE_TICK_VALUE_LOSS в конце.

Видно, что в профите на самом деле учитывается разная стоимость тика в зависимости от прибыльности или убыточности сделки. Это потому, что есть неявная операция конвертации в валюту депозита, когда нужно полученный финансовый результат в одной валюте продать (если это прибыль) или выкупить (если убыток) для конвертации.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

 

 

 Стоимость тика не зависит от прибыльности или убыточности сделки.

Прибыль и убыток закроятся по една и тоже цена. При конвертация - тоже. 

Только шорт и лонг сделки можно имеет разница в стоимость тика и можно считается  по разному для конвертации в валюту депозита.  

В предний пример BuyPlus и BuyMinus надо будет равни. SellPlus и SellMinus - тоже.    Можно только Buy.... различается с  Sell...

Вы что-то путаете  здесь : 

 

Renat:

...  когда нужно полученный финансовый результат в одной валюте продать (если это прибыль) или выкупить (если убыток) для конвертации.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете - Документация по MQL5
 

Когда откроете сделка на EURGBP, а валюта депозита USD, вы практически имеете (примерно) Buy EURUSD и Sell GBPUSD.   (разница объеми не имеет значение, потому-что при закритие они не меняется)

Для откритие: Buy EURUSD по цена Ask(EURUSD)  и для Sell GBPUSD - Bid(GBPUSD).

 

При закритие (если это прибыль, если убыток) у вас  цени едни и тоже:  Bid(EURUSD) и Ask(GBPUSD).

Почему стоимость тика разная  для   прибыль/убыток ?!?!

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете - Документация по MQL5
 

Это результат давнего заблуждения разработчиков:

Renat:

Точнее сказать, что TickValue при конвертации в целевую валюту зависит от того, убыточна она или нет. То есть, если мы получили убыток в 1 пипс, то нам надо его выкупить по цене Ask, а если прибыль в 1 пипс, то продать по цене Bid.

 
Manov:

 

 Стоимость тика не зависит от прибыльности или убыточности сделки.

Прибыль и убыток закроятся по една и тоже цена. При конвертация - тоже.

В том то и дело, что зависит.

Для этого нужно достаточно глубоко погрузиться в математику расчетов с конвертациями сложных кроссов. Пока Вы оперируете мейджорами типа EURUSD и GBPUSD, ничего не увидите.

Да, на первый взгляд кажется, что не должна зависеть, но при детальном рассмотрении кроссов увидите, что зависит.

 
Renat:

В том то и дело, что зависит.

На самом деле это спорный вопрос. Логика Рената понятна и кажется даже правильной на первый взгляд:

Совершая операцию по кроссу, вы получаете прибыль в ее базовой валюте. Например, прибыль от торговли по EURGBP измеряется в GBP. Но в MT5 нет понятия мультивалютной прибыли, поэтому GBP-прибыль на лету конвертится в валюту счета. И, казалось бы, при положительной прибыли конвертить ее надо по текущему курсу GBPUSD_Bid, а при отрицательной - GBPUSD_Ask.

Однако, контр-пример:

  1. У вас есть два независимых счета. И вы решили попереливать средства с одного на другой.
  2. На EURGBP вы выставляете внутрь спреда на одном счету BuyLimit. Соответственно, Bid-цена становится вашей.
  3. На другом счете маркет-ордером делаете SELL.
  4. Такой нехитрой операцией вы сами себе продали.
  5. Проходит определенное время, и вы решаете закрыть сделки.
  6. На первом счете выставляете SellLimit внутрь спреда. Теперь вашей ценой становится Ask-цена.
  7. На другом счете маркет-ордером делаете BUY.
  8. Получилось, что вы теперь купили у себя же.
  9. Обе сделки на каждом счету закрыты. Вы покупали и продавали сами себе же.
  10. На одном счету положительная прибыль, на другом отрицательная.
  11. Как думаете, сумма средств на ваших обоих счетах изменилась (не учитывая комиссию брокера)?
  12. По логике Рената - изменилась. Т.к. на одном счету прибыль не будет равна убытку на другом счету. И это несмотря на то, что вы сами себе продавали и покупали.
  13. Правильно ли это?

Речь велась о рыночных условиях - ECN/STP брокер.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
hrenfx:

Однако, контр-пример:
  1. Правильно ли это?

Речь велась о рыночных условиях - ECN/STP брокер.

Учтите, что есть еще как минимум две внутренние конверсионные операции с их собственными спредами.
 
Renat:

В том то и дело, что зависит.

Для этого нужно достаточно глубоко погрузиться в математику расчетов с конвертациями сложных кроссов. Пока Вы оперируете мейджорами типа EURUSD и GBPUSD, ничего не увидите.

Да, на первый взгляд кажется, что не должна зависеть, но при детальном рассмотрении кроссов увидите, что зависит.

 Разчет цена Ask/Bid   может бы сложнии, но на самом деле  для всех кроссов  у вас есть 2 сделки:

1. Buy or Sell  SYMBOL_CURRENCY_BASEACCOUNT_CURRENCY  по Аск/Бид

2. Buy or Sell  SYMBOL_CURRENCY_PROFIT - ACCOUNT_CURRENCY  по Аск/Бид

Каждая из сделок, если откроили по Bid - закроим по Ask. И наоборот...  

Знак результата не имеет значение для цени закрития, как сейчас на MetaTrader 5  !!

 
 
Renat:
Учтите, что есть еще как минимум две внутренние конверсионные операции с их собственными спредами.

О каких конверсионных операциях идет речь? Логика же простая, нужно мультивалютную прибыль конвертировать в валюту счета, не более. В случае примера, надо профит в GBP перевести в USD. Не важно положительный профит или отрицательный, но конвертировать надо.

Вы отказались от рыночной схемы ведения мультивалютной прибыли и конвертации ее в момент ролловера. Это уход от рыночных условий MT5, позиционирующейся, как рыночная платформа. Но ради упрощения такой уход может быть понят и не несет во многих случаях (не во всех) серьезных издержек.

Но в случае расчета прибыли, если называть вещи своими именами, вы, специально или случайно, способствуете мошеннической схеме отъема денег у клиентов в пользу брокера, использующего MT5. Поясню, на данный момент брокер получает на MT5 доп. прибыль от торговли всех клиентов, равную (грубо) обороту всех его клиентов по кроссам, умноженную на соответствующий спред мажоров.

Вы реализовали бесплатную схему зарабатывания на спреде, причем на любом. Например, во время новостей, на том же GBPUSD спред может быть очень широким, и если происходит закрытие/открытие у клиентов брокера, то брокер зарабатывает этот огромный спред на ровном месте.

Это минус и отказа от мультивалютной прибыли, потому как мультиприбыль конвертится может по совсем поганым ценам во время новостей. А ведь на самом деле во время ролловера конвертация мультивалютной прибыли происходит вообще по суммарному неттингу всех клиентов. И таких перекосов, как показал выше в контрпримере, произойти ну никак не может.

Причина обращения: