English Deutsch
preview
プライスアクション分析ツールキットの開発(第31回):Python Candlestick Recognitionエンジン(I) - 手動検出

プライスアクション分析ツールキットの開発(第31回):Python Candlestick Recognitionエンジン(I) - 手動検出

MetaTrader 5統合 |
66 0
Christian Benjamin
Christian Benjamin

内容



はじめに

ローソク足チャートは、金融アナリストやトレーダーが時間の経過に伴う価格変動を視覚化し、分析するための基本的なツールです。もともとは何世紀も前の日本の米商人に由来するこのチャートは、株式、FX、先物など、さまざまな金融市場におけるテクニカル分析の重要な要素へと進化してきました。 

パターン

ローソク足は、特定の時間枠内での始値、終値、高値、安値といった重要なデータポイントを示すことで、市場のセンチメントに関する基本情報を提供します。各ローソク足の独自の構造は市場心理の洞察を与え、潜在的な取引シグナルとして活用することも可能です。 

本記事では、MQL5とPythonの機能を活用した包括的なCandlestick Recognition(ローソク足認識)システムの開発について解説します。まずは手動検出の方法を実装し、MQL5からメトリクスを抽出し、あらかじめ定義した基準に基づいてパターン名を割り当てるスクリプトを作成します。認識自体はMQL5だけでも実現可能ですが、本記事ではMQL5とPythonの役割を分担することで、それぞれの強みを活かし、より柔軟かつ堅牢なシステムを構築します。 

続編の記事では、Pythonのライブラリを活用してローソク足パターン認識の高度な機能を取り入れ、パターン検出の精度やバリエーションをさらに向上させます。本記事では、ローソク足パターン識別の詳細に迫り、この統合的アプローチが取引分析をどのように強化するかを解説します。 以下は、本記事で取り上げる手順の概要です。

  • 各パターンの分析:各ローソク足パターンを個別に検討し、Pythonにおける認識方法を解説します。
  • MQL5とPythonの連携の確認:MQL5エキスパートアドバイザー(EA)がPythonサーバーとどのようにやり取りをおこなうか、データ交換プロセスや通信フローについて解説します。
  • 結果の評価と結論:最後にシステムの成果を評価し、その有効性を議論した上で、性能や改善の可能性について結論を述べます。


ローソク足パターン分析

ローソク足の太い部分は実体と呼ばれ、特定期間内の始値と終値の差を表します。実体が塗りつぶされている場合は、終値が始値より低く、陰線(弱気)を示します。逆に、塗りつぶされていない、または異なる色の実体は、終値が始値より高く、陽線(強気)を示します。

ヒゲは実体から伸びており、その期間の最高値と最安値を示します。ヒゲの長さや位置は市場の変動性や投資家心理を示し、価格が始値と終値に対してどのように変動したかを理解する手がかりになります。

ローソク足パターンは市場参加者の心理を反映しており、彼らの感情や期待を表現しています。テクニカル分析では、これらの視覚的サインを利用して、エントリーやエグジットのタイミングを見極めます。ローソク足チャートの起源は18世紀の日本にさかのぼり、当時の米取引の商人が米価を監視するために使用していました。今日では、株式、為替ペア、先物などの流動性の高い資産分析に広く活用されています。

陽線と陰線

  • 陽線

終値が始値を上回るローソク足を陽線と呼びます。白色や緑色で表示されることが多く、上昇圧力や買い優勢を示します。特に重要なサポート付近で長い陽線が出現すると、買い意欲の強さを示唆します。

  • 陰線

終値が始値を下回るローソク足を陰線と呼びます。黒色や赤色で表示されることが多く、下落圧力や売り優勢を示します。長い陰線は強い売り圧力や下降トレンドの継続を示唆します。

  • 色の慣習

多くの取引プラットフォームでは、陽線を白や緑、陰線を黒や赤で表示するのが一般的です。しかし、色の選択は必ずしも固定されているわけではありません。重要なのは色そのものではなく、始値と終値の関係を理解することです。市場心理を正確に読み取るためには、常に始値と終値の位置関係に注目することが重要です。

幅広いローソク足パターンが存在しますが、当システムでは特に重要なパターンに焦点を当てています。以下では、各パターンの視覚的特徴を示し、Pythonでどのように判定するかを解説します。

