pythonでMT5にアクセスして自動売買するプログラムを作成しました。
まずは本当にMT5を制御しているのか検証するため、過去データの取得等は一切行わず、1分後に買い、1分後に利確し、1分後に売り、1分後に利確する作業を繰り替えす超単純なロジックにしました。
コード
import MetaTrader5 as mt5
import time
import sys
def initialize_mt5():
"""MT5を初期化"""
if not mt5.initialize():
print("MT5の初期化に失敗しました")
sys.exit()
print("MT5の初期化成功")
def place_order(symbol, action, lot=0.1):
"""
注文を発行
Parameters:
symbol (str): 通貨ペア
action (str): "buy" または "sell"
lot (float): ロットサイズ
"""
tick = mt5.symbol_info_tick(symbol)
if tick is None:
print(f"{symbol} の価格情報を取得できません")
return False
price = tick.ask if action == "buy" else tick.bid
order_type = mt5.ORDER_TYPE_BUY if action == "buy" else mt5.ORDER_TYPE_SELL
request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": lot,
"type": order_type,
"price": price,
"deviation": 10,
"magic": 123456,
"comment": "AutoTrade",
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_IOC,
}
result = mt5.order_send(request)
if result.retcode != mt5.TRADE_RETCODE_DONE:
print(f"注文エラー: {result.comment}")
return False
print(f"注文成功: {action.upper()} {symbol} at {price}")
return True
def main_loop(symbol):
"""
取引のメインループ
Parameters:
symbol (str): 通貨ペア
"""
try:
while True:
# 1分ごとに買いと売りを交互に行う
print("買い注文を発行")
if place_order(symbol, "buy"):
time.sleep(60) # 1分待機
print("売り注文を発行")
if place_order(symbol, "sell"):
time.sleep(60) # 1分待機
except KeyboardInterrupt:
print("取引停止")
finally:
mt5.shutdown()
if __name__ == "__main__":
symbol = "USDJPY" # 取引したい通貨ペア
initialize_mt5()
main_loop(symbol)
これを実行してみたところ、
売り注文を発行
注文エラー: AutoTrading disabled by client
買い注文を発行
注文エラー: AutoTrading disabled by client
というエラーを続出。なんでかなー???と原因を探っていたら、分かりました。
なんとおバカなことに、MT5の自動売買に許可をしていませんでした。
これまでMT4を使っていただけに、MT5ではメニューバーに「アルゴリズム取引」ボタンを押せば自動売買システムが許可されることを知りませんでした。
19:42に買い、19:43分に売り・・・と自動売買していることが確認できました。
ですが、なぜかポジションが増えるばかり。全く利確しません。
クローズするために注文IDを取得する必要があるのですが、意外にもここでてこずりました。orders_get()関数を使ってみたのですが、なぜか取得失敗のエラーメッセージ。それならとpositions_get()関数に切り替えると、なんとなく反応はあったものの、どうやらorderではなく、tickettやposisionなどの属性も含まれてしまうためID特定に至らない様子。結果的にposition.ticket属性を使って取得させることで注文IDが取得できました。
買って、注文IDを取得して、利確して、売って、ID取得、利確を行うロジックの完成です。ここにpyqtでメニュー画面を設け、人とのインタフェースを完成させることで配布できる形となりました。