|
|
发表于 2026-1-27 17:08:47
|
显示全部楼层
广东省广州市
易语言(上层控制端)→ 通信桥接(DLL/文本文件/注册表)→ MT4终端(MQ4脚本/EA,底层执行端)→ 外汇市场(行情/交易)
//+------------------------------------------------------------------+//| MT4ForE.lang |//| Copyright 2026, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright "Copyright 2026, MetaQuotes Software Corp."#property link "https://www.mql5.com"#property version "1.00"#property strict// 导出DLL函数:供易语言调用(必须用extern "C",避免函数名混淆)extern "C" { // 功能1:获取外汇货币对最新报价 // 参数:symbol=货币对(如"EURUSD"),bid=买价(输出),ask=卖价(输出) __declspec(dllexport) bool GetSymbolPrice(const char* symbol, double* bid, double* ask); // 功能2:下外汇市价多单(买涨) // 参数:symbol=货币对,lots=手数(0.01-10,外汇最小手数),stoploss=止损点,takeprofit=止盈点 __declspec(dllexport) ulong OpenBuyOrder(const char* symbol, double lots, double stoploss, double takeprofit); // 功能3:下外汇市价空单(买跌) // 参数:同多单 __declspec(dllexport) ulong OpenSellOrder(const char* symbol, double lots, double stoploss, double takeprofit);}// 实现:获取最新报价bool GetSymbolPrice(const char* symbol, double* bid, double* ask){ if(!bid || !ask) return false; *bid = SymbolInfoDouble(symbol, SYMBOL_BID); // 获取买价(用户卖出价) *ask = SymbolInfoDouble(symbol, SYMBOL_ASK); // 获取卖价(用户买入价) return true;}// 实现:下市价多单ulong OpenBuyOrder(const char* symbol, double lots, double stoploss, double takeprofit){ // 订单请求结构(MT4官方标准) MqlTradeRequest request={0}; MqlTradeResult result={0}; request.action = TRADE_ACTION_DEAL; // 执行交易:市价单 request.symbol = symbol; // 外汇货币对 request.volume = lots; // 手数 request.type = ORDER_TYPE_BUY; // 多单(买涨) request.price = Ask; // 市价单价格=卖价 request.sl = stoploss; // 止损(0=无止损) request.tp = takeprofit; // 止盈(0=无止盈) request.deviation = 3; // 滑点容忍:3个点(外汇通用) request.type_filling = ORDER_FILLING_FOK; // 成交方式:立即成交(外汇适配) // 发送订单请求到MT4 if(!OrderSend(request, result)) { Print("多单下单失败:", GetLastError()); // MT4终端日志打印错误 return 0; } return result.order; // 返回订单号(易语言接收,用于后续平仓/cha询)}// 实现:下市价空单ulong OpenSellOrder(const char* symbol, double lots, double stoploss, double takeprofit){ MqlTradeRequest request={0}; MqlTradeResult result={0}; request.action = TRADE_ACTION_DEAL; request.symbol = symbol; request.volume = lots; request.type = ORDER_TYPE_SELL; // 空单(买跌) request.price = Bid; // 市价单价格=买价 request.sl = stoploss; request.tp = takeprofit; request.deviation = 3; request.type_filling = ORDER_FILLING_FOK; if(!OrderSend(request, result)) { Print("空单下单失败:", GetLastError()); return 0; } return result.order;}//+------------------------------------------------------------------+
.版本 2.支持库 spec' ===================== 核心:声明MT4的DLL命令(严格对应MQ4函数,参数类型必须一致)=====================' 注意:DLL路径填写你的MT4实际路径,如:"D:\IC Markets MT4\MQL4\Libraries\MT4ForE.dll".DLL命令 GetSymbolPrice, 逻辑型, "MT4ForE.dll", "GetSymbolPrice", 公开, 获取外汇货币对最新报价.参数 symbol, 文本型, , 外汇货币对,如"EURUSD"、"GBPUSD".参数 bid, 双精度小数型, 传址, 买价(输出,用户卖出价).参数 ask, 双精度小数型, 传址, 卖价(输出,用户买入价).DLL命令 OpenBuyOrder, 整数型, "MT4ForE.dll", "OpenBuyOrder", 公开, 下外汇市价多单(买涨),返回订单号(0=失败).参数 symbol, 文本型, , 货币对.参数 lots, 双精度小数型, , 手数(外汇最小0.01).参数 stoploss, 双精度小数型, , 止损点(0=无止损).参数 takeprofit, 双精度小数型, , 止盈点(0=无止盈).DLL命令 OpenSellOrder, 整数型, "MT4ForE.dll", "OpenSellOrder", 公开, 下外汇市价空单(买跌),返回订单号(0=失败).参数 symbol, 文本型, , 货币对.参数 lots, 双精度小数型, , 手数.参数 stoploss, 双精度小数型, , 止损点.参数 takeprofit, 双精度小数型, , 止盈点' ===================== 按钮1:获取外汇最新报价(示例:EURUSD)=====================.子程序 _按钮1_被单击, , , 获取报价.局部变量 货币对, 文本型.局部变量 买价, 双精度小数型.局部变量 卖价, 双精度小数型.局部变量 是否成功, 逻辑型货币对 = “EURUSD” ' 可改为编辑框输入,如:编辑框1.内容是否成功 = GetSymbolPrice (货币对, 买价, 卖价).如果 (是否成功) 调试输出 (“获取报价成功:”, 货币对, “ 买价:”, 买价, “ 卖价:”, 卖价) 标签1.标题 = 货币对 + “ 买价:” + 到文本 (买价) + “ 卖价:” + 到文本 (卖价).否则 信息框 (“获取报价失败!请检查MT4是否开启DLL权限/货币对是否正确”, 0, ).如果结束' ===================== 按钮2:下EURUSD市价多单(买涨,示例:0.01手,无止损止盈)=====================.子程序 _按钮2_被单击, , , 下多单.局部变量 货币对, 文本型.局部变量 手数, 双精度小数型.局部变量 止损, 双精度小数型.局部变量 止盈, 双精度小数型.局部变量 订单号, 整数型货币对 = “EURUSD”手数 = 0.01 ' 外汇最小手数,可改为编辑框输入止损 = 0 ' 0=无止损,如需止损填写具体价格(如EURUSD买价1.08000,止损1.07800)止盈 = 0 ' 0=无止盈,如需止盈填写具体价格(如1.08500)订单号 = OpenBuyOrder (货币对, 手数, 止损, 止盈).如果 (订单号 > 0) 信息框 (“多单下单成功!订单号:” + 到文本 (订单号), 0, ) 调试输出 (“多单订单号:”, 订单号).否则 信息框 (“多单下单失败!请检查MT4账号/资金/网络”, 0, ).如果结束' ===================== 按钮3:下EURUSD市价空单(买跌,示例:0.01手,无止损止盈)=====================.子程序 _按钮3_被单击, , , 下空单.局部变量 货币对, 文本型.局部变量 手数, 双精度小数型.局部变量 止损, 双精度小数型.局部变量 止盈, 双精度小数型.局部变量 订单号, 整数型货币对 = “EURUSD”手数 = 0.01止损 = 0止盈 = 0订单号 = OpenSellOrder (货币对, 手数, 止损, 止盈).如果 (订单号 > 0) 信息框 (“空单下单成功!订单号:” + 到文本 (订单号), 0, ) 调试输出 (“空单订单号:”, 订单号).否则 信息框 (“空单下单失败!请检查MT4账号/资金/网络”, 0, ).如果结束
确保MT4 终端已登录(模拟 / 实盘账号均可,建议先模拟测试)
易语言中,将 DLL 命令的「库文件名」改为MT4ForE.dll 的实际绝对路径避免找不到 DLL
在 MQ4 的 DLL/EA 中添加平仓函数,易语言传递「订单号」或「货币对 + 方向」实现平仓:
// MQ4平仓函数(导出为DLL,易语言调用)extern "C" { __declspec(dllexport) bool CloseOrder(ulong orderId); // 根据订单号平仓}bool CloseOrder(ulong orderId){ MqlTradeRequest request={0}; MqlTradeResult result={0}; OrderSelect(orderId, SELECT_BY_ORDER, MODE_TRADES); request.action = TRADE_ACTION_DEAL; request.order = orderId; request.type = (OrderType()==ORDER_TYPE_BUY) ? ORDER_TYPE_SELL : ORDER_TYPE_BUY; request.price = (OrderType()==ORDER_TYPE_BUY) ? Bid : Ask; request.volume = OrderVolume(); request.deviation = 3; request.type_filling = ORDER_FILLING_FOK; if(!OrderSend(request, result)) {Print("平仓失败:", GetLastError()); return false;} return true;}
止损止盈修改
实现动态修改订单的止损止盈点,适配外汇行情的实时变化。
|
|