English Deutsch
preview
MQL5とPythonを使用したブローカーAPIとエキスパートアドバイザーの統合

MQL5とPythonを使用したブローカーAPIとエキスパートアドバイザーの統合

MetaTrader 5 | 2 6月 2025, 09:19
72 0
Clemence Benjamin
Clemence Benjamin

はじめに

今回は、MetaTrader 5のEAと外部ブローカーをAPI連携でスムーズに接続する方法を解説します。主な目的は、取引口座の残高が設定した閾値を下回った場合に自動で残高補充処理をおこない、資金不足の問題を解決することです。  この手法は資金管理の課題に効果的に対処し、取引の効率性と安全性を高めることが可能となります。

通常、私たちはブローカーの口座ポータルにログインして各種操作や取引をおこなっていますが、これは従来の方法です。一方、API (Application Programming Interface)という強力な仕組みを利用することで、より多くのことが可能になり、運用も最適化できます。「API」に馴染みのある方もいれば、そうでない方もいらっしゃると思いますので、ここでは以下のポイントに分けてわかりやすく解説します。

  1. APIとは何か
  2. APIの使用
  3. APIへのアクセス
  4. APIドキュメント

これらを詳しく見てみましょう。

1.APIとは何か

API (Application Programming Interface)とは、ソフトウェアシステムと外部がやり取りを行うための仕組みです。本件においては、手動でログインせずとも、サーバー上で直接ブローカーの口座操作をおこなうことを可能にします。

興味深いことに、APIは1940年代から存在していましたが、1970年代に注目されるようになり、2000年代以降に急速に普及しました。

2. APIの使用

APIはソフトウェア間のコミュニケーションを円滑にします。主な利用分野の例は以下の通りです。

  • Webサイトサーバー
  • モバイルアプリケーション

また、APIは様々な外部情報源からのデータにシームレスにアクセスする手段としても活用されます。

  • ソーシャルメディアプラットフォーム
  • クラウドストレージ
  • 決済ゲートウェイ
  • 気象観測所
  • 株式・金融市場

API

外部コンピュータとクラウドサーバー間の橋渡しとして機能するAPI


3.APIへのアクセス

APIを利用するには、一般的に以下の手順が必要です。

  • 提供元からAPIキーを取得する
  • APIを正しく統合するために、APIドキュメントを熟読する
  • 認証・認可のため、APIキーをリクエストのパラメータに含める
  • APIキーは、アプリケーションやユーザーを識別し、安全なアクセスを保証するために重要です。

4.APIドキュメント

APIにはそれぞれ固有のユーザーガイドや仕様書が付属しています。これらはAPIを効果的に操作するための詳細な説明が記載されています。たとえば、Telegram APIのドキュメントは、DerivBroker APIなどのブローカーのAPIのドキュメントとは大きく異なります。

APIの理解と活用によって、業務を効率化し、プロセスの自動化を実現し、ブローカー口座管理の効率を向上させることができます。これから各要素について詳しく見ていき、その実践的な実装方法を探っていきましょう。

議論の主なセクションのリストは次のとおりです。


本稿の概要

この記事では、ブローカーのAPIとMQL5を連携させて、資金管理におけるシームレスな運用を実現する方法について探ります。私たちの目的は、MQL5のEAが持つ大きな可能性を明らかにすることです。MQL5単体ではWebサーバーと直接通信できないため、ブローカーのAPIの仕様に応じて、PythonやNode.jsなどの外部プログラミング言語ライブラリを活用します。本記事では、取引ブローカーとしてDeriv.comを対象に説明します。

このアプローチの利点

  • 自動資金振替:EAが取引口座から安全な別口座へ取引利益を自動で送金します。
  • 取引口座への残高補充:エクイティが設定した閾値を下回った場合、自動で取引口座の残高を補充します。
  • 継続的な操作:EAを仮想サーバー(VPS)にホストすることで、ほぼ無制限に資金管理を行い、24時間365日稼働させられます。

課題と考慮点

  • 資金枯渇のリスク:EAが継続的に利益を生み出せずに残高補充だけを繰り返すと、用意した資金が底をつく可能性があります。
  • 堅固な資金管理の必要性:特定の損失や資本の閾値を超えた場合に自動で運用を停止する、高度な資金管理システムの実装が必須です。

