Photo by Marga Santoso on Unsplash
最終更新: 2026年07月
ブレイクアウト戦略は、N期間の高値・安値を価格が突破した瞬間にポジションを取る、シンプルかつ実績のある手法だ。「シンプルだから実装も簡単」と思われがちだが、実際にMQL5で動くコードを書こうとすると、MQL4との関数仕様の違い、確定足判定、バックテストモデルの選択基準など、いくつかのハマりポイントが待ち受けている。本記事では、筆者がMQL5でドンチャンチャネル型ブレイクアウトEAを実装した経験をもとに、コードの内部ロジックからバックテスト検証、カーブフィッティング回避まで体系的に解説する。
ブレイクアウトEAの基本設計思想
FXブレイクアウトEAは、N期間の高値・安値突破をトリガーに自動エントリー・エグジットを行う順張りシステムだ。エントリー条件の定義・相場フィルター・リスク管理の3層設計がパフォーマンスを左右する。
高値・安値ブレイクアウトとは何か
ブレイクアウト(Breakout)の定義は単純だ。「直近N本の高値を現在のバーが上回ったら買い、安値を下回ったら売り」という条件式が核心となる。有名な実装例としてタートルズのドンチャンチャネルがある。
- System 1(短期): 過去20日間の最高値・最安値でエントリー、過去10日間の反対方向更新でエグジット
- System 2(長期): 過去55日間の最高値・最安値でエントリー、過去20日間の反対方向更新でエグジット
直感的には「勢いのある方向に乗る」順張り戦略だが、数理的には価格の自己相関(serial correlation)が短期ではほぼゼロでも、中長期では正の相関が観測されやすいという性質を利用している。
終値確定後エントリー vs 即時エントリー
ブレイクアウトEAの設計で最初に決めるべき仕様がある。「バンドを突破した瞬間に成行注文を出すか、そのバーが確定してから次のバーで注文するか」だ。
即時エントリー(ティック判定) は期待収益が高い反面、ウィックによる偽ブレイクの影響を受けやすい。終値確定後エントリー はダマシを減らせるが、強いブレイクアウト時には有利なレートを逃しやすい。
筆者が検証した範囲では、日足ベースのブレイクアウトは終値確定後(翌日の逆指値注文)の方が安定した結果を示す傾向があった。一方、1時間足以下では即時判定の方がPF(プロフィットファクター)が優位になるケースも見られた。どちらが正解かはバックテストで確かめるしかない。
エントリー条件とフィルター設計
最低限必要なフィルターは以下の3種類だ。
- 方向フィルター: 長期トレンドと同方向のみエントリー(例: 200MAより上なら買いのみ)
- ボラティリティフィルター: ATRが直近平均の0.5倍以下のレンジ相場では不発動
- 時間フィルター: 流動性が低い時間帯(例: 土日・東京時間の深夜)は除外
フィルターを増やすほどバックテストの結果は向上しやすいが、同時にカーブフィッティング(過最適化)のリスクも上がる。後述するが、フィルターの数は「なぜこのフィルターが機能するのかを論理的に説明できるもの」に限定するのが原則だ。
MQL5実装のコアコード解説
MQL5でブレイクアウトEAを実装する際の核心は、ハンドル方式のインジケータAPI・確定足の自前判定・CTradeクラスによる注文管理の3点にある。MQL5でのEA作成の基礎についてはMQL5でEAを作る手順と実装方法も合わせて参照してほしい。
iHighestとiHighによる高値・安値帯域の計算
MQL5でN期間の最高値を取得するには、二段階の処理が必要になる。
// Step1: iHighestでN期間内の最高値のバーインデックスを取得
// ※ start=1 は「1本前から遡る」意味(現在足を含まない終値確定ベース)
int highestIndex = iHighest(_Symbol, PERIOD_D1, MODE_HIGH, 20, 1);
// Step2: そのインデックスの実際の高値を取得
double upperBand = iHigh(_Symbol, PERIOD_D1, highestIndex);
// 下限帯域も同様
int lowestIndex = iLowest(_Symbol, PERIOD_D1, MODE_LOW, 20, 1);
double lowerBand = iLow(_Symbol, PERIOD_D1, lowestIndex);
iHighest() の第5引数 start を 1 にすることで、現在の未確定バーを除外した計算になる。ここを 0 にすると、形成途中のバーが含まれてしまい終値確定判定の意味が崩れる。見落としやすいが重要な仕様だ。
MQL5にOnBar関数は存在しない
ネット上の解説記事には「OnBar()関数で確定足を処理する」という記述が散見されるが、これは誤りだ。MQL5の標準イベントハンドラに OnBar() は存在しない。OnTick()の中で「新しいバーが開いたか」を自分で判定する実装が正しい。
// 新規バー判定関数(staticで前回のバー時刻を記憶)
bool IsNewBar(string symbol, ENUM_TIMEFRAMES tf) {
static datetime lastBarTime = 0;
datetime currentBarTime = iTime(symbol, tf, 0);
if(currentBarTime != lastBarTime) {
lastBarTime = currentBarTime;
return true;
}
return false;
}
void OnTick() {
// 新しいバーが開いた瞬間のみ以降の処理を実行
if(!IsNewBar(_Symbol, PERIOD_H1)) return;
// ← ここにブレイクアウト判定ロジックを書く
}
CTradeクラスによる注文発注と動的ストップロス設定
MQL5での注文発注は CTrade クラス一択だ。OrderSend() の生API呼び出しに比べてコードが読みやすく、エラーハンドリングも内包されている。
CTrade.BuyStop() と OrderSend() のどちらを使うべきか、という問いは何度か受けた。答えは明確で、新規実装なら CTrade 一択だ。エラーリトライ・マジックナンバー管理・スリッページ設定がメソッドチェーンで書けるので、生の OrderSend() に戻る理由がない。
以下に、ドンチャンチャネル型ブレイクアウトEAの完全版コードを示す。コメントを読めばロジックの流れが把握できるよう設計した。
//+------------------------------------------------------------------+
//| DonchianBreakoutEA.mq5 |
//| ドンチャンチャネル型ブレイクアウトEA (完全版) |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026"
#property version "1.00"
#include <Trade/Trade.mqh>
//--- 入力パラメータ
input int InpBreakoutPeriod = 20; // ブレイクアウト期間(本)
input int InpExitPeriod = 10; // エグジット期間(本)
input double InpLotSize = 0.1; // ロットサイズ
input int InpATRPeriod = 14; // ATR期間
input double InpATRMultiplier = 2.0; // ストップロスのATR倍率
input int InpMagicNumber = 20001; // マジックナンバー
input int InpMaxSlippage = 5; // 最大スリッページ(ポイント)
input int InpStartHour = 1; // 取引開始時刻(時)
input int InpEndHour = 22; // 取引終了時刻(時)
CTrade trade;
int atrHandle;
//+------------------------------------------------------------------+
//| 初期化 |
//+------------------------------------------------------------------+
int OnInit() {
trade.SetExpertMagicNumber(InpMagicNumber);
trade.SetDeviationInPoints(InpMaxSlippage);
// ATRハンドルを取得(MQL5ではハンドル方式)
atrHandle = iATR(_Symbol, PERIOD_CURRENT, InpATRPeriod);
if(atrHandle == INVALID_HANDLE) {
Print("ATRハンドルの取得に失敗しました");
return INIT_FAILED;
}
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| ハンドル解放 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
IndicatorRelease(atrHandle);
}
//+------------------------------------------------------------------+
//| ティック処理 |
//+------------------------------------------------------------------+
void OnTick() {
// 確定足のみ処理(OnBar相当の自前実装)
if(!IsNewBar(_Symbol, PERIOD_CURRENT)) return;
// 時間フィルター(セッション限定)
int currentHour = TimeHour(TimeCurrent());
if(currentHour < InpStartHour || currentHour >= InpEndHour) return;
// ATR値を取得(MQL5ハンドル方式:CopyBufferが必須)
double atrBuffer[];
ArraySetAsSeries(atrBuffer, true);
if(CopyBuffer(atrHandle, 0, 1, 1, atrBuffer) < 1) {
Print("ATRデータのコピーに失敗しました");
return;
}
double atrValue = atrBuffer[0];
// ボラティリティフィルター(ATRが極端に低い場合は不発動)
if(atrValue <= 0) return;
// N期間の高値・安値帯域を計算
int highestIndex = iHighest(_Symbol, PERIOD_CURRENT, MODE_HIGH, InpBreakoutPeriod, 1);
int lowestIndex = iLowest(_Symbol, PERIOD_CURRENT, MODE_LOW, InpBreakoutPeriod, 1);
double upperBand = iHigh(_Symbol, PERIOD_CURRENT, highestIndex);
double lowerBand = iLow(_Symbol, PERIOD_CURRENT, lowestIndex);
// エグジット帯域(ポジション決済判定用)
int exitHighIndex = iHighest(_Symbol, PERIOD_CURRENT, MODE_HIGH, InpExitPeriod, 1);
int exitLowIndex = iLowest(_Symbol, PERIOD_CURRENT, MODE_LOW, InpExitPeriod, 1);
double exitHigh = iHigh(_Symbol, PERIOD_CURRENT, exitHighIndex);
double exitLow = iLow(_Symbol, PERIOD_CURRENT, exitLowIndex);
// 現在の終値(前確定バー)
double closePrice = iClose(_Symbol, PERIOD_CURRENT, 1);
double spread = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID);
// ポジション管理
bool hasBuyPos = false;
bool hasSellPos = false;
for(int i = 0; i < PositionsTotal(); i++) {
if(PositionGetSymbol(i) == _Symbol &&
PositionGetInteger(POSITION_MAGIC) == InpMagicNumber) {
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) hasBuyPos = true;
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) hasSellPos = true;
}
}
// エグジット判定:買いポジション → 安値帯域を下回ったら決済
if(hasBuyPos && closePrice < exitLow) {
CloseAllPositions(POSITION_TYPE_BUY);
}
// エグジット判定:売りポジション → 高値帯域を上回ったら決済
if(hasSellPos && closePrice > exitHigh) {
CloseAllPositions(POSITION_TYPE_SELL);
}
// エントリー判定(ポジションなしの場合のみ)
if(!hasBuyPos && !hasSellPos) {
// 上方ブレイクアウト → 逆指値買い注文
if(closePrice > upperBand) {
double sl_buy = NormalizeDouble(upperBand - atrValue * InpATRMultiplier, _Digits);
trade.Buy(InpLotSize, _Symbol, 0, sl_buy, 0, "Donchian Breakout BUY");
}
// 下方ブレイクアウト → 逆指値売り注文
else if(closePrice < lowerBand) {
double sl_sell = NormalizeDouble(lowerBand + atrValue * InpATRMultiplier, _Digits);
trade.Sell(InpLotSize, _Symbol, 0, sl_sell, 0, "Donchian Breakout SELL");
}
}
}
//+------------------------------------------------------------------+
//| 新規バー判定(OnBar相当) |
//+------------------------------------------------------------------+
bool IsNewBar(string symbol, ENUM_TIMEFRAMES tf) {
static datetime lastBarTime = 0;
datetime currentBarTime = iTime(symbol, tf, 0);
if(currentBarTime != lastBarTime) {
lastBarTime = currentBarTime;
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| 全ポジション決済(指定タイプ) |
//+------------------------------------------------------------------+
void CloseAllPositions(ENUM_POSITION_TYPE posType) {
for(int i = PositionsTotal() - 1; i >= 0; i--) {
if(PositionGetSymbol(i) == _Symbol &&
PositionGetInteger(POSITION_MAGIC) == InpMagicNumber &&
PositionGetInteger(POSITION_TYPE) == posType) {
trade.PositionClose(PositionGetInteger(POSITION_TICKET));
}
}
}
MQL5のコード設計でロジックの整理が難しいとき、AIと対話しながらEA構造を詰める方法もある。Claudeと会話しながらインジケータが作れる Hedgrow FX を、実装ステップの壁越えに活用してほしい。
MQL5のiATR関数:MQL4と何が違うのか
MQL5のiATR()がMQL4と根本的に異なるのは、関数の戻り値がdouble型のATR値ではなくint型のインジケータハンドルである点だ。実際の数値データはCopyBuffer()で別途取り出す必要がある。
ハンドル方式という根本的な違い
MQL4の iATR() は呼び出した瞬間に double 型のATR値を直接返してくれた。MQL5の iATR() はまず インジケータハンドル(int型の整数) を返すだけで、実際の数値データは別途 CopyBuffer() で取り出す必要がある。
// NG: MQL4的な感覚でそのままATR値として使おうとするとint型が返るだけ
// double atValue = iATR(_Symbol, PERIOD_H1, 14); // ← 間違い
// 正しい MQL5 の書き方
int atrHandle = iATR(_Symbol, PERIOD_H1, 14); // ハンドル取得(OnInitで1回だけ)
double atrBuffer[];
ArraySetAsSeries(atrBuffer, true);
CopyBuffer(atrHandle, 0, 1, 1, atrBuffer); // 1本前の確定バーの値を取得
double atrValue = atrBuffer[0];
CopyBuffer() の第3引数(start)は 1 固定だ。0 にすると現在の未確定バーのATRが返る。確定足ベースで戦略を組んでいる限り、ここは絶対に 1 にする。
ハンドルはOnInitで一度だけ取得する
iATR() はOnTick()内で毎回呼ぶのではなく、OnInit() で一度だけ取得してグローバル変数に保持する。毎回呼ぶとシステムにハンドルが蓄積されリソースリークになる。OnDeinit() での IndicatorRelease() 呼び出しも欠かせない。省くと長時間稼働でMT5がメモリを食いつぶしていく。
バックテスト手順と検証の方法論
Photo by Nick Chong on Unsplash
FXブレイクアウトEAのバックテストでは、MT5ストラテジーテスターのティックモデル選択・テスト期間の長さ・ウォークフォワード検証の3ステップが検証精度の基盤となる。
MT5ストラテジーテスターのモデル選択
MT5のストラテジーテスターには複数のティックモデルが用意されている。選択を誤ると検証結果の精度と実際の運用成績がかけ離れる。
| モデル | 精度 | 速度 | 推奨用途 |
|---|---|---|---|
| リアルティック(Real ticks) | 最高 | 最低(例: 74秒) | 最終検証・公開前チェック |
| 全ティック(Every tick) | 高 | 中 | 通常の開発検証 |
| 1分足OHLC(OHLC on M1) | 低 | 最高(例: 1.57秒) | 高速パラメータスキャン |
(速度の数値はsys-tre.comの実測データを参考にした)
開発フェーズでは「OHLC on M1」でパラメータの広範囲スキャンを行い、有望なパラメータ候補が絞れたら「Every tick」で再確認する。公開前の最終チェックは「リアルティック」で行うというワークフローが効率的だ。
バックテスト期間の設計
バックテスト期間が短すぎると、リーマンショック・コロナショックのような相場環境を網羅できない。私が最低ラインとしているのは5〜10年分のデータだ。
参考値として、ドル円の15年バックテストで記録された実績として「PF(プロフィットファクター)1.52、勝率54.8%、取引回数3213回」というデータがある(出典: kuroda-yuusuke.com)。EAの安定運用実績として参照されるPF範囲は1.5〜2.0前後だ(出典: ea-bank.com)。この数値はその下限付近に位置する。PF基準の詳細についてはPF基準についてはこちらを参照してほしい。
ただし、これはあくまで過去データの検証結果であり、将来の収益を保証するものではない。
ウォークフォワードテストの組み方
バックテストだけでは過最適化の発見が難しい。ウォークフォワードテスト(Walk-Forward Test)では以下の手順をとる。
- 全データを「最適化期間」と「テスト期間」に分割(比率は最低3:1が目安)
- 最適化期間でパラメータを最適化する
- テスト期間でそのパラメータが機能するかを検証する
- ウィンドウをずらして繰り返す(複数セクションの平均値で判断)
私が基準にしているのは、テスト期間のPFが最適化期間の70%以上を維持しているかどうかだ。数値は通貨ペアやブローカーの環境で変動するが、これを下回るようなら再設計を検討する。
典型的な落とし穴とその回避策
ブレイクアウトEAのバックテスト検証で特に注意すべき落とし穴は、カーブフィッティング・スリッページ過小評価・ニュースイベント時の偽ブレイクアウトの3種類だ。
カーブフィッティングの定量チェック
カーブフィッティング(過最適化)は、EAをバックテストデータに過剰適合させてしまう現象だ。バックテストでは輝かしいPFを示すのに、実際に運用すると全く機能しないという状況の主因となる。
定量的なチェック方法として以下の3点を実施するのが有効だ。
1. パラメータ堅牢性チェック
最適パラメータを±10〜20%変化させたとき、パフォーマンスが急激に劣化するなら過最適化の疑いが強い。例えばブレイクアウト期間の最適値が20の場合、17〜23の範囲でも安定したPFが出るかを確認する。
2. モンテカルロ検証
トレードの順序をランダムにシャッフルして1000回シミュレーションを回す。50%以上のシナリオで資産曲線がプラスを維持するなら堅牢性合格の目安となる。MetaTrader上では外部ツール(StrategyQuantなど)が必要になる。
3. アウトオブサンプルテスト
最適化に使っていない期間でのテスト結果を必ず確認する。過去2年間のデータを意図的にバックテストから除外し、「後から見る」形で評価する。
カーブフィッティング回避の手法をさらに体系的に整理したい場合はEAのカーブフィッティング回避法も参考にしてほしい。
スリッページとスプレッドの現実的な設定
ブレイクアウトEAは価格が急動する瞬間にエントリーするため、スリッページの影響を受けやすい。バックテストのスプレッド設定を実際のブローカーのスプレッドと合わせることは最低条件だ。
さらに重要なのが、ブレイクアウト直後の「瞬間的なスプレッド拡大」だ。指標発表直後には通常の3〜5倍のスプレッドが発生することもある。バックテスト時はスプレッドの設定を「通常値の2倍」程度にしてストレステストをかけておくと、実運用とのギャップを縮める効果がある。
ニュースイベント時のフィルター実装
経済指標発表の直前直後はスプレッドが拡大し、一方向に数十pips飛ぶこともある。こうした局面では、ブレイクアウトの「本物度」を見極めることが極めて難しくなる。
実装上は「MQL5からEconomic Calendarイベントを取得してフィルタリングする」方法が考えられるが、これはやや実装コストが高い。最もシンプルな代替として、米国雇用統計(NFP)・FOMC・日銀政策決定会合の前後30分を TimeCurrent() と事前登録した日時リストで除外する方法がある。
プロが行うブレイクアウトEAのチューニング
Photo by Kanchanara on Unsplash
実運用に耐えるブレイクアウトEAへのチューニングは、ATRベースの動的ストップロス・ボラティリティフィルター・時間フィルターの3点が基本軸だ。ロット計算とリスク管理の設計についてはFXポジションサイジングの基本も合わせて参考にしてほしい。
ATRによる動的ストップロス設定
固定pipsのストップロスには大きな問題がある。ボラティリティが高いときは損切りラインが近すぎてノイズで刈られ、低いときは損失が大きくなりすぎる。ATRを使った動的ストップロスはこの問題を解消する。
上述の完全版コードで実装しているように、エントリー価格からATRの2倍を控除した水準をストップロスとする方法が基本形だ。
// ATRベースのストップロス計算
double sl_buy = entryPrice - (atrValue * InpATRMultiplier);
double sl_sell = entryPrice + (atrValue * InpATRMultiplier);
ATR倍率(InpATRMultiplier)の最適値は通貨ペアと時間足に依存する。日足では2.0〜3.0倍が参考レンジとなることが多いが、これも必ずバックテストで確認が必要だ。
ボラティリティフィルターの実装
レンジ相場ではブレイクアウト戦略は機能しにくい。ATRが直近の平均を大きく下回っているとき(低ボラティリティ状態)はエントリーを見送る。それだけで無駄な損切りが体感でかなり減る。
// ATRの短期平均と長期平均を比較してボラティリティ状態を判定
double atrShortBuffer[];
double atrLongBuffer[];
ArraySetAsSeries(atrShortBuffer, true);
ArraySetAsSeries(atrLongBuffer, true);
// 短期ATR(5期間)と長期ATR(20期間)の比率でフィルター
int atrShortHandle = iATR(_Symbol, PERIOD_CURRENT, 5);
int atrLongHandle = iATR(_Symbol, PERIOD_CURRENT, 20);
CopyBuffer(atrShortHandle, 0, 1, 1, atrShortBuffer);
CopyBuffer(atrLongHandle, 0, 1, 1, atrLongBuffer);
double volRatio = atrShortBuffer[0] / atrLongBuffer[0];
// 短期ATRが長期ATRの0.7倍未満ならレンジ相場と判定してスキップ
if(volRatio < 0.7) return;
このフィルターを加えるとトレード頻度は下がるが、バックテスト上のPFが改善するケースが多い。ただし前述のとおり、改善が過最適化によるものでないか必ずウォークフォワードテストで確認すること。
時間フィルターとセッション限定取引
ブレイクアウト戦略はトレンドが出やすい時間帯に性能が集中する。私の検証ではロンドン・ニューヨーク重複時間(日本時間21:00〜翌0:00)を核とした時間絞り込みが最もPFを押し上げた。ロンドン時間(日本時間16:00〜1:00)まで広げるかどうかは通貨ペアによる。
完全版コードでは InpStartHour(取引開始時刻)と InpEndHour(取引終了時刻)のパラメータで調整できるように設計した。
よくある質問(FAQ)
Q: MQL5のiATR()がMQL4と何が違うのですか?なぜCopyBufferが必要なのですか? A: MQL5のiATR()はインジケータのハンドル(int型の整数)を返すだけで、ATR値そのものを返しません。実際の数値データはCopyBuffer()関数を呼び出してバッファから取り出す必要があります。MQL4の感覚でdouble変数に受けようとすると、int型のハンドル番号が格納されるだけで正常な値が取れない。これはMQL5移行で最初にはまるパターンの筆頭だ。
Q: ブレイクアウトEAで終値確定後にエントリーすべきですか?それとも抜けた瞬間に入るべきですか? A: 一概には言えませんが、日足ベースでは終値確定後(翌バーの始値で成行または上位バンドへの逆指値注文)の方がダマシを減らしやすい傾向があります。1時間足以下の短期足では即時エントリーの方がパフォーマンスが出るケースもあり、対象の時間足でバックテストを引いて比較するのが唯一の答えだ。
Q: MT5バックテストでOHLC on M1とEvery Tickでは結果がどれほど違いますか? A: ブレイクアウトEAのように逆指値注文を多用する戦略では差が出やすい傾向にあります。速度はOHLC on M1の方が約47倍高速という実測データがあります(sys-tre.com)。開発初期はOHLC on M1で高速スキャンし、最終確認はEvery Tickもしくはリアルティックで行う——これが私の鉄板ワークフローだ。
Q: ドンチャンチャネルのN期間は20日と55日のどちらが良いですか? A: タートルズの原典では20日(System 1)と55日(System 2)の両方を使い、通貨ペアによってどちらが有効かが異なるとされています。現代のデータで検証しても一方が絶対優位とは言えないため、バックテストで対象通貨ペアごとに確かめるしかない。ブレイクアウト期間の最適化は過最適化に転びやすいので、ウォークフォワードテストで必ず検証する。
Q: ウォークフォワードテストで「合格」の基準は何ですか? A: 業界統一の基準はない。私が使っているのは「テスト期間のPFが最適化期間のPFの70%以上を維持していること、かつ複数のウィンドウ期間で安定した正のPFが出ていること」だ。私はモンテカルロ検証(50%以上のシナリオが資産曲線プラス)も必須にしている。この二重チェックを省いてから後悔したことが実際にある。
Q: CTrade.BuyStop()とOrderSend()はどちらを使うべきですか? A: 新規に書くならCTradeクラス一択だ。OrderSend()は生のAPIで柔軟性は高いが、エラー処理・スリッページ設定・マジックナンバー管理を全部自分で書く必要がある。CTradeはそれらを内包したラッパーで、コードの読みやすさと保守性が段違いに上がる。MQL4からの移植時はOrderSend()の仕様変更(MQL5では引数の型が変わっている)でほぼ確実に一度ハマる。
EAのロジック構成をAIと対話しながら組み立てたい場合は、Claudeと会話しながらインジケータが作れる Hedgrow FX が参考になる。
参考データ
本記事で引用した統計データの出典一覧を示す。
| データ内容 | 出典 |
|---|---|
| ブレイクアウトEA ドル円15年バックテスト(PF1.52、勝率54.8%) | kuroda-yuusuke.com |
| EAの安定運用実績として参照されるPF範囲(1.5〜2.0前後) | ea-bank.com |
| 順張りEA平均PF(3000トレード、約1.28)・逆張りEA平均PF(1500トレード、約1.33) | fx-ea-lab.com |
| 無料ブレイクアウトEA 16本の24ヶ月バックテスト比較(PF0.50〜2.71) | tokyo-ea.jp |
| MT5ストラテジーテスター速度比較(リアルティック74秒 vs OHLC 1.57秒) | sys-tre.com |
無料EAと組み合わせた検証を検討している方は無料EAのおすすめ一覧も参考にしてほしい。
ブレイクアウトEAの実装プロセス全体をAIと相談しながら進めるなら、Claudeと会話しながらインジケータが作れる Hedgrow FX を活用してほしい。
免責事項
本記事で紹介するコード・バックテスト結果・統計数値はすべて情報提供を目的としたものであり、特定の金融商品への投資を勧誘するものではありません。バックテストの結果は過去のパフォーマンスを示すものであり、将来の収益を保証するものではありません。FX取引には元本損失を含む重大なリスクが伴います。実際の投資判断は自己責任で行い、必要に応じて金融の専門家にご相談ください。
著者情報: [著者名] / [資格・専門領域] / [著者プロフィールURL]
