2015年10月27日火曜日

[MT4プログラミング]小ネタ バックテスト時のiCloseは1000本前までに限定される。

ちょっとバックテストを行っていて気が付いたことを・・・。

バックテストのOnTick関数内にてiCloseを使って終値を取得してみました。
左側がiCloseの第3引数shiftの値、右側が応答となります。

PERIOD_D1
1002 0.0
1001 0.0
1000 1.28623
999 1.29676
998 1.29328

PERIOD_H4
1002 0.0
1001 0.0
1000 1.13141
999 1.1293
998 1.13314

PERIOD_H1
1002 0.0
1001 0.0
1000 1.08665
999 1.08713
998 1.0872

PERIOD_M30
1002 0.0
1001 0.0
1000 1.12231
999 1.12268
998 1.12311

PERIOD_M15
1002 0.0
1001 0.0
1000 1.14006
999 1.14041
998 1.13999

PERIOD_M5
1002 0.0
1001 0.0
1000 1.12717
999 1.12753
998 1.1276


・・・・。
すべて1001からは0が帰ってきます。
バックテスト時、iClose関数の最大バー数は1000に固定されるのですね。
すべての時間帯において1001からは0が帰ってきてしまいます。

ちなみに、実際動作させると、ヒストリカルデータがあるだけ取れます。こんなところにもバックテストと実動作の違いがありました。

iOpenなども同様かと思われます。バックテストで価格取得関数を使用する場合は注意しましょう。


ブログランキングにご協力よろしくお願いいたしますm(_ _ )m
にほんブログ村 為替ブログへ
にほんブログ村


プログラムはこんな感じです。


OnTick以外はテンプレートで生成したまんまです。
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static bool isRun = false;
 
   if( isRun ) return ;
   isRun = true;

   Print("PERIOD_M5");
   for( int i = 998 ; i < 1003; i++ )
   {
      Print(i, " ", iClose("EURUSD", PERIOD_M5, i));
   }

   Print("PERIOD_M15");
   for( int i = 998 ; i < 1003; i++ )
   {
      Print(i, " ", iClose("EURUSD", PERIOD_M15, i));
   }

   Print("PERIOD_M30");
   for( int i = 998 ; i < 1003; i++ )
   {
      Print(i, " ", iClose("EURUSD", PERIOD_M30, i));
   }

   Print("PERIOD_H1");
   for( int i = 998 ; i < 1003; i++ )
   {
      Print(i, " ", iClose("EURUSD", PERIOD_H1, i));
   }
 
 
   Print("PERIOD_H4");
   for( int i = 998 ; i < 1003; i++ )
   {
      Print(i, " ", iClose("EURUSD", PERIOD_H4, i));
   }
 
   Print("PERIOD_D1");
   for( int i = 998 ; i < 1003; i++ )
   {
      Print(i, " ", iClose("EURUSD", PERIOD_D1, i));
   }
 
  }