ライブラリ: MT4Orders - ページ 29

 
手数料について興味深いことがあります。MT5は、取引のエントリーとエグジットで手数料を半分に分けます(ポジションに2つの取引がある場合)。OrderCommissionは取引の手数料の2倍のサイズを返します(PositionIDによって計算されるのでしょうか? 私は見ていません)。しかし、テスターと同じレポート指標を得るためには、利益が出た取引の手数料の半分を考慮する必要があり、取引に入るときに引き落とされた部分は損失の合計に考慮されるべきです。つまり、利益が出た取引はOrderCommission()の1/2を考慮し、利益が出なかった取引は全手数料を考慮し、利益が出るごとに+1/2を全損失に考慮する...。これは最も単純なケースで、部分的なエントリー/エグジットがない場合です。)OrderSwap()でも同じでしょうか?P.S. いや、スワップはアウト方向にのみ課金されるようだ。
総じて、クールなライブラリだ。
 
Ilya Malev:
テスターと同じレポート指標を得るためには、利益が出た取引の手数料の半分を考慮する必要があり、取引に入る際に引き落とされた部分は損失の合計に考慮する必要がある。つまり、利益が出た取引はOrderCommission()の1/2を考慮し、利益が出なかった取引は手数料全体を考慮し、利益が出るごとに+1/2をトータルの損失に考慮する...。これは最も単純なケースで、部分的なエントリー/エグジットがない場合です。)

何かが間違っている。

 
fxsaber:

何かが混乱している。

私は、テスト中に同時にオープンされる異なるタイプの取引について、PFインジケータの並列計算を行っています。そこで、MT4-my stupidlyがすべてのプラスとマイナスの取引を別々にOrderProfit()+OrderCommission()+OrderSwapを合計した場合、最終的に合計利益、合計損失、すそのPFが一致しないことに気づきました。そして、これらを一致させるためには、以下のようにする必要があります(「理想的なテスター環境」で、1ポジションにつき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は、どのプラットフォームを使用しても、異なる方法で計算することはできません。PFは純粋に数学的な概念です。したがって、常に一義的に計算されます。

 
fxsaber:

だから、PFの計算は完全に間違っている。PFは、どのプラットフォームを使っても、異なる計算をすることはできない。純粋に数学的な概念だからだ。したがって、常に一義的に計算されます。

まあ、自分でどんなシステムでも計算してみて、MT5のレポートの数字と比較してみてください。ただ、手数料は、できればFXで計算することをお勧めします(FXをテストしていたため)。

 
Ilya Malev:

どんなシステムでも自分で計算してみて、MT5のレポートの数字と比較してみてください。手数料がある場合のみで、できればFXがいい(FXをテストしていたから)。

このコードをMQL 5に挿入した。

#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:

このコードをMQL 5に挿入した。

Testerと完全に一致した。

ということは、もしかしたら、あなたが接続している口座タイプは取引手数料が無料なのかもしれない。

追伸:もう一度確認してみます。何かあれば、写真付きで投稿します :)
 
fxsaber:

このコードをMQL 5に挿入した。

Testerと完全一致。

MetaQuotes-DemoサーバーはFX取引の手数料が無料です。

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) 儲かる!笑):

 
Ilya Malev:

つまり、あなたが接続している口座のタイプは取引手数料が無料なのかもしれません。

その通り、私は間違った取引サーバーでチェックしました。手数料がある場合、正しいPFはテスターと一致しません。これは、MT5がPFを不正に計算し、DEAL_IN-commissionをまったく考慮していないことを示しています。

利益は完全に正しく計算されている

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手数料を全く考慮していないことを示しています。

これは、MT5が異なる哲学を持っていることを示しています。彼らは取引を全体として考えていません(HistoryPositionSelectなどの意味で、履歴にはポジションは存在しません)。彼らにとって、各取引は独立した操作であり、だからこそ、損失を伴う入力時に手数料を加算するのである(ただし、その場合、なぜ出力時の利益から手数料を差し引くのかは不明である)。