こんにちは、潤奈です!
今回は、2026年10月6日の通貨強弱EA開発記録です。前回作成した4通貨ランキング型のv3をテストし、損切り・利確を固定pipsからATR連動へ変更しました。
さらに、建値移動とトレイリングもATR連動にしたv4を作成。ただ、こちらはテスト結果が悪化したため、値幅に下限を設ける修正まで進めました。
最終損益だけでなく、途中の下落を見る
朝のv3の分析では、2,014取引の合計が+858.9pipsでした。それでも、途中で下がるところや停滞するところが気になり、取引ログを確認しました。
その後、H4の強弱差に上限を付ける過熱フィルターを追加。建値移動の発動幅を15pipsにしたテストや、H4強弱差の下限を2.0にしたテストも行いました。
ただし、特定の年だけ悪かった時間帯を、すぐに除外したいわけではありません。他の年に取れていた利益まで失わないか、という点も見ています。
夜は、調整に使った2010年〜2019年とは期間をずらして、2019年〜2025年を確認しました。そこでの固定pips版は510取引、合計+104.9pips。最終的にはプラスでも、十分に安定したとは言えない結果でした。
損切り・利確を、そのときの値動きに合わせる
次に考えたのが、相場の変動幅に対して、固定の損切り・利確幅が合っているかという点です。
そこで、値動きの大きさを測るATRを使い、v3の損切り・利確を調整する方式に変更しました。実装の初期設定はATR期間14、損切りがATRの2倍、利確が4倍です。建値移動とトレイリングの幅は、この段階では固定pipsのままです。
以下は、当日の分析出力に残っている結果です。USDJPYのH1を対象とした開発中のバックテストで、実運用成績ではありません。
| 2019/1/1〜2025/12/31のテスト | 固定pips決済のv3 | SL・TPをATR連動にしたv3 |
|---|---|---|
| 取引数 | 510回 | 449回 |
| 勝率 | 62.55% | 64.37% |
| 合計損益 | +104.9pips | +628.7pips |
| pipsベースのPF | 1.02 | 1.11 |
| 累積pipsの最大下落幅 | 561.7pips | 496.7pips |
PFは、利益pipsの合計を損失pipsの絶対値の合計で割った値です。最大下落幅も、確定した取引の累積pipsから算出しています。ロット・手数料などを含む口座損益や、含み損を含む証拠金のドローダウンとは異なります。
ATR版の数値は改善しました。ただし、各回の全入力設定・テスターモデルをそろえた保存資料までは確認できていないため、改善分をすべてATRだけの効果と断定せず、当日の開発比較として扱います。
また、調整期間と比較期間には2019年の重複があります。完全に独立した検証ではありません。後の期間の結果を見て設計を変更している点も含め、最終確認には、期間の重複をなくし、調整に使っていないデータを残す必要があります。
トレイリングまでATR連動にすると、結果は悪化した
損切り・利確をATRに合わせるなら、利益を守る側の幅も合わせた方がよいのではないか。そう考えて、建値移動とトレイリングをATR倍率で計算するv4を作りました。
しかし、2010年〜2019年のテストでは、次の結果になりました。
| 2010/1/1〜2019/12/31のテスト | v3:SL・TPのみATR連動 | v4:建値・追従幅もATR連動、下限追加前 |
|---|---|---|
| 取引数 | 608回 | 598回 |
| 合計損益 | +1,883.6pips | +1,197.6pips |
| pipsベースのPF | 1.31 | 1.18 |
| 累積pipsの最大下落幅 | 521.4pips | 726.1pips |
一つの仮説は、ATRが小さい場面では、建値移動やトレイリングの発動が早くなりすぎることです。例えばATRが10pipsなら、1.5倍の建値移動トリガーは15pips、2.5倍のトレイリング開始幅は25pipsになります。
ただ、集計だけで悪化の原因が一つに決まるわけではありません。「ATRに合わせれば必ず良くなる」と考えず、次の修正をテストすることにしました。
MathMaxで、ATR連動の値幅に下限を付ける
10月6日の最後に追加したのが、ATR倍率で求めた距離と固定の最低幅を比べ、大きい方を使う処理です。
建値移動では、最低20pipsとATRの1.5倍を比較します。以下は、当日のv4修正記録からの抜粋です。
double trigger_dist = MathMax(InpMinBreakEvenPips * pips_unit, atr_val * InpBreakEvenAtrMultiplier);
atr_valは価格単位のATRです。最低幅の設定値はpipsなので、pips_unitを掛けて価格単位にそろえてから比較します。
初期設定なら、ATRが10pipsのときは20pips、ATRが28pipsのときは42pipsまで利益が伸びたところで、建値移動の発動条件を満たします。これは発動までの距離で、建値移動後の確保幅は別設定の2pipsです。
トレイリングも同じ考え方です。開始幅は最低35pips、追従幅は最低20pipsとしました。
double start_dist = MathMax(InpMinTrailingStartPips * pips_unit, atr_val * InpTrailingStartMultiplier);
double stop_dist = MathMax(InpMinTrailingStopPips * pips_unit, atr_val * InpTrailingStopMultiplier);
double step_dist = atr_val * InpTrailingStepMultiplier;
開始幅のATR倍率は2.5、追従幅は1.5です。更新刻みのstep_distはATRの0.3倍のままで、この日の修正では下限を追加していません。
コードは距離を求める部分だけです。ATR取得、pips換算、保有注文の確認、損切り位置の更新処理などを省略しているため、この抜粋だけでは動作しません。10月7日以降の変更も含めず、10月6日時点の実装を紹介しています。
下限を追加した効果は、次のテストで確認する
下限付きv4は、10月6日23時44分ごろに0エラー・0警告でコンパイルできています。ただし、この日の記録で確認できたのは実装までです。下限追加後のテスト結果は、今回の記事には含めていません。
なお、v4には損失後の再エントリーを一定時間止める機能も追加されていますが、初期設定は0時間で無効です。その効果を確認済みという扱いにはしていません。
今回進んだのは、ATR連動を試し、うまくいかなかった部分に最低幅を設けるところまで。次は基準期間で確認し、良かった数字だけでなく、悪化した期間や取引の変化も見ていきます。



コメント