如何创建一个返回最大亏损交易的MQL4函数?

时间:2017-05-01 15:48:25

标签: trading algorithmic-trading mql4 metatrader4 forex

我正在尝试使用MQL4语言创建EA交易。

如何编写一个能够返回最大亏损交易的函数(而不是总亏损交易)?

2 个答案:

答案 0 :(得分:1)

以下功能将返回损失最大的交易单。

默认值为loss = DBL_MAX,这仍然可以返回利润最低的盈利交易。
使用 loss = 0 ,它只返回一笔交易最负的利润或零。

如果没有找到交易,将返回此类交易的机票和EMPTY。

int LargestLoss( int magic, double loss = DBL_MAX )
{
        int ticket=EMPTY;
        for(int i=0; i < Orderstotal(); i++)
        {
                if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                {
                        if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderProfit()+OrderSwap()+OrderCommision()<loss)
                        {
                                loss=OrderProfit()+OrderSwap()+OrderCommision();
                                ticket=OrderTicket();
                        }
                }
        }
        return ticket;
}

答案 1 :(得分:0)

任何订单的实际净利润都有3个要添加的组件:

为了公平比较,应该添加所有[A] + [B] + [C]来比较其中一个:

                        double aNetLOSS     = OrderProfit()     // [A]
                                            + OrderCommission() // [B]
                                            + OrderSwap();      // [C]

一个强大的调用接口应该提供

对于严重的MQL4自动化,返回值应始终包含任何不必要的副作用

bool GetTheTicketWithLargestLOSS(       int    &aTicket2SEARCH,
                                        double &aValueOfLOSS,
                                  const string  aSymbol2SEARCH, // <= _Symbol
                                  const int     aMagNUM        = 0,
                                  const int     aSearchMODE    = MODE_TRADES // | MODE_HISTORY
                                  )
{
    double aLocalMaxLOSS  = 0.;
           aTicket2SEARCH = EMPTY;         // BLOCK ANY BLIND OrderSelent() USE

    for ( int i = 0; i < OrdersTotal(); i++ )
    {         // TRY:
            if (        OrderSelect( i, SELECT_BY_POS, aSearchMODE ) )
            {
                  if (  OrderSymbol()      == aSymbol2SEARCH    // MATCH?
                     && OrderMagicNumber() == aMagNUM           // MATCH?
                        )
                  {     double aNetLOSS     = OrderProfit()     // [A]
                                            + OrderCommission() // [B]
                                            + OrderSwap();      // [C]
                        if (   aNetLOSS    <  aLocalMaxLOSS )
                        {
                          aLocalMaxLOSS     = aNetLOSS;         // UPDATE
                          aLocalTkt2FIND    = OrderTicket();
                        }
                        continue; // ----------------------------^ LOOP NEXT
                  }
                  continue; // ----------------------------------^ LOOP NEXT
            }
            else
            { // ON EXC:
              // LOG:
              // REPORT:
              // HANDLE:
              // RET/SIG:
                 return( False );            // SIG TERM EXIT
            }
    }
    aTicket2SEARCH = aLocalTkt2FIND;         // ON  FAIR EXIT: FINAL ASSIGNMENTS
    aValueOfLOSS   = aLocalMaxLOSS;
    return( True );                          // SIG FAIR EXIT ( &DATA SET )
}