ハンマー

ハンマーは、始値・高値・終値がほぼ同じ位置にあり、実体が小さいローソク足です。特徴は長い下ヒゲで、価格が一時的に下がったものの買い手が押し戻したことを示します。これは底値圏での潜在的な強気シグナルであり、市場で買い手が優勢になりつつあることを示しています。ハンマーは下落トレンドの転換点として注目されます。 以下はPythonスクリプトでHammerパターンを識別するためのコードスニペットです。

# inside detect_patterns(df: pd.DataFrame)
for i, _ in enumerate(df.index):
    o,h,l,c = df.iloc[i][["OPEN","HIGH","LOW","CLOSE"]]
    body = abs(c - o)
    lower = min(o,c) - l
    upper = h - max(o,c)
    
    if lower >= 2*body and upper <= body:
        pats[i] = "hammer"
        continue

  • 実体:(abs(close - open)).
  • 下ヒゲ:実体の2倍以上
  • 上ヒゲ:実体以下
  • この条件が満たされると、pats[]配列に「hammer」というラベルが付けられます。

流れ星

流れ星は、始値・安値・終値がほぼ同じ位置にある場合に出現します。その結果、実体が非常に小さく、上ヒゲが長いローソク足となります。ハンマーの弱気版と見なされることが多く、上昇モメンタムの反転または停滞の可能性を示します。テクニカル分析の専門家は、上ヒゲが実体の少なくとも2倍以上であることをパターンの有効性を確認する基準として推奨しています。

# inside detect_patterns(df: pd.DataFrame)
for i, _ in enumerate(df.index):
    o,h,l,c = df.iloc[i][["OPEN","HIGH","LOW","CLOSE"]]
    body = abs(c - o)
    lower = min(o,c) - l
    upper = h - max(o,c)
    
    if upper >= 2*body and lower <= body:
        pats[i] = "shootingstar"
        continue

  • 実体:始値と終値の差
  • 上ヒゲ:実体の2倍以上、下ヒゲ:小さいこと(実体以下)
  • これらの条件が満たされると、パターンは「shootingstar」としてマークされます

包み足(強気と弱気)

 強気の包み足は、小さな陰線の後に、大きな陽線が前のローソクの実体を完全に包むパターンです。このパターンは、買い圧力が売り圧力を上回ったことを示し、下落トレンドから上昇トレンドへの潜在的な反転を示唆します。 

# Bullish Engulfing: small red followed by large green that engulfs it
if i >= 1:
    prev_o, prev_c = df.iloc[i-1][["OPEN", "CLOSE"]]
    curr_o, curr_c = o, c
    if (prev_c < prev_o and curr_c > curr_o and  # red candle then green
        curr_o < prev_c and curr_c > prev_o):    # body engulfs previous
        pats[i] = "bullishengulfing"
        continue

弱気の包み足はその逆です。小さな陽線の後に、大きな陰線が前のローソクの実体を完全に包むパターンです。このパターンは、売り圧力が増大したことを示し、上昇トレンドから下降トレンドへの潜在的な反転を示唆します。

# Bearish Engulfing: small green followed by large red that engulfs it
if i >= 1:
    prev_o, prev_c = df.iloc[i-1][["OPEN", "CLOSE"]]
    curr_o, curr_c = o, c
    if (prev_c > prev_o and curr_c < curr_o and  # green candle then red
        curr_o > prev_c and curr_c < prev_o):    # body engulfs previous
        pats[i] = "bearishengulfing"
        continue

同時線

同時線は、始値と終値がほぼ同じで、実体が非常に小さいかほとんどないローソク足です。このパターンは市場の迷いや不確実性を示しており、その期間中、買い手と売り手のいずれも支配的になっていないことを表します。

# Doji: very small or no real body
if abs(c - o) <= (h - l) * 0.1:
    pats[i] = "doji"
    continue

  • 実体:abs(c - o)(始値と終値の差)
  • ローソクの範囲:(h - l)(高値と安値の差)。実体がレンジの10%以下であれば、同時と判定されます。

ハラミ(強気と弱気)