次のセクションでは、DerivブローカーのAPI機能を詳述し、APIとシームレスに連携するPythonコードを開発します。さらに、そのPythonソリューションとMQL5 EAを統合し、効率的かつ信頼性の高い資金管理を実現する方法を、初心者でも理解しやすいステップバイステップ形式で解説します。

基本的な双方向フローEAからブローカーAPI

MQL5とブローカー間の双方向フロー


Deriv API

Deriv.comはMetaTrader 5に対応しており、自動化操作のためのAPIアクセスを提供する人気の高いブローカーです。詳細については、Deriv APIドキュメントをご覧ください。まず、Webサイト上の手順に従ってAPIアクセスに登録してください。

学習目的で利用する場合、Deriv APIダッシュボードからアプリケーションを作成します。その際、デモ口座を選択し、適切なアクセスレベルでAPIトークンを生成してください。このプレゼンテーションでは、デモ口座の残高補充などの操作が可能な「Trade」APIアクセスレベルを推奨します。「Admin Access」レベルは口座全体を制御可能なため、十分なセキュリティ管理に自信がある場合を除き選択しないでください。不正アクセスを防ぐため、APIトークンは他人に見せず、安全な場所に保管してください。

APIトークンを作成した後は、Python製のWebSocketクライアントを構築し、それをMQL5と統合して、口座操作を自動で管理できるプログラムを作成します。

主な操作内容

このプログラムで目指す主な操作は次の2点です。

  • Deriv口座からMetaTrader 5口座への資金移動
  • Deriv APIとの連携による資金管理の自動化

これらの操作方法は、Deriv APIドキュメントの「MT5 API」セクションに詳しく記載されています。その過程で、以下の2つの重要な情報を取得します。

  • アプリID:Derivプラットフォーム上でアプリケーションを識別するためのID
  • APIトークン:指定された操作を実行するためのアクセス認証情報

これらの情報をもとに、PythonのWebSocketクライアントを開発し、MQL5と連携させて、資金管理システムを構築していきます。

APIセキュリティとあなた

セキュリティは非常に重要で、絶対に軽視できません。スマートフォンを不正アクセスから守るように、APIキーも同様に慎重に扱う必要があります。APIトークンは口座への入り口であり、もし悪意ある第三者に渡ってしまえば、あなたの知らないうちに不正な取引や資金移動がおこなわれてしまう可能性があります。

DerivではAPIトークンのアクセスレベルを設定することができ、トークンに与える権限を細かく管理できます。特別な理由がない限り、管理者アクセス(Admin Access)は避けるべきです。このレベルでは、口座の完全な制御が可能になり、万一漏洩した場合に非常に大きなリスクとなります。

この注意点はDerivに限った話ではありません。どのサービスのAPIでも、トークンはパスワードと同等に扱うべきです。第三者と共有せず、常に安全な場所に保管し、不必要に公開しないことが、口座の安全を守る鍵になります。


WebSocket API通信のためのPythonライブラリ

まず第一に、このプロジェクトを進めるには、コンピューターにPythonがインストールされている必要があります。次に、ブローカーのAPIとのWeb通信を可能にするために、PythonのWebSocketライブラリをインストールする必要があります。Deriv APIは高速な通信のためにWebSocketを使用しているため、これに対応できるよう環境を整えることが重要です。以下は、Windows環境でコマンドプロンプトを使用してライブラリをインストールするコマンドです。

pip install websocket-client

 ライブラリをインストールするには、Windowsでコマンドプロンプトを開き、上記のコマンドを入力します。インストールが完了すると、スクリプトの実行やテストがおこなえるようになります。その前に、次のステップとしてMetaTrader 5とブローカーAPI(この例ではDerivのAPI)との通信を処理するPythonスクリプトの開発に取り掛かります。


MetaTrader 5とブローカーAPI間の通信を仲介するPythonスクリプト

ここでは、Pythonスクリプトの開発手順を説明します。Fund Manager EAの作成に進む前に、このプログラムの構築に取り組みましょう。まずはコードエディタ(Notepad++を推奨)を開いて新しいファイルを作成してください。スクリプトの名前はderiv_api_handler.pyとします。後ほどEAのコード内でスクリプトの場所が必要になるため、ファイルの保存場所は忘れずに控えておいてください。

