Die Sprache MQL5 von Grund auf selbst erlernen - Seite 58

 
MrBrooklin:

Ich habe eine Standardvorlage erstellt. Hier habe ich angefangen, den Code zu schreiben, und hier habe ich begonnen, die bereits geschriebenen Fragmente zu veröffentlichen. Ich habe noch nicht über den Algorithmusrahmen mit meinen eigenen Funktionen nachgedacht, danke für den Tipp! Danke auch für den Tipp mit dem Verrechnungskonto!


Es gibt eine solche Technik aus der Alphabetisierungsprogrammierung - sie ermöglicht es, sehr schnell und verständlich zu schreiben.

Schreiben Sie im Allgemeinen in literarischem Stil in die Kommentare, was Sie tun werden (nur die wichtigste direkte Folge)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

Im Grunde alle. Außerdem schreiben Sie nach jedem Kommentar einen Code von 3-5 (im Allgemeinen etwas) Zeilen. Ihre gesamte Funktion sollte von Anfang bis Ende in den Bildschirm passen, den Sie sehen. Wenn Sie mehr erhalten, bedeutet dies, dass die Fragmente in separate Funktionen/Methoden aufgeteilt werden müssen.

Wenn eine so elementare Sache im Tester zu funktionieren beginnt, kann man verallgemeinern, Bedingungen aus dem wirklichen Leben hinzufügen, z.B. Schrittwechsel oder Frequenz, Marktbedingungen berücksichtigen, der Perfektion sind keine Grenzen gesetzt...

 
Maxim Kuznetsov:

abstrakt gibt es eine Alphabetisierungsmethode, mit der man sehr schnell und deutlich schreiben kann.

Schreiben Sie im Allgemeinen in literarischem Stil in die Kommentare, was Sie tun werden (nur die wichtigste direkte Folge)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

Im Grunde alle. Außerdem schreiben Sie nach jedem Kommentar einen Code von 3-5 (im Allgemeinen etwas) Zeilen. Ihre gesamte Funktion sollte von Anfang bis Ende in den Bildschirm passen, den Sie sehen. Wenn Sie mehr erhalten, bedeutet dies, dass die Fragmente in separate Funktionen/Methoden aufgeteilt werden müssen.

Wenn eine so elementare Sache im Tester zu funktionieren beginnt, kann man sie verallgemeinern, Bedingungen aus dem wirklichen Leben hinzufügen, z.B. Schrittwechsel oder Frequenz, Marktbedingungen berücksichtigen, der Perfektion sind keine Grenzen gesetzt...

Hallo Maxim, du bist sehr hilfreich mit deinem Tipp! Ich sitze hier und frage mich, wie man eine Standard-EA-Vorlage ausfüllt.

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin:

Liebe Programmierungsexperten!

Bitte erläutern Sie zwei Fragen:

  1. Erste Frage zur Magic Number - wird sie in den Eingabeparametern nur für schwebende Aufträge und offene Positionen erstellt (oder nur für offene Positionen?), oder kann sie auch für den EA selbst erstellt werden? Wenn die Antwort "ja" lautet, zu welchem Zweck sollte dies geschehen? Diese Frage hat mich wirklich verwirrt und ich habe keine gute Antwort.
  2. Die zweite Frage zur Magic Number - wenn es mehr als eine offene Position im aktuellen Chart gibt, dann ist es möglich, einen solchen Eingabeparameter anzuwenden, um jede Position zu bestimmen:

Vielleicht habe ich ein falsches Verständnis von der Anwendung der Magischen Zahl in der Programmierung.

Mit freundlichen Grüßen, Vladimir.

Wenn ein Auftrag zur Ausführung angenommen wird, werden alle seine Merkmale (Symbol, Zeit, Auftragsart, Ticket) vom Terminal zugewiesen (vom Benutzer angefordert und vom Terminal zugewiesen) und nicht vom Benutzer. Das Gleiche gilt für die Position, die Informationen über ihre Aufträge speichert, von denen es jedoch viele geben kann. Und die magische Zahl ist eine Benutzerkennung. Zitat:

