MT4のEAについてです。ご教授下さい。 自作でEAを作成しています。2つ有効なEA…

MT4のEAについてです。ご教授下さい。

自作でEAを作成しています。2つ有効なEAが出来たのですが、1つはUSDJPYにて、もう1つはEURUSDを用いるものです。

当方資金不足にて、複数のポジションを持ちたくなく、ポジションは常に1つにしたいです。また、1つめのEA(USDJPY)のほうが利率が高いためそちらを最優先とし、そちらで取引がされていない場合、2つ目のEURUSDが稼働するというようにしたいのです。

同通貨であれば、2つのロジックを1つのEAにできますが(実際2つのロジックを組み込んでいます)、別通貨となるとそれがおそらく出来ないため困っております。

実際にどちらのEAも中身のロジックは同じなのですが、やはり取引回数が多くないため、それを稼ぐために2つ稼働の優先順位を決めて1ポジションで行いた い塙佑┐討ります。

他EAのマジックナンバーを読み取りif文で判別出来たりしないのでしょうか。。すみません、ご存知の方がいれば教えて頂けると助かります。また、出来ることならバックテストも可能であるかも知りたいです。

よろしくお願い致します。

回答1

複数の通貨ペアにEAを設置した際にトレード優先順をコントロールするには、下記のような方法などが挙げられます。

1.クライアントターミナルのグローバル変数を用いる方法
2.ロックファイルを用いる方法

上記はいずれもUSDJPY側のEAで処理状況を変数・ロックファイルに書込んで、EURUSD側のEAでこれを読込んで判定する方法となります。また、上記のうち、比較的シンプルな1.の方法についての実装例は下記のようになります。

【実装例】
void OnTick()
{

//略:イグジット判定

//イグジット処理直後の処理
//このEAを実行している通貨ペアがUSDJPYの場合
if(StringCompare("USDJPY",_Symbol)==0)
{
//動作確認用
Print("USDJPYのトレード終了。");
//クライアントターミナルのグローバル変数「 USDJPY最終イグジット日時」にを現在日時を設定
GlobalVariableSet("USDJPY_LastExitTime",TimeCurrent());
}

//略

//エントリー判定直前の処理
//このEAを実行している通貨ペアが(EURUSD等)USDJPY以外の場合
if(StringCompare("USDJPY",_Symbol)!=0)
{
//現在時間枠の秒単位を取得
int PintPeriodSeconds=PeriodSeconds(_Period);
//クライアントターミナルのグローバル変数「USDJPY最終バー位置での処理日時」を取得
datetime PdttProcess_USDJPY=(datetime)NormalizeDouble(GlobalVariableGet("USDJPY_LastProcessBarTime"),0)/PintPeriodSeconds*PintPeriodSeconds;
//動作確認用
Print("PdttProcess_USDJPY=",PdttProcess_USDJPY);
Print("Time[0](int)=",(int)Time[0]);

//USDJPY側の最終バー位置でまだ処理が完了していない場合
if(PdttProcess_USDJPY<Time[0])
{
//動作確認用
Print("USDJPY最新バーはEA未判定のため、処理見送り。");
//USDJPYの処理を最優先にするため、今回のOnTickイベント処理を見送る
return;
}

//USDJPY関連のクライアントターミナルのグローバル変数を取得
datetime PdttEntry_USDJPY=(datetime)NormalizeDouble(GlobalVariableGet("USDJPY_LastEntryTime"),0);//最終エントリー日時
datetime PdttExit_USDJPY =(datetime)NormalizeDouble(GlobalVariableGet("USDJPY_LastExitTime"), 0);//最終イグジット日時
//動作確認用
Print("PdttEntry_USDJPY=",PdttEntry_USDJPY);
Print("PdttExit_USDJPY=",PdttExit_USDJPY);

//取得した最終エントリー日時が最終イグジット日時よりも新しい場合
if(PdttEntry_USDJPY>PdttExit_USDJPY)
{
//動作確認用
Print("USDJPYトレード中のため、処理見送り。");
//USDJPYでトレ 璽秒罎任△襪海箸鮗┐垢燭瓠∈2鵑OnTickイベント処理を見送る
return;
}

//動作確認用
Print("USDJPYトレード・オフのため、",_Symbol,"でのエントリー判定可能。");
}

//略:エントリー判定処理

//エントリー処理直後の処理
//このEAを実行している通貨ペアがUSDJPYの場合
if(StringCompare("USDJPY",_Symbol)==0)
{
//動作確認用
Print("USDJPYでトレード発生。");
//クライアントターミナルのグローバル変数「USDJPY最終エントリー日時」にを現在日時を設定
GlobalVariableSet("USDJPY_LastEntryTime",TimeCurrent());
}

//略

//このEAを実行している通貨ペアがUSDJPYの場合
if(StringCompare("USDJPY",_Symbol)==0)
{
//動作確認用
Print(&qu ot;USDJPY最新バーのEA判定完了。");
//クライアントターミナルのグローバル変数「USDJPY最終バー位置での処理日時」に現在足の日時を設定
GlobalVariableSet("USDJPY_LastProcessBarTime",Time[0]);
}

}//OnTick()の対中括弧

【複数通貨ペアのバックテストについて】

下記のような方法が挙げられます。

1.有料ソフトを用いる方法
2.無料ソフトを用いる方法
3.自力で行なう方法

上記1.2.については、検索キーワード「MT4 複数同時 バックテスト」などで詳細な情報が得られると思われます。また、上記3.の例としては下記のような方法が挙げられます。

【自力バックテスト例】

1.EURUSDバックテストを一時停止してUSDJPY関連のクライアントターミナルのグローバル変数をコントロールするカスタムインディケータを実行中のチャートに起動させる方法
2. USDJPYとEURUSDのテスト結果をエクセルなどを用いて集計する方法

上記のうちのいずれにおいても先にUSDJPYのバックテストをして、エントリー&イグジット日時の情報を出力しておく必要があります。出力した情報またはこれをもとに事前にdatetime型の二次元配列に加工したものをIsTesting()限定でEAから読込んだり、カスタムインディケータからUSDJPY関連のクライアントターミナルのグローバル変数をコントロールする方法になります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA