您现在的位置:程序化交易>> 期货公式>> (MC)multicharts>> MC知识>>正文内容

如何实现由最近的连续亏损次数决定下一次开仓手数? [MC]

  • MC用户求助:

    inputs: Price( close ), FastLength( 9 ), SlowLength( 18 ), MAX_shares(5);
    variables: var0( 0 ), var1( 0 ), var2(" "), lots(1);
    {max_shares作为初始的输入参数,表示最大手数;lots是变量,表示下单的手数}


    var0 = AverageFC( Price, FastLength ) ;  
    var1 = AverageFC( Price, SlowLength ) ;
    {var0和var1分别表示快速均线和慢速均线,针对您的想法,我通过在最简单的均线策略中具体化您的想法}

    condition1 = CurrentBar > 1 and var0 crosses over var1 ;
    if condition1 then begin
            if marketposition=0 or (marketposition=-1 and openpositionprofit>0) then begin
    {conditio1成立表示金叉出现;lots为1的情况只有两种情况,一种是第一次下单时(通过marketposition=0来表示;第二种是未平仓收益是正的时候,由于不允许加仓,所以使用了marketposition=-1的情况,同时使用openpositionprofit来判断是否盈利} 
                    lots=1;                                                   
                    Buy ( "MA2CrossLE" ) lots shares next bar at market ;
            end
            else if marketposition=-1 and openpositionprofit<=0 then begin
    {若即不是第一次下单,又不是盈利状态时,此时通过marketposition=-1 and openpositionprofit<=0来判断,表示亏损,此时会执行下面的语句,也就是取 lots+1和max_shares的最小值赋值给lots,然后下单lots手}
                    lots=minlist(lots+1,max_shares);
                    Buy ( "MA2CrossLE1" ) lots shares next bar at market ;
            end;
    end;

    {以上部位是金叉出现的情况,下面的部位是死叉出现的情况,逻辑类似}

    condition1 = CurrentBar > 1 and var0 crosses under var1 ;
    if condition1 then begin
            if marketposition=0 or (marketposition=1 and openpositionprofit>0) then begin
                     lots=1;                                                          
                    Sell Short ( "MA2CrossSE" ) lots shares next bar at market;
            end
            else if marketposition=1 and openpositionprofit<0 then begin
                    lots=minlist(lots+1,max_shares);
                    Sell Short ( "MA2CrossSE1" ) lots shares next bar at market;
            end;
    end;


    注意事项:
    一、整个策略都是使用平仓反向语句,所以下单的手数在下单之前就需要确定,如果先平仓再开仓,这样会有一定的延迟。
    二、使用的是市价单来下单,会立即以对手价成交,不过这样会和下单判断语句中openpositionprofit的值有一定的误差,因为一个是市价之间的盈亏值,另一个是市价成交之后的盈亏值;如果需要更准确的是,那么需要将平仓和开仓分开来写。
    三、这里使用的是市价单委托,如果需要使用条件单,因为条件单不一定会成交,而且成交的时间也不确定,所以条件单和盈亏判断一起使用的话,需要将平仓和开仓分开来执行,而且也会稍微复杂一些。

     

  • MC回复讨论一:

    inputs: Price( close ), FastLength( 9 ), SlowLength( 18 ), MAX_shares(5);
    variables: var0( 0 ), var1( 0 ), var2(" "), lots(1);
    {max_shares作为初始的输入参数,表示最大手数;lots是变量,表示下单的手数}


    var0 = AverageFC( Price, FastLength ) ;  
    var1 = AverageFC( Price, SlowLength ) ;
    {var0和var1分别表示快速均线和慢速均线,针对您的想法,我通过在最简单的均线策略中具体化您的想法}

    condition1 = CurrentBar > 1 and var0 crosses over var1 ;
    if condition1 then begin
            if marketposition=0 or (marketposition=-1 and openpositionprofit>0) then begin
    {conditio1成立表示金叉出现;lots为1的情况只有两种情况,一种是第一次下单时(通过marketposition=0来表示;第二种是未平仓收益是正的时候,由于不允许加仓,所以使用了marketposition=-1的情况,同时使用openpositionprofit来判断是否盈利} 
                    lots=1;                                                   
                    Buy ( "MA2CrossLE" ) lots shares next bar at market ;
            end
            else if marketposition=-1 and openpositionprofit<=0 then begin
    {若即不是第一次下单,又不是盈利状态时,此时通过marketposition=-1 and openpositionprofit<=0来判断,表示亏损,此时会执行下面的语句,也就是取 lots+1和max_shares的最小值赋值给lots,然后下单lots手}
                    lots=minlist(lots+1,max_shares);
                    Buy ( "MA2CrossLE1" ) lots shares next bar at market ;
            end;
    end;

    {以上部位是金叉出现的情况,下面的部位是死叉出现的情况,逻辑类似}

    condition1 = CurrentBar > 1 and var0 crosses under var1 ;
    if condition1 then begin
            if marketposition=0 or (marketposition=1 and openpositionprofit>0) then begin
                     lots=1;                                                          
                    Sell Short ( "MA2CrossSE" ) lots shares next bar at market;
            end
            else if marketposition=1 and openpositionprofit<0 then begin
                    lots=minlist(lots+1,max_shares);
                    Sell Short ( "MA2CrossSE1" ) lots shares next bar at market;
            end;
    end;


    注意事项:
    一、整个策略都是使用平仓反向语句,所以下单的手数在下单之前就需要确定,如果先平仓再开仓,这样会有一定的延迟。
    二、使用的是市价单来下单,会立即以对手价成交,不过这样会和下单判断语句中openpositionprofit的值有一定的误差,因为一个是市价之间的盈亏值,另一个是市价成交之后的盈亏值;如果需要更准确的是,那么需要将平仓和开仓分开来写。
    三、这里使用的是市价单委托,如果需要使用条件单,因为条件单不一定会成交,而且成交的时间也不确定,所以条件单和盈亏判断一起使用的话,需要将平仓和开仓分开来执行,而且也会稍微复杂一些。

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 511411198  点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容