Wenn wir einen neuen schwebenden Auftrag erstellen, müssen wir ihn irgendwie kennzeichnen - damit das Programm weiß, dass dieser bestimmte Auftrag von NAMI für diesen bestimmten schwebenden Auftrag erteilt wurde - das heißt, wir müssen einen Auftrag oder eine Position eindeutig identifizieren und mit einem bestimmten schwebenden Auftrag verknüpfen.

NAMI fehlt in seiner Bedeutung. Und dann gibt Artem die Klassifizierung der Aufträge in die Magik-Nummer ein. Warum nicht, die ersten 2 Ziffern geben etwas an, z.B. die Auftragsart, die nächsten 4 Ziffern geben das Datum des Auftrags an.

In Bezug auf den Algorithmus von etwas. Legen Sie zunächst die Anfangsbedingungen fest. Es gibt Aufträge, die auf unserem Symbol stehen und die wir nicht berücksichtigen oder die wir berücksichtigen. Ohne Anfangsbedingungen Nacharbeit bei der Erstellung des Algorithmus, und noch mehr so kann der Code ewig sein)

 
Maxim Kuznetsov:

abstrakt gibt es eine Alphabetisierungsmethode, mit der man sehr schnell und deutlich schreiben kann.

Schreiben Sie in den Kommentaren, was Sie tun werden (nur die wichtigste direkte Sequenz) ...

... Im Grunde alle. Als Nächstes schreiben Sie nach jedem Kommentar 3-5 (im Allgemeinen nicht viel) Zeilen Code. Die gesamte Funktion vom Anfang bis zum Ende sollte in den Bildschirm passen, den Sie sehen. Wenn Sie mehr erhalten, bedeutet dies, dass Sie die Fragmente in separate Funktionen/Methoden aufteilen müssen.

Maxim, bitte überprüfen Sie, ob ich Ihren Hinweis richtig verstanden habe, oder gibt es noch etwas, das ich hinzufügen muss? Ich meine den Testteil, denn ich habe die Codes noch nicht geschrieben.

Mit freundlichen Grüßen, Vladimir.

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры: "Уровень перестановки Stop Loss в безубыток" и "Шаг трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---

// 1. берём позицию Buy
// 2. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 4. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 
MrBrooklin:

Maxim, bitte sehen Sie nach, ob ich Ihren Hinweis richtig verstanden habe, oder gibt es noch etwas, das ich hinzufügen muss? Ich meine den Testteil, abgesehen von den Codes.

Mit freundlichen Grüßen, Vladimir.

Ausgangsbedingungen. Wir berechnen, dass es eine Position auf unserem Symbol gibt, und wir sehen sie auf dem Chart.

Wenn wir eine Position haben, ist es nur eine, entweder kaufen oder verkaufen. Wir beginnen daher mit der Suche nach Positionen auf unserem Symbol. Merkmale anfordern/erhalten. Bestimmung der Positionsart - Kauf oder Verkauf. Und so geht es weiter durch den Text.

 
Valeriy Yastremskiy:

Wenn ein Auftrag zur Ausführung angenommen wird, werden alle seine Merkmale (Symbol, Ausstellungszeitpunkt, Auftragsart, Ticket) vom Terminal zugewiesen (vom Benutzer angefordert und vom Terminal zugewiesen), nicht vom Benutzer, und dasselbe gilt für die Position, die Informationen über ihre Aufträge speichert, von denen es jedoch viele geben kann. Und die magische Zahl ist eine Benutzerkennung. Zitat:

Wenn wir einen neuen schwebenden Auftrag erstellen, müssen wir ihn irgendwie kennzeichnen - damit das Programm weiß, dass dieser bestimmte Auftrag von NAMI für diesen bestimmten schwebenden Auftrag erteilt wurde - das heißt, wir müssen einen Auftrag oder eine Position eindeutig identifizieren und mit einem bestimmten schwebenden Auftrag verknüpfen.

