まずFXの基礎知識として「MA」とは?
MAは、一定期間の価格の平均を計算した指標で、価格の動向を視覚的に把握するためによく使われます。移動平均線の種類として、単純移動平均(SMA)と指数移動平均(EMA)が主に使用されます。
SMAは直近の一定期間の価格を単純に平均化したものです。一方、EMAは直近の価格に対してより重みを置いた計算方法で、最近の価格の動きに敏感に反応します。
この移動平均線を用いた売買戦略でよく取り上げられるのが「ゴールデンクロス」と「デッドクロス」です。ゴールデンクロスは、短期の移動平均線(例えば50期間)が長期の移動平均線(例えば200期間)を下から上に突き抜けた時に発生します。これを買いシグナルとして捉えます。逆に、デッドクロスは、短期の移動平均線が長期の移動平均線を上から下に突き抜けた時に発生し、売りシグナルとして捉えます。
次に、PythonでMetaTrader 5を操作するために、MT5に接続します。接続には、MT5のログインID、パスワード、サーバー情報が必要です。以下のコードでMT5に接続することができます。
import MetaTrader5 as mt5
# MT5に接続
mt5.initialize(login=12345678, password="your_password", server="your_server")
# 接続確認
if mt5.initialize():
print("MT5に接続しました")
else:
print("接続に失敗しました")
以前、PythonでMT5から為替データを吸い出すコードを記載しましたが、あくまでインジケーター的な使い方だったためパスワード等は不要でした。実際にオーダーするプログラムを稼働させる場合には、IDとパスワードが必要になります。
次に、移動平均線を使った売買戦略のコードを見ていきます。ここでは、50期間の短期移動平均線と200期間の長期移動平均線を使って、ゴールデンクロスとデッドクロスのシグナルに基づいて売買を行います。以下のコードは、MAの交差を検出し、それに基づいて注文を出す方法を示しています。
import MetaTrader5 as mt5
import pandas as pd
import numpy as np
# データ取得
symbol = "USDJPY"
timeframe = mt5.TIMEFRAME_M1 # 1分足
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, 200)
# データフレームに変換
data = pd.DataFrame(rates)
data['time'] = pd.to_datetime(data['time'], unit='s')
# 移動平均線を計算
data['MA50'] = data['close'].rolling(window=50).mean()
data['MA200'] = data['close'].rolling(window=200).mean()
data['Signal'] = np.where(data['MA50'] > data['MA200'], 1, 0) # 1: ゴールデンクロス、0: デッドクロス
# 最後のシグナルを取得
last_signal = data['Signal'].iloc[-1]
# 売買条件
if last_signal == 1:
print("ゴールデンクロス: 買い注文を出します")
# 買い注文を出すコード
elif last_signal == 0:
print("デッドクロス: 売り注文を出します")
# 売り注文を出すコード
このコードでは、まずUSDJPYの1分足データを200件取得し、50期間と200期間の移動平均線を計算しています。その後、短期MA(50)が長期MA(200)を上回っていればゴールデンクロス、下回っていればデッドクロスと判定し、対応する売買シグナルを表示しています。
実際に売買注文を出すためには、mt5.order_send()などの注文発行関数を使用します。例えば、ゴールデンクロスが発生した場合、買い注文を出すコードは以下のようになります。
# 注文発行(例)
symbol = "USDJPY"
lot_size = 0.1
price = mt5.symbol_info_tick(symbol).ask
slippage = 10
order_type = mt5.ORDER_TYPE_BUY
# 買い注文を発行
order = mt5.order_send(
symbol=symbol,
action=mt5.TRADE_ACTION_DEAL,
order_type=order_type,
volume=lot_size,
price=price,
slippage=slippage,
comment="ゴールデンクロスによる買い注文"
)
if order:
print("注文が成功しました")
else:
print("注文が失敗しました")
このコードでは、ゴールデンクロスが発生した場合に買い注文を出し、注文が正常に発行されたかどうかを確認しています。さらに売り注文を出し、それぞれのポジションを利益確定するロジックを組み込む必要がありますが、本日のところはここまで。続きは次回の記事にしたいと思います。