【问题标题】:How to create a MQL4 function that returns the largest losing trade? [closed]如何创建返回最大亏损交易的 MQL4 函数? [关闭]
【发布时间】:2017-09-29 00:56:12
【问题描述】:

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

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

【问题讨论】:

标签: trading algorithmic-trading mql4 metatrader4 forex


【解决方案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.99然后-1.01,你的代码决定-1.01是最大的跨度>
  • @DanielKniaz 好点,匆忙写了。现在改变
  • 什么是 DBL_MAX?它是我必须声明的函数才能工作的变量吗?
  • @NicolaBastienne 最大值双精度可以是docs.mql4.com/constant_indices
  • 您可能已经知道,以票号 a 0 的形式返回的提议不是一个负责任的选择。返回值 EMPTY 而不是 0,是一种更安全的做法,因为盲人 OrderSelect( aTicketNUM, ... )保持安全和稳健,以对抗任何天真的盲人和未处理的 -产生异常的产品。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 2016-10-02
    • 2013-04-22
    • 2022-12-03
    • 2018-09-25
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多