プライスアクション分析ツールキットの開発(第29回):Boom & Crash Interceptor EA
内容
はじめに
現代の防空システムでは、多層構造のセンサーネットワークが、あらゆるレーダー反応や赤外線シグナルを極めて精密に分析します。 それぞれの目標について速度、飛行軌道、特徴を評価し、大規模な脅威データベースと照合します。 そして、複数の独立した判定フィルタが一致した場合にのみ迎撃ミサイルの発射が許可されます。これにより、資源を温存しつつ、真の脅威を遅滞なく確実に無力化します。
Boom & Crash Interceptor EAは、このような厳格な考え方を市場データ分析に応用しています。 ローリング方式の価格変動速度ウィンドウにより、現在の価格変動が最近の値動きを大きく上回っているかを判定し、ATRに基づくボラティリティ急増フィルタによって市場変動が実際に拡大していることを確認します。さらに、移動平均線によるトレンドフィルタが方向性を検証します。 加えて、オプションのピボットゾーンフィルタや取引時間帯フィルタによって、流動性の低い時間帯に発生する不要なシグナルを抑制します。
これらすべての条件が満たされたときのみ、EAはチャート上に「BOOM」または「CRASH」の矢印を表示し、ユーザーが指定した色や表示位置を適用するとともに、CSVファイルへイベントを記録します。これにより、トレーダーは確率の高いトレードチャンスだけに集中することができます。 本記事では、それぞれの検出レイヤーの調整方法と、このMQL5ツールを堅牢なシグナル生成コンポーネントとしてトレードシステムへ組み込む方法を紹介します。
戦略の理解
Boom & Crash Interceptor EAは、ミサイル迎撃システムの防衛思想から着想を得ており、市場で発生する急激な価格変動を「飛来するミサイル」として捉えます。軍事用語においてミサイルとは、誘導式・非誘導式を問わず、目標へ向けて発射される飛翔体を指します。現代のミサイルは、自力推進するロケットに弾頭を搭載し、慣性航法、レーダー、衛星、光学センサーなどによって誘導されます。その例には、大陸間弾道ミサイル(ICBM)、巡航ミサイル、地対空ミサイルなどがあります。歴史的には、投げ槍や矢も、目標へ向けて飛ばされる飛翔体であることから、ミサイルの一種と考えられます。
トレードの世界でも、急激な価格上昇や急落は同様に危険です。こうした値動きは突然発生し、準備不足のトレーダーに大きな損失をもたらす可能性があります。そこで有効なのが、ミサイル迎撃システムの考え方です。迎撃ミサイルシステムは、飛来する弾頭を検出・追跡し、目標へ到達する前に無力化する防衛システムです。その動作は、次の4つの段階で構成されます。
検出と追跡
- 地上・艦艇・宇宙配備の各種センサーが敵ミサイルの発射を検知します。
- 射撃管制システムが飛行軌道、速度、予測着弾地点を計算します。
発射と誘導
- 脅威が確認されると、迎撃ミサイルがサイロ、車両、艦艇、航空機などから発射されます。
- 慣性誘導、中間誘導データリンク、終末段階でのレーダーまたは赤外線誘導によって軌道が修正されます。
- Hit-to-Kill方式:迎撃ミサイルが弾頭へ直接衝突し、マッハ10を超える相対速度による運動エネルギーで破壊します。
- 近接信管方式(Proximity Blast):目標付近で爆発し、破片や衝撃波によって弾頭を破壊または軌道逸脱させます。
- 短距離システム(例:Patriot PAC-3)は終末段階で迎撃します。
- 中間迎撃システム(例:SM-3、Ground-based Midcourse Defense)は宇宙空間で迎撃します。
- ブースト段階迎撃は現在も研究段階であり、発射直後の迎撃を目指しています。
このような多層構造は、誤発射を最小限に抑えながら最大限の防御効果を実現するために設計されており、高速なデータ統合と厳格な確認ロジックによって支えられています。
Boom & Crash Interceptor EAも、このアーキテクチャを市場分析へ応用しています。継続的な市場監視がレーダーネットワークの役割を果たし、価格変動速度の閾値、ATR急増フィルタ、移動平均線による方向性確認が独立した確認レイヤーとして機能します。さらに、オプションのピボットゾーンフィルタやセッション時間フィルタは、おとり(デコイ)の識別機能に相当します。そして、すべての条件が一致した場合にのみ、EAは「BOOM」または「CRASH」の矢印を表示し、イベントを記録します。このようにして、トレーダーの注意力と取引資金は、本当に対応すべき市場の急変にのみ集中されます。これは、防空システムが本当に危険な弾頭に対してのみ迎撃ミサイルを使用する考え方と同じです。

