English Deutsch
preview
プライスアクション分析ツールキットの開発(第12回):External Flow (III)トレンドマップ

プライスアクション分析ツールキットの開発(第12回):External Flow (III)トレンドマップ

MetaTrader 5トレーディングシステム | 16 6月 2025, 14:38
114 2
Christian Benjamin
Christian Benjamin

はじめに

2020年のCOVID-19危機によって市場が変動する中、トレーダーたちは回復の兆しを見極めるためにさまざまなテクニカルツールを活用しました。中には、過去の価格動向に基づく転換点を特定しようと、フィボナッチタイムゾーンを試す者もいました。フィボナッチ予測と主要な反発の整合性には議論の余地がありますが、各国政府の景気刺激策と経済再開の中で、これらのツールは不確実な環境を乗り切るためのひとつのフレームワークを提供しました。

前回のプライスアクション分析ツールキット開発シリーズでは、VWAP(出来高加重平均価格)を用いた戦略を紹介し、VWAPの上で価格が推移していれば買い、下であれば売りとするシグナルの可能性に注目しました。しかし、VWAPだけに依存するのは、特に極端な市場状況や反転が発生する局面では問題となる可能性があります。

本記事では、VWAPにフィボナッチレベルを組み合わせることで、取引シグナルの生成をさらに進化させます。フィボナッチリトレースメントレベルは、サポートやレジスタンスの可能性がある領域を特定するのに役立ち、VWAPと組み合わせることで、より堅牢な取引戦略を構築できます。まずは基礎概念を解説し、次にMQL5のEAとPythonスクリプトの主要な関数を紹介します。その後、各関数の詳細を掘り下げ、想定される結果を考察し、最後に得られた知見をまとめます。以下の目次をご参照ください。 


概念

フィボナッチリトレースメントは、13世紀にレオナルド・フィボナッチによって紹介されたフィボナッチ数列に由来する比率に基づいており、価格の反転が起こる可能性のあるサポートやレジスタンスの水準を特定するために、テクニカル分析で広く使用されています。VWAPとフィボナッチリトレースメントを組み合わせることで、価格と出来高の両方のデータを考慮した市場の真のセンチメントと流動性を反映する、より堅牢な取引ツールが得られます。この統合により、出来高によって裏付けられた証拠で重要な反転ゾーンを確認できるため、誤ったシグナルを減らし、より動的な市場行動の見方を提供します。

TrendMapシステムは、MQL5(MetaTrader 5エキスパートアドバイザー(EA))とPythonベースの分析サーバーを統合した取引シグナル生成フレームワークです。このシステムは、フィボナッチリトレースメント水準、VWAP、および価格データを処理して、売買シグナルを生成します。 

  • VWAPがフィボナッチ50%水準(中間価格)を下回る場合、買いシグナルが生成されます。
  • VWAPがフィボナッチ50%水準を上回る場合、売りシグナルが生成されます。

これにより、VWAPおよびフィボナッチリトレースメント水準に基づいたプライスアクションからシグナルが提供されることが保証されます。 以下に、市場がフィボナッチ水準およびVWAPとどのように相互作用するかを示す図を示しています。この図は、Pythonベースのシステムがシグナル生成のために監視する必要条件を表しています。

  • Fib 0:0%
  • Fib 1:24%
  • Fib 2:38%
  • Fib 3:50%
  • Fib 4:62%
  • Fib 5:79%
  • Fib 6:100%

Fib 3は50%のリトレースメント水準を表しており、VWAPがこの水準よりも上にあることが観察されます。これは反転の可能性を示しており、結果として売りシグナルが生成されます。 また、価格がフィボナッチ水準およびVWAPの両方と交差している箇所を円で囲んで強調しています。

コンセプト

図1:価格vsフィボナッチおよびVWAP

MQL5 EAは、フィボナッチリトレースメントレベルとVWAP分析を統合し、取引シグナルを生成しますが、実際の売買はおこないません。EAは過去の指定された本数のバーからフィボナッチレベルを計算し、スイングハイ・スイングローを特定し、市場トレンドを評価するためにVWAPを算出します。そして、このデータをHTTP経由でPythonサーバーに送信し、市場状況を分析させたうえで「買い」または「売り」のシグナルを受け取ります。 新たなシグナルを受信すると、EAはチャートを更新し、シグナルの表示、フィボナッチライン、VWAPライン、矢印などを描画して視覚的に表現します。

タイマーイベントに基づいて定期的に動作し、定期的に更新をおこないながら市場の変化をログに記録し追跡します。このスクリプトでは、Flaskサーバーを構築し、MQL5 EAから送られる市場データを受け取り、それを処理して取引シグナルを返します。

EAがVWAP、フィボナッチリトレースメントレベル、スイング高値/安値、価格データを含むJSONデータを送信すると、スクリプトはVWAPがスイングレンジの中間価格より下か上かを判定し、買いまたは売りのシグナルを決定します。同時に、VWAP、フィボナッチレベル、価格データを描画したMatplotlibチャートを生成し、参照用に画像として保存します。この描画処理は別スレッドで実行されるため、全体の処理がスムーズに保たれます。

すべての処理はログに記録され、サーバーは127.0.0.1:5110で稼働します。 以下のフローチャートを見ながら、プロセス全体の流れを確認してみましょう。

メインロジック

図2:フローチャート


主な関数

MQL5 EA

このパートでは、MQL5で動作するFibonacci-VWAP EAの中核を成す主要な関数について詳しく解説します。目的は次の通りです。

  1. スイングハイとスイングローを使用してフィボナッチリトレースメントレベルを計算する
  2. トレンドを確認するためにVWAP(出来高加重平均価格)を算出する
  3. 市場データをPythonに送信し、より深い分析を行って売買シグナルを返してもらう
  4. すべての条件が満たされたらチャートにシグナル矢印を描画する

それでは、ステップごとに見ていきましょう。

1.フィボナッチインジケーターとVWAPインジケーターの更新

まず最初に、シグナルを生成する前に、フィボナッチリトレースメントレベルとVWAPが最新であることを確認する必要があります。そのため、2つの主要な関数を呼び出します。最初に呼び出すのはCalculateFibonacciLevels()関数で、これはスイングハイとスイングローを特定し、対応するフィボナッチリトレースメントレベルを計算する役割を持ちます。

これらのレベルは、潜在的なサポートおよびレジスタンスゾーンを把握するうえで非常に重要です。次に呼び出すCalculateVWAP()関数では、VWAP(出来高加重平均価格)を算出します。VWAPは、価格と出来高に基づいた市場全体のトレンドを判断する指標として機能します。これらのインジケーターを最新状態に保つことで、正確な分析と意思決定に不可欠な最新の市場データを確実に利用できます。

void UpdateIndicators()
  {
   CalculateFibonacciLevels(InpTimeFrame, InpNumBars, g_SwingHigh, g_SwingLow, g_FibLevels);
   g_VWAP = CalculateVWAP(InpTimeFrame, InpNumBars);
   Print("Updated Indicators: SwingHigh=" + DoubleToString(g_SwingHigh, Digits()) +
         ", SwingLow=" + DoubleToString(g_SwingLow, Digits()) +
         ", VWAP=" + DoubleToString(g_VWAP, Digits()));
  }

2.Pythonに市場データを送信する

フィボナッチインジケーターとVWAPインジケーターを更新した後のステップは、高度な分析のために市場データをPythonに送信することです。これは、必要な情報をすべて含むJSONペイロードを作成することでおこないます。このペイロードには、チャートの銘柄や時間枠、スイングハイとスイングローのポイント、VWAP値、計算されたフィボナッチレベルなどの主要なデータポイントが含まれています。さらに、最近の価格データも含めて、市場分析を補完します。データがこのJSON形式に構造化されると、HTTPリクエストを通じてPythonサーバーに送信され、Python側で処理されて計算に基づいた取引シグナルが返されます。

string BuildJSONPayload()
  {
   string jsonPayload = "{";
   jsonPayload += "\"symbol\":\"" + Symbol() + "\",";
   jsonPayload += "\"timeframe\":\"" + EnumToString(InpTimeFrame) + "\",";
   jsonPayload += "\"swingHigh\":" + DoubleToString(g_SwingHigh, Digits()) + ",";
   jsonPayload += "\"swingLow\":" + DoubleToString(g_SwingLow, Digits()) + ",";
   jsonPayload += "\"vwap\":" + DoubleToString(g_VWAP, Digits()) + ",";

   jsonPayload += "\"fibLevels\":[";
   for(int i = 0; i < 7; i++)
     {
      jsonPayload += DoubleToString(g_FibLevels[i], 3);
      if(i < 6) jsonPayload += ",";
     }
   jsonPayload += "],";

   jsonPayload += "\"priceData\":[";
   for(int i = 0; i < InpNumBars; i++)
     {
      jsonPayload += DoubleToString(iClose(Symbol(), InpTimeFrame, i), Digits());
      if(i < InpNumBars - 1) jsonPayload += ",";
     }
   jsonPayload += "]}";

   return jsonPayload;
  }

3. Pythonとの通信およびシグナルの受信

この段階では、HTTPリクエストが作成され、JSONペイロードがPythonスクリプトに送信されます。Pythonサーバーはデータを解析し、買いシグナルまたは売りシグナルを含むレスポンスを返します。HTTPリクエストは、データの送信とレスポンスの受信の両方を処理できるように構築されており、処理中のエラーもチェックします。リクエストが成功した場合(レスポンスコード200で示される)、レスポンスは解析され、Pythonから返されたJSONデータから該当するシグナル(買い、売り、または保留)が抽出されます。これにより、MQL5のEAは外部の計算リソースを意思決定プロセスに統合し、より堅牢な取引シグナルを実現します。

string SendDataToPython(string payload)
  {
   string headers = "Content-Type: application/json\r\n";
   char postData[];
   StringToCharArray(payload, postData);
   char result[];
   string resultHeaders;
   int resCode = WebRequest("POST", InpPythonURL, headers, InpHTTPTimeout, postData, result, resultHeaders);
   
   if(resCode == 200)
     {
      string response = CharArrayToString(result);
      Print("HTTP Response: " + response);
      string signal = ParseSignalFromJSON(response);
      return signal;
     }
   else
     {
      Print("Error: WebRequest failed with code " + IntegerToString(resCode));
      return "";
     }
  }

4. チャート上に買い/売りシグナルをプロットする

Pythonから取引シグナルを受け取った後のステップはそのシグナルをチャート上に視覚的に表示することです。これは、現在の市場価格の位置に矢印を描画することでおこなわれます。買いシグナルの場合は上向きの矢印(緑色)、売りシグナルの場合は下向きの矢印(赤色)が描かれます。この視覚的な表示は、トレーダーが数値を分析せずに素早く取引の提案を理解するために重要です。

矢印は ObjectCreate関数を使って動的に作成され、その見た目(色やサイズなど)は視認性を高めるために調整可能です。これらの矢印の使用により、システムの詳細な分析を追わなくても、取引シグナルが明確かつアクセスしやすくなります。

void DrawSignalArrow(string signal)
  {
   int arrowCode = 0;
   color arrowColor = clrWhite;

   string lowerSignal = MyStringToLower(signal);
   if(lowerSignal == "buy")
     {
      arrowCode = 233;  // Upward arrow
      arrowColor = clrLime;
     }
   else if(lowerSignal == "sell")
     {
      arrowCode = 234;  // Downward arrow
      arrowColor = clrRed;
     }
   else
     {
      Print("Invalid signal: " + signal);
      return;
     }

   string arrowName = "SignalArrow_" + IntegerToString(TimeCurrent());
   ObjectCreate(0, arrowName, OBJ_ARROW, 0, TimeCurrent(), iClose(Symbol(), PERIOD_CURRENT, 0));
   ObjectSetInteger(0, arrowName, OBJPROP_ARROWCODE, arrowCode);
   ObjectSetInteger(0, arrowName, OBJPROP_COLOR, arrowColor);
   ObjectSetInteger(0, arrowName, OBJPROP_WIDTH, 2);
  }

Pythonスクリプト

1.VWAPとフィボナッチの価格に対するプロット

plot_vwap_fib_vs_price()関数は、価格の動き、VWAP、フィボナッチリトレースメントレベルを可視化します。これにより、これら3つの指標の関係性を理解するのに役立ちます。関数は以下のパラメータを受け取ります。

  • symbol:分析対象の資産 
  • vwap:計算された出来高加重平均価格(VWAP)
  • swingHighswingLow :フィボナッチリトレースメントレベルを計算するための高値と安値
  • fibLevels:フィボナッチリトレースメントレベル(デフォルトでは0.236、0.382などの一般的な値が含まれます)
  • price_data:時間軸に沿った価格データを含むpandasのSeries

関数の内訳:

  • 価格データのプロット:sns.setでスタイルを設定し、ax.plotを使って時間軸に沿った価格データを描画します
  • フィボナッチレベルの描画:リスト内の各フィボナッチレベルについて、対応する価格を計算し、ax.axhlineで水平線を描きます
  • VWAPの描画:VWAPは黄色の水平線として描かれます
  • プロットの保存:前回のチャートを上書きしないように、タイムスタンプ付きでプロットを画像ファイルとして保存します

このプロットは価格が主要なフィボナッチリトレースメントレベルおよびVWAPとどのように相互作用しているかを視覚的に示すのに役立ちます。

def plot_vwap_fib_vs_price(symbol: str, vwap: float, swingHigh: float, swingLow: float, fibLevels: list, price_data: pd.Series) -> str:     sns.set(style="whitegrid")     fig, ax = plt.subplots(figsize=(7.5, 5), dpi=100)     ax.plot(price_data.index, price_data.values, label="Price", color='blue', marker='o', markersize=4)     for level in fibLevels:         level_price = swingLow + (swingHigh - swingLow) * level         ax.axhline(y=level_price, linestyle='--', linewidth=1.5, label=f'Fib {level*100:.1f}%: {level_price:.5f}')          ax.axhline(y=vwap, color='yellow', linestyle='-', linewidth=2, label=f'VWAP: {vwap:.5f}')     ax.set_title(f'VWAP & Fibonacci vs Price for {symbol}')     ax.set_xlabel('Time Index')     ax.set_ylabel('Price')     ax.legend()     filename = f"vwap_fib_plot_{symbol}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"     plt.savefig(filename)     plt.close(fig)     return filename

2.シグナルおよび分析用のFlaskルート

get_signal()関数はPOSTリクエストを処理する主要なルートであり、市場データの受信、分析の実行、取引シグナルの返却を担当します。このデータはMQL5からJSONペイロードとして送信されます。

関数の内訳:

  • データの受信:生データを受け取り、デコードしてJSONオブジェクトに解析します。
  • データの抽出:銘柄、swingHighswingLowvwapfibLevelspriceDataなどの主要なデータをJSONから抽出します。
  • プロット作成:新しいスレッドでプロット関数を呼び出し、市場状況(VWAPとフィボナッチ)を視覚化します。
  • シグナル生成:VWAPとスイングハイ・スイングローの中間点を比較して売買シグナルを生成します。VWAPが中間点より低ければ買いシグナルを生成し、それ以外は売りシグナルを発行します。
  • レスポンス:生成したシグナル(「買い」「売り」「なし」)と説明を返します。

シグナル生成のロジックはシンプルながら効果的です。

  • 買いシグナル:VWAPがスイングハイ・スイングローの中間点より低く、上昇の勢いが期待されます。
  • 売りシグナル:VWAPが中間点より上にあり、下降トレンドまたは弱気の状況を示唆しています。

@app.route('/getSignal', methods=['POST']) def get_signal():     try:         # Get the raw data from the request         raw_data = request.data.decode('utf-8').strip()         logging.debug("Raw data received: " + raw_data)         # Parse JSON         decoder = json.JSONDecoder()         data, idx = decoder.raw_decode(raw_data)         if idx != len(raw_data):             logging.error(f"Extra data found after valid JSON: index {idx} of {len(raw_data)}")         logging.info("Data received from MQL5: " + json.dumps(data, indent=2))     except Exception as e:         logging.error("Error parsing JSON: " + str(e))         return jsonify({"signal": "None", "error": str(e)})     try:         # Extract parameters         symbol = data.get('symbol', 'Unknown')         swingHigh = float(data.get('swingHigh', 0))         swingLow = float(data.get('swingLow', 0))         vwap = float(data.get('vwap', 0))         fibLevels = data.get('fibLevels', [0.236, 0.382, 0.5, 0.618, 1.618])  # Default levels if not provided         # Convert priceData list into a pandas Series         price_data = pd.Series(data.get('priceData', []))         # Start thread for visualization         threading.Thread(target=plot_vwap_fib_vs_price, args=(symbol, vwap, swingHigh, swingLow, fibLevels, price_data)).start()         # Determine signal based on VWAP & Fibonacci         mid_price = np.mean([swingHigh, swingLow])         if vwap < mid_price and price_data.iloc[-1] < swingLow + (swingHigh - swingLow) * 0.382:             signal = "Buy"         elif vwap > mid_price and price_data.iloc[-1] > swingLow + (swingHigh - swingLow) * 0.618:             signal = "Sell"         else:             signal = "None"         explanation = f"Signal: {signal} based on VWAP and Fibonacci analysis."     except Exception as e:         logging.error("Error processing data: " + str(e))         signal = "None"         explanation = "Error processing the signal."     # Build response     response = {         "signal": signal,         "explanation": explanation,         "received_data": data     }     logging.debug("Sending response to MQL5: " + json.dumps(response))     return jsonify(response)