NAMI fehlt in seiner Bedeutung. Und dann gibt Artem die Klassifizierung der Aufträge in die Magik-Nummer ein. Warum nicht, die ersten 2 Ziffern geben etwas an, z.B. die Auftragsart, die nächsten 4 Ziffern geben das Datum des Auftrags an.

In Bezug auf den Algorithmus von etwas. Legen Sie zunächst die Anfangsbedingungen fest. Es gibt Aufträge, die auf unserem Symbol stehen und die wir nicht berücksichtigen oder die wir berücksichtigen. Ohne die Überarbeitung der Ausgangsbedingungen bei der Erstellung des Algorithmus kann der Code ewig dauern)

Vielen Dank, Valeriy, für die ausführliche Antwort. Vieles ist klarer geworden. Ich denke genauso über den Algorithmus, aber Vassily hat bereits erklärt, warum wir die Magic Number in diesem EA nicht brauchen.

Mit freundlichen Grüßen, Vladimir

 
MrBrooklin:

Vielen Dank, Valery, für die ausführliche Antwort. Es hat sich viel geklärt. Ich habe die gleiche Meinung über den Algorithmus, aber Vasiliy hat bereits erklärt, warum wir die Magic Number in diesem EA nicht brauchen.

Mit freundlichen Grüßen, Vladimir.

Wir haben ein Diagramm geöffnet und es gibt eine Position auf dem Diagrammsymbol, wir wissen nicht, was es ist, und wir wollen es zum Break-Even eröffnen und dann SL nachziehen, um Verluste zu reduzieren, falls der Preis umkehrt.

 

Mit den Korrekturen von Valery hat die EA-Vorlage mit Kommentaren ein neues Aussehen bekommen.

Mit freundlichen Grüßen, Vladimir.

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры для "Уровня перестановки Stop Loss в безубыток" и "Шага трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---
// 1. ищем все позиции на текущем символе:
//    - отправляем запрос на сервер и получаем характеристики открытых позиций
//    - определяем тип открытой позиции - Buy или Sell 
// 2. берём позицию Buy
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 4. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 5. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 

Vladimir, du musst sie nicht lange nutzen. Auf geht's ins Getümmel. Ich habe eine Vorlage für das gewünschte Trailing für Sie geschrieben:

//+------------------------------------------------------------------+
//|                                                  TestingTral.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MrBrooklin"
#property link      "http://www.mql5.com"
#property version   "1.00"
input double BreakevenValue = 100.0; // Величина безубытка, в пунктах инструмента
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //-- Выбираем позиции по текущему символу. Если позиции нет выбирать нечего - выходим
   if(!PositionSelect(Symbol()))
      return;
   //-- Стоп-лосс длинной позиции переставляем в безубыток и тралим его
   if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
   {
      SetBreakevenForBuyPosition();
      TrailingStopLossForBuyPosition();
   }
   //-- Стоп-лосс короткой позиции переставляем в безубыток и тралим его
   else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
   {
      SetBreakevenForSellPosition();
      TrailingStopLossForSellPosition();
   }
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции BUY в безубыток                         |
//+------------------------------------------------------------------+
void SetBreakevenForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции SELL в безубыток                        |
//+------------------------------------------------------------------+
void SetBreakevenForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+

Alles, was Sie tun müssen, ist, die Funktionen mit der Logik zu füllen, die ihren Namen entspricht. Wie Sie sehen können, ist die Vorlage elementar. Und strukturell ähnlich wie die ToR.

Beachten Sie, dass sich dieser Code kompilieren lässt, d. h. aus Sicht des Compilers ist er korrekt. Streben Sie immer diesen Zustand an: d.h. nehmen Sie während der Entwicklung kleine Änderungen vor, so dass der Code danach kompiliert werden kann. Streben Sie auch an, dass der Compiler "0 Fehler, o Warnungen" meldet. Es ist klar, dass man das Programm nicht mit Fehlern laufen lassen kann, aber die Warnungen des Compilers sollten als unser Vaterunser aufgefasst werden: wenn es eine Warnung gibt, muss sie korrigiert werden. Diese Vorlage wird mit "0 Fehler, o Warnungen" erstellt- speichern Sie diesen Status bis zum Ende der Entwicklung.

