我做的一个程序,请大神帮我看下:
设当前K线(开盘价+收盘价)/2的值为K1,前一根K线(开盘价+收盘价)/2的值为K2,再前一根K线(开盘价+收盘价)/2的值为K3。
如果(K2-K3)大于0,且K2为阳线:如果当前无持仓,则做多一手;如果持有空单,先平仓再做多一手;如果持有多单,则不操作。
如果(K2-K3)小于0,且K2为阴线:如果当前无持仓,则做空一手;如果持有多单,先平仓再做空一手;如果持有空单,则不操作。
Vars
Numeric K2;
Numeric K3;
Numeric diff;
Numeric signalExecuted; // 用Numeric代替Boolean
Events
OnBar(ArrayRef<Integer> indexs)
{
// 重置信号执行状态(每根K线开始时重置)
signalExecuted = 0;
// 确保至少有3根K线
If (CurrentBar < 2) Return;
// 计算K2(前一根K线中点)和K3(前两根K线中点)
K2 = (Open[1] + Close[1]) / 2;
K3 = (Open[2] + Close[2]) / 2;
diff = K2 - K3;
// 多头信号:K2-K3 > 0 且 K2为阳线
If (diff > 0 && Close[1] > Open[1])
{
// 如果已执行过信号,跳过(避免重复触发)
If (signalExecuted == 1) Return;
// 1. 先平空(如果持有空单)
If (MarketPosition == -1)
{
SellShort(0, Close); // 平空
signalExecuted = 1; // 标记已执行
}
// 2. 再开多(如果未持有多单)
If (MarketPosition != 1)
{
Buy(1, Close); // 开多
signalExecuted = 1; // 标记已执行
}
}
// 空头信号:K2-K3 < 0 且 K2为阴线
Else If (diff < 0 && Close[1] < Open[1])
{
// 如果已执行过信号,跳过
If (signalExecuted == 1) Return;
// 1. 先平多(如果持有多单)
If (MarketPosition == 1)
{
Sell(0, Close); // 平多
signalExecuted = 1; // 标记已执行
}
// 2. 再开空(如果未持空单)
If (MarketPosition != -1)
{
SellShort(1, Close); // 开空
signalExecuted = 1; // 标记已执行
}
}
}
问题是:有的地方出现了四笔交易,根据设计,应该每个信号两笔交易。请大神帮我看下问题出在哪儿,谢谢!!

如果反手会出两个信号的,一个信号是平,另一个信号是开
你这个模型问题很大。图表机制,开仓bar不可以平仓的