如果仓位亏损,如何在一定时间后平仓交易MQL4

时间:2016-04-21 09:29:59

标签: trading algorithmic-trading mql4 metatrader4

我用 1H & 4H 周期,&我正在尝试实现编码,如果它处于亏损状态,则会关闭一个位置。到交易周期的一半时(PERIOD_CURRENT)。

贸易周期4H = 4 [hr] = 240 [min] = 14,400 [s]

交易周期为4H,因此如果交易最初开盘后2小时交易亏损,我希望能够自动平仓。

根据时间(自1970年1月1日起以秒为单位),我将 TimeCurrent() OrderOpenTime() +进行了比较 4H 以秒为单位,但将其除以2以获得两小时后的时间。

然而这不起作用 - 我已添加以下代码。

如果有人能对此有所了解,我们将不胜感激。

示例

OrderStartTime = 14,000,000

OrderCloseTime = 14,000,000 + 60 minutes * 240 minutes = 14,014,400 <<<<<

如果贸易在时间损失,请关闭一半 = 14,000,000 + (60 * 240*0.5) = 140,007,200

for ( int earlcloses = OrdersTotal() - 1; earlcloses >= 0; earlcloses-- )
{
    if (                        OrderSelect( earlcloses, SELECT_BY_POS, MODE_TRADES ) )
         if (                   OrderType()                               == OP_SELL )
               if (             OrderMagicNumber()                        == Period() )
                     if (       OrderOpenTime() + ( 60 * Period() * 0.5 ) <= TimeCurrent() )
                           if ( OrderOpenPrice()                          <  Bid )
                           { // |||||||||||||||||||||||||||||||||||||||||||
                             /* --serially-nested-if()-s CODEBLOCK-{}-START--- */

                                earlcloses = OrderClose( OrderTicket(),
                                                         LotSize,
                                                         MarketInfo( sym, MODE_BID )
                                                       + MarketInfo( sym, MODE_SPREAD )
                                                       * MarketInfo( sym, MODE_POINT ),
                                                         300,
                                                         clrNONE
                                                         );

                             /* ------------------------ CODEBLOCK-{}-FINISH--- */
                           } // ||||||||||||||||||||||||||||||||||||||||||||
    if ( earlcloses == true )
    {    Sleep( 60000 );
         int  earlyclosesel =  OrdersHistoryTotal()-1;
         bool earlySelect   =  OrderSelect( earlyclosesel, SELECT_BY_POS, MODE_HISTORY );
         if ( earlySelect   == true )
         {
              int earlTicket = OrderTicket();
              SendMail( "Notification of early position closure", "Trade #" + IntegerToString( earlTicket, 0 ) + "has been closed at" + DoubleToStr( OrderClosePrice(), 5 ) + "due to timeout" );
         }
         else if ( earlySelect == false )
              {
                   Print( "EarlyClose failed with error #", GetLastError() );
              }
    }
 }

2 个答案:

答案 0 :(得分:0)

MQL4应该很好地理解语言构造函数的语法:

如上所述,当且仅当满足所有串行嵌套earlcloses = OrderClose(...);条件时,代码才会执行​​单个命令if()

之后(仅有条件地执行CODEBLOCK-{}),有一条下一行,相反,在每个for(){...}循环中评估,除了最后一行:

if ( earlcloses == true )

if() 条件在所有情况下都会计算为True,但在上一轮for(){...}循环中除外,因为直到最后一个,for(){...}循环 - 声明为

的控制变量
for( int earlcloses =  OrdersTotal() - 1; // .SET  initial value
         earlcloses >= 0;                 // .TEST before a loop-execution starts
         earlcloses--                     // .UPD  after  a loop-execution
         ){...}

这意味着,您的代码始终使用值( earlcloses == true )到达> False测试,这会产生True if(...) 输出test和以下{...}代码将被执行(for()的最后一个循环除外,earlcloses == 0,因此产生if() - test {{1} } ,如上所述。

False应遵守XTO规则,参考。其他你的问题

提交服务器端执行的说明,请务必正确设置价格。阅读 OrderClose() ,而不是处理来自RefreshRates()的结果,因为您在之前的问题中已多次重复,MarketInfo()

强大的NormalizeDouble()代码永远不依赖于db.Pool MQL4

而是使用ORDER_BY_POS db.Pool- DMA -mode。如您的代码中所列,隐式基于位置的假设导致情况,当OrderTicket()中没有记录时 - db.Pool的一部分,而HISTORY的盲目尝试将失败。

时间比较应该是正确的:

OrderSelect( ...,  MODE_HISTORY )

上面( OrderOpenTime() + 0.5 * PeriodSeconds( PERIOD_CURRENT ) <= TimeCurrent() ) 代码概念中的最差错误是在干预分配中,损坏了MQL4 - 循环控制的逻辑变量

这显而易见:

for(){...}

第一个for ( int earlcloses = OrdersTotal() - 1; earlcloses >= 0; earlcloses-- ) { if ( ... .. . { earlcloses = OrderClose( OrderTicket(), ... ); } ... } 调用会杀死整个OrderClose()逻辑,通过它干预 for(){...} -last循环值{none|one}到循环控制变量中。

尾声:

一旦您在最后四个问题中发布了一条评论,您就会因为没有按照您的意愿运行代码而感到厌恶,因为否则,您有一个有利可图的策略,聘请专业人士似乎是合理的两倍为您做正确和稳健的算法化。与纠正单个代码片段相比,它可以更快地为您提供策略RTO。

答案 1 :(得分:0)

建议。请阅读评论:

for ( int orderIndex = OrdersTotal() - 1; orderIndex >= 0; orderIndex-- ) {
    //Note: You are closing ALL orders regardless of Symbol() of the current chart!!
    if (                        OrderSelect( orderIndex, SELECT_BY_POS, MODE_TRADES ) )
         if (                   OrderType()                               == OP_SELL )
               if (             OrderMagicNumber()                        == Period() )
                     if (       (TimeCurrent()-OrderOpenTime())           >= (60*Period()/2) )
                           if ( (              OrderProfit()     // P&L
                                             + OrderCommission() // needs to factor in Commission
                                             + OrderSwap()       // needs to factor in all Swaps
                                               )                          <  0.0 ) {
                             // --------------------------------------------------
                                RefreshRates();                  // VERY IMPORTANT
                             // --------------------------------------------------                                    
                                int  closedTicket = OrderTicket();
                                if (  OrderClose( closedTicket,
                                                  OrderLots(),
                                                  MarketInfo( Symbol(), MODE_ASK ),   //You are closing a SELL trade, should use ASK price.
                                                  300, clrNONE ) ) {
                                      SendMail( "Notification of early position closure",
                                                "Trade #" + IntegerToString( closedTicket, 0 )
                                              + " has been closed at " + DoubleToStr( MarketInfo( Symbol(), MODE_ASK), 5 ) + " due to timeout."
                                                );
                                }
                                else {
                                      Print( "EarlyClose failed with error #", GetLastError() );
                                }
                           }
}