Wenn wir die Logik und den Compiler verstanden haben, müssen wir nur noch die Funktionen mit der notwendigen Logik ausstatten.

Der zweite Parameter, der Trail-Wert, wird vorerst in die nächste Version verschoben. Dazu sind zusätzliche Berechnungen erforderlich. Aus diesem Grund ist sie in dieser Vorlage nicht enthalten. Das Schleppnetz wird jede Sekunde hochgezogen.

 
Vasiliy Sokolov:

Vladimir, du musst sie nicht lange nutzen. Auf geht's ins Getümmel. Ich habe eine Vorlage für das gewünschte Trailing für Sie geschrieben:

Alles, was Sie tun müssen, ist, die Funktionen mit der Logik zu füllen, die ihren Namen entspricht. Wie Sie sehen können, ist die Vorlage elementar. Und strukturell ähnlich wie die ToR.

Beachten Sie, dass sich dieser Code kompilieren lässt, d. h. aus Sicht des Compilers ist er korrekt. Streben Sie immer diesen Zustand an: d.h. nehmen Sie während der Entwicklung kleine Änderungen vor, so dass der Code danach kompiliert werden kann. Streben Sie auch an, dass der Compiler "0 Fehler, o Warnungen" meldet. Es ist klar, dass man das Programm nicht mit Fehlern laufen lassen kann, aber die Warnungen des Compilers müssen als unser Vaterunser aufgefasst werden: Wenn es eine Warnung gibt, muss sie korrigiert werden. Diese Vorlage wird mit "0 Fehler, o Warnungen" erstellt- speichern Sie diesen Status bis zum Ende der Entwicklung.

Wenn wir die Logik und den Compiler verstanden haben, müssen wir nur noch die Funktionen mit der benötigten Logik versehen.

Der zweite Parameter, der Trail-Wert, wird vorerst in die nächste Version verschoben. Dazu sind zusätzliche Berechnungen erforderlich. Aus diesem Grund ist sie in dieser Vorlage nicht enthalten. Das Schleppnetz wird jeden Tick aktualisiert.

Vasiliy, ich möchte dir natürlich für deine Arbeit danken, aber es hilft mir nicht zu verstehen, woher diese Funktionen und Operatoren kommen und vor allem, warum sie da sind. Es wäre richtiger gewesen, den Code zu schreiben, wie Sie es mir vorgeschlagen haben. Ich wollte unbedingt selbst so weit kommen, und das will ich jetzt auch.

Ich verstehe, dass Sie, wie viele andere, es leid sind, dass ich ständig alle Codezeilen buchstabiere und auf der Stelle trete, aber das Problem ist, dass ich immer noch nicht verstehe, wie alles aufgebaut ist, vom Algorithmus bis zum Schreiben des Codes. Hinzu kommen mangelnde Englischkenntnisse, denn ich muss fast alle Compiler-Fehler- und Warnmeldungen sowie andere englische Wörter in Google Translator kopieren und einfügen. Übrigens, wenn jemand versucht hat, diese Mikro- oder sogar Nano-Codes auszuführen, die ich in diesem Thread gepostet habe, haben sie alle die Kompilierung mit "0 Fehler, 0 Warnungen" bestanden.

Jetzt brauche ich etwas Zeit, um zu erkennen oder besser gesagt zu verstehen, warum diese Funktionen und Operatoren erschienen sind. Kurz gesagt, es ist ein stiller Horror. Und ich bin ein schlechter Schüler, wenn ich elementare Dinge nicht verstehe.

Ich danke Ihnen und allen anderen Programmierern dafür, dass Sie meine Langsamkeit toleriert haben. Allerdings ist mir klar, dass Ihre Geduld nicht grenzenlos ist.

Mit freundlichen Grüßen, Vladimir.