FXデータ分析Pythonを使ってスキャ・デイトレ・スイングの実質コストを調べる
import MetaTrader5 as mt5
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
from datetime import datetime
import os
import zipfile
# 日本語フォントの設定
plt.rcParams['font.family'] = 'MS Gothic' # Windowsの場合
# plt.rcParams['font.family'] = 'Hiragino Sans GB' # macOSの場合
# plt.rcParams['font.family'] = 'Noto Sans CJK JP' # Linuxの場合
# MT5への接続
if not mt5.initialize():
print("MT5の初期化に失敗しました")
quit()
# メジャーな銘柄のリスト
symbols = [
"EURUSDm", "USDJPYm", "GBPUSDm", "AUDUSDm", "USDCADm", "USDCHFm", "NZDUSDm",
"EURGBPm", "EURJPYm", "GBPJPYm", "AUDJPYm", "CADJPYm", "CHFJPYm", "EURCHFm",
"GBPCHFm", "AUDCADm", "AUDNZDm", "XAUUSDm", "XAGUSDm"
]
# 時間枠のリスト
timeframes = [
(mt5.TIMEFRAME_M1, "1分"),
(mt5.TIMEFRAME_M5, "5分"),
(mt5.TIMEFRAME_M15, "15分"),
(mt5.TIMEFRAME_H1, "1時間"),
(mt5.TIMEFRAME_H4, "4時間"),
(mt5.TIMEFRAME_D1, "日足")
]
def calculate_spread_ratio(symbol, timeframe):
# スプレッドの取得
rates = mt5.copy_rates_from_pos(symbol, mt5.TIMEFRAME_M1, 0, 600)
spread = rates[500]['spread']
point = mt5.symbol_info(symbol).point
spread = spread * point
# 指定された時間枠での変動値幅の平均の計算
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, 1000)
df = pd.DataFrame(rates)
df["range"] = (df["high"] - df["low"])
average_range = df["range"].mean()
# スプレッドの比率固定値の計算
spread_ratio = spread / average_range
return spread_ratio
# 各時間枠でのスプレッド比率の計算
results = []
for timeframe, timeframe_name in timeframes:
data = []
for symbol in symbols:
try:
spread_ratio = calculate_spread_ratio(symbol, timeframe)
data.append({"Symbol": symbol, "Spread Ratio": spread_ratio})
except Exception as e:
print(f"Error processing {symbol} for {timeframe_name}: {e}")
df = pd.DataFrame(data)
df = df.sort_values("Spread Ratio", ascending=True).reset_index(drop=True)
results.append((timeframe_name, df))
# 現在の日時を取得
current_time = datetime.now().strftime("%Y%m%d_%H%M%S")
# 保存用のディレクトリを作成
output_dir = f"spread_ratio_images_{current_time}"
os.makedirs(output_dir, exist_ok=True)
# 各時間枠のグラフを個別に作成し保存
for timeframe_name, df in results:
plt.figure(figsize=(10, 8))
sns.barplot(x="Spread Ratio", y="Symbol", data=df, palette="viridis")
plt.title(f"スプレッド比率の比較 - {timeframe_name}", fontsize=16)
plt.xlabel("スプレッド比率", fontsize=12)
plt.ylabel("シンボル", fontsize=12)
# バーの終端に値を表示
for i, v in enumerate(df["Spread Ratio"]):
plt.text(v, i, f' {v:.6f}', va='center', fontsize=8)
filename = os.path.join(output_dir, f"spread_ratio_{timeframe_name}.png")
plt.savefig(filename, dpi=300, bbox_inches='tight')
plt.close()
print(f"{timeframe_name}のグラフを保存しました: {filename}")
# 画像ファイルをZIPで圧縮
zip_filename = f"spread_ratio_images_{current_time}.zip"
with zipfile.ZipFile(zip_filename, 'w') as zipf:
for root, dirs, files in os.walk(output_dir):
for file in files:
zipf.write(os.path.join(root, file), file)
print(f"画像ファイルを圧縮しました: {zip_filename}")
# MT5との接続を閉じる
mt5.shutdown()
※注意MT5はエクスネスのスタンダード口座を使っているのでシンボル名にmがついてます。他のブローカーでやる場合はmを消したりして適宜調整してください。
Pythonの準備は以下の記事で解説してます。
ん、なるほど。
ドル円が一番スキャ向けですね。
4時間超えるとゴードルがお得になる傾向があるけど、ドル円とゴールドがよさそうです。
逆に銀とかはやめたほうがいいです。ストラテジーがどれだけ優秀でも負けます。
パチ屋で設定6でも換金率悪ければ負けるのでそれと同じような感じですね。
いいなと思ったら応援しよう!
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!