第七章:限价单理想的发单指令模式
1、在之前我们提到过
# 如果委托条件未发生改变,且委托价格发生改变,那么MC的发单机制会“删单,以最新委托价发单”
【委托条件】(未变) + 【委托价格】(已变) = “删单,以最新委托价发单”
# 如果委托条件发生改变,且不管委托价格是否发生改变,那么MC的发单机制会“删单”
【委托条件】(已变) + 【委托价格】(已变/未变) = “删单”
# 如果委托条件为发生改变,且委托价格也未发生改变,那么MC的发单机制会“保持委托单不变”
【委托条件】(未变) + 【委托价格】(未变) = “保持委托单不变”
2、限价单理想的发单指令
限价单理想的发单指令是:委托后,委托条件保持不变的情况下,保持委托单不变(一直挂着),当委托条件发生改变,只进行删单处理即可。
目的:防止限价委托单频繁变动,导致滑价过大,如一直未成交,只做删单处理,或者一直未成交,不按照MC的这种机制,自己编写逻辑进行追价处理。
举例说明:
比如:一双均线策略且进行多单委托为例。
A:判断条件,当快线>慢线时,进行限价发单委托,并且委托价格为正常的委托价格(多单限价委托)
B:当委托价格在当根Bar未成交,且快线>慢线的判断条件保持不变,那么保持之前的委托价格不变(保持多单限价委托)
C:当快线<慢线时,判断条件发生改变,只做删单(删除之前的限价委托)操作。
【注意】:下面的代码是以非Bar内模式进行编写
3、实现过程
要实现这个过程,其关键点就是保持当初首次的委托价格,在不断改变Bar的时候,一直保持起初的委托价格不变。所以需要限定这个初次委托价格在Bar的变化过程中,保持价格一致。
特别说明的是,这是MC的一个内在发单机制。这种机制导致条件发生改变,MC可以进行自动的追价操作保证委托。但是在实际操作的,很多情况下,我们希望一直等待价格的成交,因此需要改变这个MC的发单机制。并在代码上进行改变。
一般来说,MC编写信号指标,会把信号判断部分与实际委托部分分开写,这样写的话可以逻辑更加清晰,当然也符合MC的自身的EL语言逻辑。
代码逻辑:
以螺纹刚为例,快慢均线进行开多、开空的转换下单操作。且对每次下单价格加上或减去50个点,保证不会限价委托成交,只方便观察它的委托状态。
品种周期:
15秒,可以更快的观察
示例代码1:
var:ma0(0),ma1(0);
ma0 = Average(close,5); // 快速均线
ma1 = Average(close,20); // 慢速均线
// 多单判断条件
if ma0 > ma1 then
begin
condition1 = True;
if value1 = 0 then value1 = Open of next bar; // 保持价格一致
end
else
// 多单条件失效,返回默认状态
begin
condition1 = False;
value1 = 0;
end;
// 空单判断条件
if ma0 < ma1 then
begin
condition2 = True;
if value2 = 0 then value2 = Open of next bar; //保持价格一致
end
else
// 空单条件失效,返回默认状态
begin
condition2 = False;
value2 = 0;
end;
// 多单开仓逻辑
if marketposition <> 1 and condition1 then
buy 1 shares next bar at value1 - 50 limit; // 加点不会成交,实际应用时取消50个点
//buy 1 shares next bar at value1 limit; // 实际交易选择这个代码
// 空单开仓逻辑
if marketposition <> -1 and condition2 then
sellshort 1 shares next bar at value2 + 50 limit;// 加点不会成交,实际应用时取消50个点。
// sellshort 1 shares next bar at value2 limit;// 实际交易选择这个代码
4、实验过程如下:
变化过程如下:
# 第一次委托多单,价格为3489
# 新Bar来到,之前挂单未成交,价格3489保持不变,并没有删单重发
# 新Bar来到,之前挂单未成交,价格3489保持不变,并没有删单重发
# 委托状态发生改变,向下出现开空状态
# 只进行删单处理
# 反向空单开仓,进入空仓的下一个循环逻辑
5、图式:
不加控制的限价委托模式:
变为理想的限价委托模式:
7、示例代码2:
var:ma0(0),ma1(0),jumpPoint(1); // 滑价N跳
ma0 = Average(close,5);
ma1 = Average(close,20);
if ma0 > ma1 then
begin
condition1 = True;
if value1 = 0 then value1 = Open of next bar;
end
else
begin
condition1 = False;
value1 = 0;
end;
if ma0 < ma1 then
begin
condition2 = True;
if value2 = 0 then value2 = Open of next bar;
end
else
begin
condition2 = False;
value2 = 0;
end;
if marketposition <> 1 and condition1 then
buy 1 shares next bar at value1 + MinMove * jumpPoint Point limit; //根据不同品种设置增加几跳的限价委托价格
if marketposition <> -1 and condition2 then
sellshort 1 shares next bar at value2 - value1 + MinMove * jumpPoint Point limit;
因为limit单无法在外面进行滑价设置,因为滑价设置只对Market单和Stop单有效,因此在代码内部增加滑价。
其中:MinMove:返回一个数值,表明是图表中数据的价格变动最小单位(注:这里设置的是整数,比如白糖是1个价位这样的变动,返回是1,铁矿石是半个价位的变动,返回是5),这里观察到的并不是价格的最小变动单位,因为在QM中默认设置的是整数。
Point:返回一个十进位的数值,表示价格精度。1个Point = 1/Pricescale。
因此:准确的一跳=MinMove*jumpPoint Point;或者MinMove*JumpPoint/Pricescale。
6、总结:
这段限价单委托的核心逻辑就是“if value1 = 0 then value1 = Open of next bar;”,这里表达的意识是,第一次判断条件后,value1默认为0,此时给value1赋值具体的限价委托价格。当判断条件保持不变、委托价格未成交,Bar状态改变,此时value1 已经不等于 0,再不会给value1进行重新赋值,保持“委托价格条件保持不变”(这一点非常重要)。
再当条件改变时,把状态与价格进行初始化操作。condition1 = True,value1 = 0;这样就实现了我们想要的功能。
另外,Stop单的委托也可以采用这种方式。但是,市价单这样写法也是可以的,不过也是没有必要的,因为Market市价单一般来说都会成交,成交概率是最大的。
【本章总结】
【总结1】:
SA+真回报、AA+假回报,是两种最常用的搭配方式。
【总结2】:
根据交易所支持的发单指令,配置不同的委托设置,如不支持支持,选择对应的“本地洗”方式。
【总结3】:
进行续仓操作(也就是前面有仓位,此时需要开启自动化交易)时,选择AA+假回报,建议选择AA+假回报方式。
进行开仓操作(也就是前面没有仓位,此时需要开启自动化交易)时,选择SA+真回报、AA+假回报均可,建议选择AA+假回报。
【总结4】:
理想的limit(限价单)发单指令尽量采用本章中推荐的代码。在实际编写代码时,开仓逻辑计算与开仓下单指令建议分开写,多空指令分开写,图表分开加载(也即是一个信号代码中有开多开空,建议分成两个代码编写)。
=================================================
之前的文章感谢大家的转载,希望转载时请注明出处,本人转自其它网站的图表一并感谢,谢谢~!
https://www.cnblogs.com/noah0532/