Fehler, Irrtümer, Fragen - Seite 1989

 

Die Leistung des Testers ist in hohem Maße vom Handelsserver abhängig.


Tester-Einstellungen:

Netting USD, nur Core1 aktiviert.


Expert Advisor

#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int Interval = 60;
input int AmountLastDeals = 5;
input double Lots = 1;

double CorrectLot( const double Lot )
{
  static const double StepVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
  static const double MaxVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
  static const double MinVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);

  const double Vol = StepVol * (int)(Lot / StepVol + 0.5);

  return((Vol < MinVol) ? MinVol : ((Vol > MaxVol) ? MaxVol : Vol));
}
  
void OnTick()
{  
  if (!PositionGetTicket(0))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      double SumProfit = 0;
      double SumLots = 0;

      for (int i = Total, Count = 0; (i >= 0) && (Count < AmountLastDeals); i--)
      {
        const ulong Ticket = HistoryDealGetTicket(i);

        if ((ENUM_DEAL_ENTRY)HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
        {
          SumProfit += HistoryDealGetDouble(Ticket, DEAL_PROFIT) * (AmountLastDeals - Count);
          SumLots += HistoryDealGetDouble(Ticket, DEAL_VOLUME) * (AmountLastDeals - Count);

          Count++;
        }
      }

      SumLots /= (AmountLastDeals * (1 + AmountLastDeals)) >> 1;

      MqlTradeRequest Request = {0};

      Request.action = TRADE_ACTION_DEAL;

      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;

      Request.volume = (SumProfit >= 0) ? Lots : CorrectLot(SumLots);
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

//      MqlTradeCheckResult CheckResult;
//      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);
      }
    }
  }
  else if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)
  {
    MqlTradeRequest Request = {0};
    MqlTradeResult Result;

    Request.action = TRADE_ACTION_DEAL;
    Request.position = PositionGetInteger(POSITION_TICKET);

    Request.symbol = PositionGetString(POSITION_SYMBOL);
    Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));

    Request.volume = PositionGetDouble(POSITION_VOLUME);
    Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);

    const bool AntiWarning = OrderSend(Request, Result);
  }
}


Ergebnis auf demFIBOGroup-MT5-Server

------
OnTesterInit
i = 0 Pass = 0 OnTester = 7.994 s.: Count = 15925124, 1992134.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 1 Pass = 1 OnTester = 7.831 s.: Count = 15925124, 2033600.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 2 Pass = 2 OnTester = 7.811 s.: Count = 15925124, 2038807.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 3 Pass = 3 OnTester = 7.825 s.: Count = 15925124, 2035159.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 4 Pass = 4 OnTester = 7.831 s.: Count = 15925124, 2033600.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 5 Pass = 5 OnTester = 7.832 s.: Count = 15925124, 2033340.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
iMin = 2 Results[iMin] = 7.811 s.
iMax = 0 Results[iMax] = 7.994 s.
Amount = 6 Mean = 7.854 s. - 90.11%
OnTesterDeinit
------
Interval = 52.296 s., Count = 0, 0.0 unit/sec


Ergebnis zu MetaQuotes-Demo

OnTesterInit
i = 0 Pass = 0 OnTester = 1.497 s.: Count = 2456073, 1640663.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 1 Pass = 1 OnTester = 1.494 s.: Count = 2456073, 1643957.8 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 2 Pass = 2 OnTester = 1.496 s.: Count = 2456073, 1641760.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 3 Pass = 3 OnTester = 1.493 s.: Count = 2456073, 1645058.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 4 Pass = 4 OnTester = 1.499 s.: Count = 2456073, 1638474.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 5 Pass = 5 OnTester = 1.498 s.: Count = 2456073, 1639568.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
iMin = 3 Results[iMin] = 1.493 s.
iMax = 4 Results[iMax] = 1.499 s.
Amount = 6 Mean = 1.496 s. - 49.11%
OnTesterDeinit
------
Interval = 18.279 s., Count = 0, 0.0 unit/sec


Die Gesamtzahl der Ticks auf einemFIBOGroup-MT5-Server beträgt 15925124 und die Leistung des Testers 2038807,3 Einheiten/Sekunde.MetaQuotes-Demo hat 2456073 Ticks und die Testerleistung 1645058,9 Einheiten/Sek. Das heißt, auf dem zweiten Server ist die Leistung des Testers um 20 % gesunken. Aber der Prüfer sollte nicht vom Handelsserver abhängig sein!

Reproduzierbar ohne Probleme.

 
Alexey Kozitsyn:
Es hat nicht geholfen:) OK, wir brauchen nicht zu raten, wir brauchen nur eine Antwort vom SD. Solche Krücken sollten ohnehin nicht akzeptiert werden!

