保持敬畏之心
交易是一场持久战

​MQL4(26):封装 SL/TP 计算函数

封装SL/TP价格计算函数

为了将 SL/TP 的计算逻辑与验证逻辑分离,并提高代码复用性,我们可以创建专门的函数来根据开仓价和用户指定的点数 (pips) 计算出目标的 SL 或 TP 价格。

函数设计要点:

  • 输入: 函数接收交易品种 (argSymbol,用于调用 PipPoint)、SL 或 TP 的点数 (argStopLossPipsargTakeProfitPips) 以及计算的基准价格 (argOpenPrice)。
  • 输出: 函数返回计算出的 SL 或 TP 的价格 (double 类型)。如果输入的点数为 0 或无效,则返回 0。
  • 职责: 这些函数只负责计算价格,不包含任何对 MODE_STOPLEVEL(最小停止级别)的验证。价格验证应在调用完计算函数之后,由另一组专门的验证函数或逻辑来完成。

计算买单止损价格 (CalcBuyStopLoss)

/**
 * @brief 根据开仓价和止损点数计算买单的止损价格。
 * @param argSymbol         交易品种 (用于 PipPoint 计算)
 * @param argStopLossPips   止损距离 (单位: pips)
 * @param argOpenPrice      计算基准的开仓价格 (市价单用 Ask, 挂单用挂单价)
 * @return double           计算出的止损价格;如果 argStopLossPips <= 0,返回 0.0
 */
double CalcBuyStopLoss(string argSymbol, int argStopLossPips, double argOpenPrice)
{
    // 如果用户未设置止损点数 (<=0),则直接返回 0
    if (argStopLossPips <= 0) return(0.0);

    // 计算 1 pip 的价格值 (需要 PipPoint 函数,假设已定义)
    double onePipValue = PipPoint(argSymbol);
    if (onePipValue <= 0) return(0.0); // PipPoint 计算失败则返回 0

    // 计算止损价格 = 开仓价 - (止损点数 * 每 pip 的价值)
    double stopLossPrice = argOpenPrice - (argStopLossPips * onePipValue);

    // 注意:本函数不进行价格规范化和 StopLevel 验证
    return(stopLossPrice);
}
  • 解释: 函数首先检查传入的止损点数 argStopLossPips 是否有效(>0)。如果无效,返回 0 表示不设止损。否则,它调用 PipPoint() 获取 1 pip 的价值,然后从开仓价 argOpenPrice 中减去 argStopLossPips 个 pips 对应的价格距离,得到初步的止损价格并返回。

计算买单止盈价格 (CalcBuyTakeProfit)

/**
 * @brief 根据开仓价和止盈点数计算买单的止盈价格。
 * @param argSymbol         交易品种 (用于 PipPoint 计算)
 * @param argTakeProfitPips 止盈距离 (单位: pips)
 * @param argOpenPrice      计算基准的开仓价格 (市价单用 Ask, 挂单用挂单价)
 * @return double           计算出的止盈价格;如果 argTakeProfitPips <= 0,返回 0.0
 */
double CalcBuyTakeProfit(string argSymbol, int argTakeProfitPips, double argOpenPrice)
{
    // 如果用户未设置止盈点数 (<=0),则直接返回 0
    if (argTakeProfitPips <= 0) return(0.0);

    // 计算 1 pip 的价格值 (需要 PipPoint 函数)
    double onePipValue = PipPoint(argSymbol);
    if (onePipValue <= 0) return(0.0); // PipPoint 计算失败

    // 计算止盈价格 = 开仓价 + (止盈点数 * 每 pip 的价值)
    double takeProfitPrice = argOpenPrice + (argTakeProfitPips * onePipValue);

    // 注意:本函数不进行价格规范化和 StopLevel 验证
    return(takeProfitPrice);
}

  • 解释: 逻辑与 CalcBuyStopLoss 非常相似,只是将减法改为了加法来计算止盈价格。

卖单的 SL/TP 计算函数: 计算卖单止损 (CalcSellStopLoss) 和卖单止盈 (CalcSellTakeProfit) 的函数与上述类似,只是加减方向相反:

  • CalcSellStopLoss 类似于 CalcBuyTakeProfit(开仓价 加 pips 距离)。
  • CalcSellTakeProfit 类似于 CalcBuyStopLoss(开仓价 减 pips 距离)。 这些函数的具体代码可以在原文的附录 D 中找到。

通过将纯粹的价格计算逻辑封装起来,使得代码更加清晰,并且可以在计算之后、下单之前,插入独立的、更复杂的价格验证和调整逻辑。

赞(0)
未经允许不得转载:图道交易 » ​MQL4(26):封装 SL/TP 计算函数
分享到