Fehler, Irrtümer, Fragen - Seite 148

 
EQU:

Und wieder - der Code... Code... Code ist gut... aber er ist auch - Taktik, Zyklen... ;)

Bekommt das Diagramm nicht die Meldung, dass ein neuer Balken erstellt wurde? Ich kann es nicht glauben...)))

Ist es ein Problem, daraus ein Ereignis zu machen? Ist es zumindest eine vordefinierte Variable?

Im Allgemeinen ist es einfacher, Ereignisse zu verarbeiten, als einen Berg von Code zu füllen. Und außerdem - mit Fehlern (FEHLERFREIE PROGRAMME gibt es NIE!!! )))))

Ich stimme Ihnen absolut zu, dass die neue Bar ein Ereignis ist und dass sie programmiert werden kann (und sollte). Es gibt einen Zweig unter https://www.mql5.com/ru/forum/1031, den Sie in Ruhe lesen können, aber ich habe jahrelang damit zu kämpfen...

Z.I. Ich denke, nachdem Sie dies gelesen haben, werden Sie sehen, dass die neue Bar vielleicht NIE erscheinen wird... ein Loch...

Обсуждение статьи "Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5"
Обсуждение статьи "Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5"
  • www.mql5.com
Обсуждение статьи "Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5".
 
EQU:

Nochmals, Code... Code... Code ist gut... aber auch Taktiken, Schleifen... ;)

Bekommt das Diagramm nicht die Meldung, dass ein neuer Balken erstellt wurde? Ich kann es nicht glauben...)))

Ist es ein Problem, daraus ein Ereignis oder zumindest eine vordefinierte Variable zu machen?

Im Allgemeinen ist es einfacher, Ereignisse zu verarbeiten, als einen Berg von Code zu füllen. Und außerdem - mit Fehlern (FEHLERFREIE PROGRAMME gibt es NIE!!! )))))

Wie sehen Sie das im Allgemeinen? 20 Zeitrahmen x Anzahl der Symbole in der "Marktbeobachtung" und das Ereignis OnNewBar wird für jeden von ihnen erzeugt? Und Sie müssen jeden einzelnen verarbeiten, um festzustellen, auf welches Symbol und welchen Zeitrahmen er sich bezieht? Jetzt haben Sie die Wahl: Schreiben Sie Ihre eigene Funktion NewBar und definieren Sie darin, welche neuen Balken Sie erhalten möchten: alle Perioden für ein Symbol, alle Symbole für die aktuelle Periode oder einen Sonderfall. Dies ist eine einfache Funktion. Dies ist besser als die generische Funktion OnNewBar mit vielen Prüfungen.
 

Beim Testen wird ein Fehler erzeugt

CTrade::PositionClose::OrderCheck: Ungültige Stop(s)-Anforderung
In meinem Expert Advisor gibt es die folgenden Zeilen

Beschreibung der Variablen (im Verfahren)

CTrade m_trade;

..................

Position schließen

m_trade.PositionClose(_Symbol, eSlippage);

warum wird ein Fehler angezeigt? CTrade::PositionClose::OrderCheck: Ungültige Stop(s)-Anforderung

falsche SL und/oder TP
TRADE_RETCODE_INVALID_STOPS

Was haben Stopps mit dem Schließen von Positionen zu tun, oder habe ich etwas übersehen?

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
Prival:

Ich stimme Ihnen absolut zu, dass eine neue Bar ein Ereignis ist und dass sie programmiert werden kann (und sollte). Es gibt einen Threadauf https://www.mql5.com/ru/forum/1031, den Sie in Ruhe lesen können, aber ich kämpfe schon seit Jahren...

Z.I. Ich denke, nachdem Sie dies gelesen haben, wird Ihnen klar sein, dass der neue Balken NIE erscheinen darf... ein Loch...

Ich bin das Risiko eingegangen, mir den Link anzusehen... Ich denke, Sie sollten es wirklich lesen... in aller Ruhe... ;)

Das ist der Grund für den Wunsch nach einer solchen Veranstaltung... Keine Bar, keine Veranstaltung.

 
Valmars:
Wie stellen Sie sich das eigentlich vor? 20 Zeitrahmen x Anzahl der Symbole in "Market Watch" und für jedes einzelne wird das OnNewBar-Ereignis erzeugt? Und Sie müssen jedes einzelne verarbeiten, um festzustellen, auf welches Symbol und welchen Zeitrahmen es sich bezieht? Jetzt haben Sie die Wahl: Schreiben Sie Ihre eigene Funktion NewBar und definieren Sie darin, welche neuen Balken Sie erhalten möchten : alle Perioden für ein Symbol, alle Symbole für die aktuelle Periode oder einen Sonderfall. Dies ist eine einfache Funktion. Sie ist besser als die universelle OnNewBar-Funktion mit vielen Prüfungen.

