MQL4 专家顾问:7777.mq4 代码完整修复
//+------------------------------------------------------------------+
//| 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金叉的时候做多
CloseOrders();
return;
}
请注意,在OnTick函数中,我将CloseOrders函数添加到了逻辑的末尾以关闭所有订单。这样应该能够修复问题并使代码正常运行。
原文地址: http://www.cveoy.top/t/topic/bSVI 著作权归作者所有。请勿转载和采集!