ハラミは、日本語で「妊婦」を意味する言葉に由来する、テクニカル分析でよく知られたパターンです。このパターンは2本のローソク足で構成されます。1本目は大きなローソク足で「母ローソク」と呼ばれ、2本目はその範囲内に収まる小さなローソク足で「子ローソク」と呼ばれます。パターンが有効とされるには、2本目のローソクが前のローソクの実体内で終値をつける必要があり、市場モメンタムの一時停止や反転の可能性を示します。

上昇トレンド後に出現する場合、売り圧力の弱まりを示し、弱気反転のサインとなることがあります。下降トレンド後に出現する場合、買い圧力の増加を示し、強気の兆しとなることがあります。

if i >= 1:
    prev_o, prev_c = df.iloc[i-1][["OPEN", "CLOSE"]]
    curr_o, curr_c = o, c

    # Previous candle: large body (engulfing candle)
    prev_body = abs(prev_c - prev_o)
    curr_body = abs(curr_c - curr_o)

    if prev_body > 0 and curr_body > 0:
        # Bullish Harami
        if prev_o > prev_c and curr_o < curr_c:  # bearish → bullish
            if curr_o > prev_c and curr_c < prev_o:
                pats[i] = "bullishharami"
                continue

        # Bearish Harami
        if prev_o < prev_c and curr_o > curr_c:  # bullish → bearish
            if curr_o < prev_c and curr_c > prev_o:
                pats[i] = "bearishharami"
                continue

明けの明星

明けの明星は、下落トレンドの後に現れる代表的な強気の反転パターンで、市場心理が弱気から強気に変わる可能性を示します。3本のローソク足で構成されます。1本目は大きな陰線で、強い売り圧力を示します。2本目は小さな実体のローソク足(陽線または陰線)で、1本目からギャップがあり、迷いやモメンタムの一時停止を表します。3本目は大きな陽線で、1本目の実体の中間値を超えて終値をつけ、上昇モメンタムへの移行を確認します。

この3本ローソクのパターンは、売り手の勢いが弱まり、買い手が優勢になっていることを示し、確認されると、持続的な上昇につながる可能性があります。明けの明星は、特に長期の下落後にロングポジションのエントリーポイントを見極めるために、トレーダーに広く利用されています。

if i >= 2:
    o1, c1 = df.iloc[i-2][["OPEN", "CLOSE"]]  # First candle
    o2, c2 = df.iloc[i-1][["OPEN", "CLOSE"]]  # Second (small) candle
    o3, c3 = df.iloc[i][["OPEN", "CLOSE"]]    # Third candle

    # Candle directions
    is_bearish1 = c1 < o1
    is_small2 = abs(c2 - o2) < abs(c1 - o1) * 0.5
    is_bullish3 = c3 > o3

    # Morning Star Logic
    if is_bearish1 and is_small2 and c3 > ((o1 + c1) / 2) and c3 > o3:
        if min(o2, c2) < c1 and max(o2, c2) > c1:  # small gap
            pats[i] = "morningstar"
            continue

  • 1本目:長い陰線
  • 2本目:小さな実体のローソク足(陽線または陰線)
  • 3本目:長い陽線で、1本目の中間値を超えて終値をつける

このパターンは3本のローソク足による反転パターンで、通常、下落トレンドの終わりを示します。

宵の明星

宵の明星は、上昇トレンドの後に現れる代表的な弱気の反転パターンで、強気から弱気への市場心理の変化を示す可能性があります。3本のローソク足で構成されます。1本目は大きな陽線で、強い買い圧力を反映します。2本目は小さな実体のローソク足(陽線または陰線)で、1本目からギャップがあり、市場の迷いや停滞を示します。3本目は大きな陰線で、1本目の実体の中まで終値をつけ、反転を確認します。この3本ローソクのパターンは、強気から弱気への潜在的なトレンド反転を示します。

このパターンは、買い手の勢いが弱まり、売り手が優勢になっていることを示し、確認されると下降トレンドや調整につながることがあります。トレーダーは、特に長期の上昇後には短期ポジションを検討したり、ロングポジションからの撤退サインとして宵の明星を利用します。