コード内のシグナル生成プロセスでは、VWAPとフィボナッチの両方を考慮しており、買いシグナルまたは売りシグナルを生成するかどうかの判断は、両者の一致に明確に依存しています。買いまたは売りのシグナルは、VWAPとフィボナッチレベルの整合性に直接基づいています。以下はその代表例です。

  • 買いシグナル:VWAPが中間点より下で、価格がサポートレベル(フィボナッチリトレースメント)に接近している場合、強い買いのサインとなります。
  • 売りシグナル:VWAPが中間点より上で、価格がレジスタンスのフィボナッチレベルにある場合、売りのシグナルがより強くなります。


その他の関数

MQL5 EA

  • 補助関数

まずは補助関数から始めましょう。これらは、後での作業を簡単にするための小さな道具のようなものです。たとえば、BoolToString関数は真偽値(true/false)を文字列(「true」または「false」)に変換します。これにより、ログ出力や表示の際に読みやすくなります。次に、CharToStrは、文字コード(unsigned short)を受け取り、それを文字列に変換する関数です。テキストデータを扱うときに便利です。最後に、MyStringToLowerは、与えられた文字列を1文字ずつ処理し、大文字を小文字に変換します。これは、大文字小文字を区別せずに文字列比較をしたいときに特に役立ちます。以下に正確なコードを示します。

//+------------------------------------------------------------------+ //| Helper: Convert bool to string                                   | //+------------------------------------------------------------------+ string BoolToString(bool val)   {    return(val ? "true" : "false");   } //+------------------------------------------------------------------+ //| Helper: Convert ushort (character code) to string                | //+------------------------------------------------------------------+ string CharToStr(ushort ch)   {    return(StringFormat("%c", ch));   } //+------------------------------------------------------------------+ //| Helper: Convert a string to lower case                           | //| This custom function avoids the implicit conversion warning.     | //+------------------------------------------------------------------+ string MyStringToLower(string s)   {    string res = "";    int len = StringLen(s);    for(int i = 0; i < len; i++)      {       ushort ch = s[i];       // Check if character is uppercase A-Z.       if(ch >= 'A' && ch <= 'Z')          ch = ch + 32;       res += CharToStr(ch);      }    return res;   }

本質的に、これらの関数は、EA全体でテキストとデータの処理の一貫性を保証するのに役立ちます。

  • 初期化とクリーンアップ

次に、初期化とクリーンアップのルーチンがあります。これは、舞台が始まる前の準備や終わった後の片付けのようなものです。OnInit関数では、EAはまずウェルカムメッセージを表示します。その後、定期的な処理に欠かせないEventSetTimer でタイマーを設定し、InitializeFibonacciArrayを呼び出してフィボナッチレベルを事前に読み込みます。また、次回の更新管理のために現在時刻を記録します。タイマーの設定に失敗した場合は、それ以上の問題を避けるためにEAは即座に停止します。一方、OnDeinit関数はEAがチャートから削除された際に呼び出され、EventKillTimerでタイマーを停止し、終了理由をログに残します。以下はその処理の例です。

//+------------------------------------------------------------------+ //| Expert initialization function                                   | //+------------------------------------------------------------------+ int OnInit()   {    Print("FibVWAP No-Trade EA initializing...");    if(!EventSetTimer(InpTimerInterval))      {       Print("Error: Unable to set timer.");       return(INIT_FAILED);      }    InitializeFibonacciArray();    g_LastUpdateTime = TimeCurrent();    Print("FibVWAP No-Trade EA successfully initialized.");    return(INIT_SUCCEEDED);   } //+------------------------------------------------------------------+ //| Expert deinitialization function                                 | //+------------------------------------------------------------------+ void OnDeinit(const int reason)   {    EventKillTimer();    Print("FibVWAP No-Trade EA deinitialized, reason code: " + IntegerToString(reason));   } //+------------------------------------------------------------------+ //| Initialize Fibonacci levels array                                | //+------------------------------------------------------------------+ void InitializeFibonacciArray()   {    g_FibLevels[0] = 0.000;    g_FibLevels[1] = 0.236;    g_FibLevels[2] = 0.382;    g_FibLevels[3] = 0.500;    g_FibLevels[4] = 0.618;    g_FibLevels[5] = 0.786;    g_FibLevels[6] = 1.000;   }

環境を慎重にセットアップし、片付けることで、EAがスムーズに動作し、問題を残さないようにしています。

  • 定期実行とイベント処理

次に、EAが実行中にタスクをどのように管理しているかを見ていきましょう。ここで重要なのがOnTimer関数です。これはユーザーが設定した間隔(InpTimerInterval)で呼び出されます。このタイマーが動くたびに、EAはインジケーターを更新し、JSONペイロードを作成してPythonのエンドポイントへ送信し、返ってきたシグナルを処理します。新しいシグナルがあれば、チャート上に矢印を描画します。OnTickは市場の更新ごと(ティックごと)に呼ばれますが、重い処理が毎回おこなわれないようにMainProcessingLoopの呼び出しに限定し、制御された間隔でのみ実行されるようにしています。この設計により、EAの効率が保たれます。以下にコードを示します。

