MT5でpythonを試してみる

2/22のupdateでOANDAのMT5も最新バージョンになり、pythonとの連携がより強化されました。
ディープラーニングを適用するにはpython連携は必須と言っても良いので、いくつか試してみました。

公式によると、追加されたコマンドは以下の通り。

  1. account_info()
  2. positions_total()
  3. positions_get(symbol, ticket)
  4. orders_total()
  5. orders_get(symbol, ticket)
  6. history_orders_total(from, to)
  7. history_orders_get(from, to, position, ticket)
  8. history_deals_total()
  9. history_deals_get(from, to, position, ticket)
  10. symbol_info(symbol)
  11. symbol_info_tick(symbol)
  12. symbol_select(symbol, enable)
  13. order_check(request)
  14. order_send(request)
  15. order_calc_margin(action, symbol, volume, price)
  16. order_calc_profit(action, symbol, volume, price_open, price_close)

大きな変更は、アカウント、および取引系のコマンドが直接実行できるようになったことです。

注1:MT5と同じPCにpythonの実行環境が存在しないと起動できません。

注2:pythonはインタプリタの為、コンパイルした時点で実際に実行されてしまうので本番口座でoreder_send()を試す方は要注意です!!

各コマンドの使い方(基本的にMQL版と同じです)

引数の無いコマンドの場合(そのまま入力)

//入力例
o=mt5.orders_total();
print(o);

//出力
2020.02.27 18:24:26.139 Python 1

引数のあるコマンドの場合(symbolは文字列で指定)

//入力例
o=mt5.orders_get(symbol='USDJPY');
print(o);

//出力
2020.02.27 18:55:50.600	Python	(TradeOrder(ticket=114369, time_setup=1582803664, time_setup_msc=1582803664799, time_done=0, time_done_msc=0, time_expiration=0, type=3, type_time=0, type_filling=2, state=1, magic=0, position_id=0, position_by_id=0, reason=3, volume_initial=0.1, volume_current=0.1, price_open=112.0, sl=0.0, tp=0.0, price_current=110.154, price_stoplimit=0.0, symbol='USDJPY', comment='', external_id=''),)

※)orders_get(symbol, ticket)と書いてありますが、実際の引数はsymbol or ticketです。

order_send()の場合(MqlTradeRequestは辞書型で指定)

//入力例
req={};
req["action"]=mt5.TRADE_ACTION_PENDING;
req["symbol"]="USDJPY";
req["volume"]=0.1;
req["price"]=112.0;
req["type"]=mt5.ORDER_TYPE_SELL_LIMIT;
o=mt5.order_send(req);
print(o);

//出力
2020.02.27 18:58:37.064	Python	OrderSendResult(retcode=10009, deal=0, order=114392, volume=0.1, price=0.0, bid=0.0, ask=0.0, comment='Request executed', request_id=16, retcode_external=0)

なお、order_send()の下記の簡易型が標準で用意されていましたが、OANDAでは動作しませんでした。(無効な注文充填タイプエラー)

# Buy order                
def Buy(symbol, volume, price=None, *, comment=None, ticket=None):
    # with direct call
    if price != None:
        return _RawOrder(ORDER_TYPE_BUY, symbol, volume, price, comment, ticket)
    # no price, we try several times with current price
    for tries in range(10):
        info = symbol_info_tick(symbol)
        r = _RawOrder(ORDER_TYPE_BUY, symbol, volume, info.ask, comment, ticket)
        if r.retcode != TRADE_RETCODE_REQUOTE and r.retcode != TRADE_RETCODE_PRICE_OFF:
            break
    return r

# Sell order
def Sell(symbol, volume, price=None, *, comment=None, ticket=None):
    # with direct call
    if price != None:
        return _RawOrder(ORDER_TYPE_SELL, symbol, volume, price, comment, ticket)
    # no price, we try several times with current price
    for tries in range(10):
        info = symbol_info_tick(symbol)
        r = _RawOrder(ORDER_TYPE_SELL, symbol, volume, info.bid, comment, ticket)
        if r.retcode != TRADE_RETCODE_REQUOTE and r.retcode != TRADE_RETCODE_PRICE_OFF:
            break
    return r

以前のバージョンではpythonからMT5を呼び出して価格情報を入手することはできましたが、python側で売買を決定した後で実際に取引を行うまでが大変でした。

今回のバージョンアップにより、よりpython連携が行いやすくなりましたね\(^_^)/

注)デモ口座が古いタイプの場合、MT5サブアカウント作成がエラーになります。その場合には、新しくデモ口座を作り直すとうまく行きます(サポート談)

コメントを残す

メールアドレスが公開されることはありません。