2/22のupdateでOANDAのMT5も最新バージョンになり、pythonとの連携がより強化されました。
ディープラーニングを適用するにはpython連携は必須と言っても良いので、いくつか試してみました。
公式によると、追加されたコマンドは以下の通り。
- account_info()
- positions_total()
- positions_get(symbol, ticket)
- orders_total()
- orders_get(symbol, ticket)
- history_orders_total(from, to)
- history_orders_get(from, to, position, ticket)
- history_deals_total()
- history_deals_get(from, to, position, ticket)
- symbol_info(symbol)
- symbol_info_tick(symbol)
- symbol_select(symbol, enable)
- order_check(request)
- order_send(request)
- order_calc_margin(action, symbol, volume, price)
- 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サブアカウント作成がエラーになります。その場合には、新しくデモ口座を作り直すとうまく行きます(サポート談)