marketposition问题


Params

//此处添加参数

 


Numeric k1(0.3);               //不对称区间参数

Numeric k2(0.2);                //不对称区间参数

Numeric ExitOnCloseMine(14.58);   //清仓时间

Numeric N(3);

Numeric lots(1);

Numeric danger(-1750);

Numeric profit(2150);

Numeric thred_short(500);

Numeric thred_long(500);

//Numeric ni_target(500);

//Numeric shun_target(500);

Numeric up_count(1);

//Numeric down_count(2);

Numeric color_aver(86450);

Numeric color_nolong(3000);

Numeric color_short(4000);

Numeric today_stop(-2000);

Vars

//此处添加变量

Series<Numeric> upband;        //通道上轨变量

Series<Numeric> dnband;        //通道下轨变量

   Global Numeric HH;

   Global Numeric HC;

   Global Numeric LC;

   Global Numeric LL;

   Global Numeric range1;

   

   Global Numeric longPosition(0);

   Global Numeric shortPosition(0);

   Series<Numeric> LongMA;        //长周期均线变量

   Global Numeric sumVolumeWeightedPrice (0);

   Global Numeric sumVolume(0);

   Global Numeric sign_ni(0);

   Global Numeric p_stop(0);

   Global Numeric total_loss(0);

   Global Numeric high_profit(0);

   Global Numeric close_position(0);

   Global Numeric need_plus(0);

   Global Numeric short_build(0);

   Global Numeric long_build(0);

   Global Numeric count_close(0);

   Global Numeric Open_bar(0);

   Global Numeric market_count(0);

   Global Numeric kui_count(0);

   


   


Defs


Events

//此处实现事件函数

//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作

OnInit()

{

}

OnBarClose(ArrayRef<Integer> indexs)

