Merkmale der Sprache mql4, Feinheiten und Techniken - Seite 10

 
Alexey Viktorov:

Ich kann nicht verstehen, was die Überraschung ist. In der Dokumentation gibt es einen int-Wert für die Auftragsart.

OP_BUY

0

Kaufen

OP_SELL

1

Verkaufen

OP_BUYLIMIT

2

BUY LIMIT schwebende Order

OP_SELLLIMIT

3

Ausstehender SELL LIMIT-Auftrag

OP_BUYSTOP

4

Ausstehender BUY STOP-Auftrag

OP_SELLSTOP

5

Ausstehender SELL STOP-Auftrag


#define OP_BALANCE 6
#define OP_CREDIT 7

Bei einer Anordnung von 6 Zellen kann man also manchmal über Bord gehen.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Ich möchte den EA-Kommentar von der linken in die rechte Ecke verschieben?

fxsaber, 2018.07.10 15:13

// Вывод комментария по примерным координатам
void CommentXY( string Str, const uint X = 0, const uint Y = 0 )
{
  string Shift = NULL;
  
  StringInit(Shift, X >> 2, ' ');
  
  if (StringLen(Shift))
  {
    StringReplace(Str, "\n", "\n" + Shift);
    
    Str = Shift + Str;
  }
  
  if (Y)
  {
    StringInit(Shift, Y / 14, '\n');
    
    Str = Shift + Str;
  }
  
  Comment(Str);  
}


Anmeldung

void OnStart()
{
  const uint Height = 200;
  const uint Width = 200;
  
  while (!IsStopped())
  {
    CommentXY("Hello World!\nCommentXY", MathRand() * Width / SHORT_MAX, MathRand() * Height / SHORT_MAX); // Вывод комментария со сдвигом (ноль - левый-верхний угол).
    
    Sleep(200);
  }
}
 
fxsaber:

Haben Sie eine offizielle Antwort von den Entwicklern erhalten? Bis jetzt kann ich nur feststellen, dass Sie gesucht, nachgedacht und entschieden haben.

 
Artyom Trishkin:

Haben Sie eine offizielle Antwort von den Entwicklern erhalten? Bis jetzt sehe ich nur, dass Sie selbst gesucht, nachgedacht und entschieden haben.

Meine Schlussfolgerung zum Grad der "Autarkie" ist nicht besser als die zu Beginn dieses Threads

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql4, Tipps und Tricks

die Auftragsart und den dazugehörigen Preis festlegen. Es ist ausreichend, OrderClosePrice() zu schreiben


Kein Grund, an Unsinn/Paranoia zu leiden.

 
fxsaber:

Meine Schlussfolgerung zum Grad der "Selbstständigkeit" ist nicht größer als die zu Beginn dieses Threads


Es gibt keinen Grund, an Unsinn/Paranoia zu leiden.

Sie müssen die Zeit verpasst haben, als die meisten, die nicht unter "Paranoia" litten, dringend ihre Codes umschrieben, da die EAs über Nacht zusammenbrachen. Wegen der Abhängigkeit von der Triage. Es ist lange her, aber die Menschen haben noch Erinnerungen daran. Diejenigen, die in Schwierigkeiten gerieten, begannen, sortierungsunabhängige Codes zu schreiben. Ich bin nicht in Schwierigkeiten geraten - ich habe es nur im Forum gelesen und es mir zu Herzen genommen.

 
Artyom Trishkin:

Sie müssen die Zeit verpasst haben, als die meisten, die nicht unter "Paranoia" litten, dringend ihre Codes umschrieben, weil die EAs über Nacht zusammenbrachen. Wegen der Abhängigkeit von der Triage. Es ist lange her, aber die Menschen haben noch Erinnerungen daran. Diejenigen, die in Schwierigkeiten gerieten, begannen, sortierungsunabhängige Codes zu schreiben. Ich bin nicht in Schwierigkeiten geraten - ich habe es nur im Forum gelesen und es mir zu Herzen genommen.

Leider lässt sich dieser Mythos in der Geschichte des Forums nicht belegen. Darüber hinaus haben die Entwickler immer wieder deutlich gemacht, dass solche Änderungen grundsätzlich nicht vorgenommen werden können.


Sie können zum Beispiel schreiben

if (OrderType() <= OP_SELL)
  ReverseType = 1 - OrderType();


anstelle von

if ((OrderType() == OP_BUY) || (OrderType() == OP_SELL))
  ReverseType = (OrderType() == OP_BUY) ? OP_SELL : OP_BUY;


Sie können gerne schreiben

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten der Sprache mql4, Tipps und Tricks

fxsaber, 2018.04.03 16:15

double Lots[] = {0, 0, 0, 0, 0, 0, 0, 0};

for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    Lots[OrderType()] += OrderLots();

usw.

 
fxsaber:

Leider lässt sich dieser Mythos in der Geschichte des Forums nicht belegen. Darüber hinaus haben die Entwickler immer wieder deutlich gemacht, dass solche Änderungen grundsätzlich nicht vorgenommen werden können.

