MetaTrader 5 Strategy Tester: バグ、不具合、改善のための提案 - ページ 48

 

pipsモードでは、負けポジションは全ポジション量 に対して1つのマーカーで決済し、利益が出ているポジションは0.01ロットで決済することで、ギルを手に入れることができます。

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

const bool Init = EventSetTimer(100);

void OnTimer()
{
  while (OrdersTotal())
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), (OrderProfit() > 0) ? 0.01 : OrderLots(), OrderClosePrice(), 0);
      
  OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
}


結果

 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

ライブラリ: SingleTesterCache

fxsaber, 2020.01.12 23:20

現在のバージョンのtst-formatには、以下のデータは含まれていません。

  • 時間(ミリ秒)。
  • PositionIDです。
  • MagicNumberです。
そのため、利用シーンに制約がある。
 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

ライブラリ: SingleTesterCache

fxsaber, 2020.01.13 00:01

複数のバグを再現する。ヘッジ口座のStrategy TesterでExpert Advisorを起動します。

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PAUSE 100000

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
    Sleep(PAUSE);
    
    OrderSend(_Symbol, OP_BUY, 2, Ask, 0, 0, 0);
    Sleep(PAUSE);

    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    Sleep(PAUSE * 2);
    
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    Sleep(PAUSE * 2);

    TesterWithdrawal(100);    
    
    FirstRun = false;
  }
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      Print(OrderTicketID()); // MT5-PositionID
    }
}


以下のようになります。

2020.01.08 23:59:58   #1 2020.01.01 00:00:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.01 00:00:00 0.00000 0.00 0.00 100000.00 0
2020.01.08 23:59:58   0
2020.01.08 23:59:58   #4 2020.01.02 06:00:00 buy 1.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:03:20 1.12132 -3.56 0.00 -4.46 0
2020.01.08 23:59:58   2
2020.01.08 23:59:58   #5 2020.01.02 06:01:40 buy 2.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:06:40 1.12129 -7.14 0.00 -14.27 0
2020.01.08 23:59:58   3
2020.01.08 23:59:58   #6 2020.01.02 06:10:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.02 06:10:00 0.00000 0.00 0.00 -100.00 withdrawal 0
2020.01.08 23:59:58   0


そして、対応するtstファイルをスクリプトで読み込む。

#include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> // https://www.mql5.com/ru/code/27611
#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

void OnStart()
{  
  uchar Bytes2[];
  
  if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Если получилось прочитать последнюю кеш-запись одиночного прогона
  {
    const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Загоняем ее в соответствующий объект.

    for (int i = 0; i < ArraySize(SingleTesterCache.Positions); i++)
      Print(SingleTesterCache.Positions[i].ToString());
  }
}


位置のデータを印刷します

id = 0
mfe = 0.0
mae = -8.029999999999999
profit = -4.46
lifetime = 00:03:20

id = 0
mfe = 0.0
mae = -21.4
profit = -14.27
lifetime = 00:05:00

id = 0
mfe = 0.0
mae = 0.0
profit = 0.0
lifetime = 00:00:00


この記事にあるものをすべて比較すると、以下のようなバグがあることがわかります。

  • 正しいIDではなく、ゼロのID。
  • 手数料およびスワップ料は、利益計算の際に考慮されません。
  • 撤退トレードが誤ってクローズドトレードのポジション数に含まれています。

 

デバッガは完全に機能するわけではありません。標準的なデバッガと比べて何が足りないのか、欠点が多い順に並べてみました。

1.メモリの修正。変数の閲覧は可能ですが、編集はできないようです。

2.条件付きブレークポイント変数test=10でストップとか。

3.移動実行の可能性。つまり、ある行をクリックして、そこから実行するように指示すればいいのです。つまり、ある線をクリックして、「さあ、ここから走ってください」と言うのです。

4. 既に実行中のスクリプト/アドバイザ/インジケータへの添付。せめてクラッシュ時にアタッチできるようにすれば、解析しやすくなるのに。

 
traveller00:

デバッガは完全に機能するわけではありません。標準的なデバッガと比べて何が足りないのか、欠点が多い順に並べてみました。

2.条件付きブレークポイント変数test=10でストップとか。

if (smth) {

    int a;

}
 
そうですね、組み替えればほとんど何でも実現できますね。ただし、4は除く。4.でも、やはりデバッガーには標準的な機能として搭載してほしいですね。
 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

ライブラリ: SingleTesterCache

fxsaber, 2020.01.14 10:49

今はset-filesの代わりにtst-filesを使っています。入力パラメータだけでなく、フルバックテストも用意されており、非常に迅速に切り替えが可能です。

tstのミリ秒データがないため、現在は異なるTSを完全に組み合わせてポートフォリオにすることができないのが残念です。


開発者には、既存のフィールドをフルに活用するようになってほしいですね

INT64             TradeDeal::time_create;             // время создания записи

INT64             TradeOrder::time_setup;             // время приёма ордера от клиента в систему
INT64             TradeOrder::time_done;              // время снятия завки

のように、秒単位ではなくミリ秒単位で時間値を記述します。


一般に、実際にはtstのちょっとした欠点があるため、tstを使うことの格好良さをすべて発揮することはできない。これは修正される可能性が あります。

 


TesterWithdrawalはレポートにあるが、TesterDepositがない。

 
この絵をどう理解するか。最適化グラフでは、5000付近でピーク値を示しています。しかし、最適化テーブルでは、最大値が4670となっている。最高のパスのためのパラメータはどこにあるのか?
ファイル:
8c97so2_7-1.jpg  184 kb
 
Grozir:
この絵をどう理解するか。最適化グラフでは、5000付近でピーク値を示しています。そして、最適化テーブルでは、最大値が4670となっています。最高のパスのためのパラメータはどこにあるのか?

Result」列をソートします。