封装SL/TP价格计算函数
为了将 SL/TP 的计算逻辑与验证逻辑分离,并提高代码复用性,我们可以创建专门的函数来根据开仓价和用户指定的点数 (pips) 计算出目标的 SL 或 TP 价格。
函数设计要点:
- 输入: 函数接收交易品种 (
argSymbol
,用于调用PipPoint
)、SL 或 TP 的点数 (argStopLossPips
或argTakeProfitPips
) 以及计算的基准价格 (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 中找到。
通过将纯粹的价格计算逻辑封装起来,使得代码更加清晰,并且可以在计算之后、下单之前,插入独立的、更复杂的价格验证和调整逻辑。