|
[size=16.002px]以下是根据需求编写的MQL4代码,实现在总利润回撤统一调整止盈点:
//+------------------------------------------------------------------+
//| HedgeEA.mq4 |
//| Copyright 2023, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
// 全局变量
double maxTotalProfit = 0; // 记录历史最大总利润
bool adjusted = false; // 止盈调整标志
int magicNumber = 12345; // 订单魔术编号
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double totalProfit = 0;
int orderCount = 0;
// 计算总利润和订单数量
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() &&
OrderMagicNumber() == magicNumber &&
OrderType() == OP_BUY)
{
totalProfit += OrderProfit();
orderCount++;
}
}
}
// 确保有三个多单
if(orderCount == 3)
{
// 更新最大利润
if(totalProfit > maxTotalProfit)
{
maxTotalProfit = totalProfit;
adjusted = false; // 发现新高时重置标志
}
// 检查回撤条件
if(!adjusted &&
maxTotalProfit > 0 &&
totalProfit <= maxTotalProfit * 0.3)
{
// 遍历所有订单调整止盈
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() &&
OrderMagicNumber() == magicNumber &&
OrderType() == OP_BUY)
{
double newTP = CalculateValidTP(Bid);
// 仅当需要修改时调整
if(MathAbs(OrderTakeProfit() - newTP) > Point/2)
{
bool result = OrderModify(
OrderTicket(),
OrderOpenPrice(),
OrderStopLoss(),
newTP,
0,
clrNONE
);
if(result)
{
Print("订单 ", OrderTicket(), " 止盈调整成功至 ", newTP);
}
else
{
Print("错误 ", GetLastError(), ": 订单 ", OrderTicket(), " 止盈调整失败");
}
}
}
}
}
adjusted = true; // 标记已调整
}
}
}
//+------------------------------------------------------------------+
//| 计算符合平台要求的有效止盈价 |
//+------------------------------------------------------------------+
double CalculateValidTP(double desiredPrice)
{
double minStoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL) * Point;
double adjustedPrice = NormalizeDouble(desiredPrice, Digits);
// 计算与当前价格的差距
double diff = MathAbs(adjustedPrice - Bid);
// 如果小于最小停损水平
if(diff < minStoplevel)
{
// 根据方向调整
if(adjustedPrice > Bid)
adjustedPrice = Bid + minStoplevel;
else
adjustedPrice = Bid - minStoplevel;
adjustedPrice = NormalizeDouble(adjustedPrice, Digits);
}
return adjustedPrice;
}
-------------------------------------------------------------------------------
代码说明:使用注意事项:
|
|