1.初期セットアップと構成

 最初に、必要なモジュールのインポート、接続設定の構成、そしてMQL5との通信に使用するファイルパスの準備をおこないます。ここでは、基本的なライブラリをいくつかインポートします。たとえば、WebSocketを通じて送受信するメッセージの形式としてJSONが使われるため、jsonライブラリが必要です。また、Deriv APIとの接続をおこなうにはwebsocketライブラリが必要です。スクリプト内で一時的な待機処理をおこなうためにはtimeが、そしてファイルシステムと連携してコマンドファイルの存在確認などをおこなうにはosライブラリが必要になります。

import json
import websocket
import time
import os

# Configuration
API_URL = "wss://ws.binaryws.com/websockets/v3?app_id= Your app ID"   #Replace with your App ID created in Deriv API dashboard
API_TOKEN = "Your API token"   #Replace with your actual token

# File paths (Replace YourComputerName with the actual name of your computer)
MQL5_TO_PYTHON = "C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/mql5_to_python.txt"
PYTHON_TO_MQL5 = "C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/python_to_mql5.txt"
  • 次に、DerivサーバーとのWebSocket接続を認証するために必要となるAPIのURLとトークンを定義します。このURLはWebSocketのエンドポイントを指しており、APIトークンはサーバーに対してこちらの身元を証明する役割を果たします。
  • 最後に、MQL5との連携に使用するファイルパスを指定します。これらのファイルは、PythonスクリプトとMQL5の間の橋渡し役となり、コマンドやレスポンスのやり取りを可能にします。MQL5とPythonの両方から確実にアクセスできるパスを慎重に選ぶ必要があります。

2. WebSocket接続

このコードセクションでは、DerivのWebSocket APIに対してセキュアな接続を確立し、スクリプトがリクエストを送信できるように認証をおこないます。

def connect_to_deriv():
    """Connects to Deriv's WebSocket API."""
    try:
        ws.connect(API_URL)
        ws.send(json.dumps({"authorize": API_TOKEN}))
        response = json.loads(ws.recv())
        print(f"Authorization Response: {response}")
        if response.get("error"):
            print("Authorization failed:", response["error"]["message"])
            return False
        return True
    except Exception as e:
        print(f"Error during authorization: {e}")
        return False
  • WebSocket接続を管理する関数を定義します。まず、先ほど設定したURLを使ってAPIに接続を試みます。ws.connect(API_URL)によって接続を開始し、その後、APIトークンを含む認証メッセージを送信します。これは、スクリプトをDerivサーバーに認証させるために必要です。
  • すぐに、スクリプトはサーバーからのレスポンスを待ち受けます。サーバーは、接続が成功したかどうかを確認するJSONオブジェクトを返してきます。もしその中にエラーが含まれていれば、トークンが無効であるか、別の問題があったことがわかります。このエラー処理は、スクリプトが適切に終了するために重要です。
  • 接続やメッセージの送受信に問題が発生してもスクリプトがクラッシュしないように、try-exceptブロックを使用しています。これは、トラブル発生時にも処理全体を中断させずにデバッグや問題対応をおこなうための安全策です。

3.コマンド処理

この段階では、プログラムが受信したコマンドを解釈し、コマンドの種類に応じた適切な処理を実行します。接続と認証に成功すると、スクリプトはMQL5から送られてくるJSON形式のコマンドを処理する準備が整います。
  • process_command関数では、まず受け取ったコマンドをPythonの辞書型に変換しようとします。これにより、コマンド内のさまざまなフィールド(たとえば入金額など)へ簡単にアクセスできるようになります。次に、変換されたJSONに特定のキー(例:「mt5_deposit」)が含まれているかどうかを確認します。これによって、MQL5がどのような操作を求めているのかがわかります。
  • たとえば、入金を求めるコマンド(「mt5_deposit」)があれば、それを処理するためにmt5_depositという別の関数が呼び出されます。このようなモジュール化された設計により、スクリプトの柔軟性と保守性が高まり、将来的に他の種類のコマンドを簡単に追加できるようになります。

  • コマンドが不明であったり、形式が正しくない場合には、エラーメッセージを返します。これにより、MQL5側で何が問題だったのかを把握できるようになります。

def process_command(command):
    """Processes a command from MQL5."""
    try:
        command_data = json.loads(command)  # Parse the JSON command
        if "mt5_deposit" in command_data:
            return mt5_deposit(
                command_data["amount"],
                command_data["from_binary"],
                command_data["to_mt5"]
            )
        else:
            return {"error": "Unknown command"}
    except json.JSONDecodeError:
        return {"error": "Invalid command format"}
    except Exception as e:
        return {"error": f"Unexpected error: {e}"}

