有没有大神帮我看看,为什么这个总是信号闪烁,信号持仓和账户持仓不同步

Params

   Numeric closeHour(15);

   Numeric closeMinute(0);

// 变量定义区

Vars

   Numeric newprice;        // 最新价格

   Numeric opentime;        // 开仓时间(时间戳)

   Numeric closeTotalSec;  //收盘时间

   Numeric openTotalSec;   //开盘时间

   Numeric TradeDate;      //交易日期

   

   Global Numeric RiskPoint(0.005);      //风险点

   Global Bool opened(False);  // 标记是否已开仓

   Series<Numeric> prentryPrice;  // 记录开仓价格

   Series<Numeric> openPrice;     // 9:00开盘价

   Series<Numeric> tradePrice;     // 9:15开盘价

   Series<Numeric> LastTradeDate;      // 最后储存交易日

   Series<Numeric> OpenPrice_0900(InvalidNumeric);     // 09:00 的开盘价

   Series<Numeric> OpenPrice_0915(InvalidNumeric);     // 09:15 的开盘价

   Series<Numeric> OpenPrice_1030(InvalidNumeric);     //10:30 的开盘价

// 事件处理区

Events

   // 初始化:只执行一次

   OnInit()

   {

       prentryPrice = 0;

       openPrice = 0;

       tradePrice = 0;

       openTotalSec = 9*3600 + 30*60;   // 9:30开盘

       closeTotalSec = 15*3600;          // 15:00收盘

       Print("OnInit: RiskPoint = " + Text(RiskPoint));        

   }


   // 每根K线闭合时触发(核心逻辑)

   OnBar(ArrayRef<Integer> indexes)

   {

       Numeric currentSec = Hour()*3600 + Minute()*60;

      // 获取当前时间和日期

      TradeDate = TradingDate();

       Commentary("当前日期:"+text(TradeDate));

       

      // 过滤非交易日(周六=6,周日=0)

     

        TradeDate = TradingDate();

       Commentary("当前日期:"+text(TradeDate));

       

       // 过滤非交易日(周六=6,周日=0)

       If(WeekdayFromDateTime(Time) == 6 Or WeekdayFromDateTime(Time) == 0)

           Return;

       

       Commentary("最后储存日期:"+text(LastTradeDate));

       

       // 检查是否为新的交易日,重置状态

       If(TradeDate != LastTradeDate)

       {

           LastTradeDate = TradeDate;

           Commentary("修改后储存日期:"+text(LastTradeDate));

           OpenPrice_0900 = 0;

           OpenPrice_0915 = 0;  

           OpenPrice_1030 = 0;

           opened = False;

       }

           

       // 记录21:00开盘价

       If(currentSec == 9*3600)

       {

           OpenPrice_0900 = Open;

       }

       

       // 记录21:15开盘价

       If(currentSec == 9*3600 + 15*60)

       {

           OpenPrice_0915 = Open;

       }

       

       // 记录9:00开盘价

       If(currentSec == 10*3600 + 30*60)

       {

           OpenPrice_1030 = Open;

       }


       // 2. 开仓逻辑:满足时间条件 + 价格条件 + 未开仓

       If ( MarketPosition == 0 && opened == False )

       {

           if(currentSec >= 9*3600 + 15*60 && currentSec <= 9*3600 + 18*60 && OpenPrice_0900 != InvalidNumeric)

           {

               If(OpenPrice_0915 < OpenPrice_0900)  // 当前价格低于开盘价,做空,这个条件永远成立

               {

                   // 开空仓

                   SellShort(1, OpenPrice_0915);

                   opened = True;

                   prentryPrice = OpenPrice_0915; // 记录开仓价

                   Print("开空仓成功,开仓价:" + Text(prentryPrice) + ",当前时间:" + Text(CurrentTime()));

               }

               Else If(OpenPrice_0915 > OpenPrice_0900)  // 当前价格高于开盘价,做多

               {

                   // 开多仓

                   Buy(1, OpenPrice_0915);

                   opened = True;

                   prentryPrice = OpenPrice_0915; // 记录开仓价

                   Print("开多仓成功,开仓价:" + Text(prentryPrice) + ",当前时间:" + Text(CurrentTime()));

               }

               Else  // 价格相等,不开仓

               {

                   Print("价格与开盘价相等,今日不开仓");

               }

               

           }

           if(currentSec >= 10*3600 + 30*60 && currentSec <= 10*3600 + 33*60 && OpenPrice_0900 != InvalidNumeric)//currentTotalSec == 10*3600 + 30*60

           {

               If(OpenPrice_1030 < OpenPrice_0900)  

               {

                   // 开空仓

                   SellShort(1, OpenPrice_1030);

                   opened = True;

                   prentryPrice = OpenPrice_1030; // 记录开仓价

                   Print("开空仓成功,开仓价:" + Text(prentryPrice) + ",当前时间:" + Text(CurrentTime()));

               }

               Else If(OpenPrice_1030 > OpenPrice_0900)  // 当前价格高于开盘价,做多

               {

                   // 开多仓

                   Buy(1, OpenPrice_1030);

                   opened = True;

                   prentryPrice = OpenPrice_1030; // 记录开仓价

                   Print("开多仓成功,开仓价:" + Text(prentryPrice) + ",当前时间:" + Text(CurrentTime()));

               }

               Else  // 价格相等,不开仓

               {

                   Print("价格与开盘价相等,今日不开仓");

               }

               

           }

       }

       

       // 3. 止损逻辑(独立于开仓逻辑,已开仓时持续检查)

       If(opened == True && MarketPosition != 0)

       {

           // 空单止损:价格从下方涨到开仓价的(1+0.5%)以上,即亏损达到0.5%

           If(MarketPosition == -1  && High >= prentryPrice * (1 + RiskPoint))

           {

               BuyToCover(0, High); // 平空仓

               opened = False;

               Commentary("止损平仓(做空): 数量: " + "1" + ", 时间: " + Text(Time) + ", 价格: " + Text(High));

               prentryPrice = 0;

           }

           // 多单止损:价格从上方跌到开仓价的(1-0.5%)以下,即亏损达到0.5%

           If(MarketPosition == 1  && Low <= prentryPrice * (1 - RiskPoint))

           {

               Sell(0, Low); // 平多仓

               opened = False;

               Commentary("止损平仓(做多): 数量: " + "1" + ", 时间: " + Text(Time) + ", 价格: " + Text(Low));

               prentryPrice = 0;

           }

       }


       // 4. 收盘前10分钟强制平仓

       If( opened == True && currentSec >= 14*3600 + 50*60 && MarketPosition != 0)//currentTotalSec >= 14*3600 + 50*60

       {

           If(MarketPosition == 1)

           {

               //Print("准备平仓,时间:" + Text(CurrentTime()));

               Sell(0,Open);

               //Print("平仓指令已发送,MarketPosition = " + Text(MarketPosition));

               Commentary("平仓(做多): 数量: " + " 1 " + ", 时间: " + Text(Time));

               opened = False;

               prentryPrice = 0;

           }

           IF(MarketPosition == -1)

           {

               BuyToCover(0,Open);

               opened = False;

               prentryPrice = 0;

               Commentary("平仓(做空): 数量: " + " 1 " + ", 时间: " + Text(Time));

           }

           

           

                         

           

       }

     

   }

出现闪烁后图表信号持仓如何与账户持仓同步
持仓不同步问题
关于算法代理信号持仓与账号持仓
获取账户持仓
信号持仓同步机制
发生信号闪烁,实际执行了信号成交了,但是监控器却认为没有信号,没有持仓。
【信号闪烁】信号不闪烁的方法
信号闪烁会有什么后果
大神帮我看下程序出现更多信号的问题
信号闪烁

您好,粗略看了下,大致问题可能出在,用全局变量来控制是否开仓。

满足平仓条件,平仓后(2),下个Tick再运行公式,就会因为条件(1)不满足而不执行,这样平仓信号就消失了。这就是这种场合一般用序列来控制,而不用全局变量来控制的原因。