Keep main focused on MT5 platform

This commit is contained in:
chrisnov-it
2026-05-19 12:38:30 +08:00
parent 2715bfc8ef
commit 5bf46f5fe1
12 changed files with 21 additions and 3433 deletions
-353
View File
@@ -1,353 +0,0 @@
#!/usr/bin/env python3
"""
Indonesian Market Trading Demo for QuantumBotX
Showcasing opportunities in Indonesian financial markets
"""
import sys
import os
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# Add the project root to the path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
def demo_indonesian_market_overview():
"""Overview of Indonesian trading opportunities"""
print("🇮🇩 Indonesian Market Trading Opportunities")
print("=" * 60)
print("Welcome to the Indonesian Financial Markets!")
print("=" * 60)
market_segments = {
'IDX Stocks (Jakarta Stock Exchange)': {
'description': 'Local Indonesian companies',
'examples': ['BBCA.JK (BCA)', 'BBRI.JK (BRI)', 'TLKM.JK (Telkom)'],
'trading_hours': '09:00-16:00 WIB (GMT+7)',
'currency': 'IDR (Indonesian Rupiah)',
'min_lot': '100 shares',
'opportunities': ['Banking sector growth', 'Infrastructure development', 'Consumer goods expansion']
},
'USD/IDR Forex': {
'description': 'Indonesian Rupiah currency trading',
'examples': ['USDIDR', 'EURIDR', 'JPYIDR'],
'trading_hours': '24/5 (Global forex hours)',
'currency': 'IDR pairs',
'min_lot': 'Varies by broker',
'opportunities': ['Commodity-driven moves', 'Central bank policy', 'Tourism recovery']
},
'International Markets via Indonesian Brokers': {
'description': 'Global markets through local brokers',
'examples': ['XAUUSD', 'US stocks', 'Major forex pairs'],
'trading_hours': 'Varies by market',
'currency': 'USD typically',
'min_lot': 'Standard international',
'opportunities': ['Global diversification', 'USD income', 'Hedge against IDR']
}
}
print("\\n📊 Indonesian Market Segments:")
for i, (segment, details) in enumerate(market_segments.items(), 1):
print(f"\\n{i}. {segment}")
print(f" 📝 Description: {details['description']}")
print(f" 📈 Examples: {', '.join(details['examples'])}")
print(f" ⏰ Hours: {details['trading_hours']}")
print(f" 💰 Currency: {details['currency']}")
print(f" 🎯 Opportunities: {', '.join(details['opportunities'][:2])}")
def demo_indonesian_brokers():
"""Showcase Indonesian brokers with demo accounts"""
print("\\n🏢 Indonesian Brokers with Demo Accounts")
print("=" * 60)
brokers = [
{
'name': 'Indopremier Securities (IPOT)',
'type': 'Local Indonesian Broker',
'specialties': ['IDX Stocks', 'Local bonds', 'Indonesian mutual funds'],
'demo_account': 'Yes - Full IDX access',
'advantages': ['Local market expertise', 'IDR-based trading', 'Indonesian customer service'],
'website': 'https://www.indopremier.com/',
'best_for': 'Indonesian stock market and local investments'
},
{
'name': 'XM Indonesia',
'type': 'International Broker (Indonesia Office)',
'specialties': ['Forex', 'CFDs', 'Commodities', 'Crypto CFDs'],
'demo_account': 'Yes - $10,000 virtual',
'advantages': ['Global markets', 'MT4/MT5 platform', 'Indonesian support'],
'website': 'https://www.xm.com/id/',
'best_for': 'Forex and international markets'
},
{
'name': 'OctaFX Indonesia',
'type': 'International Broker (Popular in Indonesia)',
'specialties': ['Forex', 'Metals', 'Indices', 'Energies'],
'demo_account': 'Yes - Unlimited time',
'advantages': ['Tight spreads', 'Fast execution', 'Indonesian community'],
'website': 'https://www.octafx.com/id/',
'best_for': 'Professional forex trading'
},
{
'name': 'HSBC Indonesia',
'type': 'International Bank',
'specialties': ['Forex', 'Asian currencies', 'Trade finance'],
'demo_account': 'Available for qualified clients',
'advantages': ['Banking integration', 'Asian market focus', 'Multi-currency'],
'website': 'Contact local HSBC branch',
'best_for': 'Currency hedging and international business'
}
]
print("\\n🎯 Recommended Brokers for Indonesian Traders:")
for i, broker in enumerate(brokers, 1):
print(f"\\n{i}. {broker['name']}")
print(f" 🏢 Type: {broker['type']}")
print(f" 📈 Specialties: {', '.join(broker['specialties'][:3])}")
print(f" 🧪 Demo Account: {broker['demo_account']}")
print(f" ⭐ Best For: {broker['best_for']}")
print(f" 🌐 Website: {broker['website']}")
def demo_idx_stocks_trading():
"""Demo trading Indonesian stocks"""
print("\\n📈 IDX Stock Trading Simulation")
print("=" * 60)
# Simulate some popular Indonesian stocks
idx_stocks = [
{'symbol': 'BBCA.JK', 'name': 'Bank Central Asia', 'price': 9150, 'sector': 'Banking'},
{'symbol': 'BBRI.JK', 'name': 'Bank Rakyat Indonesia', 'price': 4520, 'sector': 'Banking'},
{'symbol': 'TLKM.JK', 'name': 'Telkom Indonesia', 'price': 3280, 'sector': 'Telecommunications'},
{'symbol': 'ASII.JK', 'name': 'Astra International', 'price': 6750, 'sector': 'Automotive'},
{'symbol': 'UNVR.JK', 'name': 'Unilever Indonesia', 'price': 7100, 'sector': 'Consumer Goods'},
]
print("\\n🏦 Popular IDX Stocks (Simulated Prices):")
print("Symbol | Company | Price (IDR) | Sector")
print("-" * 70)
total_portfolio_value = 0
for stock in idx_stocks:
# Simulate small price movements
current_price = stock['price'] * (1 + np.random.uniform(-0.02, 0.02))
change_pct = ((current_price - stock['price']) / stock['price']) * 100
# Simulate trading with 1000 IDR capital per stock
shares_affordable = int(100000 / current_price) # 100k IDR investment
position_value = shares_affordable * current_price
total_portfolio_value += position_value
color = "📈" if change_pct > 0 else "📉" if change_pct < 0 else "➡️"
print(f"{stock['symbol']:10} | {stock['name']:25} | {current_price:8.0f} {color} | {stock['sector']}")
print(f"\\n💼 Simulated Portfolio Value: {total_portfolio_value:,.0f} IDR")
print(f"💰 Equivalent in USD: ${total_portfolio_value/15400:.2f} (assuming 1 USD = 15,400 IDR)")
def demo_usd_idr_trading():
"""Demo USD/IDR forex trading"""
print("\\n💱 USD/IDR Forex Trading Simulation")
print("=" * 60)
# Current USD/IDR around 15,400
base_rate = 15400
# Simulate daily USD/IDR movements
days = 30
dates = pd.date_range(end=datetime.now(), periods=days, freq='D')
# IDR volatility (typically 0.5-1% daily)
daily_changes = np.random.randn(days) * 0.008 # 0.8% daily volatility
rates = base_rate * (1 + daily_changes).cumprod()
print(f"\\n📊 USD/IDR Rate Simulation (Last {days} days):")
print(f"Starting Rate: {base_rate:,.0f} IDR per USD")
print(f"Ending Rate: {rates[-1]:,.0f} IDR per USD")
print(f"Total Change: {((rates[-1] - base_rate) / base_rate) * 100:+.2f}%")
# Trading simulation
position_size = 10000 # $10,000 USD position
entry_rate = rates[0]
exit_rate = rates[-1]
if rates[-1] > rates[0]: # USD strengthened
pnl_usd = position_size * ((exit_rate - entry_rate) / entry_rate)
direction = "USD strengthened"
else: # USD weakened
pnl_usd = position_size * ((exit_rate - entry_rate) / entry_rate)
direction = "USD weakened"
pnl_idr = pnl_usd * exit_rate
print(f"\\n💹 Trading Simulation:")
print(f"Position: Long ${position_size:,} USD vs IDR")
print(f"Entry Rate: {entry_rate:,.0f} IDR/USD")
print(f"Exit Rate: {exit_rate:,.0f} IDR/USD")
print(f"Market Move: {direction}")
print(f"P&L: ${pnl_usd:+,.2f} USD (or {pnl_idr:+,.0f} IDR)")
def demo_strategy_performance_indonesia():
"""Test strategies on Indonesian markets"""
print("\\n🤖 Strategy Performance on Indonesian Markets")
print("=" * 60)
from core.brokers.indonesian_brokers import IndopremierBroker
# Create Indonesian broker instance
broker = IndopremierBroker(demo=True)
# Test symbols
test_symbols = [
('BBCA.JK', 'Bank Central Asia'),
('USDIDR', 'USD/IDR Forex'),
('XAUIDR', 'Gold in IDR')
]
print("\\n📈 Testing QuantumBotX Strategies on Indonesian Markets:")
for symbol, name in test_symbols:
try:
# Get simulated market data
df = broker.get_market_data(symbol, broker.timeframe_map[broker.Timeframe.H1] if hasattr(broker, 'timeframe_map') else 'H1', 500)
if not df.empty:
# Calculate basic metrics
volatility = (df['close'].std() / df['close'].mean()) * 100
price_range = f"{df['close'].min():.0f} - {df['close'].max():.0f}"
# Assess suitability for different strategies
if volatility < 2:
strategy_rec = "Bollinger Reversion (Low volatility)"
elif volatility > 5:
strategy_rec = "Conservative MA Crossover (High volatility)"
else:
strategy_rec = "QuantumBotX Hybrid (Moderate volatility)"
print(f"\\n📊 {symbol} ({name}):")
print(f" Price Range: {price_range}")
print(f" Volatility: {volatility:.1f}%")
print(f" Recommended Strategy: {strategy_rec}")
print(f" Data Points: {len(df)} bars")
else:
print(f"\\n❌ {symbol}: No data available")
except Exception as e:
print(f"\\n❌ {symbol}: Error - {e}")
def demo_regulatory_compliance():
"""Indonesian regulatory information"""
print("\\n⚖️ Indonesian Regulatory Compliance")
print("=" * 60)
regulatory_info = {
'Primary Regulator': {
'name': 'OJK (Otoritas Jasa Keuangan)',
'role': 'Financial Services Authority',
'website': 'https://www.ojk.go.id/',
'oversight': 'Banks, capital markets, insurance, pension funds'
},
'Stock Exchange': {
'name': 'IDX (Indonesia Stock Exchange)',
'location': 'Jakarta',
'website': 'https://www.idx.co.id/',
'trading_currency': 'Indonesian Rupiah (IDR)'
},
'Key Regulations': [
'Foreign investment limits in certain sectors',
'Tax obligations for trading profits',
'Anti-money laundering (AML) requirements',
'Know Your Customer (KYC) procedures'
],
'Tax Considerations': [
'Capital gains tax on stock trading',
'Forex trading taxation rules',
'Withholding tax on foreign investments',
'Professional trader vs investor classification'
]
}
print("\\n🏛️ Regulatory Framework:")
print(f"Primary Regulator: {regulatory_info['Primary Regulator']['name']}")
print(f"Stock Exchange: {regulatory_info['Stock Exchange']['name']}")
print("\\n⚠️ Important Considerations:")
for consideration in regulatory_info['Key Regulations'][:3]:
print(f"{consideration}")
print("\\n💰 Tax Implications:")
for tax_item in regulatory_info['Tax Considerations'][:3]:
print(f"{tax_item}")
print("\\n📝 Recommendation:")
print(" • Consult with Indonesian tax advisor")
print(" • Understand local broker regulations")
print(" • Keep detailed trading records")
print(" • Consider professional trader registration if applicable")
def main():
"""Main Indonesian market demo"""
print("🇮🇩 SELAMAT DATANG! Welcome to Indonesian Market Trading!")
print("Your QuantumBotX system now supports Indonesian markets!")
print()
# Run all demos
demo_indonesian_market_overview()
demo_indonesian_brokers()
demo_idx_stocks_trading()
demo_usd_idr_trading()
demo_strategy_performance_indonesia()
demo_regulatory_compliance()
print("\\n" + "=" * 60)
print("🎯 NEXT STEPS FOR INDONESIAN TRADING")
print("=" * 60)
next_steps = [
{
'step': '1. Choose Your Indonesian Broker',
'recommendation': 'Start with XM Indonesia demo (easiest setup)',
'action': 'Sign up for demo account at xm.com/id/'
},
{
'step': '2. Add Indonesian Configuration',
'recommendation': 'Update .env file with Indonesian broker credentials',
'action': 'Add XM_INDONESIA_LOGIN and XM_INDONESIA_PASSWORD'
},
{
'step': '3. Test IDX Stocks Strategy',
'recommendation': 'Start with banking stocks (BBCA, BBRI, BMRI)',
'action': 'Run backtests on Indonesian blue-chip stocks'
},
{
'step': '4. Explore USD/IDR Trading',
'recommendation': 'Great for Indonesian traders to earn USD',
'action': 'Test forex strategies on USD/IDR pair'
},
{
'step': '5. Regulatory Compliance',
'recommendation': 'Understand Indonesian tax obligations',
'action': 'Consult with local financial advisor'
}
]
for step_info in next_steps:
print(f"\\n{step_info['step']}")
print(f" 💡 Recommendation: {step_info['recommendation']}")
print(f" 🎯 Action: {step_info['action']}")
print("\\n🎉 AMAZING OPPORTUNITY!")
print("=" * 60)
print("You're now building a trading system that covers:")
print("✅ Global Forex (MT5, cTrader, XM)")
print("✅ Cryptocurrency (Binance)")
print("✅ US Stocks (Interactive Brokers)")
print("✅ Social Trading (TradingView)")
print("✅ Indonesian Markets (Local brokers)")
print()
print("🌏 FROM INDONESIA TO THE WORLD!")
print("Your trading system now spans the entire globe! 🚀")
if __name__ == "__main__":
main()
-310
View File
@@ -1,310 +0,0 @@
#!/usr/bin/env python3
"""
Multi-Broker Universe Demo for QuantumBotX
Shows how to trade across all major platforms simultaneously
"""
import sys
import os
import pandas as pd
import numpy as np
from datetime import datetime
# Add the project root to the path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
def demo_all_brokers():
"""Demonstrate all broker integrations"""
print("🌍 QuantumBotX Multi-Broker Universe Demo")
print("=" * 60)
print("Your trading system now supports ALL major platforms!")
print("=" * 60)
brokers_info = [
{
'name': 'MetaTrader 5',
'type': 'Forex/CFD Platform',
'assets': ['EURUSD', 'GBPUSD', 'XAUUSD', 'US30', 'AAPL'],
'advantages': ['Most forex brokers', 'Expert Advisors', 'Built-in indicators'],
'best_for': 'Forex and traditional CFD trading'
},
{
'name': 'Binance',
'type': 'Crypto Exchange',
'assets': ['BTCUSDT', 'ETHUSDT', 'ADAUSDT', 'SOLUSDT', 'DOGEUSDT'],
'advantages': ['24/7 trading', 'High liquidity', 'Low fees'],
'best_for': 'Cryptocurrency trading and DeFi'
},
{
'name': 'cTrader',
'type': 'Modern Forex Platform',
'assets': ['EURUSD', 'GBPUSD', 'USDJPY', 'XAUUSD', 'USOIL'],
'advantages': ['Advanced charting', 'Level II pricing', 'Fast execution'],
'best_for': 'Professional forex trading'
},
{
'name': 'Interactive Brokers',
'type': 'Multi-Asset Broker',
'assets': ['AAPL', 'ES', 'EURUSD', 'GC', 'Options'],
'advantages': ['Global markets', 'Low commissions', 'Advanced tools'],
'best_for': 'Stocks, futures, and options'
},
{
'name': 'TradingView',
'type': 'Social Trading Platform',
'assets': ['All markets', 'Pine Script', 'Social signals'],
'advantages': ['Community strategies', 'Advanced charts', 'Alerts'],
'best_for': 'Strategy development and social trading'
}
]
print("\\n🏢 Broker Overview:")
print("=" * 60)
for i, broker in enumerate(brokers_info, 1):
print(f"\\n{i}. {broker['name']} ({broker['type']})")
print(f" 📈 Assets: {', '.join(broker['assets'][:3])}{'...' if len(broker['assets']) > 3 else ''}")
print(f" ⭐ Best For: {broker['best_for']}")
print(f" 🎯 Key Advantages: {', '.join(broker['advantages'][:2])}")
return brokers_info
def demo_unified_portfolio():
"""Show how to create a unified portfolio across all brokers"""
print("\\n💼 Unified Portfolio Management")
print("=" * 60)
portfolio_allocation = {
'MT5 (Forex)': {
'allocation': '30%',
'symbols': ['EURUSD', 'GBPUSD', 'USDJPY'],
'strategy': 'QuantumBotX Hybrid',
'capital': '$3,000'
},
'Binance (Crypto)': {
'allocation': '25%',
'symbols': ['BTCUSDT', 'ETHUSDT', 'ADAUSDT'],
'strategy': 'MA Crossover (Crypto-tuned)',
'capital': '$2,500'
},
'cTrader (Forex Pro)': {
'allocation': '20%',
'symbols': ['XAUUSD', 'USOIL'],
'strategy': 'Bollinger Reversion',
'capital': '$2,000'
},
'Interactive Brokers (Stocks)': {
'allocation': '20%',
'symbols': ['AAPL', 'MSFT', 'TSLA'],
'strategy': 'Quantum Velocity',
'capital': '$2,000'
},
'TradingView (Signals)': {
'allocation': '5%',
'symbols': ['Community strategies'],
'strategy': 'Pine Script alerts',
'capital': '$500'
}
}
print("\\n📊 Portfolio Distribution ($10,000 total):")
print("-" * 60)
total_expected_return = 0
for broker, details in portfolio_allocation.items():
print(f"\\n{broker}")
print(f" 💰 Capital: {details['capital']} ({details['allocation']})")
print(f" 📈 Assets: {', '.join(details['symbols'][:3])}")
print(f" 🤖 Strategy: {details['strategy']}")
# Simulate expected returns
expected_monthly = np.random.uniform(2, 8) # 2-8% monthly return
total_expected_return += expected_monthly * float(details['allocation'].strip('%')) / 100
print(f" 📊 Expected Monthly Return: {expected_monthly:.1f}%")
print(f"\\n🎯 Portfolio Expected Monthly Return: {total_expected_return:.1f}%")
print(f"🎯 Portfolio Expected Annual Return: {total_expected_return * 12:.1f}%")
def demo_risk_management():
"""Show unified risk management across all brokers"""
print("\\n🛡️ Unified Risk Management System")
print("=" * 60)
risk_rules = [
{
'rule': 'Maximum Portfolio Risk',
'value': '15% of total capital',
'implementation': 'Sum of all open positions across all brokers'
},
{
'rule': 'Per-Broker Risk Limit',
'value': '5% per broker maximum',
'implementation': 'Individual broker position sizing limits'
},
{
'rule': 'Correlation Protection',
'value': 'Max 3 correlated positions',
'implementation': 'Cross-broker correlation monitoring'
},
{
'rule': 'Volatility Scaling',
'value': 'Dynamic position sizing',
'implementation': 'ATR-based sizing per asset class'
},
{
'rule': 'Emergency Brake',
'value': 'Auto-stop at 10% daily loss',
'implementation': 'Real-time P&L monitoring across all accounts'
}
]
print("\\n🔒 Global Risk Rules:")
for i, rule in enumerate(risk_rules, 1):
print(f"\\n{i}. {rule['rule']}: {rule['value']}")
print(f" Implementation: {rule['implementation']}")
def demo_24_7_opportunities():
"""Show 24/7 trading opportunities"""
print("\\n⏰ 24/7 Global Trading Opportunities")
print("=" * 60)
trading_schedule = [
{'time': '00:00-08:00 UTC', 'active': ['Crypto (Binance)', 'Forex (Asian session)'], 'opportunity': 'Crypto volatility + Asian forex'},
{'time': '08:00-16:00 UTC', 'active': ['All Forex', 'European Stocks', 'Crypto'], 'opportunity': 'European session overlap'},
{'time': '13:00-17:00 UTC', 'active': ['US Stocks (IB)', 'US/EU Forex overlap', 'Crypto'], 'opportunity': 'Maximum liquidity window'},
{'time': '17:00-00:00 UTC', 'active': ['Crypto (Binance)', 'Asian prep', 'After-hours'], 'opportunity': 'Crypto focus + overnight gaps'}
]
print("\\n🌍 Global Trading Sessions:")
for session in trading_schedule:
print(f"\\n⏰ {session['time']}")
print(f" 🎯 Active: {', '.join(session['active'])}")
print(f" 💡 Opportunity: {session['opportunity']}")
print("\\n🔥 Never Miss a Move:")
print(" • Forex: 24/5 traditional markets")
print(" • Crypto: 24/7/365 never stops")
print(" • Stocks: Pre/post market + global exchanges")
print(" • Commodities: Global futures markets")
def demo_integration_benefits():
"""Show the benefits of integrated multi-broker system"""
print("\\n🚀 Integration Benefits")
print("=" * 60)
benefits = [
{
'category': 'Market Coverage',
'benefits': [
'Trade forex, crypto, stocks, and commodities',
'Access to global markets 24/7',
'Never limited by single broker restrictions'
]
},
{
'category': 'Risk Diversification',
'benefits': [
'Spread risk across multiple platforms',
'Reduce broker-specific risks',
'Currency and asset class diversification'
]
},
{
'category': 'Strategy Optimization',
'benefits': [
'Different strategies for different markets',
'Platform-specific advantages utilization',
'Cross-market arbitrage opportunities'
]
},
{
'category': 'Operational Excellence',
'benefits': [
'Single dashboard for all trading',
'Unified risk management',
'Consolidated reporting and analytics'
]
}
]
for benefit_group in benefits:
print(f"\\n📈 {benefit_group['category']}:")
for benefit in benefit_group['benefits']:
print(f"{benefit}")
def main():
"""Main demo function"""
print("🎉 Welcome to the Financial Universe!")
print("Your QuantumBotX system now connects to EVERYTHING!")
print()
# Demo all components
brokers_info = demo_all_brokers()
demo_unified_portfolio()
demo_risk_management()
demo_24_7_opportunities()
demo_integration_benefits()
print("\\n" + "=" * 60)
print("🎯 IMPLEMENTATION ROADMAP")
print("=" * 60)
roadmap = [
{
'phase': 'Week 1: Crypto Integration',
'tasks': ['Set up Binance testnet', 'Test crypto strategies', 'Validate risk management'],
'impact': 'Add 24/7 trading capability'
},
{
'phase': 'Week 2: cTrader Setup',
'tasks': ['Create cTrader demo account', 'Test modern forex features', 'Compare with MT5'],
'impact': 'Enhanced forex trading experience'
},
{
'phase': 'Week 3: Interactive Brokers',
'tasks': ['Set up TWS paper trading', 'Test stock strategies', 'Explore futures'],
'impact': 'Access to US stocks and global markets'
},
{
'phase': 'Week 4: TradingView Integration',
'tasks': ['Set up webhook alerts', 'Create Pine Script strategies', 'Social trading'],
'impact': 'Community-driven strategy development'
},
{
'phase': 'Month 2: Unified Platform',
'tasks': ['Portfolio manager', 'Cross-broker risk management', 'Performance analytics'],
'impact': 'Complete multi-broker trading ecosystem'
}
]
for i, phase in enumerate(roadmap, 1):
print(f"\\n{i}. {phase['phase']}")
print(f" 📋 Tasks: {', '.join(phase['tasks'][:2])}...")
print(f" 🎯 Impact: {phase['impact']}")
print("\\n" + "=" * 60)
print("🏆 THE BIG PICTURE")
print("=" * 60)
print("\\n🌟 What You're Building:")
print(" • Universal Trading Platform - One system, all markets")
print(" • Risk-Managed Portfolio - Diversified across asset classes")
print(" • 24/7 Profit Machine - Never miss opportunities")
print(" • Future-Proof Architecture - Ready for any new broker")
print("\\n💰 Potential Impact:")
current_profit = 4649.94
projected_increase = 2.5 # Conservative 2.5x increase
projected_profit = current_profit * projected_increase
print(f" Current Demo Profit: ${current_profit:,.2f}")
print(f" With Multi-Broker: ${projected_profit:,.2f} (estimated)")
print(f" Improvement Factor: {projected_increase}x")
print("\\n🎉 Congratulations!")
print("You've just designed a trading system that rivals")
print("what hedge funds and prop trading firms use!")
print("\\nFrom learning to trade → Building a financial empire! 🚀")
if __name__ == "__main__":
main()
-59
View File
@@ -1,59 +0,0 @@
# testing/test_ctrader_broker.py
import unittest
from unittest.mock import patch
from datetime import datetime
from core.brokers.ctrader_broker import CTraderBroker
class TestCTraderBroker(unittest.TestCase):
"""
Test cases for the cTrader broker implementation, focusing on market hours.
"""
def setUp(self):
"""Set up a CTraderBroker instance for testing."""
self.broker = CTraderBroker(demo=True)
@patch('core.brokers.ctrader_broker.datetime')
def test_is_market_open_weekday(self, mock_datetime):
"""Test that the market is open on a standard weekday."""
# Wednesday, 12:00 UTC
mock_datetime.utcnow.return_value = datetime(2023, 1, 4, 12, 0, 0)
self.assertTrue(self.broker.is_market_open())
@patch('core.brokers.ctrader_broker.datetime')
def test_is_market_closed_saturday(self, mock_datetime):
"""Test that the market is closed on Saturday."""
# Saturday, 12:00 UTC
mock_datetime.utcnow.return_value = datetime(2023, 1, 7, 12, 0, 0)
self.assertFalse(self.broker.is_market_open())
@patch('core.brokers.ctrader_broker.datetime')
def test_is_market_opens_sunday_evening(self, mock_datetime):
"""Test that the market opens on Sunday evening."""
# Sunday, 22:01 UTC (market is open)
mock_datetime.utcnow.return_value = datetime(2023, 1, 8, 22, 1, 0)
self.assertTrue(self.broker.is_market_open())
@patch('core.brokers.ctrader_broker.datetime')
def test_is_market_closed_sunday_morning(self, mock_datetime):
"""Test that the market is closed on Sunday morning."""
# Sunday, 10:00 UTC (market is closed)
mock_datetime.utcnow.return_value = datetime(2023, 1, 8, 10, 0, 0)
self.assertFalse(self.broker.is_market_open())
@patch('core.brokers.ctrader_broker.datetime')
def test_is_market_closes_friday_evening(self, mock_datetime):
"""Test that the market closes on Friday evening."""
# Friday, 22:01 UTC (market is closed)
mock_datetime.utcnow.return_value = datetime(2023, 1, 6, 22, 1, 0)
self.assertFalse(self.broker.is_market_open())
@patch('core.brokers.ctrader_broker.datetime')
def test_is_market_open_friday_morning(self, mock_datetime):
"""Test that the market is open on Friday morning."""
# Friday, 10:00 UTC (market is open)
mock_datetime.utcnow.return_value = datetime(2023, 1, 6, 10, 0, 0)
self.assertTrue(self.broker.is_market_open())
if __name__ == '__main__':
unittest.main()