MQL4代码修复:添加开仓操作解决无订单问题
MQL4代码修复:添加开仓操作解决无订单问题
问题描述:
在之前的MQL4代码中,发现运行后没有订单生成。
问题分析:
经过检查,发现代码中缺少了开仓操作的部分,导致无法生成订单。
解决方案:
在OnTick函数中添加开仓操作,当满足特定条件时,调用开仓函数OpenBuyOrder或OpenSellOrder来生成订单。
**代码示例:**csharp//+------------------------------------------------------------------+//| 7777.mq4 |//| Copyright 2023, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2023, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'#property strict//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit(){ //---
//--- return(INIT_SUCCEEDED);}//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason){ //---
}//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+
//+------------------------------------------------------------------+// 定义常量#define MAGIC_NUMBER 92133#define INITIAL_LOTS 0.5#define REPLENISH_MULTIPLIER 0.6#define REPLENISH_ATTEMPTS 5#define PROFIT_TARGET 40#define MIN_FLUCTUATION MarketInfo(Symbol(), MODE_POINT) * 100
// 定义变量double currentLots = 0;double totalProfit = 0;
// 定义函数:开仓多单bool OpenBuyOrder(double lots){ int ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 0, 0, 'Buy Order', MAGIC_NUMBER); if (ticket > 0) { if (OrderSelect(ticket, SELECT_BY_TICKET)) { currentLots = OrderLots(); return true; } else { Print('Failed to select order with ticket ', ticket); } } else { Print('Failed to send buy order'); } return false;}
// 定义函数:开仓空单bool OpenSellOrder(double lots){ int ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 0, 0, 'Sell Order', MAGIC_NUMBER); if (ticket > 0) { if (OrderSelect(ticket, SELECT_BY_TICKET)) { currentLots = OrderLots(); return true; } else { Print('Failed to select order with ticket ', ticket); } } else { Print('Failed to send sell order'); } return false;}
// 定义函数:补仓多单bool ReplenishBuyOrder(double lots){ int totalOrders = 0; double averagePrice = 0; double totalLots = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MAGIC_NUMBER && OrderType() == OP_BUY) { totalOrders++; averagePrice += OrderOpenPrice() * OrderLots(); totalLots += OrderLots(); } }
if (totalLots > 0) { averagePrice /= totalLots; }
if (totalOrders > 0 && MarketInfo(Symbol(), MODE_ASK) - averagePrice > MIN_FLUCTUATION * 100) { currentLots = OrderLots() * REPLENISH_MULTIPLIER; int ticket = OrderSend(Symbol(), OP_BUY, currentLots, Ask, 0, 0, 'Buy Order', MAGIC_NUMBER);
if (ticket > 0) { if (OrderSelect(ticket, SELECT_BY_TICKET)) { currentLots = OrderLots(); return true; } else { Print('Failed to select order with ticket ', ticket); } } else { Print('Failed to send buy order'); } }
return false;}
// 定义函数:锁仓空单bool LockSellOrder(){ int ticket = OrderSend(Symbol(), OP_SELL, INITIAL_LOTS, Bid, 0, 0, 'Sell Order', MAGIC_NUMBER); if (ticket > 0) { if (OrderSelect(ticket, SELECT_BY_TICKET)) { currentLots = OrderLots(); return true; } else { Print('Failed to select order with ticket ', ticket); } } else { Print('Failed to send sell order'); } return false;}
// 定义函数:补仓空单bool ReplenishSellOrder(double lots){ int totalOrders = 0; double averagePrice = 0; double totalLots = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MAGIC_NUMBER && OrderType() == OP_SELL) { totalOrders++; averagePrice += OrderOpenPrice() * OrderLots(); totalLots += OrderLots(); } }
if (totalLots > 0) { averagePrice /= totalLots; }
if (totalOrders > 0 && averagePrice - MarketInfo(Symbol(), MODE_BID) > MIN_FLUCTUATION * 100) { currentLots = OrderLots() * REPLENISH_MULTIPLIER; int ticket = OrderSend(Symbol(), OP_SELL, currentLots, Bid, 0, 0, 'Sell Order', MAGIC_NUMBER);
if (ticket > 0) { if (OrderSelect(ticket, SELECT_BY_TICKET)) { currentLots = OrderLots(); return true; } else { Print('Failed to select order with ticket ', ticket); } } else { Print('Failed to send sell order'); } }
return false;}
// 定义函数:平仓逻辑void CloseOrders(){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MAGIC_NUMBER) { if (OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0)) { Print('Closed order with ticket ', OrderTicket()); } else { Print('Failed to close order with ticket ', OrderTicket()); } } }}
void OnTick(){ // 检查当前魔术码下的多单持仓是否为0 bool hasLongPosition = false; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MAGIC_NUMBER && OrderType() == OP_BUY) { hasLongPosition = true; break; } }
// MACD金叉的时候做多 if (!hasLongPosition) { OpenBuyOrder(INITIAL_LOTS); }
CloseOrders(); return;}
代码解释:
- 在
OnTick函数中,首先检查当前是否存在多单持仓。2. 如果不存在多单持仓,则调用OpenBuyOrder函数开仓做多。3. 最后调用CloseOrders函数进行平仓操作。
注意:
- 以上代码示例仅供参考,实际应用中需要根据具体情况进行修改。- 在测试和使用代码之前,请确保您已经了解MQL4编程语言和EA交易的相关知识。- 交易外汇和差价合约具有高风险,可能会导致您的投资损失。
原文地址: https://www.cveoy.top/t/topic/bS2O 著作权归作者所有。请勿转载和采集!