老师好,
新人小白一枚,最近在模拟交易时遇到个问题:有交易信号,但是无发单委托。
比如:有开仓信号,但无发单委托;有平仓信号,无发单委托。
附上部分代码及图片,还请帮忙看看是哪里有潜在的问题,感谢!
//------ 持仓处理 ------
If(MarketPosition == 1)
{
CurrentPrice = Close[1]; // 使用前一Bar收盘价(确定值)
FloatProfitRatio = (CurrentPrice - FirstEntryPrice) / FirstEntryPrice; // 计算相对盈亏
// 全局风控检查
If(!EquityRiskTriggered)
{
// 直接使用计算盈亏比例(不再依赖 PositionProfit)
If(FloatProfitRatio <= -FloatLossThreshold) // 注意:亏损时为负值
{
Sell(0, Open, SlipPoint);
Commentary("多头浮动止损触发 | 亏损比例:" + Text(FloatProfitRatio*100) + "%");
EquityRiskTriggered = True;
LastExitBar = CurrentBar;
}
}
// 动态止损止盈
DynamicStopRatio = FixScale * (1 + (ATRValue[1]/Close[1])*StopSensitivity);
FixedStopLong = FirstEntryPrice * (1 - DynamicStopRatio);
ProfitTargetLong = FirstEntryPrice + ATRValue[1] * ProfitMultiplier;
// 止损执行(使用前一日低点防闪烁)
If(Low <= FixedStopLong && Low[1] > FixedStopLong)
{
Sell(0, FixedStopLong, SlipPoint);
LastExitBar = CurrentBar;
Commentary("多头止损触发于:"+Text(FixedStopLong));
}
// 止盈执行
Else If(High >= ProfitTargetLong && Close[1] < ProfitTargetLong)
{
Sell(0, ProfitTargetLong, SlipPoint);
LastExitBar = CurrentBar;
Commentary("多头止盈触发于:"+Text(ProfitTargetLong));
}
}
//------ 开仓逻辑 ------
If(MarketPosition == 0)
{
If(LongSignal)
{
// 开多仓
Buy(PositionSize, Open, SlipPoint);
FirstEntryPrice = Open;
If(!FirstEntryLong)
{
InitialEquity = Portfolio_CurrentEquity();
FirstEntryLong = True;
}
AddCount = 1;
LastEntryBar = CurrentBar;
EquityRiskTriggered = False;
Commentary("多头开仓于:"+Text(Open));
}
Else If(ShortSignal)
{
// 开空仓
SellShort(PositionSize, Open, SlipPoint);
FirstEntryPrice = Open;
If(!FirstEntryShort)
{
InitialEquity = Portfolio_CurrentEquity();
FirstEntryShort = True;
}
AddCount = 1;
LastEntryBar = CurrentBar;
EquityRiskTriggered = False;
Commentary("空头开仓于:"+Text(Open));
}
}
//------ 盈利保护模块 ------
If(MarketPosition != 0 && InitialEquity > 0)
{
// 核心修改:用固定入场价差替代浮动盈亏计算
CurrentPrice = Close[1]; // 关键!使用前一Bar收盘价
// 多空统一计算公式(自动识别方向)
If(MarketPosition == 1)
{
FloatProfitValue = (CurrentPrice - FirstEntryPrice) * PositionSize * ContractUnit() * BigPointValue();
FloatProfitRatio = (CurrentPrice - FirstEntryPrice) / FirstEntryPrice;
}
Else If(MarketPosition == -1)
{
FloatProfitValue = (FirstEntryPrice - CurrentPrice) * PositionSize * ContractUnit() * BigPointValue();
FloatProfitRatio = (FirstEntryPrice - CurrentPrice) / FirstEntryPrice;
}
// 盈利达标平仓
If(FloatProfitRatio >= InitialEquity * 0.15)
{
If(MarketPosition == 1)
{
Sell(0, Open, SlipPoint);
Commentary("盈利保护触发(多头)| 收益率:" + Text(FloatProfitRatio*100) + "%");
}
Else If(MarketPosition == -1)
{
BuyToCover(0, Open, SlipPoint);
Commentary("盈利保护触发(空头)| 收益率:" + Text(FloatProfitRatio*100) + "%");
}
}
}
辅k线警告!
老生常谈的问题了。
首先明确第一天,打开k线这个功能不是展示该单元的运行轨迹,仅仅是以该策略单元的配置新建一个图表运行一下。
这里可能会有疑惑为什么要强调这个?
因为策略单元里的k线都是盘中实时bar挨个tick执行过来的。而打开k线时,本来应该挨个tick执行的bar全都变成历史bar,只会按照收盘状态执行一次。
这就造成了策略单元和辅助k线可能运行轨迹不一致的问题。
但是这个运行轨迹不一致的问题,根本上来说,是模型编写的问题,一般因为模型含有信号闪烁的隐患,所以导致k线图的信号失去了参考意义。
如果想查看策略单元的实际信号执行记录,必须如下操作。
首先,必须保证,该单元没有停止运行并重启过。如果重启过,那就没意义了,就跟打开k线没区别了。
其次,打开测试报告,查看交易记录,这里才是单元内真实执行出来的信号。
这个问题说到底,还是因为模型有信号闪烁,所以才导致信号对不上。
需要理解这个问题,首先要清楚onbar事件域对于历史bar和实时bar的运行区别,其次要理解打开k线的原理(上面说了),最后还要了解一下信号闪烁的概念。
建议通过视频区零基础课程系统性地学习一下。
好的,感谢老师。零基础的课程也只是过了一遍,理解不深。他这个闪烁问题困扰了我很久,有什么办法能够比较好的快速找出影响闪烁的问题啊。
这个好像直播课教过,直接用quant3的setbaseperiod回测就好了