English

MQL5の書き方(for MQL4デザイナー)

 

2023.07

林貴晴/AMSER Inc.

MT5とPythonの連携⑤ Pythonによる発注と決済

Pythonの魅力の一つは、豊富なライブラリが用意されていることです。これらのライブラリを活用すると、MT5単体では難しい画像認識やAIによる価格予想などが可能になります。MT5とPythonを連携させ、ログインすることで、PythonからMT5を通じて発注や決済が行えます。この機能を利用すれば、Pythonで予想を行い、その結果に基づいて発注を実行することができます。

ログイン方法

PythonとMT5を接続するには、ライブラリのインストール、接続、ログインの3つのステップが必要です。ライブラリのインストールは、バージョンの変更がない限り一度で十分です。

1.ライブラリのインストール

Pythonからpipを使用して、以下のコマンドでライブラリをインストールします。

pip install MetaTrader5
                    
 
2. MT5との接続

接続することで、レートのデータなどを取得できるようになります。

import MetaTrader5 as mt5
mt5.initialize()
                    
 
3.ログイン

ログインすると、ポジション情報の取得や発注・決済などが可能になります。MT5にログインする際の情報を入力してください。

# ログイン情報
login = 000000000  # MT5アカウント番号
password = "password"#MT5ログインパスワード
server = "PhillipSecuritiesJP-PROD"  # ブローカーのサーバー名
mt5.login(login, password, server)
                    
 
オープンポジションの情報取得

現在のオープンポジションの情報をポジションごとに表示します。MT5に表示されるすべてのポジションが対象です。ポジションを持っていない場合は何も表示されません。

positions = mt5.positions_get()
# ポジション情報を表示
for position in positions:
    print(position)

                    
 

結果
TradePosition(ticket=2492146, time=1720463753, time_msc=1720463753282, time_update=1720463753, time_update_msc=1720463753282, type=0, magic=0, identifier=2492146, reason=0, volume=1.0, price_open=161.061, sl=0.0, tp=0.0, price_current=161.012, swap=0.0, profit=-4900.0, symbol='USDJPY.ps01', comment='', external_id='')

個別の値はposition.ticketのように指定することで取得できます。

 

発注方法

発注はMT5と同様にrequestに情報を代入しorder_send()関数で発注します。
SymbolにはMT5の気配値表示に表示されているサフィックスを含む通貨ペア名を正確に入れる必要があります。また、type_fillingも業者に合わせた注文執行タイプを入指定してください。発注後はMT5側でポジションが増えていることを確認してください。

                    # 発注するシンボル
symbol = "USDJPY.ps01"# サフィックス(フィリップ証券の場合.ps01)が必要
price = mt5.symbol_info_tick(symbol).ask  # 現在のAsk価格

# 発注リクエストの作成
order_request = {
    "action": mt5.TRADE_ACTION_DEAL,
    "symbol": symbol,
    "volume": 0.01,  # ロットサイズ
    "type": mt5.ORDER_TYPE_BUY,  # 買い注文の場合
    "price": price,
    "deviation": 20,  # 許容スリッページ
    "magic": 884884,  # EA識別用のマジックナンバー
    "comment": "Python Order",
    "type_time": mt5.ORDER_TIME_GTC,  # 注文の有効期限
    "type_filling": mt5.ORDER_FILLING_IOC,  # 注文執行のタイプ
}

# 発注
mt5.order_send(order_request)
                    
 

決済方法
決済は発注と同様にrequestをorder_send()関数に入れることで実行します。
決済にはMT5から取得する値が多いため、ここでは決済用のポジションを閉じる関数close_position()を作成し、最後に実行しています。

                    # ポジションを閉じる関数
def close_position(ticket):
    position = mt5.positions_get(ticket=ticket)
    position = position[0]
    symbol = position.symbol
    lot_size = position.volume
    order_type = mt5.ORDER_TYPE_SELL if position.type == 0 else mt5.ORDER_TYPE_BUY  # 0: Buy, 1: Sell
    symbol_info = mt5.symbol_info(symbol)
    price = mt5.symbol_info_tick(symbol).bid if order_type == mt5.ORDER_TYPE_SELL else mt5.symbol_info_tick(symbol).ask

    # クローズリクエストの作成
    close_request = {
        "action": mt5.TRADE_ACTION_DEAL,
        "symbol": symbol,
        "volume": lot_size,
        "type": order_type,
        "position": ticket,
        "price": price,
        "deviation": 20,
        "magic": 234000,
        "comment": "Close position",
        "type_time": mt5.ORDER_TIME_GTC,
        "type_filling": mt5.ORDER_FILLING_IOC,
    }

    # 注文送信
    result = mt5.order_send(close_request)

positions = mt5.positions_get()
#マジックナンバーが884884のポジションをすべて決済
for pos in positions:
    if pos.magic==884884 : close_position(pos.ticket)
                    
 

Pythonを使って発注・決済を行うことで、Pythonならではの新しい自動売買をPython側で完全にコントロールすることができます。MT5にしかないPython連携機能を使って今までにない新しいロジックの開発に挑戦しましょう。

 

執筆者紹介
林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。