Diskussion zum Artikel "Integration von Computer Vision in den Handel in MQL5 (Teil 1): Erstellen von Grundfunktionen"

 

Neuer Artikel Integration von Computer Vision in den Handel in MQL5 (Teil 1): Erstellen von Grundfunktionen :

Das EURUSD-Prognosesystem mit Hilfe von Computer Vision und Deep Learning. Erfahren Sie, wie Faltungsneuronale Netze komplexe Kursmuster auf dem Devisenmarkt erkennen und Wechselkursbewegungen mit einer Genauigkeit von bis zu 54 % vorhersagen können. Der Artikel beschreibt die Methodik zur Entwicklung eines Algorithmus, der Technologien der künstlichen Intelligenz für die visuelle Analyse von Charts anstelle von traditionellen technischen Indikatoren verwendet. Der Autor demonstriert den Prozess der Umwandlung von Preisdaten in „Bilder“, ihre Verarbeitung durch ein neuronales Netz und die einzigartige Möglichkeit, anhand von Aktivierungskarten und Aufmerksamkeits-Heatmaps einen Blick in das „Bewusstsein“ der KI zu werfen. Praktischer Python-Code, der die MetaTrader 5-Bibliothek nutzt, ermöglicht es den Lesern, das System zu reproduzieren und für den eigenen Handel anzuwenden.

Haben Sie sich jemals gefragt, was ein neuronales Netzwerk fühlt, wenn es den EURUSD-Markt betrachtet? Wie nimmt sie jede Volatilitätsspitze, jede Trendumkehr, jede schwer fassbare Musterbildung wahr?

Stellen Sie sich einen Computer vor, der nicht nur gedankenlos vorprogrammierte Regeln anwendet, sondern den Markt wirklich wahrnimmt – und die feinen Nuancen der Kursbewegungen erfasst, die für das menschliche Auge unsichtbar sind. Künstliche Intelligenz, die den EURUSD-Chart wie ein erfahrener Kapitän den Meereshorizont betrachtet und einen herannahenden Sturm erkennt, lange bevor die ersten Anzeichen für schlechtes Wetter auftreten.

Heute lade ich Sie auf eine Reise zur Spitze der Finanztechnologie ein, wo Computer Vision auf Marktanalysen trifft. Wir werden ein System schaffen, das den Markt nicht einfach nur analysiert, sondern ihn visuell versteht und komplexe Preismuster so selbstverständlich erkennt, wie Sie das Gesicht eines Freundes in einer Menschenmenge erkennen.

Mit dieser Funktion wird eine echte Zuordnungsmodell des Bewusstseins erstellt, aus dem hervorgeht, welchen Bereichen des Charts es bei der Entscheidungsfindung die größte Aufmerksamkeit schenkt. Rote Zonen mit erhöhter Aufmerksamkeit fallen oft mit wichtigen Niveaus und Umkehrpunkten zusammen, was bestätigt, dass unser Modell tatsächlich gelernt hat, bedeutende Preisformationen zu erkennen.


Autor: Yevgeniy Koshtenko

 
Hallo, wie geht es Ihnen, Mann?
Ich schätze wirklich diesen Artikel, den Sie für uns zur Verfügung gestellt haben. Aber ich habe noch etwas zu sagen für jemanden wie mich, der Handelssysteme (EA) mit MQL5 Sprache erstellt hat, aber haben sehr wenig Ahnung, wenn es um maschinelles Lernen oder sogar Python im Allgemeinen kommt.
Ich möchte ML in mein Handelssystem integrieren, um es von einem gewöhnlichen Programm, das, wie Sie sagten, "geistlos" ist, zu besseren Entscheidungen zu bringen.
Soweit ich weiß, scheint Ihr Artikel einige Anfängerschritte zu vermissen. Ihr erster Code sagt uns nicht, welche IDE wir verwenden werden (ist es Meta Quotes IDE?) Ich würde das gerne wissen und Schritte, um es für all die Arbeit einzurichten, die wir später tun werden.
Außer vielleicht Ihr Artikel ist nicht gerade Lehre Anfänger von Grund auf (nicht einführend).
 
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

# --- KONFIGURATION ---
SYMBOL = "EURUSD"
TIMEFRAME = mt5.TIMEFRAME_H1
DATA_LOAD = 6200      # Erhöht auf ~1 Jahr der H1-Daten
WINDOW_SIZE = 48      # Eingabefenster (48 Stunden)
PRED_WINDOW = 24      # Vorhersagehorizont (24 Stunden)
BACKTEST_ROWS = 20    # Anzahl der letzten manuell zu überprüfenden Balken

def connect_to_mt5():
    if not mt5.initialize():
        print("Error initializing MetaTrader5")
        return False
    return True

def get_historical_data(num_bars):
    # Ziehen einer bestimmten Anzahl von der aktuellen Position
    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]
        # Das Etikett basiert auf dem Preis nach 24 Stunden.
        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]))
    
    # CNN-Architektur gemäß CV_Model.py-Logik
    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
    # Wir gehen zurück, um sicherzustellen, dass das 24-Stunden-Fenster für den Backtest tatsächlich beendet ist.
    for i in range(num_checks + PRED_WINDOW, PRED_WINDOW, -1):
        idx = len(full_data) - i
        
        # 1. Holen Sie sich das zu diesem Zeitpunkt verfügbare 48-Stunden-Fenster
        window = full_data.iloc[idx - WINDOW_SIZE : idx]
        timestamp = full_data.index[idx-1]
        
        # 2. Ermitteln Sie das TATSÄCHLICHE Ergebnis genau 24 Stunden später
        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 "DOWN ▼"
        
        # 3. Modell Vorhersage basierend auf Fenster
        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 "DOWN ▼"
        
        # 4. Ergebnis
        res = "✅ WIN" if pred_dir == actual_dir else "❌ VERLUST"
        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

    # Trainieren Sie nur mit Daten, die nicht Teil unseres Backtest-Fensters sind.
    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)
    
    # Führen Sie den Backtest genau wie angegeben aus.
    run_author_backtest(model, data, BACKTEST_ROWS)
    
    # Live-Vorhersage für JETZT (die nächsten 24 Stunden)
    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 "DOWN ▼"
    
    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()
Eine kleine Änderung an den Backtest-Vorhersagen wurde vorgenommen.