if i >= 2:
    o1, c1 = df.iloc[i-2][["OPEN", "CLOSE"]]  # First candle
    o2, c2 = df.iloc[i-1][["OPEN", "CLOSE"]]  # Second (small) candle
    o3, c3 = df.iloc[i][["OPEN", "CLOSE"]]    # Third candle

    is_bullish1 = c1 > o1
    is_small2 = abs(c2 - o2) < abs(c1 - o1) * 0.5
    is_bearish3 = c3 < o3

    if is_bullish1 and is_small2 and c3 < ((o1 + c1) / 2) and c3 < o3:
        if max(o2, c2) > c1 and min(o2, c2) < c1:  # small gap possible
            pats[i] = "eveningstar"
            continue

  • 1本目:長い陽線
  • 2本目:実体が小さい(優柔不断)
  • 3本目:大きな陰線で、1本目の実体の中まで終値をつける

この3本ローソクのパターンは、強気から弱気への潜在的なトレンド反転を示します。


MQL5とPythonの連携

システムでは、ローソク足パターンの判定ロジックはPythonマイクロサービスに任せ、MQL5のEAはデータ収集、チャートへの表示、アラート処理に専念します。新しいバーが確定するたびに、EAは直近31本分のOHLCデータを取得し、JSON形式でローカルのFlaskサーバーに渡します。サーバーから返されたパターン情報を受け取り、チャート上に表示します。すべてほぼリアルタイムで処理されます。仕組みを段階的に説明します。
  • MQL5 EA:MQL5でのデータ収集
新しいバーごとに(OnTick)、EAは直近31本のバーのタイムスタンプと始値、高値、安値、終値を配列に取り込みます。
void OnTick()
{
   static datetime lastBar = 0;
   datetime bar = iTime(_Symbol, InpTF, 0);
   if(bar == lastBar) return;
   lastBar = bar;

   double o[ BARS ], h[ BARS ], l[ BARS ], c[ BARS ];
   long   t[ BARS ];
   for(int i=0; i<BARS; i++)
   {
      o[i] = iOpen(_Symbol, InpTF, i+1);
      h[i] = iHigh(_Symbol, InpTF, i+1);
      l[i] = iLow (_Symbol, InpTF, i+1);
      c[i] = iClose(_Symbol, InpTF, i+1);
      t[i] = (long)iTime(_Symbol, InpTF, i+1);
   }
   // …then build JSON…
}
  • MQL5 EA:JSONペイロードの構築
StringFormatを使用して、EAはシンボル、時間足、タイムスタンプ、OHLC配列を1行のJSON文字列にまとめ、送信可能な形式にします。
string json = StringFormat(
  "{\"symbol\":\"%s\",\"timeframe\":%d,"
  "\"time\":[%s],\"open\":[%s],\"high\":[%s],"
  "\"low\":[%s],\"close\":[%s]}",
  _Symbol, InpTF,
  CSVInt(t), CSV(o), CSV(h), CSV(l), CSV(c)
);
  • MQL5 EA:HTTP POST経由で送信
EAはWebRequest("POST", …)を使ってhttp://127.0.0.1:5000/patternsに送信します。リクエストが失敗した場合はエラーをログに記録し、成功した場合はPythonサーバーからのJSONレスポンスを受け取ります。
char body[];    StringToCharArray(json, body);
char reply[];   string hdr="Content-Type: application/json\r\n", respHdr;
int code = WebRequest("POST", InpURL, hdr, InpTimeout, body, reply, respHdr);
if(code == -1)
  Print("[CSLAB] WebRequest failed: ", GetLastError());
else
  string resp = CharArrayToString(reply, 0, -1, CP_UTF8);
  • Python:Flaskサーバー処理
Pythonサービスは末尾の不要な文字を取り除き、整形されたJSONを辞書としてデコードし、提供されたタイムスタンプをキーにしてpandasのDataFrameを再構築します。
@app.route("/patterns", methods=["POST"])
def patterns():
    raw = request.get_data(as_text=True)
    idx = raw.rfind("}")
    clean = raw[:idx+1] if idx != -1 else raw
    payload = json.loads(clean)   # may raise JSONDecodeError
    # …build DataFrame…

  • Python:データフレームの構築

build_dataframe関数は、タイムスタンプ、始値、高値、安値、終値の生のJSON配列を、パターン検出器が扱いやすい時間インデックス付きのDataFrameに変換する役割を果たします。