20 timeframes... es ist nicht die Grenze für eine ulong Parameter... Füllen einer ganzen Variable einmal in einer Minute ist richtig, nicht schwer...

Warum, OnTick schaut auf "x Anzahl von Zeichen in der 'Market Watch' und erzeugt ein Ereignis für jedes..." ?????

Und der Bit-Check ist, glauben Sie mir, eine ziemlich schnelle Sache...

Und selbst bei einer Veranstaltung

- niemand wird mich zwingen, es zu verarbeiten - kein Grund...

- Und selbst wenn Sie ein Ereignis haben, hindert Sie nichts daran, "Ihre eigene NewBar-Funktion zu schreiben und zu definieren, ob Sie neue Balken erhalten wollen" - falls nötig...

 
Interesting:

Auch jetzt noch ist es einfach, wenn man weiß, wie man es macht. Die Entwickler haben versprochen, OnTrade() umzuschreiben und die erforderlichen Parameter hinzuzufügen.

Niemand hindert Sie daran, solche Situationen lokal zu behandeln, in OnTick() oder OnTime() - am Ort der Handelsoperation; oder in OnTrade(), wenn Sie Benutzeraktionen oder Handelsoperationen abfangen müssen, die nicht direkt vom Code gesteuert werden.

Leichtigkeit ist ein relativer Begriff, und für den einen wird sie in Gramm, für den anderen in Tonnen gemessen. In meinem Expert Advisor musste ich es JEDOCH tun (wenn mein Code so genannt werden kann), weil es keine PROSTO-Varianten in meiner Sprache gibt, obwohl sie sehr wohl existieren könnten, imho. Und ich war nicht besonders glücklich darüber, dass der Code um hundert Zeilen länger wurde und dadurch komplizierter erschien.

Hier liegt das Problem im Allgemeinen:

Ein Tick kommt, der Indikator zeigt an, dass ich schließen muss, ich schließe

Wenn der nächste Tick kommt, zeigt der Indikator an, dass er geschlossen werden muss, und ich weiß nicht, was ich tun soll - die Position ist bereits positioniert und es ist natürlich unmöglich herauszufinden, was im Moment passiert, aber ich weiß es nicht.

Ich verstehe nicht, warum diese Komplexität hier noch vorhanden ist? Ich verstehe nicht, warum wir im onTrade()-Ereignis eine Menge Code schreiben müssen, um zu verstehen, was passiert ist?

Ich bin für Einfachheit, und wenn sie nicht da ist, macht mich das traurig.

 
Vladix:

Leichtigkeit ist ein relativer Begriff, und für den einen wird sie in Gramm, für den anderen in Tonnen gemessen. Ich musste es in EA tun (wenn mein Code als solcher bezeichnet werden kann), weil es keine PROSTO-Varianten in der Sprache gibt, obwohl sie imho sehr wohl existieren könnten. Und ich war nicht besonders glücklich darüber, dass der Code um hundert Zeilen länger wurde und dadurch komplizierter erschien.

Hier liegt das Problem im Allgemeinen:

Ein Tick kommt, der Indikator zeigt an, dass ich schließen muss, ich schließe

Wenn der nächste Tick kommt, zeigt der Indikator an, dass er geschlossen werden sollte, und ich weiß nicht, was ich tun soll - die Position hängt bereits, und natürlich kann ich herausfinden, was im Moment passiert, aber ich weiß es nicht.

Ich verstehe nicht, warum diese Komplexität hier noch vorhanden ist? Ich verstehe nicht, warum uns im onTrade()-Ereignis vorgeschlagen wird, eine Menge Code zu schreiben, um zu verstehen, was passiert ist?

Ich bin für Einfachheit, und wenn sie nicht da ist, macht mich das traurig.

Ich habe es getan, der Code ist weniger als hundert Zeilen ... :) Die Lösung ist zuverlässig und sofort für Multicurrency

//+----------------------------------------------------------------------------+
// Функция контроля открытия ордера на текущем баре               MQL5         |
//-----------------------------------------------------------------------------+
bool ЕстьОрдернаТекущемБаре(ENUM_ORDER_TYPE тип)
  {
   ulong тикет;
   HistorySelect(SeriesInfoInteger(СИМВОЛ,Period(),SERIES_LASTBAR_DATE),TimeCurrent());
   for(int i=0;i<HistoryDealsTotal();i=i+1)
     {
      тикет=HistoryDealGetTicket(i);
      if(HistoryDealGetString(тикет,DEAL_SYMBOL)!=СИМВОЛ || HistoryDealGetInteger(тикет,DEAL_ENTRY)==DEAL_ENTRY_STATE)// || HistoryDealGetInteger(тикет,DEAL_MAGIC)!=MAGIC
         continue;
      if(HistoryDealGetInteger(тикет,DEAL_TYPE)==тип || HistoryDealGetInteger(тикет,DEAL_TYPE)==DEAL_ENTRY_INOUT)
         return(true);
     }
   return(false);
  }
