//------------------------------------------------------------------------
// 简称: 1Min_Correct
// 名称: 反转策略(1分钟)-正确版
//------------------------------------------------------------------------
Params
Numeric Lots(1);
Numeric PriceOffset(1);
Bool EnableLimitOrder(True);
Vars
Numeric prevClose;
Numeric prevOpen;
Bool prevIsYin(False);
Bool prevIsYang(False);
Numeric targetPrice;
Bool needReverse(False);
Bool orderExecuted(False); // 控制单根K线只执行一次
Events
OnBar(ArrayRef<Integer> indexs)
{
orderExecuted = False; // 每根K线重置
If(CurrentBar > 1 And orderExecuted == False)
{
prevClose = Close[1];
prevOpen = Open[1];
prevIsYin = (prevClose < prevOpen);
prevIsYang = (prevClose > prevOpen);
Commentary("K线" + Text(CurrentBar) + ": 前一根" +
IIfString(prevIsYin, "阴柱", IIfString(prevIsYang, "阳柱", "平线")));
needReverse = False;
If(MarketPosition == -1 And prevIsYin) needReverse = True;
If(MarketPosition == 1 And prevIsYang) needReverse = True;
// --- 统一的执行逻辑(确保单根K线只执行一次)---
// 情况1:需要反向操作(先平后开)
If(needReverse And orderExecuted == False)
{
// 平仓操作
If(MarketPosition == -1) // 平空仓
{
If(EnableLimitOrder)
{
targetPrice = Open - PriceOffset * MinMove * PriceScale;
If(targetPrice >= Low)
{
BuyToCover(0, targetPrice);
orderExecuted = True;
Commentary("→ 限价平空仓:" + Text(targetPrice));
}
}
If(orderExecuted == False) // 限价单未成交,市价确保
{
BuyToCover(0, Close);
orderExecuted = True;
Commentary("→ 市价平空仓");
}
}
Else If(MarketPosition == 1) // 平多仓
{
If(EnableLimitOrder)
{
targetPrice = Open + PriceOffset * MinMove * PriceScale;
If(targetPrice <= High)
{
Sell(0, targetPrice);
orderExecuted = True;
Commentary("→ 限价平多仓:" + Text(targetPrice));
}
}
If(orderExecuted == False)
{
Sell(0, Close);
orderExecuted = True;
Commentary("→ 市价平多仓");
}
}
// 平仓后立即开反向仓
If(orderExecuted And prevIsYin) // 开多仓
{
If(EnableLimitOrder)
{
targetPrice = Open - PriceOffset * MinMove * PriceScale;
If(targetPrice >= Low)
{
Buy(Lots, targetPrice);
Commentary("→ 限价开多仓:" + Text(targetPrice));
}
Else
{
Buy(Lots, Close);
Commentary("→ 市价开多仓");
}
}
Else
{
Buy(Lots, Close);
Commentary("→ 市价开多仓");
}
}
Else If(orderExecuted And prevIsYang) // 开空仓
{
If(EnableLimitOrder)
{
targetPrice = Open + PriceOffset * MinMove * PriceScale;
If(targetPrice <= High)
{
SellShort(Lots, targetPrice);
Commentary("→ 限价开空仓:" + Text(targetPrice));
}
Else
{
SellShort(Lots, Close);
Commentary("→ 市价开空仓");
}
}
Else
{
SellShort(Lots, Close);
Commentary("→ 市价开空仓");
}
}
}
// 情况2:开新仓(无持仓时需要开仓)
Else If(MarketPosition == 0 And orderExecuted == False)
{
If(prevIsYin) // 开多仓
{
If(EnableLimitOrder)
{
targetPrice = Open - PriceOffset * MinMove * PriceScale;
If(targetPrice >= Low)
{
Buy(Lots, targetPrice);
orderExecuted = True;
Commentary("→ 限价开多仓:" + Text(targetPrice));
}
}
If(orderExecuted == False)
{
Buy(Lots, Close);
orderExecuted = True;
Commentary("→ 市价开多仓");
}
}
Else If(prevIsYang) // 开空仓
{
If(EnableLimitOrder)
{
targetPrice = Open + PriceOffset * MinMove * PriceScale;
If(targetPrice <= High)
{
SellShort(Lots, targetPrice);
orderExecuted = True;
Commentary("→ 限价开空仓:" + Text(targetPrice));
}
}
If(orderExecuted == False)
{
SellShort(Lots, Close);
orderExecuted = True;
Commentary("→ 市价开空仓");
}
}
}
// 情况3:继续持仓
Else If(orderExecuted == False)
{
Commentary("→ 继续持仓");
}
}
}
上面是图表策略,1分钟反转策略。
简单的讲就是上个K线是阳线,那么下根K线一开盘固定以开盘价+一跳开空单,挂限价单(类似于开盘第一时间排队价)等待成交,如果当根K线不成交,比如设置为挂单后的58秒或者当根K线的58秒,撤单挂市价单追单。
第一步完成,无论如何,我都会有1手空单在手上,那么当根K线如果是阴线,触发在下一根K线开盘平仓,且开新多单,图表策略是先平后开仓,但是实盘中,平仓和开仓在这个策略里都是同向,为了保证挂单能更容易成交,那么这里选择平仓和开仓同时挂单,平空开多,价格都是新的K线的开盘价减一跳挂单。为什么选择新的K线开盘价平仓开仓,因为这样上一根K线已经结束,不会出现信号闪烁,新的K线第一个BAR已经确定开盘价,我希望的限价单也不会出现误差和问题。如果当根K线是阳线,继续持仓(第一根K线的空单),不操作,如果是十字星,不操作。
当前持仓 | 前一根K线 | 策略动作 |
---|---|---|
空仓(-1) | 阴线(↓) | 平空 + 开多(反转) |
多仓(+1) | 阳线(↑) | 平多 + 开空(反转) |
空仓(0) | 阴线(↓) | 开多 |
空仓(0) | 阳线(↑) | 开空 |
多仓(+1) | 阴线(↓) | 继续持多(不操作) |
空仓(-1) | 阳线(↑) | 继续持空(不操作) |
任意 | 十字星 | 不操作 |
这张图十字的地方比较有代表性,前4根K线那根十字星(持仓遇到十字星不操作,但是开仓不影响),已经平空开多了,下一根K线十字星,不操作,再下一根K线是阴线,因为我是持有多单,继续持仓,直到我的标记的K线的左边那根K线,阳线,符合要求,那么就触发平多开空,所以在标记的那根K线,以开盘价+一跳,挂平多1手,挂开空1手,当根K线3085,开和平都是3086符合要求。
这张图标记的前8根K线,平多开空了,然后一路都是阳线或者十字星,持续持仓到标记前的一根阴线,当这根阴线结束,没有任何信号干扰,确定需要平空开多,开盘价是3090,那么我需要挂3089的限价单,平空1手,开多1手,但是当根K线没有跌破开盘价,所以在当根K线结束的收盘价3092成交,也就是我希望实盘在当根K线结束前市价追单以确保成交,保证逻辑不混乱
个人难点,我个人对A函数的理解不透彻,出现2个问题无法达到预期效果。
第一就是跟图表一样,虽然信号显示是挂的限价单(排队价),但是模拟实盘中就是新K线的第一个BAR就市价挂单撮合成交了,成交价基本就是开盘价或者开盘价的对价。
第二就是检查信号错乱,挂单没有检查到我有持仓,一直挂单最后持仓变成几百手。
当然我自己的问题比较初级,希望哪位大神能帮我把图表策略完全实盘化就行,支付宝报号码直接转账,谢谢。
注意到你发了2贴,意义不明