def build_dataframe(payload):
    times = [ datetime.fromtimestamp(int(t), timezone.utc)
              for t in payload["time"] ]
    df = pd.DataFrame({
      "OPEN":  payload["open"],
      "HIGH":  payload["high"],
      "LOW":   payload["low"],
      "CLOSE": payload["close"]
    }, index=times)
    df.index.name = "datetime"
    return df

  • Python:手動パターン検出

カスタムのdetect_patterns(df)ルーチンは、各行をスキャンして、Doji、Hammer、Shooting Star、Engulfing、Harami、Morning Star、Evening Starのシグナルを検出します。外部のテクニカル分析ライブラリは不要です。
def detect_patterns(df):
    pats = ["None"]*len(df)
    for i in range(len(df)):
        o,h,l,c = df.iloc[i][["OPEN","HIGH","LOW","CLOSE"]]
        body = abs(c-o); rng = max(h-l,1e-6)
        lower = min(o,c)-l; upper = h-max(o,c)
        # doji
        if body/rng <= 0.1:
            pats[i] = "doji"; continue
        # hammer
        if lower>=2*body and upper<=body:
            pats[i] = "hammer"; continue
        # shooting star
        if upper>=2*body and lower<=body:
            pats[i] = "shootingstar"; continue
        # bullish engulfing
        if i>0:
            po,pc = df.iloc[i-1][["OPEN","CLOSE"]]
            if pc<po and c>o and o<=pc and c>=po:
                pats[i] = "bullishengulfing"; continue
        # bearish engulfing
        if i>0:
            po,pc = df.iloc[i-1][["OPEN","CLOSE"]]
            if pc>po and c<o and o>=pc and c<=po:
                pats[i] = "bearishengulfing"; continue
        # harami
        if i>0:
            po,pc = df.iloc[i-1][["OPEN","CLOSE"]]
            if pc<po and o<c and o>pc and c<po:
                pats[i] = "bullishharami"; continue
            if pc>po and o>c and o<pc and c>po:
                pats[i] = "bearishharami"; continue
        # morning star
        if i>1:
            o1,c1 = df.iloc[i-2][["OPEN","CLOSE"]]
            o2,c2 = df.iloc[i-1][["OPEN","CLOSE"]]
            if c1<o1 and abs(c2-o2)<(df.iloc[i-1]["HIGH"]-df.iloc[i-1]["LOW"])*0.3 \
               and c>o2 and c>(o1+c1)/2:
                pats[i] = "morningstar"; continue
        # evening star
        if i>1:
            o1,c1 = df.iloc[i-2][["OPEN","CLOSE"]]
            o2,c2 = df.iloc[i-1][["OPEN","CLOSE"]]
            if c1>o1 and abs(c2-o2)<(df.iloc[i-1]["HIGH"]-df.iloc[i-1]["LOW"])*0.3 \
               and c<o2 and c<(o1+c1)/2:
                pats[i] = "eveningstar"; continue
    return pats
  • Python:レスポンスの作成

サーバーは「None」でないすべてのパターンを集計し、簡潔なJSON構造として返します。

pats = detect_patterns(df)
counts = Counter(pats)
log_lines = [f"{k}={v}" for k,v in counts.items() if k!="None"]
resp = {"patterns": pats, "log": log_lines, "ms": round((datetime.now(timezone.utc)-start).total_seconds()*1000,2)}
return make_response(json.dumps(resp), 200, {"Content-Type":"application/json"})
  • MQL5 EA:EAの解析と動作
MQL5側では、patterns配列を抽出し、31件に揃っていることを確認して、logメッセージを記録します。その後、実際に検出された各パターンについて、対応するバーの上にテキストラベルを描画し、Alert()を発生させます。
// extract patterns array
string patTxt; ExtractArray(resp, "patterns", patTxt);
string patt[]; ParseArray(patTxt, patt);
// draw+alert
for(int i=0;i<BARS;i++)
   if(patt[i]!="None")
   {
      datetime tm=iTime(_Symbol,InpTF,i+1);
      ObjectCreate(0,"CS_"+i,OBJ_TEXT,0,tm,iHigh(_Symbol,InpTF,i+1));
      ObjectSetString(0,"CS_"+i,OBJPROP_TEXT,patt[i]);
      Alert(_Symbol, " ", patt[i], " at ", TimeToString(tm,TIME_DATE|TIME_MINUTES));
   }


