
プライスアクション分析ツールキットの開発(第24回):プライスアクション定量分析ツール
内容
はじめに
多くのプライスアクショントレーダーは、ピンバー、同時線、包み足、丸坊主など、明確なローソク足の形成に依存しています。これらのローソク足は、市場心理の変化を特定し、潜在的な反転やトレンド継続の動きを見極めるために使用されます。しかし、数十のチャートを手動で確認してこれらのシグナルを探すのは、時間がかかり、見落としが発生しやすい作業です。
この課題に対処するために、MetaTrader 5用のPrice Action Quantification Analysis EAを開発しました。このエキスパートアドバイザー(EA)は、以下の機能を備えています。
- 設定可能な直近バー数を自動でスキャンし、広く認知されている4つのプライスアクションパターンを検出します。
- 検出された各パターンをチャート上に矢印とラベルで表示し、視覚的に明確な手がかりを提供します。
- アラートを発行し、次のバーのpips変動を記録して、シグナルの強さを把握するのに役立ちます。
- 各パターンを「取引」として扱い、全体の勝率を計算することで、組み込みのバックテスト統計を提供します。
次のセクションでは、EAの構造を詳しく解説し、カスタマイズ可能な設定を順に確認し、そのパフォーマンス指標がどのようにプライスアクショントレーディングを強化できるかを示します。まずは、このEAが監視する具体的なローソク足パターンを確認し、各ローソク足の構造と、パターン特定に用いられる計算方法を詳しく見ていきましょう。
ローソク足パターン
- ピンバー
ピンバーは、実体が小さく、髭が長い単一のローソク足です。このローソク足が出現すると、価格が一方向に大きく動こうとしたものの、押し戻されたことを意味します。
弱気のピンバーでは、上髭が長いことから、買い手が価格を維持できず、売り手が優勢になったことを示しています。
図1:弱気ピンバー
強気のピンバーは下髭が長く、買い手が介入して価格を上昇させたことを示しています。
図2:強気のピンバー
ローソク足の色もシグナルの強さを補強します。弱気のピンバーでは、赤(または黒)の実体は、始値よりも終値が下回ることで売りの優勢を示すため、より説得力があります。強気のピンバーでは、緑(または白)の実体が始値よりも終値が上回ることで買いの圧力を示し、シグナルを補強します。ただし、ピンバーの形状や髭の長さは、色よりも重要です。シグナルを信頼するには、髭の長さが実体の少なくとも2~3倍であること、反発時の出来高の急増があること、ピンバーが既知のサポートまたはレジスタンス付近に出現していることを確認してください。これらの追加確認により、単なる髭ではなく、真の反転シグナルを見極めることができます。
ロジック手順
- candleBody、topShadow、bottomShadowを計算する
- candleBody > minBodyPoints * _Pointを満たすことを確認する
弱気ピンバー
topShadow ≥ wickToBodyRatio * candleBody
bottomShadow < smallWickCap * candleBody
強気ピンバー
bottomShadow ≥ wickToBodyRatio * candleBody
topShadow < smallWickCap * candleBody
// 1. Calculate parts double candleBody = MathAbs(closePrice - openPrice); double topShadow = highPrice - MathMax(openPrice, closePrice); double bottomShadow = MathMin(openPrice, closePrice) - lowPrice; // 2. Minimum body check if(candleBody > minBodyPoints * _Point) { // Bearish pin bar if(topShadow >= wickToBodyRatio * candleBody && bottomShadow < smallWickCap * candleBody) Print("Bearish Pin Bar detected"); // Bullish pin bar else if(bottomShadow >= wickToBodyRatio * candleBody && topShadow < smallWickCap * candleBody) Print("Bullish Pin Bar detected"); }
- 同時線
同時線は、ローソク足の始値と終値がほぼ同じ場合に出現します。これは市場の迷いを示し、バイアスは直前のトレンドから得られます。上髭と下髭の長さの違いにより、プラス記号、十字、または逆十字のような形状を形成します。
図3:同時線
ロジック手順
- candleBody、fullRange、topShadow、bottomShadowを計算する
- candleBody ≤ maxDojiRatio * fullRangeを満たすことを確認する
- topShadow > candleBodyかつbottomShadow > candleBodyを満たすことを確認する
// 1. Calculate body and range double candleBody = MathAbs(closePrice - openPrice); double fullRange = highPrice - lowPrice; double topShadow = highPrice - MathMax(openPrice, closePrice); double bottomShadow = MathMin(openPrice, closePrice) - lowPrice; // 2. Tiny body test if(candleBody <= fullRange * maxDojiRatio) { // 3. Both shadows must extend beyond the body if(topShadow > candleBody && bottomShadow > candleBody) Print("Doji detected"); }
- 包み足
包み足には、強気の包み足と弱気の包み足の2種類あります。
強気の包み足
この2本のローソク足からなる反転パターンは、下降トレンドや保ち合いの終わりに出現します。小さな弱気のローソク足の直後に、前の実体を完全に包み込む大きな強気のローソク足が出現します。2本目のローソク足の大きさは、買い手が売り手を圧倒したことを示しており、強い上昇の始まりを示唆することが多いです。
図4:強気の包み足
弱気の包み足
これは逆の設定です。小さな強気のローソク足の後に、前の実体を完全に包み込む大きな弱気のローソク足が出現します。このパターンは売り手が優勢になったことを示し、強い下落の始まりを示すシグナルとなる可能性があります。
図5:弱気の包み足
ロジック手順
prevBody = |prevClose – prevOpen|、currBody = |close – open|を計算する
currBody > prevBodyを満たすことを確認する
強気の包み足
- prevClose < prevOpen
- openPrice ≤ prevClose
- closePrice ≥ prevOpen
弱気の包み足
- prevClose > prevOpen
- openPrice ≥ prevClose
- closePrice ≤ prevOpen
// 1. Compute body sizes double prevBody = MathAbs(prevClose - prevOpen); double currBody = MathAbs(closePrice - openPrice); // 2. Must be larger than previous if(currBody > prevBody) { // Bullish engulfing if(prevClose < prevOpen && openPrice <= prevClose && closePrice >= prevOpen) Print("Bullish Engulfing detected"); // Bearish engulfing else if(prevClose > prevOpen && openPrice >= prevClose && closePrice <= prevOpen) Print("Bearish Engulfing detected"); }
- 丸坊主
図6:丸坊主
丸坊主は、実体が大きく、髭がほとんどないローソク足として際立ちます。始値と終値がほぼ全レンジをカバーしており、市場の明確な方向性を示します。丸坊主には3種類があり、それぞれに強気版と弱気版があります。
丸坊主
強気:始値が安値、終値が高値。買い手が開始から終了まで価格を押し上げ続けます。
弱気:始値が高値、終値が安値。売り手がセッション全体を支配します。
寄り付き坊主
強気:始値が安値、終値は高値直下(小さな上髭)。買い手が即座に主導権を握ります。
弱気:始値が高値、終値は安値直上(小さな下髭)。売り手が開始時点から主導します。
大引け坊主
強気:終値が高値、始値は安値直上(小さな下髭)。買い圧力が引けにかけて高まります。
弱気:終値が安値、始値は高値直下(小さな上髭)。売り圧力が引けにかけて強まります。
ロジック手順
- candleBody、fullRange、topShadow、bottomShadowを計算する
- candleBody ≥ marubozuRatio * fullRangeを満たすことを確認する
- Require topShadow ≤ (1 – marubozuRatio) * fullRangeかつbottomShadow ≤ (1 – marubozuRatio) * fullRangeを満たすことを確認する
- closePrice > openPriceなら強気、そうでなければ弱気と判定する
// 1. Calculate parts double candleBody = MathAbs(closePrice - openPrice); double fullRange = highPrice - lowPrice; double topShadow = highPrice - MathMax(openPrice, closePrice); double bottomShadow = MathMin(openPrice, closePrice) - lowPrice; // 2. Body covers most of the range if(candleBody >= marubozuRatio * fullRange) { // 3. Shadows must be small double maxWick = (1 - marubozuRatio) * fullRange; if(topShadow <= maxWick && bottomShadow <= maxWick) { // 4. Bullish or bearish if(closePrice > openPrice) Print("Bullish Marubozu detected"); else Print("Bearish Marubozu detected"); } }
MQL5 EAの構成
上図は、EAをMetaTrader 5のチャートに適用した際の動作を示した図です。下表には結果をまとめており、各値は変化率(パーセンテージ)を表しています。今回EAを開発するにあたり、私たちの主な目的は、トレーダーが売買判断にしばしば依拠する主要なローソク足パターン(ピンバー、同時線、包み足、丸坊主)の検出を自動化することでした。EAに直近のプライスアクションを客観的に分析させ、これらのパターンを正確に識別し、チャート上に明確な視覚的手がかりを提供するとともに、パターンの有効性に関する統計的フィードバックを出力することを目指しました。
これを実現するために、まず柔軟な分析を可能にする入力パラメータを定義しました。これには、参照する過去バー数(InpLookbackBars)、無視できるローソク足を除外するための最小実体サイズ(InpMinBodySizePts)、ピンバー検出用の髭と実体の比率(InpWickBodyRatio)が含まれます。また、市場のボラティリティを把握するためにATR期間パラメータも導入しており、これはパターン認識ルールに影響を与える場合があります。
// Input parameters for customization input int InpLookbackBars = 200; // Bars to scan input int InpMinBodySizePts = 10; // Min body size (points) input double InpWickBodyRatio = 2.0; // Min wick-to-body ratio input int InpATRPeriod = 14; // ATR period
初期化フェーズ(OnInit)では、各バーの計算データ(実体サイズ、上髭と下髭、全レンジ、ATR値)を格納する配列を設定しました。これらの配列は直近のバーを効率的に処理できるよう、系列ベースとして構築しています。さらに、直近のシグナルを追跡するための小さなバッファも用意しました。これにより、後の段階でパターンの成功率を分析する際に役立ちます。
int OnInit() { ArraySetAsSeries(Body,true); ArraySetAsSeries(UpperWick,true); ArraySetAsSeries(LowerWick,true); ArraySetAsSeries(TotalRange,true); ArraySetAsSeries(ATR,true); ArrayResize(Body, InpLookbackBars+2); ArrayResize(UpperWick, InpLookbackBars+2); ArrayResize(LowerWick, InpLookbackBars+2); ArrayResize(TotalRange, InpLookbackBars+2); ArrayResize(ATR, InpLookbackBars+2); for(int i=0;i<5;i++) g_history[i]=""; return(INIT_SUCCEEDED); }コアロジックは、すべての新しいティックで実行されるOnTickOnTick関数内にあります。不要な計算を避けるため、タイムスタンプを比較して新しいバーごとに一度だけ処理をおこなうチェックを追加しました。新しいバーが検出されると、メイン分析を実行するAnalyzeAndDrawを呼び出します。
void OnTick() { static datetime lastTime=0; datetime current = iTime(_Symbol, _Period, 0); if(current == lastTime) return; // Only process once per new bar lastTime = current; AnalyzeAndDraw(); }
AnalyzeAndDraw内では、まずチャートを見やすく保つために前回の描画をすべてクリアします。その後、直近のバーをループ処理し、主要なローソク足の指標を計算します。具体的には、実体サイズ(始値と終値の絶対差)、上髭(高値-max(始値, 終値))、下髭(min(始値, 終値)-安値)、全レンジ(高値-安値)です。さらに、ATR値をコピーしてボラティリティを考慮したパターン検出に反映させています。
void AnalyzeAndDraw() { int bars = MathMin(InpLookbackBars, (int)SeriesInfoInteger(_Symbol,_Period,SERIES_BARS_COUNT)); ObjectsDeleteAll(0,0,OBJ_ARROW); ObjectsDeleteAll(0,0,OBJ_LABEL); for(int i=0; i<bars; i++) { double op = iOpen(_Symbol,_Period,i); double cl = iClose(_Symbol,_Period,i); double hi = iHigh(_Symbol,_Period,i); double lo = iLow(_Symbol,_Period,i); // Calculate candlestick components Body[i] = MathAbs(cl-op); UpperWick[i] = hi - MathMax(op,cl); LowerWick[i] = MathMin(op,cl) - lo; TotalRange[i] = hi - lo; } // Copy ATR buffer if(CopyBuffer(iATR(_Symbol,_Period,InpATRPeriod),0,0,bars,ATR)<=0) return; // Exit if ATR data not available
次に、パターン認識ルールを適用します。例えばピンバーを識別する際には、ローソク足の実体が小さく、髭が長いことを確認し、その髭と実体の比率が設定した閾値を超えているかどうかをチェックします。
- 弱気のピンバー:上髭が長く、上髭 ≥ 比率 × 実体、かつ下髭が小さい場合
- 強気のピンバー:下髭が長く、下髭 ≥ 比率 × 実体、かつ上髭が小さい場合
まずはごく小さい実体(Body > minPts)をフィルタで除外します。その上で、一方の髭が少なくとも InpWickBodyRatio × 実体を満たし、反対側の髭が実体の50%未満であることを条件として適用します。
// assume Body[i], UpperWick[i], LowerWick[i] already computed if(InpShowPinBar && Body[i] > InpMinBodySizePts*_Point) { // Bearish: towering upper wick, stubby lower wick if( UpperWick[i] > Body[i]*InpWickBodyRatio && LowerWick[i] < Body[i]*0.5 ) type = "Bearish Pin Bar"; // Bullish: towering lower wick, stubby upper wick else if( LowerWick[i] > Body[i]*InpWickBodyRatio && UpperWick[i] < Body[i]*0.5 ) type = "Bullish Pin Bar"; }
同時線の場合は、実体がポイントベースの閾値に対してごく小さいローソク足を探し、さらに髭が市場の迷いを示しているかを確認します。
- Body <= DojiBodyRatio × totalRange
- 両方の髭 > 実体(髭の存在を確認)
実体は全レンジの例えば10% (InpDojiBodyRatio)以内に制限します。また、各髭が実体を上回ることを条件にすることで、髭がほとんどない「コマ足」を除外できます。
// TotalRange[i] = high – low if(InpShowDoji && Body[i] <= TotalRange[i] * InpDojiBodyRatio // body tiny vs full range && UpperWick[i] > Body[i] // upper shadow present && LowerWick[i] > Body[i]) // lower shadow present type = "Doji";
包み足では、現在のローソク足と直前のローソク足を比較し、前のローソク足の始値と終値が逆方向にあり、かつ現在のローソク足が前の実体を完全に包み込んでいるかを確認します。
- 強気の包み足:前のバーは弱気、現在の始値≤前の終値、現在の終値≥前の始値、currBody > prevBody
- 弱気の包み足:前のバーは強気、現在の始値 ≥ 前日の終値、現在の終値 ≤ 前日の始値、currBody > prevBody
double po = iOpen(_Symbol,_Period,i+1), pc = iClose(_Symbol,_Period,i+1); double prevBody = MathAbs(pc - po), currBody = Body[i]; if(InpShowEngulfing && currBody > prevBody) { // Bullish: current body engulfs prior’s if(pc < po && op <= pc && cl >= po) type = "Bullish Engulfing"; // Bearish: current body engulfs prior’s else if(pc > po && op >= pc && cl <= po) type = "Bearish Engulfing"; }
丸坊主の場合、実体が全レンジの大部分を占めているかを確認し、強いモメンタムを示しているかを判定します。
- Body ≥ MarubozuBodyRatio × totalRange(つまり、≥ 90%)
- 両方の髭≤ (1 – MarubozuBodyRatio) × 全レンジ
if(InpShowMarubozu
&& Body[i] >= TotalRange[i] * InpMarubozuBodyRatio
&& UpperWick[i] <= TotalRange[i] * (1 - InpMarubozuBodyRatio)
&& LowerWick[i] <= TotalRange[i] * (1 - InpMarubozuBodyRatio))
{
type = (cl > op) ? "Bullish Marubozu" : "Bearish Marubozu";
}
パターンが検出されるたびに、総シグナル数と勝ち数のカウンタをインクリメントします。ここでいう「勝ち」とは、次のローソク足が期待した方向に動いたかどうかによって定義され、パターンの信頼性を測る指標となります。
if(type!="") { lastIdx = i; lastCl = cl; lastIsBuy = (StringFind(type,"Bullish")>=0); latestSignal = type; g_totalSignals++; double nextC = iClose(_Symbol,_Period,i-1); if(lastIsBuy && nextC>cl) g_totalWins++; if(!lastIsBuy && nextC<cl) g_totalWins++; DrawPattern(i, type, lastIsBuy); break; }
これらのシグナルを視覚的に把握できるように、DrawPattern関数を用いてチャート上に上下矢印を描画し、パターンの種類を示すラベルも表示します。また、パターンが出現した際には即座に通知するためのアラートも生成します。
void DrawPattern(int idx, const string type, bool isBuy) { datetime t = iTime(_Symbol,_Period,idx); double y = iHigh(_Symbol,_Period,idx) + 15*_Point; string an = StringFormat("PAQ_%s_%d",type,idx); ObjectCreate(0,an,OBJ_ARROW,0,t,y); ObjectSetInteger(0,an,OBJPROP_ARROWCODE,isBuy?233:234); ObjectSetInteger(0,an,OBJPROP_COLOR,isBuy?clrLime:clrRed); string lbl = an+"_lbl"; ObjectCreate(0,lbl,OBJ_LABEL,0,t,y-25*_Point); ObjectSetString(0,lbl,OBJPROP_TEXT,type); ObjectSetInteger(0,lbl,OBJPROP_COLOR,isBuy?clrLime:clrRed); }開発の過程で、EAを柔軟かつ情報豊富にすることを目標としました。そのため、直近のシグナルを保持するパターン履歴バッファを組み込み、バックテスト終了時やEAを削除した際には、総シグナル数、勝ち数、勝率などのパフォーマンス統計を出力します。これにより、時間を通じてパターン検出ロジックの有効性を評価することができます。
void OnDeinit(const int reason) { double rate = g_totalSignals>0 ? 100.0*g_totalWins/g_totalSignals : 0.0; PrintFormat("[PAQ] Backtest completed: Signals=%I64d Wins=%I64d WinRate=%.1f%%", g_totalSignals, g_totalWins, rate); }
まとめると、本EAは、ローソク足パターンの検出ロジックと視覚的インジケーター、パフォーマンス追跡機能を統合して開発されました。目的は、パターンの特定という時間のかかる作業を自動化しつつ、明確な視覚的シグナルとパフォーマンス統計を提供して、より情報に基づいたトレーディング判断を支援するシステムを作ることでした。
結果
次に、EAのリアルタイムおよびバックテストでのパフォーマンスを確認します。まず下図は、ライブ市場でEAが検出したパターンで、弱気の包み足です。前の陽線を完全に包み込む陰線であることから、真のパターンであることが明確に確認できます。
図7:弱気の包み足
次に、EAが正確に検出した弱気のピンバーです。有効なピンバーであり、ローソク足パターンを正確に識別できることを示しています。
図8:弱気ピンバー
最後に、バックテストの結果です。EAはパターンを正確に識別し、検出した各パターンの名称を操作ログに記録しています。
図9:バックテスト
結論
前章で示した結果から、本EAが4つの主要なローソク足パターンを安定して検出できることは明らかです。この成果は、初心者トレーダーだけでなく、経験豊富なトレーダーにとっても、目視では捉えにくいパターンの識別に役立ちます。私自身のバックテストおよびライブ市場での検証でも、EAは各パターンを正確に検出しました。どのシステムも完璧ではないため、すべてのシグナルが必ずしも結果につながるわけではありませんが、本EAはあくまで補助的で精密なプライスアクション分析手段を提供するものです。トレーダーはその後、自身の確認手法を用いてロングまたはショートの判断をおこなうことができます。
総じて、本EAはコアタスクであるパターン認識において優れた性能を発揮します。ターゲットとする4つのパターンを正確に検出する点で強く推奨できます。また、入力パラメータは各自の戦略に合わせて調整可能です。改善できる点や追加してほしい機能についてのフィードバックも歓迎します。
日付 | ツール名 | 詳細 | バージョン | アップデート | 備考 |
---|---|---|---|---|---|
01/10/24 | ChartProjector | 前日のプライスアクションをゴースト効果でオーバーレイするスクリプト | 1.0 | 初回リリース | ツール番号1 |
18/11/24 | Analytical Comment | 前日の情報を表形式で提供し、市場の将来の方向性を予測する | 1.0 | 初回リリース | ツール番号2 |
27/11/24 | Analytics Master | 2時間ごとに市場指標を定期的に更新 | 1.01 | v.2 | ツール番号3 |
02/12/24 | Analytics Forecaster | Telegram統合により、2時間ごとに市場指標を定期的に更新 | 1.1 | v.3 | ツール番号4 |
09/12/24 | Volatility Navigator | ボリンジャーバンド、RSI、ATR指標を使用して市場の状況を分析するEA | 1.0 | 初回リリース | ツール番号5 |
19/12/24 | Mean Reversion Signal Reaper | 平均回帰戦略を用いて市場を分析し、シグナルを提供する | 1.0 | 初回リリース | ツール番号6 |
9/01/25 | Signal Pulse | 多時間枠分析ツール | 1.0 | 初回リリース | ツール番号7 |
17/01/25 | Metrics Board | 分析用のボタン付きパネル | 1.0 | 初回リリース | ツール番号8 |
21/01/25 | External Flow | 外部ライブラリによる分析 | 1.0 | 初回リリース | ツール番号9 |
27/01/25 | VWAP | 出来高加重平均価格 | 1.3 | 初回リリース | ツール番号10 |
02/02/25 | Heikin Ashi | トレンドの平滑化と反転シグナルの識別 | 1.0 | 初回リリース | ツール番号11 |
04/02/25 | FibVWAP | Python分析によるシグナル生成 | 1.0 | 初回リリース | ツール番号12 |
14/02/25 | RSI DIVERGENCE | プライスアクションとRSIのダイバージェンス | 1.0 | 初回リリース | ツール番号13 |
17/02/25 | Parabolic Stop and Reverse (PSAR) | PSAR戦略の自動化 | 1.0 | 初回リリース | ツール番号14 |
20/02/25 | Quarters Drawerスクリプト | チャートにクォーターレベルを描く | 1.0 | 初回リリース | ツール番号15 |
27/02/25 | Intrusion Detector | 価格がクォーターレベルに達したときに検出して警告する | 1.0 | 初回リリース | ツール番号16 |
27/02/25 | TrendLoom Tool | 多時間枠分析パネル | 1.0 | 初回リリース | ツール番号17 |
11/03/25 | Quarters Board | クォーターレベルを有効または無効にするボタン付きのパネル | 1.0 | 初回リリース | ツール番号18 |
26/03/25 | ZigZag Analyzer | ジグザグインジケーターを使ったトレンドラインの描画 | 1.0 | 初回リリース | ツール番号19 |
10/04/25 | Correlation Pathfinder | Pythonライブラリを使用して通貨の相関関係をプロットする | 1.0 | 初回リリース | ツール番号20 |
23/04/25 | Market Structure Flip Detector Tool | 市場構造反転を検出する | 1.0 | 初回リリース | ツール番号21 |
08/05/25 | Correlation Dashboard | 異なるペア間の関係 | 1.0 | 初回リリース | ツール番号22 |
13/05/25 | Currency Strength Meter | 各通貨ペアの強さを測定する | 1.0 | 初回リリース | ツール番号23 |
21/05/25 | PAQ Analysis Tool | ローソク足形成検出器 | 1.0 | 初回リリース | ツール番号24 |
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/18207
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索