【问题标题】:Fire and catch an event when stopLoss or takeProfit happens当 stopLoss 和 takeProfit 发生时触发并捕获事件
【发布时间】:2015-12-22 15:48:32
【问题描述】:

MQL4中,我知道如何设置stopLosstakeProfit

但是,当这些事件真正发生时,我想做些别的事情。

是否有任何与此相关的事件监听器?

【问题讨论】:

    标签: algorithmic-trading mql4


    【解决方案1】:

    很遗憾,MQL4 中没有交易活动。

    但是,它可以这样模拟(仅逻辑代码,可能无法编译):

    #property copyright "No copyright, can be used freely, Joseph Lee"
    #property link      "https://www.facebook.com/joseph.fhlee"
    
    int vaiTicketList[];
    int start() {
        int viIndex;
    
        // -----------------------------------------------------------
        // EVENT CHECK SECTION:
        // Check vaiTicketList (populated in the previous cycle) to see if
        // each of the (previously) open ticket is still currently open.
        // -----------------------------------------------------------
    
        for( viIndex=0; viIndex<ArrayRange(vaiTicketList,0); viIndex++) {
            // Check if Ticket which was previously opened in the last
            // cycle is no longer open now.
    
            if(!OrderSelect( vaiTicketList[viIndex], SELECT_BY_TICKET ) ) {
                // -----------------------------------
                // EVENT CATEGORIZATION: 
                // -----------------------------------
                // Handle possible events here:
                // -- Close event: (OrderSelect( ticket, SELECT_BY_TICKET, MODE_HISTORY) == true)
                if( OrderSelect(vaiTicketList[viIndex], SELECT_BY_TICKET, MODE_HISTORY) )
                    eventTrade_Closed( vaiTicketList[viIndex] );
    
                // -- StopLoss (  Buy:  When OrderClosePrice() <= OrderStopLoss(), 
                //                Sell: When OrderClosePrice() >= OrderStopLoss() )
                // -- TakeProfit (Buy:  When OrderClosePrice() >= OrderTakeProfit(),
                //                Sell: When OrderClosePrice() <= OrderTakeProfit() )
                // -- Expiration, Cancel, etc, etc
            }
        }
    
        // -----------------------------------------------------------
        // Store a list of all currently OPEN trade tickets into array.
        // This is used to be compared in the next tick.
        // -----------------------------------------------------------
        ArrayResize( vaiTicketList, OrdersTotal() );
        for ( viIndex=0; viIndex<OrdersTotal();  viIndex++) {
            if(OrderSelect(viIndex, SELECT_BY_POS, MODE_TRADES)) {
                vaiTicketList[viIndex]  = OrderTicket();
            }
        }
        // -----------------------------------------------------------
    };
    
    // ---------------------------------------
    // This is the Trade Close event handler
    // ---------------------------------------
    bool eventTrade_Closed( int pviTicket ) {
        bool    vbIsEventBubble = true;
        // Do something here to handle the event.
        // FEATURE: vbIsEventBubble TRUE will allow event bubbles.
    
        return( vbIsEventBubble);
    }
    
    bool eventTrade_otherPossibleEvents1() {};
    bool eventTrade_otherPossibleEvents2() {};
    bool eventTrade_otherPossibleEvents3() {};
    bool eventTrade_otherPossibleEventsN() {};
    

    沿着这条线。希望对您有所帮助。

    【讨论】:

    • if(!OrderSelect() 只会在失败时执行,您的代码无法使用。您很可能打算写if(!OrderSelect()) continue;。此外,嵌套的OrderSelect()'s 将确保您的所有订单完全混乱!
    • @not2qubit:也许你会想重新思考逻辑。 if(!OrderSelect()) 只有在订单不再可用时才会执行是正确的。这是有意的,并作为“测试”来查看先前打开的订单现在是否已关闭。如果它是封闭的,那么做内部部分。所以,代码是正确的。
    • 啊哈,好吧,我想这也是一种方法。遗憾的是,为了在 MQL4 中以 正确 的方式进行操作,通常看起来与其他语言完全相反。这就是为什么详细的描述和解释对于 mq4 代码是必不可少的。无论哪种方式,您似乎都将 OrderSelect()'s 嵌套在 for() 循环中,这是可能的,但通常被认为是一个很大的禁忌,因为项目不按任何顺序返回,如果指针在操作完成之前已经死亡,甚至可能返回垃圾。
    【解决方案2】:

    您可以使用带有静态变量的 OrdersHistoryTotal() 来识别此事件。如果该值增加,则表示已平仓。

    【讨论】:

      【解决方案3】:

      不,没有这样的直接事件监听器。


      但是:

      我们可以创建一个这样的,并在 OnTick() 事件绑定处理程序的基础上测试它的激活。

      void OnTick(){                         // MQL4 system-initiated event-handler
      // ---
         myOnTickStealthTP_EventMONITOR();   //      my Event Monitor
         myOnTickStealthSL_EventMONITOR();   //      my Event Monitor
      // ---       
      
      // other code
      
      }
      

      根据not2qubit 的猜想进行扩展(无论人们认为它是多么切题、弱或错误)

      你刚刚发布了一个人为的不存在的功能。那有什么好处?如果您可以为您的建议提供部分工作代码 sn-p,那将会更有帮助。回想 MQL4 的大多数用户不是程序员。 – not2qubit 47 分钟前

      void myOnTickStealthTP_EventMONITOR(){ // HERE put everything,
                       // TP_Event           //      what the "something else"
                                             //              ( when such events
                                             //                actually take place
                                             //                )
                                             //      meant - that's fair, isn't it ?
           ...
      }
      
      void myOnTickStealthSL_EventMONITOR(){ // HERE put everything,
                       // SL_Event           //      what the "something else"
                                             //              ( when such events
                                             //                actually take place
                                             //                )
                                             //      meant - that's fair, isn't it ?
           ...
      }
      

      【讨论】:

      • 你刚刚发布了一个人为的不存在的功能。那有什么好处?如果您可以为您的建议提供部分工作代码 sn-p,那将会更有帮助。回想 MQL4 的大多数用户不是程序员。
      • Negative, @not2qubit.This Answer确实为 O/P 定义的问题提供了解决方案“是否有任何事件监听器与此类相关联?” 在上下文中与 “我知道如何设置 SL 和 TP”一个明确的意愿表示为: “但是,我想要在此类事件实际发生时做其他事情” )。同时,它还具有最大可实现的内容,只要人们可以在 O/P 发布的上下文中提供帮助(她/他没有定义任何细节,什么 “其他事情(当此类事件实际发生时)”实际上是,她/他确实知道,不是吗?G/L!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多