Files
Place-Order-Trading-Bot/AutoTrading_MT5_with_Logging_fib_atr.ipynb
T
2025-09-03 23:17:02 +02:00

842 lines
31 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>time</th>\n",
" <th>open</th>\n",
" <th>high</th>\n",
" <th>low</th>\n",
" <th>close</th>\n",
" <th>tick_volume</th>\n",
" <th>spread</th>\n",
" <th>real_volume</th>\n",
" <th>ema10</th>\n",
" <th>ema30</th>\n",
" <th>rsi</th>\n",
" <th>trend</th>\n",
" <th>signal</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2025-07-17 04:30:00</td>\n",
" <td>3340.74</td>\n",
" <td>3341.46</td>\n",
" <td>3337.21</td>\n",
" <td>3338.04</td>\n",
" <td>1293</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>3338.040000</td>\n",
" <td>3338.040000</td>\n",
" <td>NaN</td>\n",
" <td>3338.208386</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2025-07-17 04:35:00</td>\n",
" <td>3338.03</td>\n",
" <td>3341.03</td>\n",
" <td>3337.72</td>\n",
" <td>3341.03</td>\n",
" <td>964</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>3339.684500</td>\n",
" <td>3339.584833</td>\n",
" <td>NaN</td>\n",
" <td>3340.377874</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2025-07-17 04:40:00</td>\n",
" <td>3341.03</td>\n",
" <td>3341.48</td>\n",
" <td>3339.96</td>\n",
" <td>3341.26</td>\n",
" <td>944</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>3340.317841</td>\n",
" <td>3340.180848</td>\n",
" <td>NaN</td>\n",
" <td>3341.873882</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2025-07-17 04:45:00</td>\n",
" <td>3341.27</td>\n",
" <td>3343.45</td>\n",
" <td>3341.27</td>\n",
" <td>3342.47</td>\n",
" <td>1099</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>3341.026881</td>\n",
" <td>3340.811593</td>\n",
" <td>NaN</td>\n",
" <td>3342.785860</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2025-07-17 04:50:00</td>\n",
" <td>3342.47</td>\n",
" <td>3343.61</td>\n",
" <td>3342.20</td>\n",
" <td>3342.84</td>\n",
" <td>1070</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>3341.547378</td>\n",
" <td>3341.273104</td>\n",
" <td>NaN</td>\n",
" <td>3343.203260</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>495</th>\n",
" <td>2025-07-18 22:45:00</td>\n",
" <td>3349.29</td>\n",
" <td>3349.71</td>\n",
" <td>3348.47</td>\n",
" <td>3348.78</td>\n",
" <td>928</td>\n",
" <td>19</td>\n",
" <td>0</td>\n",
" <td>3350.024962</td>\n",
" <td>3351.232735</td>\n",
" <td>34.935115</td>\n",
" <td>3348.405247</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>496</th>\n",
" <td>2025-07-18 22:50:00</td>\n",
" <td>3348.79</td>\n",
" <td>3348.80</td>\n",
" <td>3347.62</td>\n",
" <td>3348.15</td>\n",
" <td>859</td>\n",
" <td>19</td>\n",
" <td>0</td>\n",
" <td>3349.684060</td>\n",
" <td>3351.033849</td>\n",
" <td>32.290909</td>\n",
" <td>3348.186635</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>497</th>\n",
" <td>2025-07-18 22:55:00</td>\n",
" <td>3348.16</td>\n",
" <td>3348.53</td>\n",
" <td>3347.65</td>\n",
" <td>3348.25</td>\n",
" <td>1028</td>\n",
" <td>19</td>\n",
" <td>0</td>\n",
" <td>3349.423322</td>\n",
" <td>3350.854245</td>\n",
" <td>33.155760</td>\n",
" <td>3348.153324</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>498</th>\n",
" <td>2025-07-18 23:00:00</td>\n",
" <td>3348.24</td>\n",
" <td>3348.88</td>\n",
" <td>3347.72</td>\n",
" <td>3348.06</td>\n",
" <td>599</td>\n",
" <td>19</td>\n",
" <td>0</td>\n",
" <td>3349.175445</td>\n",
" <td>3350.673972</td>\n",
" <td>32.311285</td>\n",
" <td>3348.346744</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>499</th>\n",
" <td>2025-07-18 23:05:00</td>\n",
" <td>3348.06</td>\n",
" <td>3349.25</td>\n",
" <td>3347.92</td>\n",
" <td>3348.88</td>\n",
" <td>450</td>\n",
" <td>19</td>\n",
" <td>0</td>\n",
" <td>3349.121728</td>\n",
" <td>3350.558231</td>\n",
" <td>39.476021</td>\n",
" <td>3348.808327</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>500 rows × 13 columns</p>\n",
"</div>"
],
"text/plain": [
" time open high low close tick_volume \\\n",
"0 2025-07-17 04:30:00 3340.74 3341.46 3337.21 3338.04 1293 \n",
"1 2025-07-17 04:35:00 3338.03 3341.03 3337.72 3341.03 964 \n",
"2 2025-07-17 04:40:00 3341.03 3341.48 3339.96 3341.26 944 \n",
"3 2025-07-17 04:45:00 3341.27 3343.45 3341.27 3342.47 1099 \n",
"4 2025-07-17 04:50:00 3342.47 3343.61 3342.20 3342.84 1070 \n",
".. ... ... ... ... ... ... \n",
"495 2025-07-18 22:45:00 3349.29 3349.71 3348.47 3348.78 928 \n",
"496 2025-07-18 22:50:00 3348.79 3348.80 3347.62 3348.15 859 \n",
"497 2025-07-18 22:55:00 3348.16 3348.53 3347.65 3348.25 1028 \n",
"498 2025-07-18 23:00:00 3348.24 3348.88 3347.72 3348.06 599 \n",
"499 2025-07-18 23:05:00 3348.06 3349.25 3347.92 3348.88 450 \n",
"\n",
" spread real_volume ema10 ema30 rsi trend \\\n",
"0 18 0 3338.040000 3338.040000 NaN 3338.208386 \n",
"1 18 0 3339.684500 3339.584833 NaN 3340.377874 \n",
"2 18 0 3340.317841 3340.180848 NaN 3341.873882 \n",
"3 18 0 3341.026881 3340.811593 NaN 3342.785860 \n",
"4 18 0 3341.547378 3341.273104 NaN 3343.203260 \n",
".. ... ... ... ... ... ... \n",
"495 19 0 3350.024962 3351.232735 34.935115 3348.405247 \n",
"496 19 0 3349.684060 3351.033849 32.290909 3348.186635 \n",
"497 19 0 3349.423322 3350.854245 33.155760 3348.153324 \n",
"498 19 0 3349.175445 3350.673972 32.311285 3348.346744 \n",
"499 19 0 3349.121728 3350.558231 39.476021 3348.808327 \n",
"\n",
" signal \n",
"0 0 \n",
"1 0 \n",
"2 0 \n",
"3 0 \n",
"4 0 \n",
".. ... \n",
"495 0 \n",
"496 0 \n",
"497 0 \n",
"498 0 \n",
"499 0 \n",
"\n",
"[500 rows x 13 columns]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"generate_signal(df)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "0a8abc07",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.01"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mt.symbol_info('XAUUSD').point"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "64757821",
"metadata": {},
"outputs": [],
"source": [
"# 📤 Order senden\n",
"def send_market_order(symbol, volume, order_type, signal, conn, sl_pips=20, tp_pips=40, magic=1001):\n",
" tick = mt.symbol_info_tick(symbol)\n",
" price = tick.ask if order_type == mt.ORDER_TYPE_BUY else tick.bid\n",
" point = mt.symbol_info(symbol).point\n",
"\n",
" sl = price - sl_pips * point if order_type == mt.ORDER_TYPE_BUY else price + sl_pips * point\n",
" tp = price + tp_pips * point if order_type == mt.ORDER_TYPE_BUY else price - tp_pips * point\n",
"\n",
" request = {\n",
" \"action\": mt.TRADE_ACTION_DEAL,\n",
" \"symbol\": symbol,\n",
" \"volume\": volume,\n",
" \"type\": order_type,\n",
" \"price\": price,\n",
" \"sl\": round(sl, 5),\n",
" \"tp\": round(tp, 5),\n",
" \"deviation\": 20,\n",
" \"magic\": magic,\n",
" \"comment\": \"AutoSignalBot\",\n",
" \"type_time\": mt.ORDER_TIME_GTC,\n",
" \"type_filling\": mt.ORDER_FILLING_IOC,\n",
" }\n",
"\n",
" result = mt.order_send(request)\n",
" print(f\"[TRADE] {symbol} - {'BUY' if order_type==0 else 'SELL'} @ {price} | SL: {sl} | TP: {tp}\")\n",
"\n",
" # Logging in DB\n",
" c = conn.cursor()\n",
" c.execute(\"\"\"\n",
" INSERT INTO trade_log (timestamp, symbol, order_type, price, sl, tp, volume, signal, comment)\n",
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n",
" \"\"\", (datetime.now(), symbol, \"BUY\" if order_type==0 else \"SELL\", price, sl, tp, volume, signal, \"AutoSignalBot\"))\n",
" conn.commit()\n",
" \n",
" return result"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "3bc5f11e",
"metadata": {},
"outputs": [],
"source": [
"# 🔁 Hauptfunktion\n",
"def run_live_trading(symbol=\"XAUUSD\", interval=300, volume=0.1, db_name=\"trading_log.db\"):\n",
" conn = init_db(db_name)\n",
" last_signal = 0\n",
"\n",
" print(f\"✅ Starte Auto-Trading für {symbol} Intervall {interval}s\")\n",
" while True:\n",
" df = get_mt5_data(symbol)\n",
" df = generate_signal(df)\n",
" signal = df[\"signal\"].iloc[-1]\n",
"\n",
" if signal != 0 and signal != last_signal:\n",
" order_type = mt.ORDER_TYPE_BUY if signal == 1 else mt.ORDER_TYPE_SELL\n",
" send_market_order(symbol, volume, order_type, signal, conn)\n",
" last_signal = signal\n",
" else:\n",
" print(f\"[{datetime.now()}] Kein neues Signal ({signal})\")\n",
"\n",
" time.sleep(interval)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "71acdb0d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"✅ Starte Auto-Trading für XAUUSD Intervall 300s\n",
"[2025-07-18 12:11:30.004688] Kein neues Signal (0)\n",
"[2025-07-18 12:16:30.083605] Kein neues Signal (0)\n",
"[2025-07-18 12:21:30.121793] Kein neues Signal (0)\n",
"[2025-07-18 12:26:30.174396] Kein neues Signal (0)\n",
"[2025-07-18 12:31:30.216996] Kein neues Signal (0)\n",
"[2025-07-18 12:36:30.258849] Kein neues Signal (0)\n",
"[2025-07-18 12:41:30.313072] Kein neues Signal (0)\n",
"[2025-07-18 12:46:30.356620] Kein neues Signal (0)\n",
"[2025-07-18 12:51:30.396600] Kein neues Signal (0)\n",
"[2025-07-18 12:56:30.442114] Kein neues Signal (0)\n",
"[2025-07-18 13:01:30.481155] Kein neues Signal (0)\n",
"[2025-07-18 13:06:30.530619] Kein neues Signal (0)\n",
"[2025-07-18 13:11:30.566248] Kein neues Signal (0)\n",
"[2025-07-18 13:16:30.606701] Kein neues Signal (0)\n",
"[2025-07-18 13:21:30.645462] Kein neues Signal (0)\n",
"[2025-07-18 13:26:30.686722] Kein neues Signal (0)\n",
"[2025-07-18 13:31:31.130100] Kein neues Signal (0)\n",
"[2025-07-18 13:36:31.193825] Kein neues Signal (0)\n",
"[2025-07-18 13:41:31.381330] Kein neues Signal (0)\n",
"[2025-07-18 13:46:31.434187] Kein neues Signal (0)\n",
"[2025-07-18 13:51:31.471695] Kein neues Signal (0)\n",
"[2025-07-18 13:56:31.507322] Kein neues Signal (0)\n",
"[2025-07-18 14:01:31.550436] Kein neues Signal (0)\n",
"[2025-07-18 14:06:31.587884] Kein neues Signal (0)\n",
"[2025-07-18 14:11:31.665002] Kein neues Signal (0)\n",
"[2025-07-18 14:16:31.704012] Kein neues Signal (0)\n",
"[2025-07-18 14:21:31.745292] Kein neues Signal (0)\n",
"[2025-07-18 14:26:31.783905] Kein neues Signal (0)\n",
"[2025-07-18 14:31:31.822325] Kein neues Signal (0)\n",
"[2025-07-18 14:36:31.873271] Kein neues Signal (0)\n",
"[2025-07-18 14:41:31.914303] Kein neues Signal (0)\n",
"[2025-07-18 14:46:31.951585] Kein neues Signal (0)\n",
"[2025-07-18 14:51:32.005271] Kein neues Signal (0)\n",
"[2025-07-18 14:56:32.046384] Kein neues Signal (0)\n",
"[2025-07-18 15:01:32.083259] Kein neues Signal (0)\n",
"[2025-07-18 15:06:32.132835] Kein neues Signal (0)\n",
"[2025-07-18 15:11:32.176714] Kein neues Signal (0)\n",
"[2025-07-18 15:16:32.221857] Kein neues Signal (0)\n",
"[2025-07-18 15:21:32.269876] Kein neues Signal (0)\n",
"[2025-07-18 15:26:32.313363] Kein neues Signal (0)\n",
"[2025-07-18 15:31:32.356954] Kein neues Signal (0)\n",
"[2025-07-18 15:36:32.403653] Kein neues Signal (0)\n",
"[2025-07-18 15:41:32.449777] Kein neues Signal (0)\n",
"[2025-07-18 15:46:32.489053] Kein neues Signal (0)\n",
"[TRADE] XAUUSD - SELL @ 3354.56 | SL: 3354.7599999999998 | TP: 3354.16\n",
"[2025-07-18 15:56:32.609729] Kein neues Signal (0)\n",
"[2025-07-18 16:01:32.650996] Kein neues Signal (0)\n",
"[TRADE] XAUUSD - BUY @ 3358.95 | SL: 3358.75 | TP: 3359.35\n",
"[2025-07-18 16:11:32.744972] Kein neues Signal (0)\n",
"[2025-07-18 16:16:32.791366] Kein neues Signal (0)\n",
"[2025-07-18 16:21:32.829930] Kein neues Signal (0)\n",
"[2025-07-18 16:26:32.871934] Kein neues Signal (0)\n",
"[2025-07-18 16:31:32.912571] Kein neues Signal (0)\n",
"[2025-07-18 16:36:32.954745] Kein neues Signal (0)\n",
"[2025-07-18 16:41:32.994281] Kein neues Signal (0)\n",
"[2025-07-18 16:46:33.048113] Kein neues Signal (0)\n",
"[2025-07-18 16:51:33.086281] Kein neues Signal (0)\n",
"[2025-07-18 16:56:33.127117] Kein neues Signal (0)\n",
"[2025-07-18 17:01:33.177813] Kein neues Signal (0)\n",
"[2025-07-18 17:06:33.219713] Kein neues Signal (0)\n",
"[2025-07-18 17:11:33.260138] Kein neues Signal (0)\n",
"[2025-07-18 17:16:33.302870] Kein neues Signal (0)\n",
"[2025-07-18 17:21:33.346259] Kein neues Signal (0)\n",
"[2025-07-18 17:26:33.390947] Kein neues Signal (0)\n",
"[2025-07-18 17:31:33.434736] Kein neues Signal (0)\n",
"[2025-07-18 17:36:33.476901] Kein neues Signal (0)\n",
"[2025-07-18 17:41:33.520435] Kein neues Signal (0)\n",
"[2025-07-18 17:46:33.575426] Kein neues Signal (0)\n",
"[2025-07-18 17:51:33.622573] Kein neues Signal (0)\n",
"[2025-07-18 17:56:33.662664] Kein neues Signal (0)\n",
"[2025-07-18 18:01:33.703019] Kein neues Signal (0)\n",
"[2025-07-18 18:06:33.748220] Kein neues Signal (0)\n",
"[2025-07-18 18:11:33.788812] Kein neues Signal (0)\n",
"[2025-07-18 18:16:33.827200] Kein neues Signal (0)\n",
"[2025-07-18 18:21:33.880825] Kein neues Signal (0)\n",
"[2025-07-18 18:26:33.931042] Kein neues Signal (0)\n",
"[2025-07-18 18:31:33.982017] Kein neues Signal (0)\n",
"[2025-07-18 18:36:34.021865] Kein neues Signal (1)\n",
"[2025-07-18 18:41:34.059505] Kein neues Signal (0)\n",
"[2025-07-18 18:46:34.100395] Kein neues Signal (0)\n",
"[2025-07-18 18:51:34.148794] Kein neues Signal (0)\n",
"[2025-07-18 18:56:34.186791] Kein neues Signal (0)\n",
"[2025-07-18 19:01:34.227630] Kein neues Signal (0)\n",
"[2025-07-18 19:06:34.272331] Kein neues Signal (0)\n",
"[2025-07-18 19:11:34.309122] Kein neues Signal (0)\n",
"[2025-07-18 19:16:34.350483] Kein neues Signal (0)\n",
"[2025-07-18 19:21:34.391638] Kein neues Signal (0)\n",
"[2025-07-18 19:26:34.430235] Kein neues Signal (0)\n",
"[2025-07-18 19:31:34.476827] Kein neues Signal (0)\n",
"[2025-07-18 19:36:34.516804] Kein neues Signal (0)\n",
"[2025-07-18 19:41:34.551478] Kein neues Signal (0)\n",
"[2025-07-18 19:46:34.600704] Kein neues Signal (0)\n",
"[2025-07-18 19:51:34.657098] Kein neues Signal (0)\n",
"[2025-07-18 19:56:34.694871] Kein neues Signal (0)\n",
"[2025-07-18 20:01:34.750662] Kein neues Signal (0)\n",
"[2025-07-18 20:06:34.786445] Kein neues Signal (0)\n",
"[2025-07-18 20:11:34.941510] Kein neues Signal (0)\n",
"[2025-07-18 20:16:34.997686] Kein neues Signal (0)\n",
"[2025-07-18 20:21:35.041835] Kein neues Signal (0)\n",
"[2025-07-18 20:26:35.082677] Kein neues Signal (0)\n",
"[2025-07-18 20:31:35.135303] Kein neues Signal (0)\n",
"[2025-07-18 20:36:35.174403] Kein neues Signal (0)\n",
"[2025-07-18 20:41:35.211876] Kein neues Signal (0)\n",
"[2025-07-18 20:46:35.254113] Kein neues Signal (0)\n",
"[2025-07-18 20:51:35.297650] Kein neues Signal (0)\n",
"[2025-07-18 20:56:35.338598] Kein neues Signal (0)\n",
"[2025-07-18 21:01:35.378704] Kein neues Signal (0)\n",
"[2025-07-18 21:06:35.421315] Kein neues Signal (0)\n",
"[2025-07-18 21:11:35.446675] Kein neues Signal (0)\n",
"[2025-07-18 21:16:35.501085] Kein neues Signal (0)\n",
"[2025-07-18 21:21:35.547489] Kein neues Signal (0)\n",
"[2025-07-18 21:26:35.600292] Kein neues Signal (0)\n",
"[2025-07-18 21:31:35.642080] Kein neues Signal (0)\n",
"[2025-07-18 21:36:35.681283] Kein neues Signal (0)\n",
"[2025-07-18 21:41:35.719258] Kein neues Signal (0)\n",
"[2025-07-18 21:46:35.756743] Kein neues Signal (0)\n",
"[2025-07-18 21:51:35.802329] Kein neues Signal (0)\n",
"[2025-07-18 21:56:35.849136] Kein neues Signal (0)\n",
"[2025-07-18 22:01:35.907573] Kein neues Signal (0)\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[22], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# ▶️ Live-Trading starten (z.B. alle 5 Minuten)\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m run_live_trading(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mXAUUSD\u001b[39m\u001b[38;5;124m\"\u001b[39m, interval\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m300\u001b[39m, volume\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0.1\u001b[39m)\n",
"Cell \u001b[1;32mIn[13], line 19\u001b[0m, in \u001b[0;36mrun_live_trading\u001b[1;34m(symbol, interval, volume, db_name)\u001b[0m\n\u001b[0;32m 16\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 17\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m[\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mdatetime\u001b[38;5;241m.\u001b[39mnow()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m] Kein neues Signal (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00msignal\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m---> 19\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(interval)\n",
"\u001b[1;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"# ▶️ Live-Trading starten (z.B. alle 5 Minuten)\n",
"run_live_trading(\"XAUUSD\", interval=300, volume=0.1)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "a7675469",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>timestamp</th>\n",
" <th>symbol</th>\n",
" <th>order_type</th>\n",
" <th>price</th>\n",
" <th>sl</th>\n",
" <th>tp</th>\n",
" <th>volume</th>\n",
" <th>signal</th>\n",
" <th>comment</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2025-07-18 16:06:32.701648</td>\n",
" <td>XAUUSD</td>\n",
" <td>BUY</td>\n",
" <td>3358.95</td>\n",
" <td>3358.75</td>\n",
" <td>3359.35</td>\n",
" <td>0.1</td>\n",
" <td>b'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00'</td>\n",
" <td>AutoSignalBot</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2025-07-18 15:51:32.545794</td>\n",
" <td>XAUUSD</td>\n",
" <td>SELL</td>\n",
" <td>3354.56</td>\n",
" <td>3354.76</td>\n",
" <td>3354.16</td>\n",
" <td>0.1</td>\n",
" <td>b'\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff'</td>\n",
" <td>AutoSignalBot</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" timestamp symbol order_type price sl tp \\\n",
"0 2025-07-18 16:06:32.701648 XAUUSD BUY 3358.95 3358.75 3359.35 \n",
"1 2025-07-18 15:51:32.545794 XAUUSD SELL 3354.56 3354.76 3354.16 \n",
"\n",
" volume signal comment \n",
"0 0.1 b'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00' AutoSignalBot \n",
"1 0.1 b'\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff' AutoSignalBot "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 🧾 Optional: SQLite-Datenbank anzeigen\n",
"conn = db.connect(\"trading_log.db\")\n",
"pd.read_sql(\"SELECT * FROM trade_log ORDER BY timestamp DESC LIMIT 10\", conn)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b4512a2c",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "ec808aea",
"metadata": {},
"outputs": [],
"source": [
"\n",
"import numpy as np\n",
"\n",
"def calculate_fib_levels(df, lookback=20):\n",
" swing_high = df['high'].rolling(lookback).max().iloc[-1]\n",
" swing_low = df['low'].rolling(lookback).min().iloc[-1]\n",
" diff = swing_high - swing_low\n",
" levels = {\n",
" '0.0': swing_low,\n",
" '0.236': swing_high - 0.236 * diff,\n",
" '0.382': swing_high - 0.382 * diff,\n",
" '0.5': swing_high - 0.5 * diff,\n",
" '0.618': swing_high - 0.618 * diff,\n",
" '0.786': swing_high - 0.786 * diff,\n",
" '1.0': swing_high\n",
" }\n",
" return levels\n",
"\n",
"def calculate_atr(df, period=14):\n",
" df['H-L'] = df['high'] - df['low']\n",
" df['H-C'] = abs(df['high'] - df['close'].shift())\n",
" df['L-C'] = abs(df['low'] - df['close'].shift())\n",
" df['TR'] = df[['H-L', 'H-C', 'L-C']].max(axis=1)\n",
" df['ATR'] = df['TR'].rolling(period).mean()\n",
" return df\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "09b3f9df",
"metadata": {},
"outputs": [],
"source": [
"\n",
"def send_fib_trade(df, symbol, order_type, volume):\n",
" fib = calculate_fib_levels(df)\n",
" df = calculate_atr(df)\n",
" atr = df['ATR'].iloc[-1]\n",
" point = mt.symbol_info(symbol).point\n",
" tick = mt.symbol_info_tick(symbol)\n",
" price = tick.ask if order_type == mt.ORDER_TYPE_BUY else tick.bid\n",
"\n",
" sl = price - atr if order_type == mt.ORDER_TYPE_BUY else price + atr\n",
" tp = price + 2 * atr if order_type == mt.ORDER_TYPE_BUY else price - 2 * atr\n",
"\n",
" request = {\n",
" \"action\": mt.TRADE_ACTION_DEAL,\n",
" \"symbol\": symbol,\n",
" \"volume\": volume,\n",
" \"type\": order_type,\n",
" \"price\": price,\n",
" \"sl\": round(sl, 5),\n",
" \"tp\": round(tp, 5),\n",
" \"deviation\": 20,\n",
" \"magic\": 1010,\n",
" \"comment\": \"FibATR_Trade\",\n",
" \"type_time\": mt.ORDER_TIME_GTC,\n",
" \"type_filling\": mt.ORDER_FILLING_IOC,\n",
" }\n",
" return mt.order_send(request)\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "base",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}