こんにちは。
あなたが私たちのために提供してくれたこの記事には本当に感謝しています。しかし、私のようにMQL5言語でトレーディングシステム(EA)を作成したことはあっても、機械学習や一般的なPythonに関してはほとんど知識がない者に言いたいことがあります。
私は自分のトレーディングシステムにMLを統合して、あなたが言ったように「無心」な一般的なプログラムから、より良い意思決定をするようにアップグレードしたいと思っています。
私が知る限り、あなたの記事には初心者のステップがいくつか欠けているようです。あなたの最初のコードには、どのIDEを使うのかが書かれていません(meta quotes IDEなのでしょうか?
多分、あなたの記事は初心者にゼロから教えるものではないと思います。
import MetaTrader5 as mt5 import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler from sklearn.model_selection import train_test_split from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense, Conv1D, MaxPooling1D, Flatten, Dropout, BatchNormalization, Input from tensorflow.keras.callbacks import EarlyStopping from datetime import datetime # --- コンフィギュレーション --- SYMBOL = "EURUSD" TIMEFRAME = mt5.TIMEFRAME_H1 DATA_LOAD = 6200 # 上半期のデータが1年分に増加 WINDOW_SIZE = 48 # 入力ウィンドウ(48時間) PRED_WINDOW = 24 # 予想水平線(24時間) BACKTEST_ROWS = 20 # 手動で確認する最近のバーの数 def connect_to_mt5(): if not mt5.initialize(): print("Error initializing MetaTrader5") return False return True def get_historical_data(num_bars): # 現在位置から特定のカウントを引き出す rates = mt5.copy_rates_from_pos(SYMBOL, TIMEFRAME, 0, num_bars) if rates is None or len(rates) == 0: return None df = pd.DataFrame(rates) df['time'] = pd.to_datetime(df['time'], unit='s') df.set_index('time', inplace=True) return df[['open', 'high', 'low', 'close']] def create_images(data, window_size=48, prediction_window=24): images, targets = [], [] for i in range(len(data) - window_size - prediction_window): window = data.iloc[i:i+window_size] # レーベルは24時間後の価格に基づく target_val = 1 if data.iloc[i+window_size+prediction_window-1]['close'] > window['close'].iloc[-1] else 0 scaler = MinMaxScaler() window_scaled = scaler.fit_transform(window) images.append(window_scaled) targets.append(target_val) return np.array(images), np.array(targets) def train_cv_model(images, targets): X_train, X_val, y_train, y_val = train_test_split(images, targets, test_size=0.15, shuffle=True) inputs = Input(shape=(X_train.shape[1], X_train.shape[2])) # CV_Model.pyのロジックに従ったCNNアーキテクチャ x = Conv1D(64, 3, padding='same', activation='relu')(inputs) x = BatchNormalization()(x) x = MaxPooling1D(2)(x) x = Conv1D(128, 3, padding='same', activation='relu')(x) x = BatchNormalization()(x) x = MaxPooling1D(2)(x) x = Flatten()(x) x = Dense(64, activation='relu')(x) x = Dropout(0.3)(x) outputs = Dense(1, activation='sigmoid')(x) model = Model(inputs, outputs) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(X_train, y_train, epochs=40, batch_size=64, validation_data=(X_val, y_val), callbacks=[EarlyStopping(patience=10, restore_best_weights=True)], verbose=0) return model def run_author_backtest(model, full_data, num_checks=20): """ Backtests the last 20 hours to see if a 24-hour prediction made at that time would have been correct. """ print(f"\n--- BACKTEST TABLE (Last {num_checks} Prediction Points) ---") print(f"{'Time (UTC)':<20} | {'Pred (24h)':<10} | {'Actual (24h)':<12} | {'Result'}") print("-" * 75) wins = 0 # バックテストのために24時間ウィンドウが実際に終了したことを確認するために、ステップバックする。 for i in range(num_checks + PRED_WINDOW, PRED_WINDOW, -1): idx = len(full_data) - i # 1.その時点で利用可能な48時間のウィンドウを取得します。 window = full_data.iloc[idx - WINDOW_SIZE : idx] timestamp = full_data.index[idx-1] # 2.24時間後に実際の結果を得る actual_price_then = window['close'].iloc[-1] actual_price_future = full_data.iloc[idx + PRED_WINDOW - 1]['close'] actual_dir = 「UP▲」。 if actual_price_future > actual_price_then else 「ダウン▼」。 # 3.ウィンドウに基づくモデル予測 scaler = MinMaxScaler() window_scaled = scaler.fit_transform(window) pred_val = model.predict(np.array([window_scaled]), verbose=0)[0][0] pred_dir = 「UP▲」。 if pred_val > 0.5 else 「ダウン▼」。 # 4.結果 res = "✅ WIN" if pred_dir == actual_dir else "❌損失" if res == "✅ WIN": wins += 1 print(f"{str(timestamp):<20} | {pred_dir:<10} | {actual_dir:<12} | {res}") print("-" * 75) print(f"TOTAL BACKTEST ACCURACY: {(wins/num_checks)*100:.2 f}% ({wins}/{num_checks})") def main(): if not connect_to_mt5(): return print(f"Loading {DATA_LOAD} bars for EURUSD...") data = get_historical_data(DATA_LOAD) if data is None: mt5.shutdown() return # バックテスト・ウィンドウに含まれないデータでのみトレーニングする。 train_data = data.iloc[:-(BACKTEST_ROWS + PRED_WINDOW)] images, targets = create_images(train_data, WINDOW_SIZE, PRED_WINDOW) print("Training model on ~1 year of data...") model = train_cv_model(images, targets) # 指定された通りにバックテストを実行する run_author_backtest(model, data, BACKTEST_ROWS) # 今すぐ(今後24時間)のライブ予報 last_window = data.iloc[-WINDOW_SIZE:] scaler = MinMaxScaler() live_pred = model.predict(np.array([scaler.fit_transform(last_window)]), verbose=0)[0][0] live_dir = 「UP▲」。 if live_pred > 0.5 else 「ダウン▼」。 print(f"\nLIVE FORECAST FOR NEXT 24 HOURS: {live_dir}") print(f"Confidence: {live_pred*100 if live_pred > 0.5 else (1-live_pred)*100:.2 f}%") input("Process complete. Press Enter to close this window...") mt5.shutdown() if __name__ == "__main__": main()バックテスト 予測の小さな変更を行った。
取引の機会を逃しています。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事「MQL5における取引へのコンピュータビジョンの統合(第1回):基本関数の作成」はパブリッシュされました:
ニューラルネットワークがEURUSD市場を見つめるとき、それは何を感じているのでしょうか。ボラティリティの急騰、トレンドの反転、そして捉えどころのないパターン形成の一つひとつを、どのように認識しているのでしょうか。
あらかじめ定められたルールを機械的に適用するのではなく、市場を真に見るコンピュータを想像してみてください。それは人間の目には見えない価格変動の微細なニュアンスを捉えます。まるでベテラン船長が水平線を見つめ、最初の兆候が現れるはるか前に嵐の接近を察知するかのように、人工知能はEURUSDチャートを読み取ります。
本記事では、コンピュータビジョンと市場分析が融合する金融テクノロジーの最前線を紹介します。私たちは単に市場を分析するのではなく、視覚的に理解するシステムを構築します。それは、群衆の中から友人の顔を自然に見分けるように、複雑な価格パターンを認識するのです。
この機能は、モデルが意思決定時にチャートのどの領域に最も注意を払っているかを可視化する、人工知能の「意識」の実際のマップを生成します。注意が高い赤いゾーンは、しばしば重要な価格レベルや反転ポイントと一致し、モデルが重要な価格形成を正しく学習していることを確認できます。
作者: Yevgeniy Koshtenko