//+------------------------------------------------------------------+ //| Expert timer function: periodic update                           | //+------------------------------------------------------------------+ void OnTimer()   {    UpdateIndicators();    string payload = BuildJSONPayload();    Print("Payload sent to Python: " + payload);    string signal = SendDataToPython(payload);    if(signal != "")      {       if(signal != g_LastSignal)         {          g_LastSignal = signal;          Print("New signal received: " + signal);          Comment("ML Signal: " + signal);          // Draw an arrow on the chart for the new signal.          DrawSignalArrow(signal);         }       else         {          Print("Signal unchanged: " + signal);         }      }    else      {       Print("Warning: No valid signal received.");      }    UpdateChartObjects();   } //+------------------------------------------------------------------+ //| Expert tick function                                             | //+------------------------------------------------------------------+ void OnTick()   {    MainProcessingLoop();   } //+------------------------------------------------------------------+ //| Main processing loop: can be called from OnTick                  | //+------------------------------------------------------------------+ void MainProcessingLoop()   {    datetime currentTime = TimeCurrent();    if(currentTime - g_LastUpdateTime >= InpTimerInterval)      {       UpdateChartObjects();       g_LastUpdateTime = currentTime;      }   }

この設定により、EAはすべてのティックに圧倒されることなく、適切なペースで更新を実行できます。

  • チャートオブジェクトの管理

取引において視覚的なフィードバックは重要であり、ここでチャートオブジェクト管理が役立ちます。DrawChartObjects関数は、フィボナッチレベルやVWAPを表す水平線など、チャート上の視覚要素を描画する役割を担っています。最初に前回のオブジェクトをすべてクリアして散らかりを防ぎ、その後、適切な色やスタイル、テキストラベルを設定して新しいオブジェクトを作成します。補助関数のUpdateChartObjectsは、コードをモジュール化するために単純にDrawChartObjectsを呼び出します。また、追加の更新やデバッグ処理が必要な場合はExtendedProcessingが用意されています。次がコードです。

//+------------------------------------------------------------------+ //| Draw objects on the chart for visual indicator levels            | //+------------------------------------------------------------------+ void DrawChartObjects()   {    string objPrefix = "FibVWAP_";    // Remove previous objects with the given prefix.    ObjectsDeleteAll(0, objPrefix);    double range = g_SwingHigh - g_SwingLow;    for(int i = 0; i < 7; i++)      {       double levelPrice = g_SwingLow + range * g_FibLevels[i];       string name = objPrefix + "FibLevel_" + IntegerToString(i);       if(!ObjectCreate(0, name, OBJ_HLINE, 0, 0, levelPrice))          Print("Error creating object: " + name);       else         {          ObjectSetInteger(0, name, OBJPROP_COLOR, clrDeepSkyBlue);          ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DOT);          ObjectSetString(0, name, OBJPROP_TEXT, "Fib " + DoubleToString(g_FibLevels[i]*100, 0) + "%");         }      }    string vwapName = objPrefix + "VWAP";    if(!ObjectCreate(0, vwapName, OBJ_HLINE, 0, 0, g_VWAP))       Print("Error creating VWAP object.");    else      {       ObjectSetInteger(0, vwapName, OBJPROP_COLOR, clrYellow);       ObjectSetInteger(0, vwapName, OBJPROP_STYLE, STYLE_SOLID);       ObjectSetString(0, vwapName, OBJPROP_TEXT, "VWAP");      }   } //+------------------------------------------------------------------+ //| Periodically update chart objects                                | //+------------------------------------------------------------------+ void UpdateChartObjects()   {    DrawChartObjects();   } //+------------------------------------------------------------------+ //| Extended processing: additional updates and chart redraw         | //+------------------------------------------------------------------+ void ExtendedProcessing()   {    Print("Extended processing executed.");    UpdateChartObjects();   }

  • 追加のユーティリティ関数
最後に、ユーティリティ関数を見てみましょう。これらは、EAを裏で支える縁の下の力持ち的存在です。CharArrayToString関数は、ウェブリクエストなどで受け取った文字の配列を使いやすい文字列に変換します。LogDebugInfoは、タイムスタンプ付きでメッセージを出力し、EAの動作を時間軸で追跡できるようにします。これはデバッグ時に非常に役立ちます。そしてPauseExecutionは、指定した秒数だけEAの動作を一時停止させることができ、テスト中の挙動観察などで役立ちます。以下にこれらユーティリティのコードを示します。

//+------------------------------------------------------------------+ //| Convert char array to string                                     | //+------------------------------------------------------------------+ string CharArrayToString(const char &arr[])   {    string ret = "";    for(int i = 0; i < ArraySize(arr); i++)       ret += CharToStr(arr[i]);    return(ret);   } //+------------------------------------------------------------------+ //| Custom logging function for detailed debug information           | //+------------------------------------------------------------------+ void LogDebugInfo(string info)   {    string logMessage = TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS) + " | " + info;    Print(logMessage);   } //+------------------------------------------------------------------+ //| Additional utility: Pause execution (for debugging)              | //+------------------------------------------------------------------+ void PauseExecution(int seconds)   {    datetime endTime = TimeCurrent() + seconds;    while(TimeCurrent() < endTime)      {       Sleep(100);      }   }

これらの関数はEAの主役ではないかもしれませんが、トラブルシューティングやシステムが期待通りに動作していることを確認する際には大きな役割を果たします。

Pythonスクリプト

  • Python取引システムにおける主要なインポート