Sie können einen beliebigen Zeitraum anstelle des Zeitraums angeben, in dem sich der EA gerade befindet. D.h. Bestellungen werden nicht mehr als einmal pro Zeitraum aufgegeben

Und nach jeder Handelsanfrage sollten wir eine Verzögerung einführen, die die Handelsanfrage innerhalb von 30 Sekunden (zum Beispiel) verbietet. Andernfalls kann es sein, dass der Auftrag beim nächsten Tick nicht mehr in der Historie erscheint.
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
 
Valmars:
Wie stellen Sie sich das im Allgemeinen vor? Im Allgemeinen besteht die Idee darin, 20 Zeitrahmen x die Anzahl der Symbole in der "Market Watch" zu haben, und für jeden von ihnen wird das OnNewBar-Ereignis generiert? Und Sie müssen jedes Symbol und jeden Zeitrahmen verarbeiten, um festzustellen, auf welches es sich bezieht? Jetzt haben Sie die Wahl: Schreiben Sie Ihre eigene Funktion NewBar und definieren Sie darin, welche neuen Balken Sie erhalten möchten: alle Perioden für ein Symbol, alle Symbole für die aktuelle Periode oder einen Sonderfall. Dies führt zu einer spezifischen und unkomplizierten Funktion. Das ist besser als eine universelle OnNewBar-Funktion mit einer Vielzahl von Prüfungen.

Eine Standardlösung sollte in etwa wie folgt aussehen

1. Das Ereignis sollte an den offenen Chart, seine Periode und das Symbol gebunden sein. Das Ereignis muss eintreten, wenn ein neuer Takt erscheint (Löcher werden ignoriert).

Ereignisse müssen in einem separaten Terminal-Thread (oder Threads) behandelt werden.

PS

Also weiter. Natürlich ist dies nur eine grobe Annäherung, ohne viele Besonderheiten zu berücksichtigen...

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

Vladix:

Das eigentliche Problem ist folgendes:

ein Tick kommt herein, der Indikator zeigt an, dass er geschlossen werden muss, ich schließe

Wenn der nächste Tick kommt, zeigt der Indikator an, dass er schließen muss, und ich weiß nicht, was ich tun soll - die Position hängt schon und man kann natürlich wissen, was im Moment passiert, aber mitten im Nirgendwo.

Ich verstehe nicht, warum diese Komplexität hier noch vorhanden ist? Ich verstehe nicht, warum uns im onTrade()-Ereignis vorgeschlagen wird, eine Menge Code zu schreiben, um zu verstehen, was passiert ist?

Ich bin für Einfachheit, und wenn man sie nicht hat, wird es traurig

Vielleicht werden die Entwickler Parameter zu OnTrade() hinzufügen, zumindest haben sie daran gedacht. Soweit ich weiß, gab es sogar einige Erklärungen dazu.
 
Dmitriy2:

Auf diese Weise gemacht, weniger Code als hundert Zeilen... :) Lösung ist zuverlässig und sofort für Multiwährung

Anstelle des Zeitraums, in dem der EA ruht, können wir einen beliebigen Zeitraum angeben. Dies bedeutet, dass Bestellungen nicht häufiger als einmal pro Zeitraum aufgegeben werden können.

Und nach jeder Handelsanforderung sollten wir eine Verzögerung einführen, die die Handelsanforderung innerhalb von 30 Sekunden (zum Beispiel) deaktivieren würde. Andernfalls kann es sein, dass der Auftrag beim nächsten Tick nicht mehr in der Historie erscheint.

Setzen Sie eine Verzögerung - ja, ich akzeptiere, wie viele Codezeilen werden dafür benötigt? Und wenn es um mehrere Währungen geht, muss die Verzögerung bei jeder einzelnen Währung berücksichtigt werden, nicht wahr?

Ich habe den Code zur Lösung dieses Problems geschrieben. Nur gefällt sie mir nicht, genauso wenig wie mir Ihre gefällt, tut mir leid. Und es geht nicht um Voreingenommenheit, sondern darum, dass es keine anderen Möglichkeiten gibt, einfach und elegant.