Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 111

 
pavlick_:

...

Bitte verwenden Sie die integrierte Textformatierung - es gibt ein Menü über dem Eingabefeld für die Nachricht - dort ist alles vorhanden. Auch Hotkeys werden dort beschrieben.

Ich habe Ihr "Zitat" korrigiert.

 
pavlick_:

Warum ist es dasselbe? Es gibt einen automatischen Kopierkonstruktor, und alle Manipulationen werden eine Ansicht haben:

... 
ar.Add(new(q));


So wie ich es verstehe, meinte ich new Q(q). Jetzt ist klar, dass wir über das Fehlen eines automatischen Kopierkonstruktors in MQL gesprochen haben.

 
Problem

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2018.12.21 10:23

Ich kann es nicht herausfinden, bitte um einen Hinweis. Es gibt einen solchen Zeiterwerb

int GetHandle() { return(0); }

bool SelectHandle( int ) { return(true); }
  
int NewHandle = 0;  
int PrevHandle = GetHandle();    

datetime time = SelectHandle(NewHandle) ? TimeCurrent() : 0;  
SelectHandle(PrevHandle);


Wie man ein Makro schreibt, das dasselbe tut

time = MACROS(NewHandle, TimeCurrent()); // Макрос


Das Problem ist, dass PrevHandle nicht im Makro erstellt wird.

Forum für Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

fxsaber, 2018.12.21 22:15

Lassen Sie mich klarstellen, dass NewHandle - eine Konstante sein kann. D.h. ein gültiger Aufruf wie dieser
time = MACROS(0, TimeCurrent()); // TimeCurrent из 0-хендла.
time = MACROS(1, TimeCurrent()); // TimeCurrent из 1-хендла.

MACROS(0, SymbolInfoTick(_Symbol, Tick)); // SymbolInfoTick из 0-хендла.

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
Price = MACROS(3, Bid); // Bid из 3-хендла.


Lösung

template <typename T>
T Memory( const T NewValue, const bool SetFlag = true )
{
  static T PrevValue;
  
  if (SetFlag)
    PrevValue = NewValue;
 
  return(PrevValue); 
}

template <typename T1, typename T2>
T2 MacrosFunc( const T1, const T2 Value, const T1 )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), B, SelectHandle(Memory(A)))


 
fxsaber:

Lösung

...
template <typename T1, typename T2>
T2 MacrosFunc( const T1, const T2 Value, const T1 )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), B, SelectHandle(Memory(A)))


Der Ausdruck B wird immer berechnet und zurückgegeben, unabhängig von den übrigen Angaben.

 
Alexey Navoykov:

Ihr B-Ausdruck wird immer berechnet und zurückgegeben, unabhängig von den übrigen Angaben.

Es gibt eine sequentielle (von rechts nach links) Berechnung der Eingabeparameter der Hilfsfunktionen.

 
fxsaber:

Es erfolgt eine sequentielle (von rechts nach links) Berechnung der Eingangsparameter der Hilfsfunktionen.

Was ändert sich dadurch? Das Makro gibt immer den Wert B
 
Alexey Navoykov:
Was ändert sich dadurch? Das Makro gibt immer den Wert von B

Versuchen Sie, die Entscheidung zu widerlegen. Ich sehe keinen Fehler.


Zuerst wird zu NewHandle gewechselt, dann wird B genommen, dann wird zu dem vorherigen Handle gewechselt.

 
fxsaber:

Zuerst wird zu NewHandle gewechselt, dann wird B genommen, dann wird zu dem vorherigen Handle gewechselt.

Die ursprüngliche Aufgabe lautete wie folgt:

SelectHandle(NewHandle) ? TimeCurrent() : 0; SelectHandle(PrevHandle);

D.h. die Bedingung muss erfüllt sein
 
Alexey Navoykov:

Und das war das ursprüngliche Problem:

Das ist dasselbe.

template <typename T1, typename T2>
T2 MacrosFunc( const T1 NewHandle, const T2 Value )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), SelectHandle(Memory(A)) ? B : 0)


Nachdem ich einen Kommentar abgegeben hatte, der das Problem etwas zusammenfasste - SymbolInfoTick und SymbolInfoDouble, etc.

 

Übrigens bin ich zu dem Schluss gekommen, dass im allgemeinen Fall, wenn der Rückgabetyp der Funktion ein absolut beliebiger Typ ist, das Problem mit MQL-Mitteln nicht lösbar ist. Es wird ein Decltype benötigt, der hier nicht vorhanden ist.