このシステムで使われている主要なライブラリを分解して説明します。データ処理、計算、マーケットの洞察の可視化など、それぞれが重要な役割を担っています。以下にこれらのインポートコードスニペットと、各ライブラリの役割とシステムへの貢献を説明する表を示します。

import datetime   import json   import logging   import threading   import numpy as np   import pandas as pd   import pandas_ta as ta   import matplotlib.pyplot as plt   import seaborn as sns   from flask import Flask, request, jsonify  

ライブラリ用途システム内での使用法
datetime時間管理保存された取引チャートとログイベントにタイムスタンプを付けるために使用されます。チャートを生成するたびに、タイムスタンプを添付して、時間の経過に伴うさまざまな市場状況を追跡します。
jsonデータ交換システムがMQL5と通信するため、JSON形式でデータを送受信します。このモジュールは、PythonとMQL5間でJSONメッセージをエンコードおよびデコードするのに役立ちます。
loggingデバッグと監視システムイベントを追跡します。これを使用して、シグナルの受信時、処理時、エラーの発生時など、すべてのステップをログに記録し、デバッグを容易にします。
threadingバックグラウンドでのタスクの実行VWAP-フィボナッチチャートを生成するときは、サーバーの応答性が維持され、MQL5 へのシグナルの送り返しが遅延しないように、別のスレッドで実行します。
numpy数値計算NumPyを使用して仲値を計算し、その他の数学演算を迅速かつ効率的に実行します。リアルタイムの市場データを処理する際には速度が重要です。
pandasデータ処理市場データは行と列(スプレッドシートのように)で構造化されているため、Pandasを使用して、分析用にこのデータを簡単に保存、フィルタリング、操作します。
pandas_taテクニカル指標現在のシステムの中核部分ではありませんが、将来必要になった場合に追加のテクニカル分析ツールを使用できるようになります。
matplotlib.pyplotチャート作成と視覚化視覚分析のバックボーン。これを使用して、価格変動、VWAPレベル、フィボナッチ リトレースメントゾーンをプロットします。
seanborn強化されたチャートスタイルチャートを視覚的に魅力的にし、トレンドや重要なレベルを見つけやすくします。
flask MQL5とPython間の通信 これにより、リアルタイムのシグナル交換が可能になります。Flaskは、MQL5 EAが価格データを送信し、取引シグナルを即座に受信できるようにする API を作成します。 
  • Flask サーバーの初期化(if __name__ == '__main__')
このブロックはFlask Webサーバーを初期化して実行し、MQL5 EAがHTTPリクエストを介してPythonスクリプトと通信できるようにします。

以下がその仕組みです。
  • サーバーをポート5110にバインドします
  • リアルタイムのログ記録とトラブルシューティングのためにデバッグモードで実行します
  • サーバーが不必要に自動再起動しないようにします(use_reloader=False)

if __name__ == '__main__':     port = 5110     logging.info(f"Starting Flask server on 127.0.0.1:{port} (debug mode ON)")     app.run(host="127.0.0.1", port=port, debug=True, use_reloader=False)

