{ "cells": [ { "cell_type": "code", "execution_count": 2, "id": "4cb5824d", "metadata": {}, "outputs": [], "source": [ "# 📦 Imports\n", "import MetaTrader5 as mt\n", "import pandas as pd\n", "import sqlite3 as db\n", "from datetime import datetime\n", "import time\n", "from scipy.signal import savgol_filter\n", "import pandas_ta as ta\n", "import keyring as kr" ] }, { "cell_type": "code", "execution_count": 3, "id": "1279652c", "metadata": {}, "outputs": [], "source": [ "# 📊 Verbindung zu SQLite\n", "def init_db(db_name=\"trading_log.db\"):\n", " conn = db.connect(db_name)\n", " c = conn.cursor()\n", " c.execute(\"\"\"\n", " CREATE TABLE IF NOT EXISTS trade_log (\n", " timestamp TEXT,\n", " symbol TEXT,\n", " order_type TEXT,\n", " price REAL,\n", " sl REAL,\n", " tp REAL,\n", " volume REAL,\n", " signal INTEGER,\n", " comment TEXT\n", " )\n", " \"\"\")\n", " conn.commit()\n", " return conn" ] }, { "cell_type": "code", "execution_count": 7, "id": "fc1eb959", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 🔐 MT5 Login einmalig initialisieren\n", "mt.initialize()\n", "login = 10800246\n", "server = \"VantageInternational-Demo\"\n", "password = kr.get_password(server, str(login))\n", "mt.login(login, password, server)" ] }, { "cell_type": "code", "execution_count": 8, "id": "840d41c6", "metadata": {}, "outputs": [], "source": [ "# 📥 MT5 Daten abrufen\n", "def get_mt5_data(symbol=\"XAUUSD\", timeframe=mt.TIMEFRAME_M5, n_bars=500):\n", " rates = mt.copy_rates_from_pos(symbol, timeframe, 0, n_bars)\n", " df = pd.DataFrame(rates)\n", " df[\"time\"] = pd.to_datetime(df[\"time\"], unit=\"s\")\n", " return df" ] }, { "cell_type": "code", "execution_count": 9, "id": "48445ef4", "metadata": {}, "outputs": [], "source": [ "df = get_mt5_data()" ] }, { "cell_type": "code", "execution_count": 11, "id": "964f927f", "metadata": {}, "outputs": [], "source": [ "# 🤖 Signale erzeugen\n", "def generate_signal(df):\n", " df[\"ema10\"] = df[\"close\"].ewm(span=10).mean()\n", " df[\"ema30\"] = df[\"close\"].ewm(span=30).mean()\n", " df[\"rsi\"] = ta.rsi(df[\"close\"], length=14)\n", " df[\"trend\"] = savgol_filter(df[\"close\"], 15, 3)\n", " df[\"signal\"] = 0\n", "\n", " for i in range(1, len(df)):\n", " if (\n", " df[\"ema10\"].iloc[i] > df[\"ema30\"].iloc[i]\n", " and df[\"ema10\"].iloc[i - 1] <= df[\"ema30\"].iloc[i - 1]\n", " and df[\"rsi\"].iloc[i] < 70\n", " and df[\"trend\"].iloc[i] > df[\"trend\"].iloc[i - 1]\n", " ):\n", " df.at[i, \"signal\"] = 1\n", " elif (\n", " df[\"ema10\"].iloc[i] < df[\"ema30\"].iloc[i]\n", " and df[\"ema10\"].iloc[i - 1] >= df[\"ema30\"].iloc[i - 1]\n", " and df[\"rsi\"].iloc[i] > 30\n", " and df[\"trend\"].iloc[i] < df[\"trend\"].iloc[i - 1]\n", " ):\n", " df.at[i, \"signal\"] = -1\n", " return df" ] }, { "cell_type": "code", "execution_count": 12, "id": "7494a5da", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | time | \n", "open | \n", "high | \n", "low | \n", "close | \n", "tick_volume | \n", "spread | \n", "real_volume | \n", "ema10 | \n", "ema30 | \n", "rsi | \n", "trend | \n", "signal | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "2025-07-17 04:30:00 | \n", "3340.74 | \n", "3341.46 | \n", "3337.21 | \n", "3338.04 | \n", "1293 | \n", "18 | \n", "0 | \n", "3338.040000 | \n", "3338.040000 | \n", "NaN | \n", "3338.208386 | \n", "0 | \n", "
| 1 | \n", "2025-07-17 04:35:00 | \n", "3338.03 | \n", "3341.03 | \n", "3337.72 | \n", "3341.03 | \n", "964 | \n", "18 | \n", "0 | \n", "3339.684500 | \n", "3339.584833 | \n", "NaN | \n", "3340.377874 | \n", "0 | \n", "
| 2 | \n", "2025-07-17 04:40:00 | \n", "3341.03 | \n", "3341.48 | \n", "3339.96 | \n", "3341.26 | \n", "944 | \n", "18 | \n", "0 | \n", "3340.317841 | \n", "3340.180848 | \n", "NaN | \n", "3341.873882 | \n", "0 | \n", "
| 3 | \n", "2025-07-17 04:45:00 | \n", "3341.27 | \n", "3343.45 | \n", "3341.27 | \n", "3342.47 | \n", "1099 | \n", "18 | \n", "0 | \n", "3341.026881 | \n", "3340.811593 | \n", "NaN | \n", "3342.785860 | \n", "0 | \n", "
| 4 | \n", "2025-07-17 04:50:00 | \n", "3342.47 | \n", "3343.61 | \n", "3342.20 | \n", "3342.84 | \n", "1070 | \n", "18 | \n", "0 | \n", "3341.547378 | \n", "3341.273104 | \n", "NaN | \n", "3343.203260 | \n", "0 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 495 | \n", "2025-07-18 22:45:00 | \n", "3349.29 | \n", "3349.71 | \n", "3348.47 | \n", "3348.78 | \n", "928 | \n", "19 | \n", "0 | \n", "3350.024962 | \n", "3351.232735 | \n", "34.935115 | \n", "3348.405247 | \n", "0 | \n", "
| 496 | \n", "2025-07-18 22:50:00 | \n", "3348.79 | \n", "3348.80 | \n", "3347.62 | \n", "3348.15 | \n", "859 | \n", "19 | \n", "0 | \n", "3349.684060 | \n", "3351.033849 | \n", "32.290909 | \n", "3348.186635 | \n", "0 | \n", "
| 497 | \n", "2025-07-18 22:55:00 | \n", "3348.16 | \n", "3348.53 | \n", "3347.65 | \n", "3348.25 | \n", "1028 | \n", "19 | \n", "0 | \n", "3349.423322 | \n", "3350.854245 | \n", "33.155760 | \n", "3348.153324 | \n", "0 | \n", "
| 498 | \n", "2025-07-18 23:00:00 | \n", "3348.24 | \n", "3348.88 | \n", "3347.72 | \n", "3348.06 | \n", "599 | \n", "19 | \n", "0 | \n", "3349.175445 | \n", "3350.673972 | \n", "32.311285 | \n", "3348.346744 | \n", "0 | \n", "
| 499 | \n", "2025-07-18 23:05:00 | \n", "3348.06 | \n", "3349.25 | \n", "3347.92 | \n", "3348.88 | \n", "450 | \n", "19 | \n", "0 | \n", "3349.121728 | \n", "3350.558231 | \n", "39.476021 | \n", "3348.808327 | \n", "0 | \n", "
500 rows × 13 columns
\n", "| \n", " | timestamp | \n", "symbol | \n", "order_type | \n", "price | \n", "sl | \n", "tp | \n", "volume | \n", "signal | \n", "comment | \n", "
|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "2025-07-18 16:06:32.701648 | \n", "XAUUSD | \n", "BUY | \n", "3358.95 | \n", "3358.75 | \n", "3359.35 | \n", "0.1 | \n", "b'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00' | \n", "AutoSignalBot | \n", "
| 1 | \n", "2025-07-18 15:51:32.545794 | \n", "XAUUSD | \n", "SELL | \n", "3354.56 | \n", "3354.76 | \n", "3354.16 | \n", "0.1 | \n", "b'\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff' | \n", "AutoSignalBot | \n", "