修复并优化MQL4代码:多空挂单仅触发一次,平仓后重启挂单
以下是修复后的MQL4代码,确保多单和空单的挂单只触发一次,并且在平仓后重新挂单。
extern int MagicNumber = 92133;
extern double InitialLots = 0.5;
extern double TakeProfitAmount = 80.0;
bool isBuyOrderTriggered = false;
bool isSellOrderTriggered = false;
double buyOrderOpenPrice = 0.0;
double sellOrderOpenPrice = 0.0;
void OnTick()
{
double currentPrice = MarketInfo(Symbol(), MODE_BID);
if (!IsOpenOrders())
{
if (!isBuyOrderTriggered)
{
// 挂单条件
double buyPrice = currentPrice + 200 * Point;
// 挂单
OrderSend(Symbol(), OP_BUYSTOP, InitialLots, buyPrice, 10, 0, 0, 'Buy Stop', MagicNumber, 0, Green);
isBuyOrderTriggered = true;
}
if (!isSellOrderTriggered)
{
// 挂单条件
double sellPrice = currentPrice - 200 * Point;
// 挂单
OrderSend(Symbol(), OP_SELLSTOP, InitialLots, sellPrice, 10, 0, 0, 'Sell Stop', MagicNumber, 0, Red);
isSellOrderTriggered = true;
}
}
// 获取持仓订单
int buyOrder = GetFirstBuyOrder();
int sellOrder = GetFirstSellOrder();
if (buyOrder != -1 && !isBuyOrderTriggered)
{
buyOrderOpenPrice = OrderOpenPrice(buyOrder);
// 多单信号
double buyOrderTakeProfit1 = buyOrderOpenPrice + 100 * Point;
double buyOrderTakeProfit2 = buyOrderOpenPrice + 200 * Point;
double buyOrderTakeProfit3 = buyOrderOpenPrice + 300 * Point;
double buyOrderTakeProfit4 = buyOrderOpenPrice + 400 * Point;
// 下单
OrderSend(Symbol(), OP_BUY, 0.3, currentPrice, 10, buyOrderTakeProfit1, 0, 'Buy Signal 1', MagicNumber, 0, Blue);
OrderSend(Symbol(), OP_BUY, 0.18, currentPrice, 10, buyOrderTakeProfit2, 0, 'Buy Signal 2', MagicNumber, 0, Blue);
OrderSend(Symbol(), OP_BUY, 0.1, currentPrice, 10, buyOrderTakeProfit3, 0, 'Buy Signal 3', MagicNumber, 0, Blue);
OrderSend(Symbol(), OP_BUY, 0.06, currentPrice, 10, buyOrderTakeProfit4, 0, 'Buy Signal 4', MagicNumber, 0, Blue);
}
if (sellOrder != -1 && !isSellOrderTriggered)
{
sellOrderOpenPrice = OrderOpenPrice(sellOrder);
// 空单信号
double sellOrderTakeProfit1 = sellOrderOpenPrice - 100 * Point;
double sellOrderTakeProfit2 = sellOrderOpenPrice - 200 * Point;
double sellOrderTakeProfit3 = sellOrderOpenPrice - 300 * Point;
double sellOrderTakeProfit4 = sellOrderOpenPrice - 400 * Point;
// 下单
OrderSend(Symbol(), OP_SELL, 0.3, currentPrice, 10, sellOrderTakeProfit1, 0, 'Sell Signal 1', MagicNumber, 0, Red);
OrderSend(Symbol(), OP_SELL, 0.18, currentPrice, 10, sellOrderTakeProfit2, 0, 'Sell Signal 2', MagicNumber, 0, Red);
OrderSend(Symbol(), OP_SELL, 0.1, currentPrice, 10, sellOrderTakeProfit3, 0, 'Sell Signal 3', MagicNumber, 0, Red);
OrderSend(Symbol(), OP_SELL, 0.06, currentPrice, 10, sellOrderTakeProfit4, 0, 'Sell Signal 4', MagicNumber, 0, Red);
}
double totalProfit = CalculateTotalProfit();
if (totalProfit >= TakeProfitAmount)
{
CloseAllOrders();
DeleteAllPendingOrders();
Sleep(60000); // 1分钟延迟
isBuyOrderTriggered = false;
isSellOrderTriggered = false;
}
}
bool IsOpenOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
return true;
}
}
}
return false;
}
int GetFirstBuyOrder()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
{
if (OrderType() == OP_BUY)
{
return i;
}
}
}
return -1;
}
int GetFirstSellOrder()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
{
if (OrderType() == OP_SELL)
{
return i;
}
}
}
return -1;
}
double OrderOpenPrice(int ticket)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{
return OrderOpenPrice();
}
return 0.0;
}
double CalculateTotalProfit()
{
double totalProfit = 0.0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
{
totalProfit += OrderProfit();
}
}
return totalProfit;
}
void CloseAllOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
{
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, Red);
}
}
}
void DeleteAllPendingOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
{
if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
{
OrderDelete(OrderTicket());
}
}
}
}
注意:
- 这只是一个示例代码,可能需要根据您的具体需求和平台要求进行调整。
- 在实际交易之前,请务必进行充分的测试和验证。
- 交易存在风险,请谨慎操作。
原文地址: https://www.cveoy.top/t/topic/cFKW 著作权归作者所有。请勿转载和采集!