`

結果

システムをテストするには、まずPythonスクリプトを実行して、接続のためのポートとサーバーを起動します。スクリプトの実行方法がわからない場合は、External Flowの記事を参照してください。サーバーが正常に起動したら、次にMQL5 EAを実行します。それでは、システムが正常に稼働した後の結果を確認していきましょう。

コマンドプロンプトログ

2025-02-06 12:45:32,384 DEBUG: Sending response to MQL5: {"signal": "Sell", "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", "received_data": {"symbol": "EURUSD", "timeframe": "PERIOD_H1", "swingHigh": 1.05331, "swingLow": 1.02099, "vwap": 1.03795, "fibLevels": [0.0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0], "priceData": [1.03622, 1.03594, 1.03651, 1.03799, 1.03901, 1.03865, 1.03871, 1.0392, 1.03951, 1.04025, 1.03974, 1.03986, 1.04041, 1.04017, 1.04049, 1.04072, 1.04156, 1.04197, 1.04181, 1.04223, 1.04224, 1.04079, 1.04192, 1.04147, 1.04251, 1.04039, 1.04039, 1.04026, 1.0385, 1.03778, 1.03786, 1.03796, 1.03845, 1.03734, 1.03786, 1.03714, 1.0378, 1.03786, 1.03854, 1.03817, 1.03811, 1.03767, 1.03784, 1.03801, 1.03593, 1.03404, 1.03254, 1.03223, 1.0335, 1.03386, 1.03344, 1.03115, 1.03067, 1.02932, 1.0306, 1.03147, 1.0322, 1.03221, 1.03178, 1.03281, 1.0342, 1.03441, 1.02955, 1.02846, 1.02785, 1.02795, 1.02761, 1.03162, 1.0251, 1.0264, 1.02577, 1.02522, 1.02438, 1.0231, 1.02436, 1.02249, 1.02431, 1.02404, 1.02265, 1.02216, 1.02235, 1.02377, 1.02314, 1.0247, 1.02504, 1.03583, 1.03733, 1.03763, 1.03698, 1.042, 1.03998, 1.03964, 1.03687, 1.03822, 1.03825, 1.03759, 1.03765, 1.03836, 1.03845, 1.0404, 1.03946, 1.03888, 1.03875, 1.0385, 1.03897, 1.03884, 1.03867, 1.03969, 1.03873, 1.03885, 1.04076, 1.0428, 1.0425, 1.0417, 1.04197, 1.04314, 1.0428, 1.04562, 1.04033, 1.03918, 1.04007, 1.04076, 1.04217, 1.04239, 1.04139, 1.0422, 1.04191, 1.04253, 1.0423, 1.042, 1.04259, 1.04247, 1.04216, 1.04209, 1.04105, 1.04164, 1.042, 1.04213, 1.04157, 1.04194, 1.04013, 1.03878, 1.0404, 1.04016, 1.04037, 1.04038, 1.04244, 1.04161, 1.04372, 1.04403, 1.04386, 1.04374, 1.0434, 1.04272, 1.04304, 1.04272, 1.04286, 1.04301, 1.04315, 1.0435, 1.04264, 1.04279, 1.04262, 1.04241, 1.04314, 1.04249, 1.04203, 1.04234, 1.0425, 1.04352, 1.04252, 1.04342, 1.04376, 1.04364, 1.04336, 1.04291, 1.04336, 1.04378, 1.04453, 1.0437, 1.04886, 1.04916, 1.04881, 1.04926, 1.04849, 1.04888, 1.04908, 1.04992, 1.05094, 1.05199, 1.05212, 1.0513, 1.05054, 1.04888, 1.04875, 1.04571, 1.04591, 1.0463, 1.04633, 1.04686]}} 2025-02-06 12:39:32,397 INFO: 127.0.0.1 - - [06/Feb/2025 12:39:32] "POST /getSignal HTTP/1.1" 200 - 2025-02-06 12:39:32,805 DEBUG: VWAP & Fibonacci vs Price graph saved as vwap_fib_plot_EURUSD_20250206_123932.png

MQL5ログ

2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 0 (0%): 1.02099 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 1 (24%): 1.02862 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 2 (38%): 1.03334 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 3 (50%): 1.03715 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 4 (62%): 1.04096 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 5 (79%): 1.04639 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Fib Level 6 (100%): 1.05331 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Updated Indicators: SwingHigh=1.05331, SwingLow=1.02099, VWAP=1.03795 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Payload sent to Python: {"symbol":"EURUSD","timeframe":"PERIOD_H1","swingHigh":1.05331,"swingLow":1.02099,"vwap":1.03795,"fibLevels":[0.000,0.236,0.382,0.500,0.618,0.786,1.000],"priceData":[1.03583,1.03594,1.03651,1.03799,1.03901,1.03865,1.03871,1.03920,1.03951,1.04025,1.03974,1.03986,1.04041,1.04017,1.04049,1.04072,1.04156,1.04197,1.04181,1.04223,1.04224,1.04079,1.04192,1.04147,1.04251,1.04039,1.04039,1.04026,1.03850,1.03778,1.03786,1.03796,1.03845,1.03734,1.03786,1.03714,1.03780,1.03786,1.03854,1.03817,1 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)     HTTP Response: { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)       "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)       "received_data": { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         "fibLevels": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.0, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.236, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.382, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.5, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.618, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         ], 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         "priceData": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03583, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03594, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03651, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03799, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03901, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03865, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03871, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0392, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03951, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04025, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03974, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03986, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04041, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04017, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04049, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04072, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04156, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04197, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04181, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04223, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04224, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04079, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04192, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04147, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04251, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04026, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0385, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03778, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03796, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03845, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03734, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03714, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0378, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03854, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03817, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03811, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03767, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03784, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03801, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03593, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03254, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03223, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0335, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03344, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03115, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03067, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02932, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0306, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03147, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0322, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03221, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03178, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03281, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03441, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02955, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02846, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02785, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02795, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02761, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03162, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0251, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02577, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02522, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02438, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0231, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02436, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02431, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02265, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02235, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02377, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02504, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03583, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03733, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03763, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03698, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03998, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03964, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03687, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03822, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03825, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03759, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03765, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03836, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03845, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03946, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0385, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03897, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03884, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03867, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03969, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03873, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03885, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0417, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04197, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04562, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04033, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03918, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04007, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04217, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04239, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04139, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0422, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04191, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04253, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0423, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04259, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04209, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04105, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04164, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04213, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04157, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04194, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04013, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03878, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04016, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04037, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04038, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04244, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04161, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04372, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04403, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04374, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0434, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04304, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04286, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04301, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04315, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0435, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04279, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04262, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04241, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04203, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04234, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04352, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04252, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04376, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04364, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04291, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04378, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04453, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0437, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04886, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04916, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04881, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04926, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04849, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04908, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04992, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05094, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05199, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05212, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0513, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05054, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04571, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04591, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0463, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04633, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04686 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         ], 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "swingHigh": 1.05331, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "swingLow": 1.02099, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "symbol": "EURUSD", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "timeframe": "PERIOD_H1", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "vwap": 1.03795 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)       }, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)       "signal": "Sell" 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)     }

VWAP-フィボナッチ対価格グラフもプロットされ、Pythonスクリプトと同じディレクトリに保存されました。このプロットは、価格がVWAPおよびフィボナッチ レベルとどのように相互作用するかを可視化するのに役立ちます。

MATPLOTLIB

図3:Matplotlibプロット

以下の図では、MetaTrader 5のチャート上でMQL5のEAがPythonサーバーからのレスポンスをログに記録し、表示しています。チャートには矢印で示された2つの買いシグナルが表示されており、これらは[エキスパート]タブにも記録されています。市場がこれらのシグナルの方向に沿って動いたことが確認でき、シグナルの有効性が裏付けられました。より明確な分析をおこなうために、私はM1チャートを表示することにしました。

B300

図4:Boom 300 Indexのテスト


結論

このシステムは、トレーダーにとって非常に有用であることがわかりました。シグナルを提供するだけでなく、シグナル生成時に価格がフィボナッチレベルやVWAPとどのように相互作用しているかを明確に可視化することができます。可視化は2つの方法で実現されています。1つは、PythonがMatplotlibライブラリを使用してグラフを描画する方法、もう1つは、MQL5 EAがVWAPとフィボナッチのラインをチャート上に直接表示する方法です。このような視覚的な強化により、トレーダーはより適切な判断を下すことが可能になります。

日付ツール名 詳細バージョン アップデート 備考
01/10/24ChartProjector前日のプライスアクションをゴースト効果でオーバーレイするスクリプト1.0初回リリースLynnchris Tool Chestの最初のツール
18/11/24Analytical Comment前日の情報を表形式で提供し、市場の将来の方向性を予測する1.0初回リリースLynnchris Tool Chestの2番目のツール
27/11/24Analytics Master2時間ごとに市場指標を定期的に更新 1.01v.2Lynnchris Tool Chestの3番目のツール
02/12/24Analytics Forecaster Telegram統合により、2時間ごとに市場指標を定期的に更新1.1v.3ツール番号4
09/12/24Volatility Navigatorボリンジャーバンド、RSI、ATR指標を使用して市場の状況を分析するEA1.0初回リリースツール番号5
19/12/24Mean Reversion Signal Reaper 平均回帰戦略を用いて市場を分析し、シグナルを提供する 1.0 初回リリース ツール番号6 
9/01/25 Signal Pulse 多時間枠分析ツール1.0 初回リリース ツール番号7 
17/01/25 Metrics Board 分析用のボタン付きパネル 1.0 初回リリースツール番号8 
21/01/25External Flow外部ライブラリによる分析1.0 初回リリースツール番号9 
27/01/25VWAP出来高加重平均価格  1.3 初回リリース ツール番号10 
02/02/25 Heikin Ashi トレンドの平滑化と反転シグナルの識別 1.0 初回リリース ツール番号11
04/02/25 FibVWAP Python分析によるシグナル生成 1.0 初回リリース ツール番号12

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

添付されたファイル |
server.py (4.53 KB)
FIBVWAP.mq5 (17.22 KB)
最後のコメント | ディスカッションに移動 (2)
linfo2
linfo2 | 21 3月 2025 において 18:52
クリスさん、いつもありがとうございます。この記事を読むためには、Price Action Analysis Toolkit Development (Part 9) を再確認した上で、自分の環境に合った設定をする必要があります:外部フロー - MQL5関連記事 他の方の参考になるかもしれません。

1 自分のアドレスかローカルホスト127.0.0.1を使うようにスクリプトを更新する。

2 ツールオプションのウェブリクエストURLに、使用しているアドレスを追加する。

4 Pythonパーツがすべてインストールされていることを確認する

matplotlibをインストールする

pipでpandasをインストール

pip install Flask seaborn and Numpty if necessary

3 使用しているアドレスでpythonファイルを実行して、そのアドレスでflaskアプリを起動する。

Christian Benjamin
Christian Benjamin | 22 3月 2025 において 14:59
linfo2 #:
クリスさん、いつもありがとうございます。この記事を読むためには、Price Action Analysis Toolkit Development (Part 9) を再確認した上で、自分の環境に合った設定をする必要があります:外部フロー - MQL5関連記事 他の方の参考になるかもしれません。

1 自分のアドレスかローカルホスト127.0.0.1を使うようにスクリプトを更新する。

2 ツールオプションのウェブリクエストURLに、使用しているアドレスを追加する。

4 Pythonパーツがすべてインストールされていることを確認する

matplotlibをインストールする

pipでpandasをインストール

pip install Flask seaborn and Numpty if necessary

3 使用しているアドレスでpythonファイルを実行して、そのアドレスでflaskアプリを起動する。

こんにちは、linfo2
あなたが提供した追加メモの通りです。ありがとうございます。
MQL5での取引戦略の自動化(第6回):スマートマネートレーディングのためのオーダーブロック検出の習得 MQL5での取引戦略の自動化(第6回):スマートマネートレーディングのためのオーダーブロック検出の習得
この記事では、純粋なプライスアクション分析を用いてMQL5でオーダーブロック検出を自動化します。オーダーブロックの定義、検出の実装、自動売買への統合をおこない、最後に戦略のバックテストを通じてパフォーマンスを評価します。
MQL5入門(第12回):初心者のためのカスタムインジケーター作成ガイド MQL5入門(第12回):初心者のためのカスタムインジケーター作成ガイド
MQL5でカスタムインジケーターを構築する方法を学びます。プロジェクトベースのアプローチを採用します。この初心者向けガイドでは、インジケーターバッファ、プロパティ、トレンドの視覚化について解説し、段階的に学習を進めることができます。
JSONをマスターする:MQL5で独自のJSONリーダーをゼロから作成する JSONをマスターする:MQL5で独自のJSONリーダーをゼロから作成する
オブジェクトと配列の処理、エラーチェック、シリアル化を備えたMQL5でカスタムJSONパーサーを作成する手順をステップバイステップで説明します。MetaTrader5でJSONを処理するためのこの柔軟なソリューションを使用して、取引ロジックと構造化データを橋渡しするための実用的な洞察を得ることができます。
エキスパートアドバイザーの堅牢性テスト エキスパートアドバイザーの堅牢性テスト
戦略開発には、多くの複雑な要素が含まれていますが、これらの多くは初心者トレーダーには十分に伝えられていません。その結果、私自身を含め多くのトレーダーが、こうした教訓を痛みを伴う経験を通じて学ぶことになりました。この記事では、MQL5で戦略を開発する際に初心者トレーダーが直面しがちな一般的な落とし穴について、私の観察に基づいて解説します。EAの信頼性を見極め、簡単に実践できる方法で自作EAの堅牢性を検証するための、さまざまなヒントやコツ、具体例を紹介します。本記事の目的は、読者がEA購入時の詐欺を回避し、自身の戦略開発での失敗を未然に防げるよう支援することです。