Библиотеки: MT4Orders - страница 28

 
Интересная штука с комиссией выходит. МТ5 делит её пополам на входе и выходе из сделки (если сделок у позиции 2). OrderCommission возвращает 2х размер комисса у сделок (подсчитывает по PositionID? я не смотрел). Но чтобы получить те же показатели отчета, что и в тестере, нужно у прибыльных сделок учитывать половинную комиссию, а ту часть, которая снималась при входе в сделку, учитывать в общем убытке. То есть у прибыльных сделок считается 1/2 OrderCommission(), а у убыточных вся целиком, и ещё +1/2 за каждую прибылью в общем убытке... Это в простейшем случае, когда нет частичных входов/выходов, о более сложном как-то пока думать не хочется)) Интересно, с OrderSwap() то же самое? П.С. Нет, похоже swap начисляется только в направлении out. 
Вообще классная библиотека, спасибо ещё раз саберу. 
 
Ilya Malev:
чтобы получить те же показатели отчета, что и в тестере, нужно у прибыльных сделок учитывать половинную комиссию, а ту часть, которая снималась при входе в сделку, учитывать в общем убытке. То есть у прибыльных сделок считается 1/2 OrderCommission(), а у убыточных вся целиком, и ещё +1/2 за каждую прибылью в общем убытке... Это в простейшем случае, когда нет частичных входов/выходов, о более сложном как-то пока думать не хочется))

Что-то намудрили.

 
fxsaber:

Что-то намудрили.

Делаю параллельный с тестером расчет показателей ПФ по разным типам сделок, которые в процессе теста открываются одновременно. Вот и заметил, что если по МТ4-му тупо суммировать OrderProfit()+OrderCommission()+OrderSwap отдельно всех плюсовых и минусовых сделок, то общая прибыль, общий убыток и соот-но пф в итоге будут не совпадать. А чтобы совпадали нужно сделать так (если в "идеальной среде тестера", где гарантированно 2 сделки на позицию)

double summ_plus=0, summ_minus=0;
int oht=OrdersHistoryTotal();
for(int i = oht-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)&&OrderType()<2/*...*/)
{
if(OrderProfit()>0)
{
summ_plus+=OrderProfit()+OrderCommission()/2+OrderSwap();
summ_minus+=-OrderCommission()/2;
}
else
{
summ_minus+=-OrderProfit()-OrderCommission()-OrderSwap();
}
}
}
return(summ_minus>0?summ_plus/summ_minus:0.0); // Корректный профит фактор по тестеру МТ5
 
Ilya Malev:

Делаю параллельный с тестером расчет показателей ПФ по разным типам сделок, которые в процессе теста открываются одновременно.

Так абсолютно неверный расчет ПФ привели. ПФ не может считаться по-разному, не зависимо от того, какая платформа используется. Это чисто математическое понятие. А потому вычисляется однозначно всегда.

 
fxsaber:

Так абсолютно неверный расчет ПФ привели. ПФ не может считаться по-разному, не зависимо от того, какая платформа используется. Это чисто математическое понятие. А потому вычисляется однозначно всегда.

Ну попробуйте сами любую систему посчитать и сравнить с цифрами в отчете МТ5. Только чтобы комиссия была и желательно форекс (т.к. я форекс тестил)

 
Ilya Malev:

Ну попробуйте сами любую систему посчитать и сравнить с цифрами в отчете МТ5. Только чтобы комиссия была и желательно форекс (т.к. я форекс тестил)

Вставил этот код в MQL5\Experts\Examples\Moving Average\Moving Average.mq5

#include <MT4Orders.mqh>

double GetPF()
{
  double SumPlus = 0;
  double SumMinus = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      const double Profit = OrderProfit() + OrderCommission() + OrderSwap();
      
      if (Profit > 0)
        SumPlus += Profit;
      else
        SumMinus -= Profit;      
    }
    
  return(SumMinus ? SumPlus / SumMinus : DBL_MAX);
}

Полное совпадение с Тестером.

 
fxsaber:

Вставил этот код в MQL5\Experts\Examples\Moving Average\Moving Average.mq5

Полное совпадение с Тестером.

Так может у типа счета к которому Вы подключены нет комиссии за сделки.

П.С. Я проверю ещё раз, хорошо. Если что выложу с картинками :)
 
fxsaber:

Вставил этот код в MQL5\Experts\Examples\Moving Average\Moving Average.mq5

Полное совпадение с Тестером.

На сервере MetaQuotes-Demo нет комиссии за сделки на форексе.

1) Найдите сервер, где есть, например у брокера А-и.

2) Добавьте к своему коду

    printf("My Profit Factor = %.8f, MT5 Profit Factor = %.8f",GetPF(),TesterStatistics(STAT_PROFIT_FACTOR));
// а заодно это
  printf("My Plus=%.8f, My Minus=%.8f, MT5 Plus=%.8f, MT5 Minus=%.8f",SumPlus,SumMinus,
    TesterStatistics(STAT_GROSS_PROFIT),TesterStatistics(STAT_GROSS_LOSS));

3) ???

4) Profit!!! :lol:

 
Ilya Malev:

Так может у типа счета к которому Вы подключены нет комиссии за сделки.

Точно, не на том торговом сервере проверил. С комиссией правильный ПФ не совпадает с Тестером. Это говорит о том, что MT5 считает ПФ криво, совсем не учитывая DEAL_IN-комиссию.

Профит вычисляется абсолютно верно

double GetProfit()
{
  double Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
      Res += OrderProfit() + OrderCommission() + OrderSwap();
    
  return(Res);
}


ПФ - кривой в MT5. В MT5 может быть бесконечный ПФ по окончании торгов, при этом баланс уменьшится. Это неправильно, конечно.

 
fxsaber:

Точно, не на том торговом сервере проверил. С комиссией правильный ПФ не совпадает с Тестером. Это говорит о том, что MT5 считает ПФ криво, совсем не учитывая DEAL_IN-комиссию.

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

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