{

           // 累加加权价格和成交量

       sumVolumeWeightedPrice = sumVolumeWeightedPrice + close * vol;

       sumVolume = sumVolume + vol;


   // 计算 VWMA

     if (sumVolume > 0)

       LongMA = sumVolumeWeightedPrice / sumVolume;

   

        // 计算移动平均线

       PlotNumeric(MA, LongMA);



       

If( Time >= ExitOnCloseMine / 100)

{

Sell(0,Close);

BuyToCover(0,Close);

longPosition = 0;

shortPosition = 0;

}

If( data1.Close < LongMA)

{

count_close = count_close + 1;

}

Else If(data1.Close > LongMA)

{

count_close = 0;

}

//止损

If(MarketPosition == -1)

{

If((short_build - Close[1])*lots < danger)

{

total_loss = total_loss + (short_build - Close[1])*lots;

BuyToCover(shortposition , Close);

shortposition = 0;

kui_count = kui_count + 1;

If(sign_ni == 0)

   {

sign_ni = 1;

   }

}

}

Else If(MarketPosition == 1)

   {

If((Close[1] - long_build)*lots < danger)

{

total_loss = total_loss + (Close[1] - long_build)*lots;

Sell(longposition , Close);

longposition = 0;

kui_count = kui_count + 1;

If(sign_ni == 0)

   {

sign_ni = 1;

    }

 }

}


//有色网均价比较

       //若持多仓,并且建仓价格在有色网均价之上,并且当前在亏损,则等到价格降到有色网均价之下时止损

   If(Time < ExitOnCloseMine / 100 &&  time > 0.09 ){

       If( MarketPosition == 1 )

       {

        If((Close < color_aver) && (Close[1] - long_build) < 0 && long_build  > color_aver && market_count == 1)

        {

            Sell(longPosition,Close);

            longPosition = 0;

            total_loss = total_loss + (Close[1] - long_build) * lots;

            kui_count = kui_count + 1;

            If(sign_ni == 0)

               {

                  sign_ni = 1;    

               }

            }

        }

        //若持空仓,并且建仓价格在有色网均价之下,并且当前在亏损,则等到价格涨到有色网均价之上时止损

        If( MarketPosition == -1)

        {

        If(short_build < color_aver && (short_build - Close[1]) < 0  && Close > color_aver  && market_count == 1)

        {

        BuyToCover(shortPosition,Close);

           shortPosition = 0;

           total_loss = total_loss + (short_build - Close[1]) * lots;

           kui_count = kui_count + 1;

           If(sign_ni == 0)

           {

                  sign_ni = 1;    

           }

           }

        }

        }

       


        //若当天亏损到达2000,则当天停止交易

        If(kui_count == 2)

        {

        p_stop = 1;

        }

       

       

        //止盈

       If(MarketPosition == -1 && (short_build - Close[1])*lots >= high_profit)

       {

        high_profit = (short_build - Close[1])*lots;

        close_position = high_profit * 0.6;

        Commentary(Text(close_position));

       }

       Else If(MarketPosition == 1 && (Close[1] - long_build)*lots >= high_profit)

       {

        high_profit = (Close[1] - long_build)*lots;

        close_position = high_profit * 0.6;

        Commentary(Text(close_position));

       }

       /*

       If(PositionProfit >= high_profit)

{

high_profit = PositionProfit;

close_position = high_profit * 0.6;

}

*/

//Commentary(long_build: + Text((short_build - Close[1])*lots));

Commentary(close_position: + Text(close_position));

If(MarketPosition == -1)

{

   If((short_build - Close[1])*lots < close_position && close_position > 0 && (short_build - Close[1]) > 0 )

  {


    If((short_build - Close[1])*lots < 2400)

    {

        //Commentary(进来前(short_build - Close[1])*lots: + Text((short_build - Close[1])*lots));

        //Commentary(进来前close_position: + Text(close_position));    

  BuyToCover(shortposition , Close);

 

  shortposition = 0;

  high_profit = profit;

  If(sign_ni == 1)

  {

   need_plus = 1;

  }

  Else If(Open_bar > 6000 && sign_ni == 0)

  {

    sign_ni = 1;

  }

 

 

}

Else If((short_build - Close[1])*lots >= 2400)

{

//Commentary(修改(short_build - Close[1])*lots: + Text((short_build - Close[1])*lots));

         //Commentary(修改close_position: + Text(close_position));

close_position = high_profit * 0.4;

Commentary(Text(close_position));

}

  //Commentary(出来后(short_build - Close[1])*lots: + Text((short_build - Close[1])*lots));

    //Commentary(出来后close_position: + Text(close_position));

 

   }


}

Else If(MarketPosition == 1)

{

  If((Close[1] - long_build)*lots < close_position && close_position > 0 && (Close[1] - long_build) > 0)

  {

      If((Close[1] - long_build)*lots < 2400)

      {

        //Commentary(进入前(Close[1] - long_build)*lots: + Text((Close[1] - long_build)*lots));

        //Commentary(进入前close_position: + Text(close_position));

  Sell(longposition , Close);

  longposition = 0;

  high_profit = profit;

  If(sign_ni == 1)

  {

   need_plus = 1;

  }

}

Else If((Close[1] - long_build)*lots >= 2400)

{

  //Commentary(修改(Close[1] - long_build)*lots: + Text((Close[1] - long_build)*lots));

        //Commentary(修改close_position: + Text(close_position));

close_position = high_profit * 0.4;

Commentary(Text(close_position));

}

//Commentary(出去后(Close[1] - long_build)*lots: + Text((Close[1] - long_build)*lots));

       // Commentary(出去后close_position: + Text(close_position));


  }

}

         Commentary(Close MarketPosition:+ Text(MarketPosition));


}

OnBarOpen(ArrayRef<Integer> indexs)