Sie können zum Beispiel wie folgt schreiben


Wozu all diese Pseudo-Optimierungen, deren Nuancen wir ständig im Auge behalten müssen? Ist es wirklich so schwierig, Code zu schreiben, der nicht von solchen Annahmen (Bedeutung einer benannten Konstante) abhängt? Welchen Sinn haben solche Konstrukte überhaupt, abgesehen davon, dass sie ein gewisses Wissen über die Feinheiten des Compilers zeigen, aber keineswegs, dass sie leichter zu verstehen sind?

 
Ihor Herasko:

Wozu all diese Pseudo-Optimierungen, deren Nuancen man ständig im Auge behalten muss? Ist es wirklich so schwer, Code zu schreiben, der nicht von solchen Annahmen abhängt (was bedeutet diese oder jene benannte Konstante)? Welchen Sinn haben solche Konstrukte überhaupt, abgesehen davon, dass sie ein gewisses Wissen über die Feinheiten des Compilers zeigen, aber keineswegs, dass sie leichter zu verstehen sind?

Es ist seltsam, ich habe keine Probleme mit dem Lesen eines solchen Codes. Außerdem ist er schneller zu lesen und zu verstehen als ein "kanonischer" Code.

Nun, das obige Beispiel mit Lots[] ist ein Schatz, der zeigt, wie der Code gleichzeitig super-lakonisch und klar sein kann. Und wohlgemerkt, es ist überhaupt nicht "kanonisch".

Wenn Sie sich den Quellcode vieler Market/Freelance-Jobs ansehen, werden Sie wahrscheinlich nicht nur auf Fetzen von "kanonischem" Code stoßen, sondern auch auf schreckliche Ineffizienz bei der Leistung und nicht zuletzt auf den wichtigsten Faktor - das Verständnis des Codes beim Lesen.


Die gleiche unauslöschliche Liebe zur Fortsetzung ist eine totale Missachtung der Möglichkeiten der Sprache. Ein Code mit 100 Zeilen wird viel besser wahrgenommen als ein Code mit 200 Zeilen, der die gleiche Aufgabe erfüllt. Das ist der Grund, warum sich die Leute anfangs über MQL5 beschwert haben. Schauen Sie sich die Umgestaltung des MT4-Codes in QB für MT5 an - es ist fast unmöglich, die Logik von TC zu verstehen (der Code ist viel größer). Es ist einfacher, das MT4-Original aufzurufen und sich den Code anzusehen.

 
fxsaber:

Seltsamerweise habe ich kein Problem damit, solchen Code zu lesen. Außerdem ist er schneller zu lesen und zu verstehen als ein "kanonischer" Code.

In vielen Softwareunternehmen würde man sich für solchen Code die Finger abhacken. Das erste, was Sie immer und überall vermeiden müssen, ist "unnötiges Lesen". Zum Beispiel, wenn Sie bei der Eingabe einer Funktion eine Bedingung verwenden:

if (<условие>)
{
}

Es wird empfohlen, zu schreiben:

if (!<условие>)
   return;

Dieser Ansatz macht das Anbringen von Bedingungen wirklich überflüssig.

Nun, das obige Beispiel mit Lots[] ist eine wahre Fundgrube, die zeigt, wie Code sowohl super-lakonisch als auch völlig verständlich sein kann. Und wohlgemerkt, sie ist keineswegs "kanonisch".

Und wieder einmal ist es ein Ärgernis. Weil niemand überprüft hat, was die Funktion OrderType() zurückgibt. Oder vielleicht hat er -1 oder 6 zurückgegeben? Dies ist ein Beispiel dafür, dass man sich in die Eigenschaften des Compilers einmischt, was man auf jeden Fall vermeiden sollte. Sie selbst führen viele Beispiele für plattformübergreifenden Code an. Warum weichen Sie also in diesem Fall davon ab? Wenn ein neuer MQ-Compiler herauskommt, wird dieser Code nicht mehr korrekt funktionieren.

Die gleiche unauslöschliche Liebe zur Fortsetzung ist eine völlige Missachtung der Möglichkeiten der Sprache. Ein 100-zeiliger Code ist viel besser verständlich als ein 200-zeiliger Code, der dasselbe tut. Das ist der Grund, warum sich die Leute anfangs über MQL5 beschwert haben. Schauen Sie sich die Umgestaltung des MT4-Codes in QB für MT5 an - es ist sehr schwierig, die Logik von TC zu verstehen (der Code ist viel größer). Es ist einfacher, das MT4-Original aufzurufen und sich den Code anzusehen.

Mit continue ist es die gleiche Situation. Code wie:

if (OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == m_nMagicNumber)
{
}

ist schwieriger zu lesen als:

if (!OrderSelect(i, SELECT_BY_POS))
   continue;

if (OrderSymbol() != Symbol())
   continue;

if (OrderMagicNumber() != m_nMagicNumber)
   continue;
Und doch ist die Effizienz der Ausführung in beiden Fällen die gleiche.