如何创建 returns 最大亏损交易的 MQL4 函数?

How to create a MQL4 function that returns the largest losing trade?

我正在尝试用 MQL4 语言创建智能交易系统 (EA)。

如何编写 returns 最大亏损交易(而不是总亏损交易)的函数?

以下函数将return最大亏损交易的单号。

在默认 loss = DBL_MAX 的情况下,这仍然可以 return 盈利最低的交易。
loss = 0, 它只会 return 一个利润最大或为零的交易。

将 return 此类交易的票据,如果未找到交易,则清空。

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;
}

任何订单的实际净利润都需要添加 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 )
}