4.入金処理

このセクションでは、MQL5から要求された入金処理を実行し、必要なデータをDeriv APIに送信します。入金処理をおこなうために、専用の関数(mt5_deposit)を作成しています。これにより、コードが整理され、入金処理のロジックが分離されるため、保守や拡張がしやすくなります。
  • この関数内では、Derivに対して入金の実行を指示するJSONメッセージを作成します。このメッセージには、金額、送金元口座、送金先のMT5口座など、必要なすべての情報が含まれています。トランザクションを正しく処理してもらうためには、正確な形式で適切なデータを送信することが重要です。
  • 入金リクエストを送信した後は、サーバーからの応答を待ちます。応答を受け取ると、それをJSONとして解析し、その結果を返します。これにより、MQL5側は処理が成功したか失敗したかを把握できます。
  • 通信や入金処理中に何らかの問題が発生した場合に備えて、例外処理もおこなっています。これにより、エラーが適切にキャッチされ、MQL5に対して報告されるようになります。
def mt5_deposit(amount, from_binary, to_mt5):
    """Performs a deposit operation to the MT5 account."""
    try:
        ws.send(json.dumps({
            "mt5_deposit": 1,
            "amount": amount,
            "from_binary": from_binary,
            "to_mt5": to_mt5
        }))
        response = ws.recv()
        return json.loads(response)
    except Exception as e:
        return {"error": f"Error during deposit operation: {e}"}

5.MQL5からのコマンドの読み取り

このセクションでは、MQL5から送信されたコマンドをチェックし、存在する場合は処理を行い、同じコマンドが繰り返し処理されないようにします。MQL5からのコマンドを読み取るには、まずmql5_to_python.txtというファイルが存在するかどうかを確認します。MQL5はこのファイルに処理対象のコマンドを書き込みます。ファイルが存在する場合、その内容を読み取ります。このとき、不要な空白を取り除いたり、BOM(バイトオーダーマーク)が含まれていないかをチェックしたりすることで、フォーマットの不一致があってもデータが正しく処理されるようにします。
  • コマンドを読み取った後は、内容をデバッグのために出力し、想定どおりのデータが取得できたかを確認します。そして、同じコマンドが再び処理されないように、ファイルを削除します。
  • もしファイルが存在しなければ、Noneを返して処理すべきコマンドがないことを示します。これにより、不要なチェックを避け、効率的に処理をおこなうことができます。
def read_command():
    """Reads a command from the MQL5 file and deletes the file after reading."""
    print(f"Checking for command file at: {MQL5_TO_PYTHON}")
    if os.path.exists(MQL5_TO_PYTHON):
        print(f"Command file found: {MQL5_TO_PYTHON}")
        with open(MQL5_TO_PYTHON, "r", encoding="utf-8") as file:
            command = file.read().strip()
        print(f"Raw Command read: {repr(command)}")
        
        # Strip potential BOM and whitespace
        if command.startswith("\ufeff"):
            command = command[1:]
        
        print(f"Processed Command: {repr(command)}")
        os.remove(MQL5_TO_PYTHON)  # Remove file after reading
        return command
    print(f"Command file not found at: {MQL5_TO_PYTHON}")
    return None


6.MQL5へのレスポンスの書き込み

この部分では、処理結果をMQL5に返すことで、MQL5側が結果に応じた次のアクションを取れるようにします。  コマンドを処理してレスポンスが得られたら、そのレスポンスをMQL5に送信します。これには、python_to_mql5.txtというファイルにレスポンスを書き込む方法を用います。MQL5はこのファイルを読み取って結果を受け取ります。
  • レスポンスが適切な形式で送信されるように、Pythonの辞書オブジェクトをjson.dumps()を使ってJSON文字列に変換します。このJSON文字列をファイルに書き込むことで、MQL5側で正しくレスポンスを解釈できるようになります。
  • このステップは、PythonとMQL5間の通信を完結させる重要な工程です。これにより、MQL5は操作が成功したか失敗したかを判断し、適切なアクションを取ることができるようになります。
def write_response(response):
    """Writes a response to the MQL5 file."""
    with open(PYTHON_TO_MQL5, "w", encoding="utf-8") as file:
        file.write(json.dumps(response))


7.メインループ

