バックテストの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));
}
}