テストと結果

このセクションでは、システムのテストと結果の分析に焦点を当てます。その前に、Pythonのインストール方法とサーバーのセットアップ手順を確認し、正常に動作することを確かめます。

ダウンロード

まず、公式WebサイトからPythonをダウンロードしてインストールします。 大きな黄色のボタン「Download Python 3.x.x」をクリックしてください。

インストーラーの実行

ダウンロードしたファイルをダブルクリックします。[Install Now]を押す前に、[Add Python to PATH]にチェックを入れてください。これにより、コマンドプロンプトからどこでもPythonを実行できるようになります。[Install Now]をクリックし、完了したら[Close]を押します。

確認

Win + Rを押して「cmd」と入力し、Enterを押します。開いた黒いウィンドウで以下を入力します。

python --version

「Python 3.10.4」のような表示が出れば、Pythonは正常にインストールされています。

Pythonのインストールが成功したら、次のステップはPythonスクリプトを作成することです。

Notepad++を開く

Notepad++(または任意のプレーンテキストエディター)を起動します。

ファイルの新規作成

[ファイル]>[新規作成]を選択し、必要に応じて[言語]>[P]>[Python]で構文ハイライトを有効にします。

サーバーコードの貼り付け

pattern_server.pyの内容(Flaskアプリとdetect_patterns(df)を含む全コード)をコピーして新しいウィンドウに貼り付けます。

ファイルの保存

  • [ファイル]>[名前を付けて保存]を選択し、
  • わかりやすいフォルダ(例:C:\PatternServer\)に保存します。
  • [ファイル名]に「pattern_server.py」と入力します(.py拡張子は重要です)。
  • [保存]をクリックします。

必要なライブラリをインストールする

コマンドプロンプトを開く

まず、WindowsキーとRキーを同時に押して、[実行]ダイアログボックスを開きます。入力フィールドにcmdと入力し、Enterキーを押すか[OK]をクリックしてコマンドプロンプトウィンドウを起動します。ここで、システムをナビゲートし、スクリプトを実行するためのコマンドを実行します。

ディレクトリの変更

次に、次に、Pythonスクリプトを保存したフォルダに移動します。コマンドプロンプトで、cd(ディレクトリ変更)コマンドに続けてスクリプトフォルダへのパスを入力します。以下はその例です。

cd path\to\your\script\folder
path\to\your\script\folderをシステム上の実際のパスに置き換えます。この操作により、ターミナルセッションが正しい場所を指すようになり、スクリプトを問題なく実行できます。

Flaskとpandasのインストール

pip install flask pandas

これで、Flask(小型Webサーバー)とpandas(データ処理用)がインストールされます。 以下のような表示が出ます。

* Serving Flask app "pattern_server"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

これはマイクロサービスが起動し、リクエストの受信を待っている状態を意味します。 次に、MQL5のEAをコンパイルしてチャートにドラッグします。これにより、EAと起動中のPythonサーバー間の接続が確立されます。以下は、システムを実行した後に得られた結果と観察結果です。 

EURUSDのテスト

MetaTrader 5[エキスパート]タブのログ

