メタトレーダー自動売買チャンピオンシップ挑戦記

MT4・MT5の発売元であるMetaQuotes Software Corp社主催だった Automated Trading Championship の参加記録でしたが、今年から非公式のに。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

コンテストにEAジェネレータは使えるのか?(3)

EAジェネレータで生成されたEAのコードを読み解くこと数日、自分の能力の素人度を思い知らされた気がします。
筆者がいかにオブジェクト指向というものが理解できていなかったかを改めて認識しました。
やたらたくさんのクラスの組み合わせで作られているコードなので、単純なMAクロスのEAですら、一体どこでMAの計算そのものをしているのかもわかりません。
何か少しでも手を加えようとすると、ほぼ全てのクラスを読み理解しなければ思ったようにいじることが出来ないようです。

何だかよく解らないまま、とりあえずマルチシンボル化にトライしてみました。
まず単純なMAだけをシグナルとするEAを生成します。中身を見てみるとint OnInit()の中で全ての処理が記述されており、メインとなるvoid OnTick()の中身はExtExpert.OnTick();だけであることが解ります。

void OnTick()
{
ExtExpert.OnTick();
}
void OnTrade()
{
ExtExpert.OnTrade();
}
void OnTimer()
{
ExtExpert.OnTimer();
}

下の2つ、void OnTrade()とvoid OnTimer()も同じですが、今回は使わないので削除します。
さてここで呼び出されているExpert.mqhの中身を見てみると、

//--- returns false if the EA is initialized on a symbol/timeframe different from the current one
if(symbol!=Symbol() || period!=Period())
{
printf(__FUNCTION__+": wrong symbol or timeframe (must be %s:%s)",symbol,EnumToString(period));
return(false);
}

「チャートのシンボルと違ってたら、エラーにする」という部分があるので、このif文をばっさり削除し、ExpertMultiSymbol.mqhなどと名前をつけて保存。
同時に、EAの始めの方にある、

#include <Expert\Expert.mqh>

を、

#include <Expert\ExpertMultiSymbol.mqh>

と書き換えます。これでチャートのシンボルと関係なく、トレード対象を自由に指定できるようになりました。
さて、ここから先は力技です。

//+------------------------------------------------------------------+
//| Global expert object |
//+------------------------------------------------------------------+
CExpert ExtExpert;

これを、

//+------------------------------------------------------------------+
//| Global expert object |
//+------------------------------------------------------------------+
CExpert ExtExpert0;
CExpert ExtExpert1;
CExpert ExtExpert2;
CExpert ExtExpert3;
CExpert ExtExpert4;
CExpert ExtExpert5;
CExpert ExtExpert6;
CExpert ExtExpert7;
CExpert ExtExpert8;
CExpert ExtExpert9;
CExpert ExtExpert10;
CExpert ExtExpert11;

と書き換えて、12通貨ペア分別々のインスタンスを作ります。
次に、同じように初期化部分も関数化して12個作ります。

//+------------------------------------------------------------------+
//| Initialization function of the expert |
//+------------------------------------------------------------------+
int OnInit()
{
int res=SubInit0("USDCHF");
res=SubInit1("GBPUSD");
res=SubInit2("EURUSD");
res=SubInit3("USDJPY");
res=SubInit4("USDCAD");
res=SubInit5("AUDUSD");
res=SubInit6("EURGBP");
res=SubInit7("EURAUD");
res=SubInit8("EURCHF");
res=SubInit9("EURJPY");
res=SubInit10("GBPJPY");
res=SubInit11("GBPCHF");
//--- ok
return(0);
}

同じように下記も無造作に12個並べちゃいます。(インスタンスをループで回す方法がわからなかった・・・。)

//+------------------------------------------------------------------+
//| Deinitialization function of the expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert0.Deinit();
ExtExpert1.Deinit();
ExtExpert2.Deinit();
ExtExpert3.Deinit();
ExtExpert4.Deinit();
ExtExpert5.Deinit();
ExtExpert6.Deinit();
ExtExpert7.Deinit();
ExtExpert8.Deinit();
ExtExpert9.Deinit();
ExtExpert10.Deinit();
ExtExpert11.Deinit();
}
//+------------------------------------------------------------------+
//| "Tick" event handler function |
//+------------------------------------------------------------------+
void OnTick()
{
ExtExpert0.OnTick();
ExtExpert1.OnTick();
ExtExpert2.OnTick();
ExtExpert3.OnTick();
ExtExpert4.OnTick();
ExtExpert5.OnTick();
ExtExpert6.OnTick();
ExtExpert7.OnTick();
ExtExpert8.OnTick();
ExtExpert9.OnTick();
ExtExpert10.OnTick();
ExtExpert11.OnTick();
}

後は関数化したInt SubInit“番号”(string sym)を12個作り、元のInt OnInit()の中身をぶち込み、
中のSymbol()をsymに替え、ExtExpertをExtExpert“番号”に書き替えて完了です。

泣きたいほど不細工な、強引というか情けないコードですが、これで一応EAジェネレータで生成されたコードをマルチシンボル化することが出来ました。
オブジェクト指向の悪い例として教科書に出て来そうですが・・・。

この例では、使われているシグナルとそのパラメータは12シンボルで全て共通となっていますが、SubInit“番号”()の中身を通貨ペアごとに変えることも出来ますので、それぞれの通貨ペアごとに最適な手法とパラメータを与えることも可能です。そのへんのちゃんとしたEAジェネレータの使い方はコチラを参照してください。後は時間との勝負ですね。
http://blog-imgs-17.fc2.com/a/l/o/alohafx/simpleMAmulti_mq5.txt

次回、コンテストのルールに合わせたオーダー処理クラスとアップロードに関する注意について考えて見ます。(たぶん)

登録終了まで、2ヶ月と18日、現在までの参加(予定)者839名。

スポンサーサイト

PageTop
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。