Bibliotecas: MT4Orders - página 29

 
Um aspecto interessante da comissão. O MT5 a divide pela metade na entrada e na saída de uma negociação (se uma posição tiver 2 negociações). O OrderCommission retorna 2x o tamanho da comissão para as negociações (calculada pelo PositionID? Não dei uma olhada nisso). Mas para obter os mesmos indicadores de relatório que no testador, você precisa levar em conta metade da comissão para negociações lucrativas, e a parte que foi retirada ao entrar em uma negociação deve ser levada em conta na perda total. Ou seja, as negociações lucrativas contam 1/2 de OrderCommission(), e as não lucrativas contam toda a comissão, e +1/2 para cada lucro na perda total.... Esse é o caso mais simples, quando não há entradas/saídas parciais, não quero pensar em casos mais complicados ainda))) Gostaria de saber se é o mesmo com o OrderSwap()? P.S. Não, parece que a troca é cobrada somente na direção de saída.
Em geral, a biblioteca é legal, e agradeço novamente ao Sabre.
 
Ilya Malev:
Para obter os mesmos indicadores de relatório que no testador, é necessário levar em conta metade da comissão para negociações lucrativas, e a parte que foi retirada ao entrar em uma negociação deve ser levada em conta na perda total. Ou seja, as negociações lucrativas contam 1/2 de OrderCommission(), e as não lucrativas contam toda a comissão, e +1/2 para cada lucro na perda total.... Esse é o caso mais simples, quando não há entradas/saídas parciais; não quero pensar em casos mais complicados ainda))))

Algo está errado.

 
fxsaber:

Algo está errado.

Estou fazendo um cálculo paralelo de indicadores de PF para diferentes tipos de negócios, que são abertos simultaneamente durante o teste. Então, notei que se o MT4, estupidamente, somar OrderProfit()+OrderCommission()+OrderSwap separadamente de todas as negociações positivas e negativas, então o lucro total, a perda total e o PF sem fuligem no final não coincidirão. E para fazê-los coincidir, você precisa fazer o seguinte (se estiver no "ambiente de teste ideal", em que 2 negociações por posição são garantidas)

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); // Fator de lucro correto no testador MT5
 
Ilya Malev:

Faço o cálculo paralelo com o testador dos indicadores de PF para diferentes tipos de negócios, que são abertos simultaneamente durante o teste.

Portanto, o cálculo do PF está absolutamente errado. O PF não pode ser calculado de forma diferente, não importa qual plataforma seja usada. Trata-se de um conceito puramente matemático. Portanto, ele é sempre calculado de forma inequívoca.

 
fxsaber:

Portanto, o cálculo do PF está completamente errado. O PF não pode ser calculado de forma diferente, independentemente da plataforma utilizada. Trata-se de um conceito puramente matemático. Portanto, ele é sempre calculado de forma inequívoca.

Bem, tente calcular você mesmo qualquer sistema e compare-o com os números do relatório do MT5. Apenas que a comissão era e, de preferência, forex (porque eu estava testando forex).

 
Ilya Malev:

Bem, tente calcular você mesmo qualquer sistema e compare-o com os números do relatório do MT5. Somente se houver uma comissão e, de preferência, forex (porque eu estava testando forex).

Inseri esse código em 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);
}

Coincidência total com o Tester.

 
fxsaber:

Inseri esse código em MQL5\Experts\Examples\Moving Average\Moving Average.mq5

Uma correspondência completa com o testador.

Portanto, talvez o tipo de conta ao qual você está conectado não tenha comissão para negociações.

P.S. Vou verificar novamente, ok. Se for o caso, publicarei o resultado com fotos :)
 
fxsaber:

Inseri esse código em MQL5\Experts\Examples\Moving Average\Moving Average.mq5

Coincidência total com o testador.

O servidor MetaQuotes-Demo não tem comissão para negociações forex.

1) Encontre um servidor onde haja, por exemplo, na corretora A-i.

2) Adicione ao seu código

    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) Lucro!!! :lol:

 
Ilya Malev:

Portanto, talvez o tipo de conta à qual você está conectado não tenha comissão para transações.

Exatamente, eu verifiquei no servidor de negociação errado. Com a comissão, o PF correto não corresponde ao do testador. Isso indica que o MT5 calcula o PF de forma incorreta, sem levar em conta o DEAL_IN-commission.

O lucro é calculado de forma absolutamente correta

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);
}


O PF está incorreto no MT5. O MT5 pode ter um PF infinito no final da negociação, com o saldo diminuindo. Isso está errado, é claro.

 
fxsaber:

Certo, verifiquei no servidor de negociação errado. Com a comissão, o PF correto não corresponde ao do testador. Isso mostra que o MT5 calcula o PF de forma incorreta, sem levar em conta a comissão DEAL_IN.

Isso mostra que eles têm uma filosofia diferente - não consideram as transações como um todo (e não há posições no histórico como tal, no sentido de HistoryPositionSelect, etc.). Para eles, cada transação é uma operação independente, e é por isso que eles adicionam a comissão na entrada com perdas (embora não esteja claro por que eles a deduzem do lucro na saída).