Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 51

 
fxsaber:

Das ist ein guter Trick. Der Trick besteht darin, das Muster auf TParent anzuwenden. So etwas habe ich noch nie gesehen.

Nun, es ist keine Mehrfachvererbung. Es ist eigentlich eine Kette Basis -> A -> B -> C -> X. Wer hindert Sie daran, es direkt zu verwenden, wenn es ausreicht?

 
Stanislav Korotky:

Nun, es ist keine Mehrfachvererbung. Es ist eigentlich eine Kette Basis -> A -> B -> C -> X. Wer hindert Sie daran, es direkt zu verwenden, wenn es ausreicht?

Knappheit.

 
fxsaber:

Knappheit.

Ich könnte nicht mehr zustimmen. IMHO wäre es kürzer und übersichtlicher, die vier Nachfolgeklassen direkt vorzuschreiben.

 
Stanislav Korotky:

Da kann ich nur zustimmen. IMHO wäre es kürzer und übersichtlicher, die vier Nachfolgeklassen direkt vorzuschreiben.

Wenn plötzlich Pluralvererbung eingeführt wird, müssen Sie nur eine kleine Änderung in nur einer Zeile vornehmen

class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C
 
fxsaber:

Wenn plötzlich Mehrfachvererbung eingeführt wird, müssen Sie nur eine kleine Ersetzung in nur einer Zeile vornehmen

Schade, dass das Forum nicht zusätzlich zu den Umfragen ein Wettformular hat - wie eine Umfrage mit Optionen, aber mit Sperrung von ein paar "Pennies" auf dem Konto für die Antwort. Diejenigen, die sich für die richtige Option entscheiden, erhalten nach der Veranstaltung die Wetten der Verlierer ;-). Ich glaube nicht, dass sie es einführen würden.

 
Stanislav Korotky:

Nun, es ist keine Mehrfachvererbung. Es ist eigentlich eine Kette Basis -> A -> B -> C -> X. Wer hindert Sie daran, es direkt zu verwenden, wenn es ausreicht?

Ja, aber die Besonderheit ist, dass alle Ausgangsklassen als Vorlagen definiert und verwendet werden. Daher kann diese Kette in beliebiger Reihenfolge eingestellt werden. Im Grunde genommen gibt es bei der Mehrfachvererbung keinen grundlegenden Unterschied. Wie ich bereits geschrieben habe, kann es bei Klassen Fallstricke geben. Was die Schnittstellen betrifft, ist alles identisch. Das Einzige ist, dass es ein wenig verkrustet aussehen wird, aber hier ist es jedem freigestellt, ob er nachschauen oder fahren möchte)
 

Eine Sache möchte ich noch hinzufügen. Eine vollständige Alternative zur Mehrfachvererbung (und mit flexibleren Optionen) könnte durch Überladen des Ghost-Operators implementiert werden. Aber aus irgendeinem Grund fügt MQ diese Überlastungsfunktion nicht hinzu, obwohl ich sie schon seit langem darum gebeten habe. Und ich habe noch nicht einmal eine konkrete Antwort von ihnen gehört, sie ignorieren es einfach.

 

Es gibt Situationen wie diese

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2017.07.24 09:27

EA ist unter 1641 kompiliert, wo schneller Handel Geschichte implementiert ist.

Ist es möglich, während der Optimierung zum Agent-Build 1596 zu gelangen, wo der Verlauf SEHR langsam arbeitet, und folglich eine Verlangsamung der Optimierung um ein Vielfaches zu erhalten?

Ganz allgemein führt die Optimierung in der Cloud manchmal zu unterschiedlichen Ergebnissen, nicht nur in Bezug auf die Zeit, sondern auch in Bezug auf die Berechnungen. Manchmal kann es vorkommen, dass das Optimierungsergebnis nicht mit einem einzigen Lauf übereinstimmt.

Dies kann darauf zurückzuführen sein, dass Agenten, die an der Optimierung beteiligt sind, und ein lokaler Agent, der an einem einzelnen Lauf beteiligt ist, eine unterschiedliche Build-Nummer haben können.

Und jeder Build enthält unterschiedliche Fehler. Zum Beispiel ist hier ein Fehler, der jetzt relevant ist, aber vor ein paar Jahren in den Builds nicht vorhanden war

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2017.07.17 23:08

