程序库: MT4Orders - 页 29

 
关于佣金,有一件有趣的事。MT5 在进入和退出交易时将佣金分成两半(如果一个仓位有 2 笔交易)。OrderCommission 返回的是交易佣金的 2 倍(由 PositionID 计算?)但要获得与测试版相同的报告指标,需要将盈利交易的一半佣金计算在内,而进入交易时提取的部分应计入总损失。也就是说,盈利的交易计入订单佣金()的 1/2,不盈利的交易计入全部佣金,总损失中的每笔盈利+1/2....。这是最简单的情况,即没有部分进入/退出,我还不想考虑更复杂的情况。)我想知道 OrderSwap() 是否也是如此?附注:不,swap 似乎只在输出方向收费。
总的来说,这个库很酷,再次感谢 saber。
 
Ilya Malev:
要获得与测试版相同的报告指标,必须考虑盈利交易佣金的一半,而进入交易时提取的部分应计入总损失。也就是说,盈利的交易计入订单佣金()的 1/2,不盈利的交易计入全部佣金,总亏损中的每笔盈利+1/2....。这是最简单的情况,即没有部分进入/退出,我不想考虑更复杂的情况))))。

有问题。

 
fxsaber:

有些东西被弄乱了。

我正在为不同类型的交易并行计算 PF 指标,这些交易在测试期间同时开启。因此我注意到,如果我愚蠢地将所有加仓和减仓交易的 OrderProfit()+OrderCommission()+OrderSwap 分别相加,那么最终的总盈利、总亏损和无煤烟 PF 将不会重合。要使它们重合,您需要执行以下操作(如果在 "理想测试环境 "中,每个仓位保证有 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); // MT5 测试仪上的正确利润因素
 
Ilya Malev:

我与测试人员同时计算不同类型交易的 PF 指标,这些交易在测试期间同时开启。

因此,PF 计算是绝对错误的。无论使用什么平台,PF 的计算方法都不一样。它是一个纯数学概念。因此,它的计算总是明确无误的。

 
fxsaber:

因此,PF 计算完全错误。无论使用什么平台,PF 的计算方法都不可能不同。它是一个纯数学概念。因此,它的计算总是明确无误的。

那么,请尝试自己计算任何系统,并与 MT5 报告中的数字进行比较。只是佣金最好是外汇(因为我在测试外汇)。

 
Ilya Malev:

请尝试自己计算任何系统,并与 MT5 报告中的数字进行比较。只有在有佣金的情况下,而且最好是外汇交易(因为我在测试外汇交易)。

我把这段代码插入了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

与测试器完全匹配。

所以也许你连接的账户类型没有交易佣金。

P.S. 我会再检查一遍的,好吗。如果有的话,我会把它连同图片一起发布:)
 
fxsaber:

我将这段代码插入了MQL5\Experts\Examples\Moving Average\Moving Average.mq5

与测试者完全吻合。

MetaQuotes-Demo 服务器没有外汇交易佣金。

1) 找到一个服务器,例如,在经纪商 A-i.

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) 盈利:lol:

 
Ilya Malev:

因此,您所连接的账户类型可能没有交易佣金。

没错,我在错误的交易服务器上进行了检查。在有佣金的情况下,正确的 PF 与 Tester 不一致。这表明 MT5 的 PF 计算错误,完全没有考虑 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 中的 PF 是错误的。MT5 在交易结束时的 PF 可能是无限的,余额会不断减少。这当然是错误的。

 
fxsaber:

对,在错误的交易服务器上进行了检查。加上佣金后,正确的 PF 与测试器不符。这说明 MT5 计算 PF 的方法不正确,完全没有考虑 DEAL_IN 佣金。

这表明他们有不同的理念 - 他们不把交易视为一个整体(历史头寸选择等意义上的历史头寸并不存在)。对他们来说,每笔交易都是独立的操作,这就是为什么他们在输入损失时要加上佣金(虽然不清楚为什么要从输出利润中扣除佣金)。