0d25548ed5
- Move utility scripts to scripts/ (check_market, check_positions, etc.) - Move test files to tests/ (test_modules, test_mt5_connection, etc.) - Move deprecated dashboards to archive/ - Move research files to docs/research/ - Add sys.path fix to all moved Python files - Rewrite README.md with architecture diagram and badges - Add CLAUDE.md project guide - Add MIT LICENSE - Update .gitignore with archive/ pattern Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
101 lines
3.1 KiB
Python
101 lines
3.1 KiB
Python
"""Get real trading history from MT5."""
|
|
# Run from project root: python scripts/get_trade_history.py
|
|
import sys, os
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
from datetime import datetime, timedelta
|
|
from dotenv import load_dotenv
|
|
load_dotenv()
|
|
|
|
import MetaTrader5 as mt5
|
|
|
|
if not mt5.initialize():
|
|
print('MT5 init failed')
|
|
exit()
|
|
|
|
if not mt5.login(int(os.getenv('MT5_LOGIN')), os.getenv('MT5_PASSWORD'), os.getenv('MT5_SERVER')):
|
|
print('MT5 login failed')
|
|
exit()
|
|
|
|
# Get account info
|
|
account = mt5.account_info()
|
|
print(f'Account: {account.login}')
|
|
print(f'Balance: ${account.balance:,.2f}')
|
|
print(f'Equity: ${account.equity:,.2f}')
|
|
print()
|
|
|
|
# Get trade history (last 14 days)
|
|
from_date = datetime.now() - timedelta(days=14)
|
|
to_date = datetime.now() + timedelta(days=1)
|
|
|
|
deals = mt5.history_deals_get(from_date, to_date)
|
|
print(f'Total deals in last 14 days: {len(deals) if deals else 0}')
|
|
print()
|
|
|
|
if deals:
|
|
# Group by position to calculate trade results
|
|
trades = {}
|
|
for deal in deals:
|
|
if deal.position_id > 0:
|
|
if deal.position_id not in trades:
|
|
trades[deal.position_id] = []
|
|
trades[deal.position_id].append(deal)
|
|
|
|
print('=' * 70)
|
|
print('REAL TRADING HISTORY (Last 14 days)')
|
|
print('=' * 70)
|
|
|
|
total_profit = 0
|
|
wins = 0
|
|
losses = 0
|
|
trade_list = []
|
|
|
|
for pos_id, pos_deals in trades.items():
|
|
if len(pos_deals) >= 2:
|
|
# Has entry and exit
|
|
entry = next((d for d in pos_deals if d.entry == 0), None) # DEAL_ENTRY_IN
|
|
exit_deal = next((d for d in pos_deals if d.entry == 1), None) # DEAL_ENTRY_OUT
|
|
|
|
if entry and exit_deal:
|
|
profit = exit_deal.profit
|
|
direction = 'BUY' if entry.type == 0 else 'SELL'
|
|
entry_time = datetime.fromtimestamp(entry.time)
|
|
exit_time = datetime.fromtimestamp(exit_deal.time)
|
|
|
|
result = 'WIN' if profit > 0 else 'LOSS'
|
|
if profit > 0:
|
|
wins += 1
|
|
else:
|
|
losses += 1
|
|
total_profit += profit
|
|
|
|
trade_list.append({
|
|
'time': entry_time,
|
|
'direction': direction,
|
|
'lot': entry.volume,
|
|
'profit': profit,
|
|
'result': result
|
|
})
|
|
|
|
# Sort by time and print
|
|
trade_list.sort(key=lambda x: x['time'])
|
|
for t in trade_list[-50:]: # Last 50 trades
|
|
print(f" {t['time']} | {t['direction']} | Lot: {t['lot']} | ${t['profit']:+.2f} [{t['result']}]")
|
|
|
|
print()
|
|
print('=' * 70)
|
|
print('REAL TRADING SUMMARY')
|
|
print('=' * 70)
|
|
total_trades = wins + losses
|
|
win_rate = (wins / total_trades * 100) if total_trades > 0 else 0
|
|
avg_profit = total_profit / total_trades if total_trades > 0 else 0
|
|
|
|
print(f' Total Trades : {total_trades}')
|
|
print(f' Winning Trades : {wins}')
|
|
print(f' Losing Trades : {losses}')
|
|
print(f' Win Rate : {win_rate:.1f}%')
|
|
print(f' Total P/L : ${total_profit:+,.2f}')
|
|
print(f' Average/Trade : ${avg_profit:+.2f}')
|
|
|
|
mt5.shutdown()
|