MQL4代码修复:添加开仓操作解决无订单问题

问题描述:

在之前的MQL4代码中,发现运行后没有订单生成。

问题分析:

经过检查,发现代码中缺少了开仓操作的部分,导致无法生成订单。

解决方案:

OnTick函数中添加开仓操作,当满足特定条件时,调用开仓函数OpenBuyOrderOpenSellOrder来生成订单。

**代码示例:**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;}

代码解释:

  1. OnTick函数中,首先检查当前是否存在多单持仓。2. 如果不存在多单持仓,则调用OpenBuyOrder函数开仓做多。3. 最后调用CloseOrders函数进行平仓操作。

注意:

  • 以上代码示例仅供参考,实际应用中需要根据具体情况进行修改。- 在测试和使用代码之前,请确保您已经了解MQL4编程语言和EA交易的相关知识。- 交易外汇和差价合约具有高风险,可能会导致您的投资损失。
MQL4代码修复:添加开仓操作解决无订单问题

原文地址: https://www.cveoy.top/t/topic/bS2O 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录