2025.07.09 22:25:42.248 Candlestick Label (EURUSD,M15)  [CSLAB] EA started – allow http://127.0.0.1:5000/patterns in Tools→Options→Expert Advisors→WebRequest
2025.07.09 22:25:42.790 Candlestick Label (EURUSD,M15)  [CSLAB] JSON-OUT: {"symbol":"EURUSD",
"timeframe":0,"time":[1752064200,1752065100,1752066000,1752066900,1752067800,1752068700,1752069600,
1752070500,1752071400,1752072300,1752073200,1752074100,1752075000,1752075900,1752076800,1752077700,
1752078600,1752079500,1752080400,1752081300,1752082200,1752083100,1752084000,1752084900,1752085800,
1752086700,1752087600,1752088500,1752089400,1752090300,1752091200],"open":[1.17051,1.17045,1.17153,
1.17167,1.17143,1.17096,1.17034,1.17152,1.17193,1.17194,1.17148,1.17095,1.1706

2025.07.09 22:25:42.790 Candlestick Label (EURUSD,M15)  [CSLAB] POST http://127.0.0.1:5000/patterns
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] HTTP 200 RESP: {"patterns": ["doji",
 "bullishengulfing", "None", "None", "eveningstar", "None", "bullishengulfing", "None", "doji", 
"bearishengulfing", "None", "None", "None", "None", "None", "bearishengulfing", "None", "None", 
"bullishengulfing", "doji", "bearishengulfing", "None", "None", "None", "None", "None", "None",
 "None", "hammer", "eveningstar", "None"], "log": ["doji=3", "bullishengulfing=3", "eveningstar=2",
 "bearishengulfing=3", "hammer=1", "total patterns=12"], "ms": 128.25}
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: doji=3
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: bullishengulfing=3
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: eveningstar=2
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: bearishengulfing=3
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: hammer=1
2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15)  [CSLAB] SERVER: total patterns=12

CMD Pythonログ

2025-07-09 22:25:42,806 [INFO] RAW BODY: {"symbol":"EURUSD","timeframe":0,"time":[1752064200,1752065100,1752066000,1752066900,1752067800,
1752068700,1752069600,1752070500,1752071400,1752072300,1752073200,1752074100,1752075000,1752075900,1752076800,1752077700,1752078600,
1752079500,1752080400,1752081300,1752082200,1752083100,1752084000,1752084900,1752085800,1752086700,1752087600,1752088500,1752089400,
1752090300,1752091200],"open":[1.17051,1.17045,1.17153,1.17167,1.17143,1.17096,1.17034,1.17152,1.17193,1.17194,1.17148,1.17095,1.17066,
1.17085,1.17060,1.17072,1.17015,1.17066,1.17050,1.17087,1.17088,1.17059,1.17086,1.17174,1.17160,1.17105,1.17134,1.17166,1.17216,1.17226,
1.17189],"high":[1.17091,1.17170,1.17206,1.17225,1.17186,1.17098,1.17160,1.17246,1.17223,1.17194,1.17163,1.17112,1.17098,1.17103,1.17091,
1.17088,1.17071,1.17073,1.17109,1.17104,1.17092,1.17102,1.17179,1.17176,1.17164,1.17147,1.17170,1.17222,1.17232,1.17232,1.17199],
"low":[1.17008,1.17036,1.17120,1.17109,1.17088,1.17005,1.17028,1.17152,1.17152,1.17131,1.17095,1.17050,1.17055,1.17050,1.17059,1.17009,1.17013,
1.17039,1.17039,1.17077,1.17043,1.17056,1.17051,1.17141,1.17091,1.17101,1.17130,1.17163,1.17188,1.17180,1.17163],"close":[1.17045,
1.17153,1.17170,1.17143,1.17096,1.17034,1.17152,1.17193,1.17194,1.17149,1.17096,1.17066,1.17086,1.17061,1.17072,1.17015,1.17067,
1.17050,1.17087,1.17088,1.17058,1.17087,1.17175,1.17160,1.17104,1.17133,1.17165,1.17216,1.17227,1.17189,1.17177]}
2025-07-09 22:25:42,934 [INFO] SEND: {'patterns': ['doji', 'bullishengulfing', 'None', 'None', 'eveningstar', 'None', 'bullishengulfing',
 'None', 'doji', 'bearishengulfing','None', 'None', 'None', 'None', 'None', 'bearishengulfing', 'None', 'None', 'bullishengulfing', 'doji',
 'bearishengulfing', 'None', 'None', 'None', 'None', 'None', 'None', 'None','hammer', 'eveningstar', 'None'], 'log': ['doji=3', 
'bullishengulfing=3', 'eveningstar=2', 'bearishengulfing=3', 'hammer=1', 'total patterns=12'], 'ms': 128.25}
2025-07-09 22:25:42,936 [INFO] 127.0.0.1 - - [09/Jul/2025 22:25:42] "POST /patterns HTTP/1.1" 200 -

クラッシュ1000のテスト


結論

