【MT5】通貨強弱EAを4通貨ランキング型へ変更|勝率だけで判断しない開発記録

作業日記

こんにちは、潤奈です!

今回は、2026年10月4日〜5日の活動記録です。通貨強弱EAの開発では、押し目を待つ方式から、4通貨の順位と強弱差で順張りする方式へ変更しました。

変更のきっかけは、「勝率が半分を超えていても、損益がマイナスになるのはなぜか」という疑問です。実際のMQL5コードの一部と、設計を見直した理由をまとめます。

勝率58.5%でも、利益が残らなかった

10月4日は、前回のv2の取引ログを掘り下げました。ADXが20未満だった取引を取り出すと、次の結果でした。ADXはトレンドの強さを見るための指標で、今回は取引を分類する目安に使っています。

項目v2のログから抽出した結果
対象USDJPY・既存バックテスト595件のうちADXが20未満の取引
取引数171回(100勝・71敗)
勝率58.5%
勝ち取引の平均約+19.1pips
負け取引の平均約−41.3pips
合計−1,024.8pips

半分以上は勝っていますが、1回の負けが平均的な勝ちの2倍以上あります。丸めた数値で計算すると、1取引あたりの平均は「0.585 × 19.1 − 0.415 × 41.3 ≒ −6.0pips」です。

これは過去のバックテストログを再集計した値です。実運用の損益でも、設定変更後のテスト結果でもありません。また、pipsの集計はロットや手数料などを含む口座損益とは区別して見ています。

フィルター追加の前に、基本の考え方を整理する

開発中には、ADXによるエントリー制限や、押し目として扱う価格帯の絞り込みも追加しました。ただ、機能が増えるほど、何が効いて何が効いていないのか分かりにくくなります。

そこで、すぐに最適化へ進む前に、通貨強弱をどう売買へ結び付けるかを考え直しました。今回選んだのは「強い通貨を買い、弱い通貨を売る」という順張りです。

押し目を狙う方法全体が間違っていると結論付けたわけではありません。今回のEAでは、まず検証する考え方を絞ることにしました。

4通貨・6ペアから強弱を計算する

新しく作成したv3では、比較対象をUSD・EUR・JPY・GBPの4通貨にしました。使用する価格は、EURUSD、GBPUSD、USDJPY、EURJPY、GBPJPY、EURGBPの6ペアです。

以下は、実装から抜粋した強弱計算の部分です。各ペアの確定足終値と、計算期間分だけ前の終値から対数変化率を求めています。

// Crossの順番: EURUSD, GBPUSD, USDJPY, EURJPY, GBPJPY, EURGBP
double Cross[6];
for(int i = 0; i < 6; i++)
  {
   Cross[i] = MathLog(now_close[i] / past_close[i]) * 10000.0;
  }

double raw_strength[G4_COUNT];
raw_strength[G4_USD] = -Cross[0] - Cross[1] + Cross[2];
raw_strength[G4_EUR] =  Cross[0] + Cross[3] + Cross[5];
raw_strength[G4_GBP] =  Cross[1] + Cross[4] - Cross[5];
raw_strength[G4_JPY] = -Cross[2] - Cross[3] - Cross[4];

例えばEURUSDが上がれば、この計算ではEUR側にプラス、USD側にマイナスを付けます。各通貨について3つのペアの変化を合計し、その後0〜10の範囲へ変換して順位を付けます。

この加減算では、変換前の4通貨のスコア合計はゼロになります。ただし、合計がゼロになること自体が、売買の優位性を示すわけではありません。

4通貨に絞れば比較する範囲は明確になります。その一方で、対象外の通貨の動きは順位へ直接反映されなくなります。どちらが良いかは、検証して判断する部分です。

順位だけでなく、強弱差と上位足も確認する

USDJPYの買いなら、基本設定ではUSDが1位、JPYが4位であることを求めます。さらに、執行足の強弱差と、上位足H4の方向も確認します。

bool buy_rank_condition = false;
if(InpRequireTopRank)
   buy_rank_condition = (base_rank == 1 && quote_rank == 4);
else
   buy_rank_condition = (base_rank <= 2 && quote_rank >= 3);

bool buy_diff_condition = (diff >= InpMinStrengthDiff);

実際の買い判定は、この2条件に上位足の買い条件であるhtf_bullを加えています。上位足フィルターが有効なら、H4の強弱差が設定値以上であることも必要です。売りは順位と強弱差の向きを逆にします。

つまり、ランキングへ変えたからといって、数値の設定が不要になったわけではありません。順位が離れていても強弱差が小さい場面をどう扱うか、という条件は残しています。

なお、コードは「ハイブリッド通貨強弱EA_v3.mq5」の一部です。配列や変数の定義、価格取得、発注処理などは省略しているため、この部分だけではEAとして動作しません。執行足はチャートの時間足を使い、今回はH1での使用を想定しています。

損切り25pips・利確50pipsを出発点にする

v3の初期設定では、固定の損切り幅を25pips、利確幅を50pipsにしました。設定上は、損失1に対して利益2を狙う形です。

ただし、建値移動とトレイリングストップは残しています。建値移動は+20pipsで発動して建値から+2pipsへ損切り位置を移し、トレイリングは+35pipsから追従を始める設定です。

途中で決済されることがあるため、実際の平均利益と平均損失が1対2になるとは限りません。ここも、テスト後に確認する必要があります。

短期の強弱反転による手仕舞いは初期設定で無効にし、H4側の反転による手仕舞いは残しました。ADXと時間帯のフィルターは任意機能として残っていますが、初期設定では無効です。

次に確認すること

取引ログには、エントリー時の順位、強弱差、ADX、最大含み益・最大含み損などを残しています。次は、取引回数だけでなく、勝ち負けの平均幅や決済理由を見て、変更の影響を確かめたいと思います。

コメント

タイトルとURLをコピーしました