如何实现由最近的连续亏损次数决定下一次开仓手数? [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 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容