量化投资_EasyLanguage/PowerLanguage教学课程__【第二篇专题】__【第七章限价单理想的发单指令模式】

 第七章:限价单理想的发单指令模式

   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/

原文地址:https://www.cnblogs.com/noah0532/p/13716691.html