• 量化投资_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/

  • 相关阅读:
    BZOJ 1707 [Usaco2007 Nov]tanning分配防晒霜
    BZOJ2697:特技飞行
    Bridging signals(NlogN最长上升子序列)
    HDU 4291 A Short problem(矩阵+循环节)
    计蒜之道 初赛第一场B 阿里天池的新任务(简单)
    1008: [HNOI2008]越狱
    1022: [SHOI2008]小约翰的游戏John
    1192: [HNOI2006]鬼谷子的钱袋
    2456: mode
    BZOJ-1968
  • 原文地址:https://www.cnblogs.com/noah0532/p/13716691.html
Copyright © 2020-2023  润新知