「Gold Fractal Breakout EA」は、MetaTrader 5用のエキスパートアドバイザーであり、確認済みのスイング高値および安値を検出し、それらの水準付近で買いストップ注文および売りストップ注文を発注しようとします。その構造検出には、組み込みのiFractalsインジケーターではなく、設定可能な隣接バーが使用されます。注文およびポジションは、現在の銘柄と設定されたマジックナンバーによって識別されます。
この戦略は、価格構造、保留注文によるエントリー、およびパーセンテージに基づくエグジット管理を組み合わせています。チャート上にエントリー矢印、フラクタルマーカー、または取引パネルは表示されません。以下の図は注文発注の概念を説明したものであり、これはシミュレーションによるもので、過去の取引実績、ターミナルのスクリーンショット、または測定されたパフォーマンスを表すものではありません。

商品名から金(ゴールド)を連想させるため、評価の出発点としては、XAUUSDのようなブローカー固有の金銘柄が想定されています。ただし、本戦略は、チャートに紐付けられた銘柄で取引を行うものであり、金に限定される制限はありません。提供されているバックテストやフォワードテストの結果からは、最適な銘柄、時間枠、または収益性の高いパラメータセットは特定されていません。
構造の時間枠は、内部定数InpFractalTFによってH1に固定されています。これは編集可能な入力項目ではありません。 チャートやストラテジーテスターの期間がD1であっても、CopyRatesはH1のバーを読み取ります。スキャンは、設定された間隔(デフォルトは15分)後の最初の利用可能なティックで実行され、ポジション管理は毎ティック実行されます。したがって、H1はデフォルトのシグナルデータを表すものであり、検証済みの最適な取引時間枠を示すものではありません。
IsSwingHighでは、候補となる高値が、選択された過去および未来の隣接するすべての高値よりも厳密に高いことが求められます。IsSwingLowでは、対応する安値が厳密に低いことが求められます。デフォルト設定では、各方向で5本のバーがチェックされます。 FindSwingは、最新の5本の終値バーより先から検索を開始し、確認ウィンドウから現在のバーを除外して、条件を満たす最も新しいレベルを返します。必要な履歴が利用できない場合、レベルは返されません。
買いのセットアップの場合、Askは設定された最小クリアランス以上の幅でスイング高値を下回っている必要があります。 売りセットアップの場合、Bidはスイング安値より、そのクリアランス以上の値で上回っていなければなりません。その後、EAはエントリーオフセットを適用し、重複距離内に同じ方向の未約定注文が存在するかどうかを確認し、その未約定エントリーが現在の気配値からブローカーの最小ストップ距離を超えていることを検証します。
買いエントリー = スイング高値 + スイング高値 × 買いオフセット / 100。売りエントリー = スイング安値 − スイング安値 × 売りオフセット / 100。両方のデフォルトオフセットは −0.10% であるため、買いエントリーは高値より下、売りエントリーは安値より上になります。 これらのデフォルト値は、スイングの境界を完全に突破することを要求するのではなく、その境界付近を想定したものです。なお、注文は、現在の市場価格に対してストップ注文として有効な価格である場合にのみ発注されます。
以下の抜粋は、現在このCodeBaseエントリからダウンロード可能なMQ5ファイルから引用したものです。これらは実装の一部を説明するものであり、単独で動作するプログラムではありません。
const ENUM_TIMEFRAMES InpFractalTF = PERIOD_H1; // チャートやテスターの期間に関係なく、H1データの期間を固定しました double FindSwing(bool high) { //--- スイング検索用の価格バーを読み込む MqlRates r[]; ArraySetAsSeries(r,true); int need=InpMaxSearchBars+InpFractalLeft+InpFractalRight+5; if(CopyRates(_Symbol,InpFractalTF,0,need,r)<need) return 0; //--- 未確認の候補をスキップし、新しいものから古いものの順に検索する int first=InpFractalRight+1; int last=MathMin(InpMaxSearchBars,ArraySize(r)-InpFractalLeft-1); for(int i=first;i<=last;i++) if(high ? IsSwingHigh(r,i) : IsSwingLow(r,i)) return high?r[i].high:r[i].low; return 0; }
series配列では、現在のバーにインデックス0が割り当てられます。 InpFractalRight + 1 から開始することで、それ以降のすべての確認バーの終値が保持されます。デフォルトの右側カウントが 5 の場合、最初の候補はインデックス 6 となり、それより新しい比較バーはインデックス 5 から 1 となります。CopyRates は、接続されたチャートの期間とは無関係に、明示的に H1 データを要求します。
bool IsSwingHigh(const MqlRates &r[],int i) { //--- 候補を以前のバーと比較する for(int k=1;k<=InpFractalLeft;k++) if(r[i].high<=r[i+k].high) return false; //--- 候補を新しいバーと比較する for(int k=1;k<=InpFractalRight;k++) if(r[i].high<=r[i-k].high) return false; return true; }
候補は、選択された隣接する高値のいずれかがそれと同等かそれ以上である場合に却下されます。IsSwingLowは、安値に対して対応する逆の比較を適用します。これらの関数は、確認済みの価格構造を特定するものであり、組み込みのiFractalsインジケーターを呼び出すことはありません。
double entry=buy?swing+Pct(swing,InpBuyEntryOffsetPct):swing-Pct(swing,InpSellEntryOffsetPct); entry=N(entry); if(SimilarPending(type,entry)) return; //--- 初期のストップロスとテイクプロフィットを計算する double sl=buy?entry-Pct(entry,InpStopLossPct):entry+Pct(entry,InpStopLossPct); double tp=buy?entry+Pct(entry,InpTakeProfitPct):entry-Pct(entry,InpTakeProfitPct); sl=N(sl); tp=N(tp);
この抜粋は PlaceBreakout 関数からのものです。buy、swing、type はその関数の前半で定義されています。Pct は最初の引数のパーセンテージを計算し、N は価格を銘柄のティックグリッドに合わせます。 正規化を行う前では、スイング高値が3000で買いオフセットが-0.10%の場合、エントリー価格は2997となります。また、スイング安値が3000で売りオフセットが-0.10%の場合、エントリー価格は3003となります。 その後行われるブローカー距離、出来高、セッション、および証拠金のチェックにより、注文の送信が阻止される可能性があります。
固定ロットモードでは、InpFixedLots が現在の銘柄の最小値、最大値、および出来高ステップに正規化されます。リスクパーセントモードでは、現在の口座残高、設定されたリスク率、エントリーからストップまでの距離、および初期化時にキャッシュされた銘柄のティックサイズとティック値から、注文出来高が推定されます。 どちらのモードでも、出来高は銘柄の最小値および最大値に制限され、ステップから導出された小数点以下の精度を使用して出来高ステップに切り捨てられます。最小値未満の値は最小値に引き上げられるため、要求されたサイズやリスク推定値を超えてエクスポージャーが増加する可能性があります。 距離が不正である場合や、キャッシュされたティックプロパティに問題がある場合は、正規化された固定ロットにフォールバックします。注文送信前に、当該銘柄における同一方向のポジションおよび未約定注文が SYMBOL_VOLUME_LIMIT に対してカウントされます(他のマジックナンバーによる取引も含む)。残りの許容容量が不足している場合、新規注文は実行されません。
初期のストップロスおよびテイクプロフィットは、保留中のエントリー価格に対するパーセンテージとして計算されます。 各ティックごとに、買いの場合はビッド価格、売りの場合はアスク価格を用いて、ポジションの約定価格からの有利な価格変動が測定されます。損益分岐点のトリガーに達すると、ストップは価格に基づくわずかな利益確定水準に向かって移動します。トレーリングの更新は、有利な価格変動がトレーリングトリガーと最大トレーリングパーセンテージの範囲内にある場合にのみ適用されます。
損失回復閾値に達すると、EAは利益確定価格を、建玉価格に対する損失幅がより小さい水準へ移動させます。これは、その後価格がその目標値に向かって回復した場合に決済を図るものであり、直ちにポジションを決済するものでも、回復を保証するものでもありません。 例えば、デフォルトの買いポジションにおけるサルベージ目標は、少なくとも1.00%の不利な値動きがあった後、エントリー価格より0.15%低い水準に設定されます。損失条件が終了しても、更新された目標値が自動的に元のテイクプロフィット値に戻ることはありません。
設定可能な25の入力パラメータすべてを、ソースのデフォルト値とともに以下に示します。「InpRiskPercent」を除き、パーセンテージ設定は価格の距離または価格変動を表しており、口座のリターンを表すものではありません。「InpDuplicatePoints」は、汎用的なピップサイズではなく、銘柄ごとのポイントを使用します。 トレーリング距離は現在の相場価格に基づきます。ここで説明するその他の決済パーセンテージは、エントリー価格または始値に基づきます。
| パラメータ | デフォルト | 意味と解釈 |
|---|---|---|
| InpMagic | 900009 | このEAの注文およびポジションを選択するために、チャートシンボルと組み合わせて使用される識別子。 |
| InpComment | "GoldX9 戦略 9" | 発注時に付加されるテキスト。保有ポジションのフィルタリングには、シンボルとマジックナンバーが使用されます。 |
| InpLotMode | LOT_FIXED | LOT_FIXEDは固定ロットを使用し、LOT_RISK_PERCENTは証拠金残高に基づくリスク比率でロットサイズを決定します。 |
| InpFixedLots | 0.01 | 固定モードで指定された取引数量。銘柄の最小値、最大値、ステップ値に合わせて正規化されます。また、無効なリスクベースのロットサイズ設定プロパティに対する正規化されたフォールバック値としても機能します。 |
| InpRiskPercent | 0.50 | 注文ごとの推定エクイティ・リスク。保証された実現損失の上限ではありません。 |
| InpMaxPending | 3 | 同一銘柄および同一マジックナンバーの指値注文。方向ごとに個別にカウントされます。 |
| InpMaxPositions | 10 | 二次的なポジション数の上限。いずれかの銘柄でポジションを保有している場合、新規エントリーがブロックされ、保有中の指値注文がキャンセルされる。 |
| InpPendingExpiryHours | 15 | この値から計算されるタイムスタンプ。注文の送信には依然としてGTCが使用されるため、時間指定による失効は実装されていません。 |
| InpDuplicatePoints | 100 | この距離以内にある同一タイプの保留中のエントリがある場合、送信は行われません。 |
| InpRescanMinutes | 15 | エントリのスキャン間隔の最小時間。スキャンには、到着したティックが必要です。 |
| InpFractalLeft | 5 | 厳密なスイング比較における、より古い隣接バーの数。 |
| InpFractalRight | 5 | スイングを確定するために必要な、より新しい終値を持つ隣接バーの数。 |
| InpMaxSearchBars | 200 | 調査対象となる候補シークエンスの最大インデックス。比較のために、それ以上のバーが読み込まれます。 |
| InpMinFractalClearancePct | 0.02 | 高値を下回るアスクのクリアランス、または安値を上回るビッドのクリアランスを、スイングのパーセンテージとして表したもの。 |
| InpBuyEntryOffsetPct | -0.10 | スイング高値に加算されます。デフォルト値が負の場合、エントリーは高値より下に設定されます。 |
| InpSellEntryOffsetPct | -0.10 | スイング安値から差し引かれます。デフォルト値が負の場合、エントリーは安値より上に設定されます。 |
| InpStopLossPct | 2.00 | 保留中のエントリー価格からの初期ストップ距離。 |
| InpTakeProfitPct | 1.00 | 指値注文価格からの初期利益目標距離。 |
| InpTrailTriggerPct | 0.20 | トレーリングの更新を行うための、始値からの最低有利な値動き。 |
| InpTrailDistancePct | 0.20 | 現在のビッドまたはアスクに対するパーセンテージとして計算されるストップ距離。 |
| InpMaxTrailPct | 1.00 | トレーリング更新の上限値(有利な値動きの閾値)。利益の上限ではありません。 |
| InpSalvageTriggerPct | 1.00 | サルベージ目標を有効にする、始値からの不利な値動き。 |
| InpSalvageExitPct | 0.15 | 始値からの損失側の目標距離。即座に決済されるわけではない。 |
| InpBreakEvenTriggerPct | 0.10 | 利益確定を有効にする、始値からの有利な値動き。 |
| InpBreakEvenLockPct | 0.025 | コスト控除前の、始値に対する利益確定率。 |
インクルードされているのは、MetaTrader 5 標準ライブラリの取引インターフェースである <Trade/Trade.mqh> のみです。その CTrade オブジェクトである trade は、指値注文の送信、エキスパートのマジックナンバーの割り当て、ポジション変更の要求、および取引結果の説明の提供を行います。スイングの検出やロットサイズの計算には使用されません。 カスタムインジケーター、外部DLL、Webサービス、または追加のカスタムインクルードファイルは参照されていません。
OnInitは、シンボルのポイントサイズ、桁数、ティックサイズ、ティック値をキャッシュし、4つの正のカウント値を持つ入力をチェックします。OnTickは、シンボルのポジションが存在する場合に残りの指値注文をキャンセルし、指値注文に必要な証拠金を確認し、ポジションを管理し、シンボルのポジションが存在しない場合にのみエントリースキャンを制限します。OnTradeTransactionも、取引成立後に指値注文のキャンセルをトリガーします。 PctおよびNは、パーセンテージ距離と小数点の正規化を処理します。OurOrderおよびOurPositionは保有状況をフィルタリングします。CountPositionsおよびCountPendingはスキャン時間の制限を適用します。FindSwingおよびスイングヘルパーは構造を特定します。SimilarPending、LotsForRisk、PlaceBreakout、およびManagePositionsは、重複チェック、ロットサイズの決定、注文の送信、および決済を実装します。
内部グローバル変数には、trade(取引インターフェース)、g_last_scan(前回のスキャン時刻)、g_point(銘柄のポイントサイズ)、g_digits(価格の小数点以下の桁数)、g_tick_size(ティックサイズの増分)、およびg_tick_value (報告されるティック値)です。InpFractalTFは、PERIOD_H1に固定された内部定数です。これらの内部変数および時間枠定数は、ユーザーによる入力対象ではありません。このEAは、価格、履歴、口座資産、注文、およびポジションについて、ターミナルに組み込まれたAPIを使用します。
InpPendingExpiryHoursは有効期限のタイムスタンプを計算するために使用されますが、注文呼び出しでは明示的にORDER_TIME_GTCが使用されています。したがって、現在のコードでは、公表されている「時間ベースの有効期限モード」は実装されていません。 証拠金に基づくクリーンアップにより、推定される発注に必要な証拠金がバッファされた自由証拠金の予算額を超えた場合、このEAの未約定注文が削除される可能性があります。これは時間ベースの有効期限切れではありません。対象銘柄でオープンポジションが検出されると、所有している未約定注文はキャンセルされます。新たなスイングが発生しただけでは、既存の注文はキャンセルされません。
現在の銘柄における未決済ポジションは、マジックナンバーに関係なく、新しい未約定注文の送信をブロックするようになりました。取引イベントおよびその後のティック発生時、EAはその銘柄における残りの未約定注文のキャンセルを試みます。他のEAが所有する注文はキャンセルされません。 削除はフリーズゾーンやセッション終了により遅延する可能性があります。クライアント側でのキャンセルは、サーバー側でのアトミックなOCO保証ではありません。InpMaxPositionsは二次的なカウントチェックとして残りますが、ポジションが存在している間は追加のエントリーを許可しません。 リスク率は、ポートフォリオ全体の合計制限ではなく、提案された注文ごとに設定されます。ブローカーの最低取引量要件、固定取引量のフォールバック、約定価格、および取引コストにより、実際のエクスポージャーは推定値と異なる場合があります。 ソースコードには、スプレッドや総合的なストップロス・リスクフィルターは含まれていません。注文の送信やポジションの変更前にブローカーの取引セッションを確認し、口座内のすべての保留注文について単独のアクティベーション証拠金を推定し、現在のフリー証拠金の20%をバッファーとして残します。 要求された正規化された取引量が、残りのバッファ付き証拠金予算に収まらない場合、注文全体がスキップされ、その理由がログに記録されます。証拠金予算に収めるために取引量が削減されることはありません。反対側の注文に対しては、想定されるネッティングによる証拠金軽減措置は適用されません。
価格はキャッシュされた銘柄のティックサイズグリッドに丸められ、その後、銘柄の桁数に合わせて正規化されます。固定ボリュームとリスクベースのボリュームの両方が、銘柄のボリューム仕様に合わせて正規化されます。決済変更リクエストは、既存のSL/TPフリーズゾーンと提案されたストップ/フリーズ距離を確認し、サーバーによる拒否結果を報告します。 変更の試行は、管理パスごとに5秒に1回に制限されます。EAはまた、送信前にOrderCheckを使用して保留中のリクエストを事前チェックします。送信時には、CTradeの戻り値とサーバーの結果コードの両方がチェックされます。失敗した場合は、要求された正規化された出来高と、銘柄の最小値、最大値、ステップ、および方向制限がログに記録されます。初期化時にも、これらの仕様がログに記録されます。
初期化時、ソースコードはフラクタル近傍数、未約定およびポジション制限、正の有限固定取引量、およびリスクサイジングが選択された場合の正の有限リスク比率をチェックします。その他いくつかの範囲についてはチェックが行われません。独立した反対ポジションは、ヘッジ口座では最も解釈しやすいですが、ネッティング口座では、同じ銘柄の注文が共有ポジションに影響を与えます。 更新されたソースコードは、エラー0件、警告0件でコンパイルされました。ユーザーからの報告によると、これらの最新のガードが導入される前に、EURUSDのH1ネットティングで50件、XAUUSDのD1ネットティングで40件の取引が行われていました。XAUUSDの実行では、セッションエラー、証拠金エラー、および凍結された変更エラーも報告されています。 更新されたガード機能については、これらの条件下での再テストはまだ行われていません。セッションのスケジュールは、例外的な取引停止期間中の利用可能性を保証するものではなく、ギャップ、急激な証拠金残高の変化、または凍結された保留注文により、タイムリーな証拠金クリーンアップが妨げられる可能性があります。パフォーマンスに関する結果は一切保証されません。
MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/78308
Prop Firm Equity Guard - Daily Loss Limit and Max Drawdown Protection
1日の損失上限、最大損失、または利益目標に達すると、すべての取引を決済し、新たな取引をブロックします。プロップファームのチャレンジ向けに設計されています。手動取引やその他のEAとも併用可能です。
Session High Low - Asian, London and New York Range Boxes
アジア、ロンドン、ニューヨークの各セッションのレンジを、高値と安値を示す色付きのボックスとして表示し、ブレイクアウト取引用の点線の延長線も追加します。H1までのすべての時間足で同じレンジが表示されます。
London Breakout EA:シンプルで透明性が高い/London Breakout EA:シンプルで透明性が高い
無料ブレイクアウトEA:アジアレンジ、ロンドンブレイクアウト、1日1トレード、常にストップロスを設定、ロットはリスク率に基づいて決定。 グリッド戦略なし、マーチンゲール戦略なし。 / 無料EA:ロンドンセッションにおけるアジアレンジのブレイクアウト、1日1トレード、常にストップロス設定、ロットはリスク率に基づいて決定。グリッド戦略およびマーチンゲール戦略は採用していません。
Accelerator Oscillator (AC)
アクセルレーション/デセレレーションインジケーター(AC)は現在の市場を動かす力の加速と減速を測ります。