{

Commentary(open MarketPosition:+ Text(MarketPosition));

If(p_stop == 0)

     {

//逆势

     If(Time < ExitOnCloseMine / 100 &&  time > 0.0905 && sign_ni == 0 )

     {

        //开空仓

if ((Close[1] > (LongMA + thred_short) && shortPosition == 0 && longPosition == 0) Or (Close[1] > (color_aver + color_short) && shortPosition == 0 && longPosition == 0) Or (count_close >= 6000 && shortPosition == 0 && longPosition == 0))

      {

       SellShort(lots, Open);

       short_build = Open;

       shortPosition = shortPosition + lots;

       Open_bar = count_close;

       close_position = 0;

       market_count = market_count + 1;

      }

         //开多仓

       else if (Close[1] < (LongMA - thred_long) && longPosition == 0 && shortPosition == 0 && Close[1] < (color_aver + color_nolong) && count_close <5000)

      {

       Buy(lots, Open);

       long_build = Open;

       longPosition = longPosition + lots;

       close_position = 0;

       market_count = market_count + 1;

      }


     


      }

      //顺势

      Else If(Time < ExitOnCloseMine / 100 && Time > 0.09 && sign_ni == 1 && MarketPosition == 0)

      {

      If(need_plus == 0)

      {

         If(Close[1] > LongMA && Close[1] > upband )

           {


        Commentary(MarketPosition:+ Text(MarketPosition));

         Buy(lots , Open);

         //Commentary(buy MarketPosition:+ Text(MarketPosition));

         //Commentary(顺势开多单);

          long_build = Open;

         longPosition = longPosition + lots;

         market_count = market_count + 1;

       

         }

         Else If(Close[1] < LongMA && Close[1] < dnband )

         {


            SellShort(lots , Open);

            Commentary(顺势开空单);

            short_build = Open;

            shortPosition = shortPosition + lots;

            market_count = market_count + 1;

       

          }

       }

     

      Else If(need_plus == 1)

      {

      If( Close[1] > (color_aver + color_nolong))

      {

      sign_ni = 0;

      }

      If(Close[1] < (color_aver + color_short))

      {

      sign_ni = 0;

      }

      }


      }

     }

}

OnBar(ArrayRef<Integer> indexs)

{

if (TrueDate(0) <> TrueDate(1))

      {

       // 重置累加器

       sumVolumeWeightedPrice = 0.0;

       sumVolume = 0.0;

       sign_ni = 0;

       p_stop = 0;

       total_loss = 0;

       high_profit = profit;

       close_position =0;

       need_plus = 0;

       count_close = 0;

       market_count = 0;

       kui_count = 0;

       //short_build = 0;

       //long_build = 0;

      }

     


       

HH=data1.HighD(N);   //N日前的高点

LL=data1.LowD(N);    //N日前的低点

HC = data1.CloseD(N);

LC = data1.OpenD(N);


range1 = Max(HH - LC, HC - LL );

upband = data1.OpenD(0) + range1 * k1;

dnband = data1.OpenD(0) - range1 * k2;

data0.PlotNumeric(upband:, upband);

data0.PlotNumeric(dnband:, dnband);

Commentary(当前盈利: + Text(PositionProfit));

Commentary(总亏损: + Text(total_loss));

Commentary(sign_ni: + Text(sign_ni));

Commentary(need_plus: + Text(need_plus));

Commentary( bar MarketPosition: + Text(MarketPosition));

//Commentary(低于均线的bar数: + Text(count_close));

//Commentary(long_build: + Text(long_build));

//Commentary(short_build: + Text(short_build));

//Commentary(多亏损: + Text((Close[1] - long_build)*lots));

//Commentary(空亏损: + Text((short_build - Close[1])*lots));


     


       

     }



//当前策略退出时触发

OnExit()

{


}


data-href=

我在tick数据中用marketposition作为条件判断是否入场,上图在平仓后,满足入场条件,立刻开多单,但是实盘中没有报单,我查看了onbaropen,onbarclose和onbar中的marketposition的值,同一根tick数据上的不一样,是否是这个问题,问题主要出在标红字段。

MarketPosition判断问题
请教MarketPosition的问题
MarketPosition出了问题
关于marketposition的问题
关于MarketPosition函数的问题
MarketPosition状态和实际开仓问题
MarketPosition 疑问
关于MarketPosition或者A_BuyPosition()/A_SellPosition()的问题。
buy函数,marketposition函数
持有多仓,MarketPosition =1,MarketPosition 识别不到,还要进入下面的买入开仓语句,逻辑不对呀

您好,代码很长,逻辑要搞清楚很费时间,对解决问题可能又没有什么直接帮助,但不看懂逻辑,直接看您说的标为顺势的代码部分,也很难看出问题,这是个矛盾。

我只能针对您说的问题回复下,OnBarOpen 、OnBar、OnBarClose不管实际顺序怎么写,用到的MarketPosition及其它变量,实际的顺序就是OnBarOpen->OnBar->OnBarClose。我做了个简化的例子测试,用tick数据运行策略,发单一切正常,MarketPosition在OnBarOpen、OnBar、OnBarClose中的值也完全正常。

至于您自己的代码为什么不正常可能还得您自己再去耐心调试了

问题主要出在标注为顺势的代码部分,请老师看看问题出在哪