見出し画像

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でも換金率悪ければ負けるのでそれと同じような感じですね。

この記事が気に入ったらサポートをしてみませんか?