代码如下,代码回测后,发现止盈止损没起作用,修改止盈止损的数值后,回测报告的结果没有任何变化,麻烦看看问题出在哪里:
Params
Numeric OpenThreshold(0.003); // 开盘价突破阈值(0.3%)
Numeric StopLossPct(0.01); // 止损比例(1%)
Numeric TakeProfitPct(0.04); // 止盈比例(4%)
Numeric CloseBeforeMinutes(5); // 收盘前清仓时间(分钟)
Vars
Numeric PreClose; // 上一交易日收盘价
Numeric BuyPrice; // 买入开仓价格
Numeric SellPrice; // 卖出开仓价格
Bool IsOpenConditionMet; // 开仓条件是否满足
Numeric SessionEndTime; // 交易时段结束时间
Events
OnBar(ArrayRef<Integer> indexs)
{
// 初始化上一交易日收盘价
if (BarStatus == 0) // 每根K线的第一次计算
{
PreClose = Close[1]; // 上一交易日收盘价
}
// 开仓条件
if (MarketPosition == 0) // 无持仓
{
if (Open < PreClose * (1 - OpenThreshold)) // 开盘价低于上一交易日收盘价0.3%以上,卖空
{
SellShort(1, Open); // 卖空开仓
SellPrice = Open; // 记录卖空价格
IsOpenConditionMet = True; // 开仓条件已满足
}
else if (Open > PreClose * (1 + OpenThreshold)) // 开盘价高于上一交易日收盘价0.3%以上,买入
{
Buy(1, Open); // 买入开仓
BuyPrice = Open; // 记录买入价格
IsOpenConditionMet = True; // 开仓条件已满足
}
}
// 止盈止损
if (MarketPosition == 1) // 持有多头
{
if (Close <= BuyPrice * (1 - StopLossPct)) // 亏损0.5%,止损
{
Sell(1, Close); // 平仓
}
else if (Close >= BuyPrice * (1 + TakeProfitPct)) // 盈利2%,止盈
{
Sell(1, Close); // 平仓
}
}
else if (MarketPosition == -1) // 持有空头
{
if (Close >= SellPrice * (1 + StopLossPct)) // 亏损0.5%,止损
{
BuyToCover(1, Close); // 平仓
}
else if (Close <= SellPrice * (1 - TakeProfitPct)) // 盈利2%,止盈
{
BuyToCover(1, Close); // 平仓
}
}
// 临近收盘前5分钟清仓
if (Time >= (SessionEndTime - CloseBeforeMinutes * 60)) // 收盘前5分钟
{
if (MarketPosition == 1) // 持有多头
{
Sell(1, Close); // 平仓
}
else if (MarketPosition == -1) // 持有空头
{
BuyToCover(1, Close); // 平仓
}
}
}
改变止盈止损代码后测试报告没有任何变化,那就说明止盈止损的条件分支没有执行过,也就是说,止盈止损的代码条件没有满足。
基于此,你应该写调试代码,把止盈止损的条件状态输出看一下,为什么不满足,是哪个数值不对,以此来分析代码哪里出问题