Diskussion zum Artikel "LifeHack für Händler: ForEach mit #define zubereiten"

 

Neuer Artikel LifeHack für Händler: ForEach mit #define zubereiten :

Eine Zwischenstufe für diejenigen, die immer noch in MQL4 schreiben und nicht auf MQL5 umsteigen können. Wir suchen weiter nach den Möglichkeiten, Codes im MQL4-Stil zu schreiben. Diesmal betrachten wir die Makrosubstitution des Präprozessors #define.

Das Erstellen von Expert Advisors oder Handelsrobotern geht immer mit viel Arbeit mit Schleifen einher. Schleifen umringen uns: Iteration über Orders, Trades in der Historie, Objekte im Chart, Symbolen in der Marktübersicht, Balken im Indikatorpuffer. Um das Leben des Programmierers ein bisschen zu erleichtern, wurden zum MetaEditor Snippets hinzugefügt. Wenn Sie anfängliche Zeichen eingeben und Tab drücken, werden sie automatisch zu einem kleinen Codeteil. So funktioniert ein Snippet für die for-Schleife:


Nicht schlecht, aber das erfüllt nicht alle unsere Bedürfnisse. Das einfachste Beispiel: sei es, wir müssen über alle Symbole in der Marktübersicht iterieren.

Autor: Vladimir Karputov

 
Zum Sparschwein

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: CDouble & CDoubleVector

amrali, 2018.02.12 23:53

#define  forEach(element, array)  for (int __i = 0, __max = ArraySize((array)); __i < __max && ((element) = array[__i]) == (element); __i++)
Alles muss in die Interna von for gestopft werden, damit man forEach wiederholt aufrufen kann. Sonst wird es ein Gedöns mit umdefinierten Variablen.
 
HistorySelect vor TimeCurrent ist ein typischer Fehler. Da die Bedeutung der Aussagen für jemanden vom Autor abhängen kann, hier eine Reihe von Zitaten

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

FORTS. Fragen zur Ausführung

Renat Fatkhullin, 2015.02.10 08:16

Ich habe den Code noch nicht ausgeführt, aber der Quellcode zeigt den klassischen Fehler des falschen Enddatums in HistorySelect.

Jeder erste Programmierer, der diese Funktion mit falschem Datum aufruft, schnappt sich ständig das Ende der Historie und stellt fest, dass ein "Long Time Trade in die Historie gelangt".

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

FORTS. Fragen zur Ausführung

Renat Fatkhullin, 2015.02.10 09:15

Der Fehler besteht darin, dass die Leute nicht darüber nachdenken, was der aktuelle Zeitpunkt ist, und ein falsches Datum aus einer falschen Quelle einsetzen.

Es genügt, ein bekanntes, weit entferntes Datum als Enddatum anzugeben, nicht die veraltete ServerTime.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

FORTS. Fragen zur Ausführung

Renat Fatkhullin, 2015.02.10 13:56

Und das Start- und Enddatum sollte mit der Realisierung von Fehlern und mit einer obligatorischen Marge festgelegt werden. Das heißt, minus N sec und plus N sec als Minimum.

TimeTradeServer() ist keine rltime-genaue Zeit, sondern wird nur auf Preis-Ticks aktualisiert, die in der Marktübersicht eingehen.


Wenn Sie plötzlich keine Daten in der Verlaufsstichprobe haben, bedeutet dies zu 99 %, dass der Fehler in den Abfragegrenzen liegt.

HistorySelect(0, LONG_MAX);
 

Предопределённые переменные _XXXX переводятся в функции MQL5 при помощи беспараметрической формы #define:

//--- die Variable _Digits speichert die Anzahl der Stellen nach dem Dezimalpunkt,
#define _Digits         Digits()
Warum?! Außerdem können Sie mit einem solchen Makro _Digits nicht als Eingabeparameter für einige Funktionen verwenden. Das heißt, der Code wird nicht mehr funktionieren.
 
//--- der letzte bekannte Verkäuferpreis (Briefkurs) für das aktuelle Symbol 
double GetAsk()
  {
   MqlTick tick;
   SymbolInfoTick(Symbol(),tick);
   return(tick.ask);
  }

Furchtbar teuer! Wenn Sie es wirklich durch die Struktur tun wollen, sollten Sie es zumindest getan haben. Und aus irgendeinem Grund gibt es keine Prüfung.

SymbolInfoDouble ist voll MT4-kompatibel.

 
#define IsTradeContextBusy  true

Hm?

vielleicht falsch?
 
Für MarketInfo ist es besser, den Ansatz über Aufzählungen + Überladungen zu verwenden

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Expert Advisors: Quantum 103

fxsaber, 26.09.2017 09:55 Uhr.

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

bool IsTesting(void)            { return(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)); }
bool IsTradeContextBusy( void ) { return(false); }
bool IsTradeAllowed(void)       { return(MQLInfoInteger(MQL_TRADE_ALLOWED)); }
bool IsExpertEnabled(void)      { return(AccountInfoInteger(ACCOUNT_TRADE_EXPERT)); }

int    ObjectFind( const string Name )   { return(ObjectFind(0, Name)); }
int    ObjectsTotal( void )              { return(ObjectsTotal(0)); }
bool   ObjectDelete( const string Name ) { return(ObjectDelete(0, Name)); }
string ObjectName( const int Pos )       { return(ObjectName(0, Pos)); }

double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
{
 double Margin;

 return(OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
        SymbolInfoDouble(Symb, (Cmd == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID), Margin) ?
        AccountInfoDouble(ACCOUNT_MARGIN_FREE) - Margin : -1);
}

#define False false
#define True  true

#define Digits _Digits
#define Point  _Point

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_DIGITS    SYMBOL_DIGITS
#define MODE_STOPLEVEL SYMBOL_TRADE_STOPS_LEVEL
#define MODE_SPREAD    SYMBOL_SPREAD

#define StrToTime    StringToTime
#define StrToInteger StringToInteger
#define TimeToStr    TimeToString
#define DoubleToStr  DoubleToString

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
 
Lediglich vereinfachte Handelsfunktionen von MQL4 fehlen für eine vollständige Kompatibilität. Aber auch dieses Problem kann auf Wunsch gelöst werden.
Dazu müssen Sie beide Architekturen sehr gut verstehen. Nicht alles ist noch offensichtlich.
 

fxsaber:
В копилку

#define  forEach(element, array)  for (int __i = 0, __max = ArraySize((array)); __i < __max && ((element) = array[__i]) == (element); __i++)

Interessante und nicht offensichtliche Technik )

 

Wie viele verdrehte Dinge kann man tun?

Definieren ist eine dumme Ersetzung eines Textes durch einen anderen. Darin liegt keine Macht!

Versuchen Sie lieber, dasselbe bei Vorlagen zu tun.

 
Koldun Zloy:

Wie oft können Sie das tun?

Definieren ist eine dumme Ersetzung eines Textes durch einen anderen. Darin liegt keine Macht!

Weniger Text ist manchmal praktisch

Versuchen Sie lieber, dasselbe mit Vorlagen zu tun.

Es ist nur eine Frage der Machbarkeit, Benutzerfreundlichkeit und Leistung.