メタトレで精緻且つ複雑なEAを作成しようとすると、そのエントリー条件は膨大な数に昇る。if ( )分の中、&&や||で連結される条件が5個程度であれば間違うこともないが、その数が20を上回るようになるともう手に負えない。出来上がったとしても形は見苦しいし、必ずと言ってよいほど、どこかで勘違いによる単純なミスを起こしてしまう。都合の悪いことには、文法上誤っていなければ、その間違いを発見することさえ難しい。
そのような場合には、条件をその性質により数個のグループに分け、グループごとに発生する売買のシグナルを最終的に一つにまとめ上げる工夫をするとよい。
例えば、昨年8月に「ロンドンFXディーラーの教える正しい押し目買い・戻り売り」で採用されている手法に基づいてEAを作成しようとすると、実に23個の条件を必要とする。条件が多くなるのは、5分足と1時間足の両時間足を利用することにより、必要な売買シグナルがほぼ2倍になることと、採用する移動平均線5本の各動きを判定する必要があるためである。
そこで、グループを① int EntrySignal( )、② int FilterSignal_1(int signal )、int FilterSignal_2(int signal)の3グループに分ける。
① int EntrySignal( )
この関数では5分足での価格の動きと、移動平均線との関係から、買いのシグナルが出れば 1、売りのシグナルが出れば -1、その他は0を戻り値として返す。
② int FilterSignal_1(int signal)
この関数では、5分足における3本の移動平均線の並び順とその傾きを判定し、ここでのシグナルがEntrySignal()と同じであれば、EntrySignal()と同じシグナルを返す。(1、-1、0のいずれか。EntrySignal( )が0であれば、FilterSignal_1()もFilterSignal_2()も 0をかえす)
③ int FilterSignal_2(int signal)
この関数では、1時間足における2本の移動平均線の並び順とそれらの傾きを判定し、買いであれば 1、売りであれば -1、その他は 0 の戻り値を返すようにする。(1、-1、0のいずれか。EntrySignal( )が0であれば、FilterSignal_1()もFilterSignal_2()も 0をかえす)
3つのグループから出た売買シグナルは OnTick( )の中で次のようにまとめる。(豊島久道教授手法)
void OnTick( )
int sig_entry = EntrySignal( );
int sig_filter_1 = FilterSignal_1(sig_entry);
int sig_filter_2 = FilterSignal_2(sig_filter_1);
こうすることによって、最初のエントリーシグナルが 1であり、且つ、FilterSignal_1( )とFilterSignal_2()がともに1を返せば、正式な買いシグナルとなる。同じようにEntrySignal()が -1で且つFilterSignal_1()とFilterSignal_2()がともに -1を返せば、正式な売りシグナルとなる。途中でシグナリが異なる場合や最初のシグナルが 0であれば、売買シグナルは出ない。売買注文は
//買い注文
if(sig_filter_2 > 0) OrderSend(_Symbol, OP_BUY,・・・);
//売り注文
if(sig_filter_2 < 0) OrderSend(_Symbol, OP_SELL,・・・);のようにシンプルな形となる。
肝心の「元ロンドンディーラーの正しい押し目買い・戻り売り」であるが、出来上がったEAのテスト状況は思わしくない。もう10年以上も前の手法であるから、アルゴリズム全盛の前には、既にファンドの餌食にされている可能背もある。考えそのものには間違いはなさそうなので、時間足の組み合わせを変えたり、最適なインディケータをフィルターに加えたり等の考察を引き続き重ねてみることにしたい。