このセクションでは、MQL5からのコマンドをリアルタイムで読み取り、処理するための継続的なループを作成します。メインループはスクリプトの中核部分であり、すべての処理が統合される場所です。Deriv APIへの接続と認証が成功した後、このループに入り、新しいコマンドがあるかどうかを継続的にチェックします。read_command関数を使って、新しいコマンドが存在するかを確認します。
  • コマンドが見つかれば、それを処理し、その結果をMQL5に書き戻します。コマンドファイルが存在しない場合やエラーが発生した場合でも、エラーメッセージを表示してループを終了するなど、スクリプトが正常に動作を終了するように設計されています。
  • このループは、システムの応答性を維持するために不可欠です。スクリプトが無限に実行されたり、何のメッセージも出さずに停止したりしないように設計されています。try-exceptブロックを導入することで、予期しないエラーからループを保護し、スクリプトがクラッシュするのではなく、適切に終了できるようにしています。
if __name__ == "__main__":
    if not connect_to_deriv():
        print("Failed to authorize. Exiting.")
        exit(1)

    print("Connected and authorized. Waiting for commands...")
    while True:
        try:
            command = read_command()
            if command:
                print(f"Processing command: {command}")
                response = process_command(command)
                print(f"Response: {response}")
                write_response(response)
                print("Response written. Exiting loop.")
                break  # Exit the loop after processing one command
            else:
                print("No command file found. Exiting.")
                break  # Exit the loop if the command file is not found
        except Exception as e:
            print(f"Error in main loop: {e}")
            break  # Exit the loop on unexpected error


資金管理用EA

この段階では、Fund Manager EAの開発プロセスを引き続き進めていきます。このEAは口座残高を監視し、指定された閾値を下回った場合に、残高補充を提案するように設計されています。残高補充操作は、以前に作成したPythonスクリプトによって実行されます。このEAは、完全な取引用EAの全機能を備えているわけではありませんが、ブローカーAPIとの連携を実現する特定のコードセグメントに焦点を当てています。ここでの議論の目的は、ブローカーAPIを任意のEAに統合できる可能性を示すことです。

開発計画の概要:

このEAの重要な構成要素の1つが、ShellExecuteW関数の実装です。この関数はEAのコード内からderiv_api_handler.pyスクリプトを実行するために使われます。EAは口座残高を監視し、残高があらかじめ定義された閾値を下回ると、入金処理(残高補充)を開始するためのコマンドを発行します。

通常、このような操作はOnTimer()関数で実行され、一定間隔での監視や自動化に適しています。ただし、テストや即時フィードバックのために、ここではOnInit()関数内に処理を記述する方法を採用しています。この方法により、EAを起動した直後にAPIの動作を確認できます。将来的には、口座残高の継続的な監視と、必要に応じた残高補充には、OnTimer()関数の使用が適しています。 

1.メタ情報とライブラリのインポート

このセクションでは、EAのメタデータを設定し、外部のコマンドを実行するためのシステムライブラリをインポートします。ShellExecuteW関数は、Windowsのshell32.dllライブラリから呼び出され、Pythonスクリプトなどの外部アプリケーションを実行するために使用されます。これにより、EAと外部のシステムやAPIとの通信が可能になります。

//+------------------------------------------------------------------+
//|                                             Fund Manager EA.mq5  |
//|                                Copyright 2024, Clemence Benjamin |
//|             https://www.mql5.com/ja/users/billionaire2024/seller |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Clemence Benjamin"
#property link      "https://www.mql5.com/ja/users/billionaire2024/seller"
#property version   "1.01"
#property description "Deposit and Withdraw funds between broker and trading account within the EA"