Wieder einmal der HistorySelect-Fehler im Tester. Im Jahr 1626 schien das nicht der Fall zu sein. Im Jahr 1629 gibt es.

#include <Trade\Trade.mqh>

void OnTick()
{
  static CTrade Trade;

  const datetime NowTime = TimeCurrent();
  
  if (Trade.Buy(1) && Trade.PositionClose(_Symbol) && HistorySelect(NowTime, NowTime))
  {
    Print(HistoryDealsTotal()); // 0 - это при том, что мы открыли и закрыли позицию в NowTime-время
      
    ExpertRemove();
  }
}

Wenn Ihr EA also während der Optimierung auf den Agenten b1626 trifft, kann er ein Ergebnis anzeigen, aber wenn er auf dem lokalen Agenten b1641 läuft, ein völlig anderes.

Daraus können wir schließen, dass Sie sich vor der Optimierung bewusst sein sollten, für welche Builds Sie Ihren EA optimieren wollen und für welche nicht.

Die Entwickler haben einen Cutter für die untauglichen Agenten vorgesehen - INIT_AGENT_NOT_SUITABLE.


Daher würde ich empfehlen, eine Prüfung auf Übereinstimmung vonTerminalInfoInteger(TERMINAL_BUILD) mit den gewünschten Werten in OnInit für Cloud-basierte Optimierungen zu schreiben.

Aber es ist fast unmöglich, die Liste der Schecks zu kennen, die Ihren Bedürfnissen entsprechen, so dass Sie wahrscheinlich Folgendes schreiben würden

int OnInit( void )
{
  // Если Агент не совпадает с билдом компиляции, отказываемся от его услуг
  if (TerminalInfoInteger(TERMINAL_BUILD) != __MQLBUILD__)
    return(INIT_AGENT_NOT_SUITABLE);
//....

Aber es ist auch eine schlechte Lösung. Eine flexiblere Lösung besteht darin, die Build-Nummer während der Optimierung an Agents zu übergeben.


Seien Sie im Allgemeinen wachsam.


SZY: Es ist möglich, einen Handelsbericht für jeden Agentendurchlauf zu erstellen und ihn während der Optimierung zu optimieren. Dies kann dazu beitragen, besser zu verstehen, warum sich das Ergebnis des Cloud-Agenten in einem einzigen Durchlauf von dem des lokalen Agenten unterscheidet. Die automatische Erstellung solcher Berichte während der Optimierung und des einzelnen Laufs ist mit Hilfe dieser Bibliothek möglich.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

Renat Fatkhullin, 2017.07.25 08:26

Wir unterbrechen regelmäßig alte Builds in der Clouda und warten darauf, dass sie aktualisiert werden, was sehr schnell und unbemerkt geschieht.

Dies ist nicht bei jeder Version der Fall, sondern hängt von der Bedeutung der vorgenommenen Änderungen ab.
Report
Report
  • Stimmen: 12
  • 2017.07.19
  • fxsaber
  • www.mql5.com
Библиотека для MetaTrader 4/5, которая позволяет формировать отчеты по истории торгов.
 

Bei der Fehlersuche (nicht unbedingt beim Debuggen), wenn man das Testintervall im Tester schnell reduzieren möchte, verwende ich folgende Funktionen

// Выгружает эксперт, если количество сделок в истории больше DealsNum.
void ConditionStopExpert( const int DealsNum = INT_MAX )
{
  if ((DealsNum != INT_MAX) && ::HistorySelect(0, ::TimeCurrent()) && ::HistoryDealsTotal() > DealsNum)
    ::ExpertRemove();

  return;  
}

// Выгружает эксперт, если с момента запуска прошло AmountHours-часов.
void ConditionStopExpert( const double AmountHours )
{
  static datetime FirstTime = ::TimeCurrent();
  
  if (::TimeCurrent() > FirstTime + (datetime)(AmountHours * 3600))
    ::ExpertRemove();

  return;  
}
 
fxsaber:

Bei der Fehlersuche (nicht unbedingt beim Debuggen), wenn Sie das Testintervall im Tester schnell reduzieren müssen, verwende ich die folgenden Funktionen

Korrigieren Sie den Code, Sie haben die Nummer 5 in der ersten Funktion anstelle von DealsNum.