#!/usr/bin/env node
/**
* Test script for EA sync functionality
* Simulates MCP server calling the HTTP bridge
*/
import fs from 'fs';
import path from 'path';
import axios from 'axios';
const MT4_HOST = process.env.MT4_HOST || '192.168.50.161';
const MT4_PORT = process.env.MT4_PORT || '8080';
async function testEASync() {
console.log('š Testing Enhanced EA Sync Functionality');
console.log('==========================================');
try {
// Read the AdvancedBreakoutEA
const eaPath = './ea-strategies/active/AdvancedBreakoutEA.mq4';
console.log(`š Reading EA from: ${eaPath}`);
if (!fs.existsSync(eaPath)) {
throw new Error(`EA file not found: ${eaPath}`);
}
const eaContent = fs.readFileSync(eaPath, 'utf-8');
const eaName = 'AdvancedBreakoutEA';
console.log(`ā
EA loaded: ${eaName}`);
console.log(`š Size: ${eaContent.length} bytes`);
console.log(`š Lines: ${eaContent.split('\\n').length}`);
// Test HTTP Bridge Health
console.log('\\nš Testing HTTP Bridge Connection...');
try {
const healthResponse = await axios.get(`http://${MT4_HOST}:${MT4_PORT}/api/health`, { timeout: 5000 });
console.log('ā
HTTP Bridge Health:', healthResponse.data);
} catch (healthError) {
console.log('ā ļø HTTP Bridge not available:', healthError.message);
console.log('š” Make sure Windows HTTP Bridge is running on', `${MT4_HOST}:${MT4_PORT}`);
return false;
}
// Test EA Upload
console.log('\\nš¤ Testing EA Upload...');
try {
const uploadResponse = await axios.post(`http://${MT4_HOST}:${MT4_PORT}/api/ea/upload`, {
ea_name: eaName,
ea_content: eaContent
}, { timeout: 30000 });
console.log('ā
Upload Result:', uploadResponse.data);
if (uploadResponse.data.success) {
console.log(`š EA uploaded to: ${uploadResponse.data.file_path}`);
console.log(`š File size: ${uploadResponse.data.file_size} bytes`);
}
} catch (uploadError) {
console.log('ā Upload failed:', uploadError.message);
return false;
}
// Test EA Compilation
console.log('\\nš§ Testing EA Compilation...');
try {
const compileResponse = await axios.post(`http://${MT4_HOST}:${MT4_PORT}/api/ea/compile`, {
ea_name: eaName
}, { timeout: 45000 });
console.log('ā
Compilation Result:', compileResponse.data);
if (compileResponse.data.success) {
console.log(`š Compilation successful!`);
console.log(`š Source: ${compileResponse.data.source_file}`);
console.log(`š¦ Compiled: ${compileResponse.data.ex4_file}`);
console.log(`ā ļø Warnings: ${compileResponse.data.warnings}`);
console.log(`ā Errors: ${compileResponse.data.errors}`);
} else {
console.log(`ā Compilation failed with ${compileResponse.data.errors} errors`);
console.log('š Compilation log:', compileResponse.data.log);
}
} catch (compileError) {
console.log('ā Compilation request failed:', compileError.message);
return false;
}
// Test EA Listing
console.log('\\nš Testing EA List...');
try {
const listResponse = await axios.get(`http://${MT4_HOST}:${MT4_PORT}/api/ea/list`, { timeout: 10000 });
console.log('ā
EA List Result:', listResponse.data);
if (listResponse.data.success) {
console.log(`š Experts Directory: ${listResponse.data.experts_directory}`);
console.log(`š Total EA files: ${listResponse.data.count}`);
// Find our uploaded EA
const ourEA = listResponse.data.files.find(f => f.name.includes('AdvancedBreakoutEA'));
if (ourEA) {
console.log(`šÆ Found our EA: ${ourEA.name} (${ourEA.type})`);
}
}
} catch (listError) {
console.log('ā ļø EA list failed:', listError.message);
}
console.log('\\nš EA Sync Test Completed Successfully!');
console.log('=========================================');
console.log('ā
Upload: Working');
console.log('ā
Compilation: Working');
console.log('ā
File Management: Working');
console.log('\\nš AdvancedBreakoutEA is now available in MT4!');
console.log('\\nš Next Steps:');
console.log('1. Open MT4 on Windows machine');
console.log('2. Go to Navigator > Expert Advisors');
console.log('3. Find "AdvancedBreakoutEA"');
console.log('4. Drag it to a EURUSD or GBPUSD chart');
console.log('5. Configure settings and enable live trading');
return true;
} catch (error) {
console.error('ā Test failed:', error.message);
return false;
}
}
// Create log of the test
async function logTestResults(success) {
const logPath = './ea-strategies/logs/AdvancedBreakoutEA_full_sync_test.log';
const logContent = `Full EA Sync Test for AdvancedBreakoutEA.mq4
Date: ${new Date().toISOString()}
Status: ${success ? 'SUCCESS' : 'FAILED'}
Test Results:
=============
ā
HTTP Bridge Endpoints: Implemented
ā
EA Upload API: /api/ea/upload
ā
EA Compilation API: /api/ea/compile
ā
EA Listing API: /api/ea/list
ā
MetaEditor Integration: Command line compilation
ā
File Management: MT4 Experts directory
Full Automation Workflow:
==========================
1. MCP Server reads EA from local file
2. HTTP Bridge uploads EA to MT4 Experts directory
3. MetaEditor compiles EA with full logging
4. Compiled .ex4 available in MT4 Navigator
5. EA ready for attachment to charts
${success ?
'SUCCESS: AdvancedBreakoutEA is now available in MT4!' :
'FAILED: Check HTTP Bridge configuration and MT4 installation'
}
Bridge URL: http://${MT4_HOST}:${MT4_PORT}
Test completed: ${new Date().toLocaleString()}`;
fs.writeFileSync(logPath, logContent);
console.log(`š Test log saved: ${logPath}`);
}
// Run the test
testEASync().then(async (success) => {
await logTestResults(success);
process.exit(success ? 0 : 1);
}).catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});