#import "shell32.dll"
int ShellExecuteW(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
#import


2. カスタマイズ用の入力パラメータ

このセクションでは、ユーザーがEAのコアコードを変更することなく、自身のニーズに合わせて調整できるようにするためのカスタマイズ可能な入力パラメータを定義します。パラメータには、残高の閾値、残高補充金額、資金移動に使用するアカウントID、そしてPythonスクリプトや実行ファイルのパスが含まれます。

input double balance_threshold = 100000.0;  // Threshold balance for top-up
input double top_up_amount = 100000.0;      // Amount to top-up if balance is below threshold
input string from_binary = "CR0000000";     // Binary account ID to withdraw funds from. Replace zero with real one
input string to_mt5 = "MTRReplace";     // MT5 account ID to deposit funds into. Replace with your MT5 acc from Deriv Broker
input string python_script_path = "C:\\Users\\YourComputerName\\PathTo\\deriv_api_handler.py"; // Python script path
input string python_exe = "python";         // Python executable command (ensure Python is in PATH)


3.初期化残高確認と入金

OnInit関数はEAのエントリポイントです。この関数ではまず、AccountInfoDouble(ACCOUNT_BALANCE)を使って現在の口座残高を取得します。取得した残高が指定された閾値を下回っている場合、EAは入金処理を開始するためのコマンドの実行に進みます。

int OnInit()
  {
   double current_balance = AccountInfoDouble(ACCOUNT_BALANCE);
   Print("Current Account Balance: ", current_balance);

   if(current_balance < balance_threshold)
     {
      Print("Balance is below the threshold. Attempting a deposit...");


4.ファイルへの入金コマンドの書き込み

EAはPythonスクリプトと通信するためのファイルを作成します。このファイルには、入金コマンドを指定するJSON形式の文字列が書き込まれます。JSONには入金額、送金元アカウント、送金先MT5アカウントなどの詳細が含まれており、Pythonスクリプトがこれを読み取って操作を実行できるようになっています。このファイルは、MQL5とPythonシステム間のインターフェイスとして機能します。

string command_file = "mql5_to_python.txt";
string command_path = TerminalInfoString(TERMINAL_COMMONDATA_PATH) + "\\Files\\" + command_file;
int handle = FileOpen(command_file, FILE_WRITE | FILE_COMMON | FILE_TXT | FILE_ANSI);

string deposit_command = StringFormat("{\"mt5_deposit\": 1, \"amount\": %.2f, \"from_binary\": \"%s\", \"req_id\": 1, \"to_mt5\": \"%s\"}", top_up_amount, from_binary, to_mt5);
FileWrite(handle, deposit_command);
FileClose(handle);
Print("Deposit command written to file: ", command_path);


5.Pythonスクリプトの起動

ShellExecuteW関数を使用して、EAは入力パラメータで指定されたPythonスクリプトを実行します。このスクリプトは入金リクエストを処理し、外部システムと連携します。

int result = ShellExecuteW(0, "open", python_exe, python_script_path, NULL, 1);
if(result <= 32)
  {
   Print("Failed to launch Python script. Error code: ", result);
   return(INIT_FAILED);
  }
else
  {
   Print("Python script launched successfully.");
  }


6.Pythonのレスポンスを確認する

Pythonスクリプトを実行した後、EAはレスポンスファイルの存在を確認します。ファイルが存在する場合、EAはその内容を読み取り、入金が成功したかどうかを確認します。EAが適切に処理を続行するためには、このレスポンスファイルに成功メッセージが含まれている必要があります。

string response_file = "python_to_mql5.txt";
if(FileIsExist(response_file, FILE_COMMON))
  {
   handle = FileOpen(response_file, FILE_READ | FILE_COMMON | FILE_TXT | FILE_ANSI);
   string response = FileReadString(handle);
   FileClose(handle);
   Print("Response from Python: ", response);

   if(StringFind(response, "\"status\":\"success\"") >= 0)
     {
      Print("Deposit was successful.");
     }
   else
     {
      Print("Deposit failed. Response: ", response);
     }
  }
else
  {
   Print("Response file not found. Ensure the Python script is running and processing the command.");
  }


7.初期化の完了

残高が閾値を超える場合、EAは入金プロセスをスキップします。初期化が正常に終了し、EAは運用フェーズに入ります。

else
  {
   Print("Balance is above the threshold. No deposit attempt needed.");
  }

return(INIT_SUCCEEDED);


8.初期化解除 

OnDeinit関数は、EAが削除または初期化解除されたときにそのイベントをログに記録します。 

void OnDeinit(const int reason)
  {
   Print("Expert deinitialized.");
  }


デモテストと結果

ここでは2つのテストについて説明します。

  1. コマンドプロンプトでPythonスクリプト(deriv_api_handler.py)をテストする
  2. Fund Manager EAのテスト

詳細を見てみましょう。

1.Pythonスクリプト(deriv_api_handler.py)のテスト

私はNotepad++という無料ツールを使用してPythonスクリプトを作成しました。以下は、エディターから直接コマンドプロンプトを起動する方法を示すアニメーションクリップです。このアプローチは、コマンドプロンプトがスクリプトを含むフォルダーに誘導され、その場所からスクリプトを直接実行できるようになるため、不可欠です。

Notepad++からcmdを起動する

Notepad++からcmdを起動する

コマンドプロンプトウィンドウが開いたら、コマンドを入力してスクリプトを実行できます。目標は、Deriv APIへの認証とアクセスが成功したことを確認することです。

コマンドプロンプトに次のコマンドを入力し、Enterキーを押します。

python deriv_api_handler.py

デフォルトのAPI認証情報を使用した応答

有効な認証情報がないデフォルトのスクリプトでは、以下に示す応答が返されます。適切な認証と機能を確立するために、有効な認証情報(APIトークンとアプリID)を提供することが重要です。

Error during authorization: Handshake status 401 Unauthorized -+-+- {'date': 'Thu, 15 Jan 2025 08:43:53 GMT', 'content-type': 
'application/json;charset=UTF-8', 'content-length': '24', 'connection': 'keep-alive', 'content-language': 'en', 'upgrade': 
'websocket', 'sec-websocket-accept': 'yfwlFELh2d3KczdgV3OT8Nolp0Q=', 'cf-cache-status': 'DYNAMIC', 'server': 'cloudflare', 'cf-ray': 
'902cd20129b638df-HRE', 'alt-svc': 'h3=":443"; ma=86400'} -+-+- b'{"error":"InvalidAppID"}'
Failed to authorize. Exiting.

正しい認証情報による応答

以下の結果スニペットでは、正しい認証情報を使用して、接続と承認が正常に確立されています。次に、プログラムは以下に示すように、共通ファイルフォルダー内のmql5_to_python.txtファイルをチェックします。このテキストファイルには、スクリプトが処理し、WebSocket接続を介して転送するコマンド情報が含まれています。APIは応答を返し、この例では、認証情報を保護するためにランダムな口座の詳細が使用されます。良い結果を得るには、正しい詳細情報を使用する必要があります。

応答を受信し、APIの応答でpython_to_mql5.txtファイルが生成され、MetaTrader5に返されたため、目標は正常に達成されました。
Connected and authorized. Waiting for commands...
Checking for command file at: C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/mql5_to_python.txt
Command file found: C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/mql5_to_python.txt
Raw Command read: '{"mt5_deposit": 1, "amount": 100000.00, "from_binary": "CR4000128", "req_id": 1, "to_mt5": "MTR130002534"}'
Processed Command: '{"mt5_deposit": 1, "amount": 100000.00, "from_binary": "CR4000128", "req_id": 1, "to_mt5": "MTR130002534"}'
Processing command: {"mt5_deposit": 1, "amount": 100000.00, "from_binary": "CR4000128", "req_id": 1, "to_mt5": "MTR130002534"}
Response: {'echo_req': {'amount': 100000, 'from_binary': 'CR4000128', 'mt5_deposit': 1, 'to_mt5': 'MTR130002534'}, 'error': {'code': 'PermissionDenied', 
'message': 'Permission denied, requires payments scope(s).'}, 'msg_type': 'mt5_deposit'}
Response written. Exiting loop.


2. Fund Manager EAのテスト

EAをテストするために、MetaTrader5で起動しました。前述のように、初期化中に入金を試行するように設計しました。私たちは10,000のエクイティを持つデモ口座で作業しているので、現在の残高がこの値を下回る場合に入金を試行するように、残高閾値を100,000に設定しました。以下は、起動と、これらの値をカスタマイズできる入力設定を示すアニメーションのスクリーンショットです。

Fund Manager EAの起動

Fund Manager EAの起動

MetaTrader 5のツールボックスウィンドウの[エキスパート]タブでは、EAによって実行されたすべての操作のログを表示できます。以下にログ結果が表示されます。

2025.01.14 11:49:56.012 Fund Manager EA1 (EURUSD,M1)    Current Account Balance: 10000.22
2025.01.14 11:49:56.012 Fund Manager EA1 (EURUSD,M1)    Balance is below the threshold. Attempting a deposit...
2025.01.14 11:49:56.013 Fund Manager EA1 (EURUSD,M1)    Deposit command written to file: C:\Users\BTA24\AppData\Roaming\MetaQuotes\Terminal\Common\Files\mql5_to_python.txt
2025.01.14 11:49:56.097 Fund Manager EA1 (EURUSD,M1)    Python script launched successfully.
2025.01.14 11:50:01.132 Fund Manager EA1 (EURUSD,M1)    Response file path: C:\Users\BTA24\AppData\Roaming\MetaQuotes\Terminal\Common\Files\python_to_mql5.txt
2025.01.14 11:50:01.133 Fund Manager EA1 (EURUSD,M1)    Response from Python: {"echo_req": {"amount": 100000, "from_binary": "CR4000128", "mt5_deposit": 1,
 "to_mt5": "MTR130002534"}, "error": {"code": "PermissionDenied", "message": "Permission denied, requires payments scope(s)."}, "msg_type": "mt5_deposit"}
2025.01.14 11:50:01.133 Fund Manager EA1 (EURUSD,M1)    Deposit failed. Response: {"echo_req": {"amount": 100000, "from_binary": "CR4000128", "mt5_deposit": 1, 
"to_mt5": "MTR130002534"}, "error": {"code": "PermissionDenied", "message": "Permission denied, requires payments scope(s)."}, "msg_type": "mt5_deposit"}

上記の結果は、Fund Manager EA、Pythonスクリプト、およびDeriv API間の相互作用が成功したことを示しています。個人的に、私はこの設定を使用して残高補充操作を正常に実行しました。ただし、この例では、個人のAPI認証情報を保護するためにランダムな認証情報が使用されたため、「権限が拒否されました」エラーが発生しました。

結論

MQL5とPythonを統合し、APIを介して外部のブローカーサーバーと連携する仕組みを実現しました。このソリューションは、特にVPS上で運用されている口座において、自動売買中に資金が不足するという課題を解決します。口座残高があらかじめ設定した閾値を下回ると、EAが自動的に資金を補充します。今回はDeriv APIに焦点を当てましたが、他のブローカーAPIでも同様の統合が可能です。多くのAPIは高度な機能やアクセスレベルを提供しており、柔軟な対応が可能です。デモ目的として、残高ゼロの口座でEAをテストし、APIからの応答を通じてその機能性を確認しました。このシステムは、出金機能やその他の高度な機能を追加することで、さらに拡張可能です。

Deriv APIアプリケーションはシンプルで、EAとの通信に必要なAPIトークンの管理を主な目的としています。APIをさらに活用することで、さまざまな可能性が広がります。テストおよび拡張用に、PythonスクリプトとFund Manager EAのファイルを添付しています。ご意見やご質問があれば、ぜひ下のコメント欄で共有していただき、活発な議論につなげてください。

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

添付されたファイル |
MQL5入門(第11回):MQL5の組み込みインジケーターの操作に関する初心者向けガイド(II) MQL5入門(第11回):MQL5の組み込みインジケーターの操作に関する初心者向けガイド(II)
RSI、MA、ストキャスティクスなどの複数のインジケーターを使用してMQL5でエキスパートアドバイザー(EA)を開発し、隠れた強気および弱気のダイバージェンスを検出する方法を学びます。教育目的で、詳細な例および完全にコメントされたソースコードを用いて、効果的なリスク管理を実装し、取引を自動化する方法をご紹介します。
MQL5でカレンダーベースのニュースイベントブレイクアウトエキスパートアドバイザーを開発する MQL5でカレンダーベースのニュースイベントブレイクアウトエキスパートアドバイザーを開発する
ボラティリティは、影響力の大きいニュースイベントの周辺でピークに達する傾向があり、大きなブレイクアウトの機会を生み出します。本記事では、カレンダーを基にしたブレイクアウト戦略の実装プロセスについて説明します。カレンダーデータを解釈・保存するためのクラスの作成、これを活用した現実的なバックテストの開発、そして最終的にライブ取引用の実行コードの実装までを一貫して解説します。
プライスアクション分析ツールキットの開発(第8回):Metrics Board プライスアクション分析ツールキットの開発(第8回):Metrics Board
最も強力なプライスアクション分析ツールの一つである「Metrics Board」は、ワンクリックで重要な市場指標を即座に表示し、市場分析を効率化するように設計されています。各ボタンには高値・安値のトレンド分析、出来高、その他の主要な指標の解析といった特定の機能が割り当てられています。このツールは、最も必要なタイミングで正確なリアルタイムデータを提供します。この記事では、その機能についてさらに詳しく掘り下げていきましょう。
MQL5でSHA-256暗号化アルゴリズムをゼロから実装する MQL5でSHA-256暗号化アルゴリズムをゼロから実装する
これまで、DLLを使用せずに暗号通貨取引所との統合を構築することは長らく課題とされてきました。しかし、本ソリューションは、市場へ直接接続するための包括的なフレームワークを提供します。