この2部構成のアーキテクチャ(片方にMQL5のEA、もう片方にPythonのパターンサーバー)は、堅牢かつ応答性に優れていることが確認されました。EAは各新しいバーのOHLCデータをきれいにまとめて送信し、返ってきたパターンラベルをチャート上に正確に描画します。一方、PythonサービスはそのJSONを受け取り、手作りの検出ロジックを実行し、すべてのリクエストと結果を記録して完全な透明性を提供します。両者が組み合わさることで、シームレスで低レイテンシのパイプラインが形成され、新しいバーが到着するとパターンが特定され、チャートがほぼ瞬時に更新されます。双方での明確で構造化されたログにより、常に何が起きているかを把握でき、トラブルシューティングも容易です。

全体として、統合は堅実で性能は安定しており、システムは設計通りに正確なリアルタイムのローソク足情報を提供します。 必要に応じて、追加のローソク足パターンを組み込むことも可能です。前述の通り、今後の記事ではPythonライブラリを活用したローソク足検出のより高度な手法やツールについても詳しく解説していきます。





   
ChartProjector
Analytical Comment
Analytics Master
Analytics Forecaster 
Volatility Navigator
Mean Reversion Signal Reaper
Signal Pulse 
Metrics Board 
External Flow
VWAP
Heikin Ashi   FibVWAP  
RSI DIVERGENCE
Parabolic Stop and Reverse (PSAR) 
Quarters Drawerスクリプト
Intrusion Detector
TrendLoom Tool  Quarters Board 
ZigZag Analyzer  Correlation Pathfinder  Market Structure Flip Detector Tool
Correlation Dashboard   Currency Strength Meter 
PAQ Analysis Tool 
Dual EMA Fractal Breaker
Pin bar, Engulfing and RSI divergence
Liquidity Sweep Opening Range Breakout Tool Boom and Crash Interceptor CCI Zer-Line EA
Candlestick Recognition          

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/18789

添付されたファイル |
patterns.py (5.24 KB)
MQL5取引ツール(第4回):動的配置とトグル機能による多時間軸スキャナダッシュボードの改善 MQL5取引ツール(第4回):動的配置とトグル機能による多時間軸スキャナダッシュボードの改善
この記事では、MQL5の多時間軸スキャナーダッシュボードを、移動可能および切り替え機能付きにアップグレードします。ダッシュボードをドラッグできるようにし、画面の使用効率を高めるために最小化/最大化オプションを追加します。これらの機能強化を実装し、テストすることで、より柔軟な取引環境を実現します。
初心者からエキスパートへ:MQL5を使ったアニメーションニュース見出し(V) - イベントリマインダーシステム 初心者からエキスパートへ:MQL5を使ったアニメーションニュース見出し(V) - イベントリマインダーシステム
本ディスカッションでは、News Headline EAに表示される経済指標カレンダーイベントに対して、精緻化されたイベント通知ロジックを統合することで得られる追加的な改善について検討します。この強化により、主要な今後のイベント直前にユーザーがタイムリーに通知を受け取れるようになります。詳細については、本ディスカッションでご確認ください。
MQL5で他の言語の実用的なモジュールを実装する(第2回):Pythonに着想を得たREQUESTSライブラリの構築 MQL5で他の言語の実用的なモジュールを実装する(第2回):Pythonに着想を得たREQUESTSライブラリの構築
この記事では、MetaTrader 5 (MQL5)でWebリクエストの送受信をより簡単におこなうために、Pythonのrequestsモジュールに似たモジュールを実装します。
MQL5で自己最適化エキスパートアドバイザーを構築する(第8回):複数戦略分析(2) - 加重投票方策 MQL5で自己最適化エキスパートアドバイザーを構築する(第8回):複数戦略分析(2) - 加重投票方策
本記事では、アンサンブル内で最適な戦略数を決定することがどれほど複雑な課題であるか、その解決がMetaTrader 5の遺伝的アルゴリズム最適化ツールを用いることで容易になるかを検討します。さらに、バックテストおよび最適化の高速化を目的として、MQL5クラウドも主要なリソースとして活用します。これらの議論を通じて、初期のアンサンブル結果に基づき、取引戦略を評価し、改善するための統計モデルを開発するための基盤を整えることを目的としています。