Seltsam. Ich habe etwa 10 Minuten lang herumgestochert, bevor ich gepostet habe, und so habe ich regelmäßig weitergestochert, indem ich die Diagrammperiode gewechselt habe und im Indikatorparameter von true auf false geändert habe. Ich sehe da kein Problem. Natürlich sind es Krücken, deshalb sagte ich, es sei eine vorübergehende Lösung.

 
Alexey Kozitsyn:
Es hat nicht funktioniert:) Ok, warum wohl, wir müssen eine Antwort vom SD bekommen. Solche Krücken sollten ohnehin nicht akzeptabel sein!

Es funktioniert ohne Probleme. Natürlich ist es sinnvoll, zuerst die Ausgabepuffer und dann die Farbpuffer zu definieren, wie es jetzt auch gemacht wird.

[Gelöscht]  
Vitaly Muzichenko:

Es funktioniert ohne Probleme. Natürlich ist es sinnvoll, zuerst die Ausgabepuffer und dann die Farbpuffer zu definieren, wie es jetzt auch gemacht wird.


Vitaly, gehen Sie bitte zuerst dem Problem auf den Grund. Wenn die Einstellung aktiviert ist, funktioniert alles einwandfrei. Das Problem beginnt, wenn die Einstellung deaktiviert ist.
[Gelöscht]  
Alexey Viktorov:
Ihre Version ist stabiler und funktioniert sogar fast immer korrekt (wenn Sie die TF nicht wechseln). Aber wenn Sie wechseln und zurückgehen... Es ist wieder ein Durcheinander.
 
fxsaber:
(string)NormalizeDouble(0.99872, 5) - sehr langes Ergebnis.

Kein Fehler, einige Zahlen in Dezimalschreibweise können nicht exakt in Double dargestellt werden

Der folgende Code liefert ein normales Ergebnis
DoubleToString(0.99872, 5)

 
Evgeny Chernyshev:

Kein Fehler, einige Zahlen in Dezimalschreibweise können nicht exakt in Double dargestellt werden

Der folgende Code liefert ein normales Ergebnis
DoubleToString(0.99872, 5)

Verstanden, danke!

 
Alexey Kozitsyn:
Vitaly, gehen Sie bitte zuerst dem Problem auf den Grund. Wenn die Einstellung aktiviert ist, funktioniert alles einwandfrei. Das Problem beginnt, wenn die Einstellung ausgeschaltet wird.

Alexey, ich bitte um Entschuldigung, ich habe eine weitere Korrektur übersehen.

   //if(inpUseArrows) // Если отображать нужно
   //  {
      SetPlotParametersArrow(0,0,bufArrowUp,false,"test up",EMPTY,clrLime,233,10);
      SetPlotParametersArrow(1,1,bufArrowDn,false,"test dn",EMPTY,clrRed,234,-10);
   //  }

Auch in diesem Beitrag korrigiert, in rot markiert.

[Gelöscht]  
Alexey Viktorov:

Alexej, es tut mir leid, ich habe eine weitere Korrektur übersehen.

Auch in diesem Beitrag korrigiert, mit der Markierung in Rot.

Darum geht es ja gerade! Es stellt sich heraus, dass Sie es gerade ausgeschaltet haben und alle Felder unter allen Diagrammreihen verwendet werden. Es geht aber gerade darum, dem Benutzer die Möglichkeit zu geben, einige der Diagrammreihen bei Bedarf zu deaktivieren. Und wenn nötig - schalten Sie ihn ein!

 
Alexey Kozitsyn:

Das ist es, worum es geht! Schalten Sie sie also einfach aus, und alle Arrays für alle Diagrammreihen werden verwendet. Es geht aber gerade darum, dem Benutzer die Möglichkeit zu geben, einen Teil der Diagrammreihe bei Bedarf zu deaktivieren. Und wenn nötig - schalten Sie sie ein!

Nun, die Anzahl der Diagrammreihen wird am Anfang des Codes definiert, was sich nicht ändert, wenn Sie die TF wechseln.

Ich befürchte, dass sie in mql5 unbesiegbar ist.

Es gibt jedoch noch einen weiteren Trick, mit dem Sie die Anzeige grafischer Reihen im Datenfenster ausschließen können

PlotIndexSetString(plotIndex, PLOT_LABEL, NULL);

Es funktioniert in mql4. Ich muss prüfen, wie es in mql5 funktioniert, ich habe es noch nicht getestet.

Nein... es funktioniert nicht in mql5. Es funktioniert in mql5.

      PlotIndexSetInteger(0, PLOT_SHOW_DATA, true);
      PlotIndexSetInteger(1, PLOT_SHOW_DATA, true);
   if(!inpUseArrows) // Если отображать не нужно
     {
      PlotIndexSetInteger(0, PLOT_SHOW_DATA, false);
      PlotIndexSetInteger(1, PLOT_SHOW_DATA, false);
     }