refactor: restructure repository and add README, CLAUDE.md, LICENSE
- 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>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
20dc1385c3
commit
0d25548ed5
@@ -0,0 +1,100 @@
|
||||
"""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()
|
||||
Reference in New Issue
Block a user