M1で動作するEAでM5のデータを参照する時
EAをM1のチャートのセットしてからM5のデータをダウンロードするのに数ティック時間が必要です。
上位足のデータがダウンロード済みの場合は問題ありませんが、ダウンロードまでの数ティックに誤動作が発生しないように気をつける必要があります。
例)ドンチャン・ブレークスルー
ドンチャンチェネルは過去x本の高値、安値を基準にします。
・上位足のドンチャンをBidが超えた時にエントリーするケース
EAをセットしてから上位足のデーターをダウンロードする数ティックの間、データが無いため高値は0になります。
高値よりBidは必ず大きくなりますので、EAセットと同時に注文が出るといった現象が発生します。バックテストでは発見できないので厄介です。
・確認用コード
void OnTick()
{
double B=iBars(_Symbol,PERIOD_M5);
double Hi=iHigh(_Symbol,5,iHighest(_Symbol,5,MODE_HIGH,330,1));
Print("Bar: ",B," High: ",Hi);
}
{
double B=iBars(_Symbol,PERIOD_M5);
double Hi=iHigh(_Symbol,5,iHighest(_Symbol,5,MODE_HIGH,330,1));
Print("Bar: ",B," High: ",Hi);
}
M5のデータのない通貨ペアのM1にセットしてM5のBarの数と高値を出力します。
インストールした直後のティックはM5のデータが無く 高値は0
ドンチャンブレイクスルーの場合発注してしまいます(汗)
次のティックでは2048本のダウンロード完了、高値が表示されます。
・次のコードは過去データ(Bars)が1000未満の時には過去データの数を表示
1000以上になるとBarsと高値を出力します。
void OnTick()
{
double B=iBars(_Symbol,PERIOD_M5);
if(B<1000){Print(B);return;}
double Hi=iHigh(_Symbol,5,iHighest(_Symbol,5,MODE_HIGH,330,1));
Print("Bar :",B," Hi: ",Hi);
}
{
double B=iBars(_Symbol,PERIOD_M5);
if(B<1000){Print(B);return;}
double Hi=iHigh(_Symbol,5,iHighest(_Symbol,5,MODE_HIGH,330,1));
Print("Bar :",B," Hi: ",Hi);
}
1ティック目は過去データ0
2,3ティックは1 おそらく第1ティック(17:29:57.213秒)が反映されている。
4ティック目に過去2048本の四本値ダウンロード完了 高値が表示されます。
上位足を参照するEAは念のため参照する上位足のBarを数えましょう
0 件のコメント:
コメントを投稿