図1:戦略
速度レーダー
VelocityHistoryBarsで指定された期間における価格変動量を測定し、その値を過去のパーセンタイル閾値と比較します。
// Record current vs. old price double priceNow = SymbolInfoDouble(_Symbol, SYMBOL_ASK); double priceOld = velHistory[VelocityHistoryBars - 1]; double delta = priceNow - priceOld; // Build and sort past deltas double d[]; ArrayResize(d, VelocityHistoryBars - 1); for(int i = 1; i < VelocityHistoryBars; i++) d[i - 1] = velHistory[0] - velHistory[i]; ArraySort(d); // Pick the (100–VelocityPctile)% threshold int idx = (int)MathRound((VelocityPctile / 100.0) * (ArraySize(d) - 1)); double velTh = d[ArraySize(d) - 1 - idx]; // Pass if current move exceeds threshold bool okVel = (delta > velTh || delta < -velTh);
ATRサージ検出器
最新のATRが、1本前のバーのATRにATRMultiplierを掛けた値を上回っているかを比較し、ボラティリティが急激に上昇したかどうかを確認します。
// Fetch two most recent ATR values double atrArr[2]; CopyBuffer(atrHandle, 0, 0, 2, atrArr); // Pass if ATR_now > ATR_prev × ATRMultiplier bool okATR = (atrArr[0] > atrArr[1] * ATRMultiplier);
トレンド整合性チェック
価格変動がトレンドに沿っていることを確認するため、上昇局面では単純移動平均線(SMA)も上昇していること、下降局面ではSMAも下降していることを確認します。// Fetch two most recent SMA values double maArr[2]; CopyBuffer(maHandle, 0, 0, 2, maArr); // If delta>0 require SMA_now>SMA_prev; if delta<0 require SMA_now<SMA_prev bool okTrend = (delta > 0 ? maArr[0] > maArr[1] : maArr[0] < maArr[1]);
ピボットゾーンフィルタ(オプション)
前のバーのピボットに近すぎるシグナルをブロックし、ZoneBufferPointsのバッファを強制します。
// Compute prior bar’s pivot double h1 = iHigh(_Symbol, MainTF, 1), l1 = iLow (_Symbol, MainTF, 1), c1 = iClose(_Symbol, MainTF, 1); double pivot = (h1 + l1 + c1) / 3.0; // Pass if priceNow is beyond pivot ± buffer bool okZone = (delta > 0 ? priceNow < pivot - ZoneBufferPoints * _Point : priceNow > pivot + ZoneBufferPoints * _Point);
最終的な「ミサイル発射」ロジック
すべてのフィルタを通過した場合にのみ、Boom(上矢印)またはCrash(下矢印)のシグナルを出します。
// Determine direction bool isBoom = (delta > velTh); bool isCrash = (delta < -velTh); // Fire only if velocity, ATR, trend, and zone all passed bool fire = ((isBoom || isCrash) && okVel && okATR && okTrend && okZone); if(fire) GenerateSignal(isBoom, priceNow, delta, atrArr[0], MainTF);
コード解説
以下は、「Boom & Crash Interceptor」エキスパートアドバイザー(EA)の主要な各セクションを体系的に解説したものです。
ヘッダーおよびコンパイルディレクティブ
冒頭のコメントブロックとその後の#property行は、EAの名刺のような役割を果たします。 これらは著作権の所有者、サポートリンク、現在のバージョン、そして厳格なコンパイルフラグを設定します。 strictモードでコンパイルすると、MetaTrader 5は最も厳密な型チェックおよび範囲チェックを適用し、ビルドプロセスの早い段階で潜在的なエラーを検出できるようになります。 これらの情報はまた、MetaQuotes Marketが製品の系譜を追跡し、エンドユーザー向けにスムーズなバージョン管理されたアップデートを可能にします。
//+------------------------------------------------------------------+ //| Boom and Crash Interceptor EA| //| Copyright 2025, MetaQuotes Ltd.| //+------------------------------------------------------------------+ #property copyright "Copyright 2025, MetaQuotes Ltd." #property link "https://www.mql5.com/ja/users/lynnchris" #property version "1.0" #property strict
ライブラリのインクルードと取引オブジェクト
<Trade\Trade.mqh>をインクルードし、グローバルなCTradeオブジェクトをインスタンス化することで、コードはMetaTraderのトレードAPIに対するオブジェクト指向ラッパーにアクセスできるようになります。 現在のバージョンはアラートとグラフィックスの出力のみをおこないますが、このオブジェクトの存在により、必要に応じてライブ注文執行へスムーズに移行できる設計になっています。
#include <Trade\Trade.mqh> CTrade trade; // object-oriented trading wrapper
外部入力 - EAのコントロールパネル
すべての実行時パラメータはinputキーワードで宣言されており、ストラテジーテスターでの最適化やチャート上の[Inputs]タブからの迅速な編集が可能です。これらは次の4つの論理グループに分類されます。
•シグナル生成設定:時間足、変動速度のルックバック期間、ATRパラメータ、移動平均パラメータ
•オプションのフィルタ:ピボットゾーンロジックおよび取引セッション時間
• 表示設定:ダッシュボードの配置、色、ライン幅、矢印のオフセット
•データロギング:CSVファイル名
input ENUM_TIMEFRAMES MainTF = PERIOD_CURRENT; // Signal TF input int VelocityHistoryBars = 96; input double VelocityPctile = 120.0; // >100 ⇒ extreme input int ATRPeriod = 14; input double ATRMultiplier = 1.5; input bool UseZoneFilter = true; input int SessionStartHour = 7; input int SessionEndHour = 17; input string LogFilename = "BoCrashLog.csv";
興味深いニュアンスとしてVelocityPctileのデフォルト値は120%に設定されています。 パーセンタイルアルゴリズムは分布の極端値で上限に達するため、100%を超える値を設定することは、実質的にルックバック期間内で観測された最も激しい値動きをさらに上回ることを要求することになり、トリガーを意図的により選択的なものにします。
グローバル変数と命名規則
配列velHistory[]は速度分析に必要なローリングウィンドウを保持しており、複数の文字列定数はGUIオブジェクト名を一元管理しています。 dashNames、hVelUpなどの名前を配列にまとめることで、オブジェクトの生成と削除を一貫して管理でき、孤立したオブジェクトの発生を防ぎ、将来的なリファクタリングも容易になります。
double velHistory[]; string dashBG = "DashBG"; string dashNames[] = {"Delta","VelThr","ATR","ATRm","Trend", "Pivot","Zone","Signal"}; string hVelUp = "VelUp"; string hVelDown = "VelDown";
OnInit():リソース取得とGUI構築
初期化処理では、まず価格変動速度の履歴配列のサイズを調整し、ATRおよび移動平均インジケータのハンドルを取得します。いずれかのハンドルが取得できない場合はINIT_FAILEDを返して終了します。これは、実行時の不安定さよりも早期失敗を優先する設計です。 その後、EAはCSVログファイルを開くか新規作成し、ファイルが新規の場合はヘッダーを書き込み、既存の場合は追記のために末尾へシークします。 最後に、半透明のダッシュボード用矩形を作成し、テキストラベルを配置し、水平および垂直の基準線を事前生成します。 これらのグラフィカル要素は、最初のティックが到来する前にすべてチャート上に表示されます。
int OnInit() { ArrayResize(velHistory,VelocityHistoryBars); atrHandle = iATR(_Symbol, ATRTF, ATRPeriod); maHandle = iMA (_Symbol, TrendTF, TrendMAPeriod, 0, MODE_SMA, PRICE_CLOSE); if(atrHandle==INVALID_HANDLE || maHandle==INVALID_HANDLE) return INIT_FAILED; logHandle = FileOpen(LogFilename, FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI); if(logHandle>=0 && FileSize(logHandle)==0) FileWrite(logHandle,"DateTime,Type,Velocity,ATR,Price"); // dashboard background ObjectCreate(0,dashBG,OBJ_RECTANGLE_LABEL,0,0,0); ObjectSetInteger(0,dashBG,OBJPROP_XSIZE,200); ObjectSetInteger(0,dashBG,OBJPROP_YSIZE,140); // dashboard labels for(int i=0;i<ArraySize(dashNames);i++) { string name="Dash_"+dashNames[i]; ObjectCreate(0,name,OBJ_LABEL,0,0,0); ObjectSetString(0,name,OBJPROP_TEXT,dashNames[i]+": ?"); } // reference lines ObjectCreate(0,hVelUp ,OBJ_HLINE,0,0,0); ObjectCreate(0,hVelDown,OBJ_HLINE,0,0,0); return INIT_SUCCEEDED; }
OnDeinit():正常なシャットダウン
EAの削除時には、インジケータハンドルを解放し、ファイルハンドルを閉じ、命名配列で参照されているすべてのグラフィカルオブジェクトを削除します。 このように生成と破棄の対称性を保つことは、ターミナルのオブジェクトリストをクリーンに維持し、オペレーティングシステムのリソースを節約するうえで重要です。
void OnDeinit(const int reason) { if(atrHandle!=INVALID_HANDLE) IndicatorRelease(atrHandle); if(maHandle !=INVALID_HANDLE) IndicatorRelease(maHandle); if(logHandle>=0) FileClose(logHandle); string objs[]={dashBG,hVelUp,hVelDown}; for(int i=0;i<ArraySize(objs);i++) ObjectDelete(0,objs[i]); for(int i=0;i<ArraySize(dashNames);i++) ObjectDelete(0,"Dash_"+dashNames[i]); }
OnTick():リアルタイム意思決定エンジン
このルーチンはまず、MainTF上で新しいバーがクローズしたことを確認します。 もし確認できない場合、この関数は即座に終了し、不要な計算を避けます。 バーの遷移が検出された場合、コードはオプションのセッションフィルタを考慮し、トレーダーが定義した時間足内でのみ処理がおこなわれるようにします。
void OnTick() { // process only on completed bar int cur=iBars(_Symbol,MainTF)-1; if(cur==lastBar) return; lastBar=cur; // optional session filter MqlDateTime now; TimeToStruct(TimeCurrent(),now); if(UseSessionFilter && (now.hour<SessionStartHour || now.hour>SessionEndHour)) return; // velocity calculation double priceNow = SymbolInfoDouble(_Symbol,SYMBOL_ASK); ArrayMove(velHistory,1,0,VelocityHistoryBars-1); // shift right velHistory[0]=priceNow; double delta = priceNow-velHistory[VelocityHistoryBars-1]; double velTh = ComputeVelocityPercentile(velHistory,VelocityPctile); bool okVel = (delta>velTh || delta<-velTh); // ATR, MA, pivot-zone checks ... /* …remaining signal logic… */ if(fire) GenerateSignal(isBoom,priceNow,delta,atrArr[0],MainTF); }
最新のAsk価格は、その後velHistoryの先頭に挿入され、古いエントリーは1インデックスずつ後方へ押し下げられます。 次に、ウィンドウ内の最新価格と最古の価格との差であるdeltaを計算し、ComputeVelocityPercentile()からパーセンタイル閾値を取得します。 deltaが上側または下側の閾値を超える場合に、速度条件が成立します。
ATRおよび移動平均フィルタは、異なるより下位の時間足で評価され、短期的なボラティリティ拡大を捉えつつ、方向バイアスを確認します。 ピボットゾーンフィルタは有効な場合、前のローソク足に基づいてクラシカルなH+L+Cピボットを計算し、価格がピボットに対してバッファ込みでなお反対側に位置している動きだけにシグナルを限定し、平均回帰の余地を狙います。
ダッシュボードは生の診断値で更新されます。各条件が満たされているかどうかは色によって即座に示されます。 一方で、水平方向の速度ラインおよびピボットライン、さらに垂直のタイミングラインは、新しいバーに合わせて再配置され、チャートの視覚的コンテキストを最新状態に保ちます。 シグナルは、速度スパイク、ATR急増、トレンド一致、ゾーンクリアランスという4つのゲートすべてがtrueを返した場合にのみ有効とみなされます。
ヘルパー関数:UpdateLabel()
この小さなルーチンはダッシュボードのテキストおよび色の更新を一元管理します。 フォーマット処理を一箇所に集約することで、一貫したスタイルを保証し、全体の見た目の調整を容易にします。
void UpdateLabel(int idx,string txt,bool pass) { string name="Dash_"+dashNames[idx]; ObjectSetString (0,name,OBJPROP_TEXT ,txt); ObjectSetInteger(0,name,OBJPROP_COLOR, pass ? clrLime : clrRed); }
ヘルパー関数:ComputeVelocityPercentile()
このアルゴリズムは、保存された価格系列を符号付きデルタのリストに変換し、そのリストをソートした上で、ユーザー指定のパーセンタイルに対応するインデックスを参照します。 順序付けされた配列の極端側から値を選択することで、追加のロジックなしに値動きの符号(上昇または下落)を保持します。100%を超えるパーセンタイル値は配列の最大要素に収束し、ウィンドウ内における「過去最大級の極端値」としての閾値が強制されます。
double ComputeVelocityPercentile(double &hist[],double pct) { int n=ArraySize(hist); if(n<2) return 0; double d[]; ArrayResize(d,n-1); for(int i=1;i<n;i++) d[i-1]=hist[0]-hist[i]; ArraySort(d); // ascending int idx=(int)MathRound((pct/100.0)*(ArraySize(d)-1)); return d[ArraySize(d)-1-idx]; // mirror to get extreme with sign }
ヘルパー関数:SetHLine()
ラインを再作成する代わりに既存のオブジェクトプロパティを操作することで、このメソッドはちらつきやグラフィカルな遅延を回避し、低スペックのハードウェアでも滑らかなユーザー体験を維持します。
void SetHLine(string name,double price,color clr) { ObjectSetDouble (0,name,OBJPROP_PRICE, price); ObjectSetInteger(0,name,OBJPROP_COLOR, clr); ObjectSetInteger(0,name,OBJPROP_WIDTH, 1); }
ヘルパー関数:GenerateSignal()
すべてのフィルタが一致した場合、このルーチンはバーの安値(Boom)または高値(Crash)からオフセットされた位置に、色分けされたWingdingsの矢印を描画し、タイムスタンプ、タイプ、delta、ATR、価格を含む包括的なエントリーをCSVログに書き込み、さらに音声アラートをトリガーします。CTradeをそのまま利用できるため、これらの視覚的なマーカーを実際の注文に変換するにはここでtrade.Buy()またはtrade.Sell()を呼び出すだけで済みます。
void GenerateSignal(bool isBoom,double price,double delta, double atr,ENUM_TIMEFRAMES tf) { int code = isBoom ? 233 : 234; double y = isBoom ? iLow(_Symbol,tf,0)-ArrowOffsetPips*_Point : iHigh(_Symbol,tf,0)+ArrowOffsetPips*_Point; color clr = isBoom ? BoomArrowColor : CrashArrowColor; string tag = (isBoom?"BOOM":"CRASH")+"_"+ TimeToString(TimeCurrent(),TIME_SECONDS); datetime t0 = iTime(_Symbol,tf,0); ObjectCreate(0,tag,OBJ_ARROW,0,t0,y); ObjectSetInteger(0,tag,OBJPROP_ARROWCODE,code); ObjectSetInteger(0,tag,OBJPROP_COLOR,clr); if(logHandle>=0) FileWrite(logHandle,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS), isBoom?"BOOM":"CRASH",DoubleToString(delta,2), DoubleToString(atr,_Digits),DoubleToString(price,_Digits)); Alert((isBoom?"BOOM":"CRASH")+" signal @"+ DoubleToString(price,_Digits)); }
戦略的意図と拡張の可能性
// Inside GenerateSignal(), after drawing the arrow: double lot = 0.02; // example risk sizing double sl = isBoom ? price - atr*2 : price + atr*2; double tp = pivot; // mean-reversion target if(AutoTrade) // user-controlled switch { if(isBoom) trade.Buy(lot,_Symbol,price,sl,tp,"Boom-auto"); else trade.Sell(lot,_Symbol,price,sl,tp,"Crash-auto"); }
概念的には、このEAは、直近のボラティリティ拡大の中で発生する爆発的な単一バーの加速を検出しつつ、その後に以前のピボットへ向かう平均回帰の動きを狙っています。 このような挙動はBoom/Crashインデックスに典型的であり、突発的なスパイクが頻繁に反転する性質を持ちます。 現在のコードは情報提供型のアラートを生成していますが、自動執行を統合するにはポジションサイジング、ストップロス(たとえば逆方向の速度ライン)、およびテイクプロフィットロジック(ピボット、またはバッファの半分など)を追加する必要があります。最後に、velHistory内のリニア配列シフトはデフォルトの96バーウィンドウでは許容範囲ですが、より大きな履歴を扱う場合には循環バッファへ置き換えることが望ましいです。
バックテストと結果
ライブ運用に移行する前に、デモ口座で包括的なバックテストを実行し、設定を微調整していきます。
1. コンパイルと読み込み
MetaEditorでEAがエラーなくコンパイルされたら、MetaTraderへ切り替えます。
2.ストラテジーテスターを開く
MetaTraderのツールバーにあるストラテジーテスターアイコンをクリックします。エキスパートリストから、Boom & Crash Interceptor EAを選択します。
3. テストの設定
- 銘柄と時間足:実際に取引する銘柄とMainTFに一致させます。
- 期間:さまざまな市場状況(静穏、トレンド、変動)を網羅する期間を選択してください。
- 入力パラメータ:VelocityHistoryBars、VelocityPctile、ATRMultiplier、TrendMAPeriod、ZoneBufferPointsなどを調整し、シグナル頻度と精度への影響を確認します。
- 実行:「全ティック」モードを使用し、最も精密なバックテストをおこないます。
4. 実行と確認
[Start]をクリックします。バックテストが終了したら、エクイティカーブ、シグナル一覧、および失敗または遅延したインターセプトを確認します。シグナルが集中している箇所や、実際のスパイクが見逃されている箇所に注目してください。
5. 改良と反復
一度に1つか2つの入力値を微調整し、たとえば速度パーセンタイルを狭めたり、ピボットバッファを広げたりしてから、再テストします。デモ結果で、許容範囲内のドローダウンを伴う、明確で再現性のあるBoom/Crash信号が表示されるまで、繰り返し作業します。
複数のデモ実行を通してEAのパフォーマンスに自信が持てたら、リスクを管理した上で実際の口座にEAを導入する準備が整います。
以下に、Boom & Crash Interceptor EAのバックテスト結果を共有しますが、その結果は特に示唆に富むものでした。

図2:Boom 900バックテスト
Boom 900のバックテストでは、予想通り、EAはすべてのBoomとCrashのシグナルをジャーナルに記録しました。ピボットラインは青色で、速度閾値はオレンジ色で表示され、視覚的に分かりやすいガイドとなります。また、BOOMには緑色の上向き矢印、CRASHには赤色の下向き矢印が表示されます。以下に、GIFでご覧いただいた内容を明確に把握していただけるよう、静止画像を掲載しました。

図3:バックテスト結果
結論
Boom & Crash Interceptor EAを構築し、厳密なバックテストを実施しました。その結果は明白です。本EAはボラティリティ、ATR急上昇、トレンド一致、ピボットゾーンの条件を追跡することで極端な価格変動を捉え、最もクリーンなBoom(緑)およびCrash(赤)の矢印のみを描画します。Boom 900のデモテストではすべてのシグナルを記録し、ピボットおよびボラティリティラインを青とオレンジで表示し、GIFと静止画像が完全に一致しました。
ただし、いくつかのシグナルは追加フィルタの改善余地があります。このEAは単体の自動売買エンジンというよりも戦術的なレーダーとして捉えるべきであり、エントリー前には時間帯、パターン、ファンダメンタル要因など独自のチェックを重ねるべきです。また、ノイズを減らすにはH1、H4、日足など上位時間足への移行も有効です。
慎重なバックテスト、適切なフィルタリング、そして管理された形でライブ運用へ移行することで、Boom & Crash Interceptor EAは市場の急変動を捉える実用的なツールとなり、相場の後追いではなく先手を取ることが可能になります。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/18616
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
MQL5におけるタイムギャップ分析(第1回):基本インジケータの構築
MetaTrader 5機械学習の設計図(第7回):散発的な実験から再現可能な結果へ
イルカエコーロケーションアルゴリズム(DEA)
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
こんにちは、
これをダウンロードできますか?リンクが見つからないのですが。
よろしくお願いします
ハリー
速度検出器にアルゴリズム上の問題があります。
ArraySort(d);買い方向では正常に動作していますが、
しかし、マイナス方向の動きについてはソートが正しく行われていないようです。
これを個別に処理するか、インデックスの計算式を変更する必要があります(売り方向のマイナス値のソートについて!!!)
if(delta>0) { for(int i = 1; i < VelocityHistoryBars; i++) d[i - 1] = velHistory[0] - velHistory[i]; ArraySort(d); } if(delta<0) { for(int i = 1; i < VelocityHistoryBars; i++) d[i - 1] = velHistory[i] - velHistory[0]; ArraySort(d); }
int idx= (int)MathRound((VelocityPctile / 100.0) * (ArraySize(d) - 1)); double velTh = d[ArraySize(d) - 1 - idx]; bool okVel = MathAbs(delta) > velTh;
ピボットラインの引き方にはいくつかのバリエーションがあります。
これがより良い方法かどうかは分かりません。
(ピボット価格を上回った場合、上昇を待ちます……)
bool okZone = false; if((delta > 0 ) && (priceNow > pivot)) okZone = true; if((delta < 0 ) && (priceNow < pivot)) okZone = true;bool okZone = false; if((delta > 0 ) && (priceNow > pivot) && (priceNow < ( pivot + ZONE_Points * _Point))) okZone = true; if((delta < 0 ) && (priceNow < pivot) && (priceNow > ( pivot - ZONE_Points * _Point))) okZone = true;速度検出器における「正しい方向」のバーの評価:
緑色/赤色のバーをパーセンテージでフィルタリングできます。
(負の方向は正の値に反転されています)
0.8 = 80%のバーが正しい方向でした。
double goodBars = 1; for(int i=ArraySize(d) - 1; i>=0; i--) if(d[i] < 0) goodBars=1 - (i+1.0)/ArraySize(d);