Fehler, Irrtümer, Fragen - Seite 1669

 

Führt das MQ5-Programm nach Beendigung der Ausführung immer automatisch IndicatorRelease für alle von ihm erstellten Handles durch?

Oder ist es möglich, den Indikator über IndicatorCreate durch ein Skript auszuführen und dann sein Handle über globale Variablen für die weitere Arbeit mit dem Indikator zu übergeben?

 

https://www.mql5.com/ru/docs/basis/preprosessor/compilation

Konstante

Typ

Beschreibung

tester_indikator

String

Name des benutzerdefinierten Indikators im Format "indicator_name.ex5".Die zum Testen erforderlichen Indikatoren werden automatisch beim Aufruf der FunktioniCustom() ermittelt, wenn der entsprechende Parameter als konstanter String angegeben wird. In anderen Fällen (Verwendung der FunktionIndicatorCreate() oder Verwendung eines nicht konstanten Strings im Parameter, der den Indikatornamen angibt) sollte diese Eigenschaft

IndicatorCreate - fast (keine Einschränkungen bei der Anzahl der Eingabeparameter) rudiment?

Документация по MQL5: Основы языка / Препроцессор / Свойства программ (#property)
Документация по MQL5: Основы языка / Препроцессор / Свойства программ (#property)
  • www.mql5.com
Основы языка / Препроцессор / Свойства программ (#property) - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
IndicatrorRelease gibt fälschlicherweise true zurück, wenn es nach iCustom+ChartIndicatorAdd aufgerufen wird. Richtig.
 
fxsaber:
Was ist der Zähler?
Wir haben gestern darüber gesprochen, Seite 1687. :) Aber es ist besser, aus diesem Beitrag auf Seite 1686 zu lesen: https://www.mql5.com/ru/forum/1111/page1686#comment_2790746 Übrigens hat der Mann auf dieselbe Frage geantwortet wie Sie. Es stellt sich heraus, dass das Schema so aussieht. Die Aufforderung zum Aufruf des Indikators geht an das Terminal. D.h. der Expert Advisor oder das Skript ruft den Indikator nicht direkt auf, sondern das Terminal fungiert als Vermittler. Das Terminal prüft, ob dieser Indikator mit den angegebenen Parametern bereits existiert. Wenn ja, gibt es dem Programm, das den Indikator aufgerufen hat, ein Handle (Link) auf den bereits vorhandenen Indikator zurück. Und in seinem endgültigen Untergrund markiert er im Zähler, dass es einen weiteren Aufruf dieses Indikators gab. Das heißt, es wird aufgezeichnet, wie viele Griffe für diesen Indikator zurückgegeben wurden. Wenn jemand den Indikator freigibt, bedeutet das nicht, dass andere, die denselben Indikator mit denselben Parametern aufgerufen haben, diesen Indikator nicht mehr benötigen. Daher verringert das Terminal den Zähler um eins, lässt aber den Indikator aktiv, da er von jemand anderem verwendet wird. Dieser Vorgang wird so lange fortgesetzt, bis der Zähler auf Null gesetzt wird. Wenn der Zähler auf Null gesetzt wird, löscht das Terminal den Indikator dauerhaft aus dem RAM.
Wenn Sie versuchen, einen Code zu erstellen, der IndicatorRelease enthält, aber den Indikator selbst nicht aufruft, werden Sie ihn nicht kompilieren können, da Sie ein Handle an IndicatorRelease übergeben müssen, aber wenn Sie den Indikator nicht aus dem Programm heraus aufrufen, erhalten Sie kein Handle.
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • Bewertungen: 8
  • www.mql5.com
Форум трейдеров MQL5.community
 

BlackTomcat:
Вчера обсуждали, страница 1687. :) Но читать лучше вот с этого сообщения на 1686-й странице: https://www.mql5.com/ru/forum/1111/page1686#comment_2790746 Кстати, человек на Ваш же вопрос отвечал. Просто получается, что схема такая. Запрос на вызов индикатора попадает в Терминал. Т.е. советник или скрипт не вызывают индикатор напрямую, терминал выступает посредником. В терминале происходит проверка, существует ли уже такой индикатор с указанными параметрами. Если да, то он возвращает программе, вызвавшей индикатор, хэндл (ссылку) на уже существующий индикатор. А в своих терминальных недрах помечает в счётчике, что был ещё один вызов на данный индикатор. Т.е. он ведёт учёт, сколько хэндлов на данный индикатор вернул. Когда кто-то делает IndicatorRelease, это не значит, что остальным, кто вызвал этот же индикатор с такими же параметрами, этот индикатор больше не нужен. Поэтому Терминал уменьшает счётчик на единицу, но оставляет индикатор активным, потому-что им ещё кто-то пользуется.

Ich danke Ihnen! Dies ist eine große Ersparnis.

Wenn Sie versuchen, einen Code zu erstellen, der IndicatorRelease, aber keinen Aufruf des Indikators selbst enthält, werden Sie ihn nicht kompilieren können, da Sie das Handle an IndicatorRelease übergeben müssen, und wenn der Indikator nicht vom Programm aus aufgerufen wurde, werden Sie das Handle nicht erhalten.

Der Handle kann über globale Variablen übergeben werden. Daher ist es möglich, sie zu verwenden.
 
fxsaber:


Ich kann den Handle über globale Variablen übergeben. Daher ist es durchaus möglich, sie zu verwenden.
Sie müssen ihn nicht bestehen. :) Oder rufen Sie zumindest nicht IndicatorRelease() für ein auf diese Weise erhaltenes Handle auf. Wenn Sie das tun, ist das Ihr Fehler und kein Sprachfehler, meinen Sie nicht auch?
 
Sergei Vladimirov:
Und das tun Sie nicht. :) Oder rufen Sie zumindest nicht IndicatorRelease() für ein auf diese Weise erhaltenes Handle auf. Wenn Sie das tun, ist das Ihr Fehler, aber kein Fehler der Sprache, meinen Sie nicht auch?

Und ich werde eine schlechte Registerkarte für den freien Markt schreiben, die zu einem bestimmten Zeitpunkt einfach durch den gesamten positiven int-Bereich geht und IndicatorRelease für jeden versucht.

Ein solches Skript wird alle Expert Advisors und Indikatoren des Terminals abdecken, die iCustom ohne ChartIndicatorAdd verwendet haben.

 

Auch das wäre Ihre bewusste Handlung und kein Sprachfehler. Warum haben Sie das geschrieben?

Übrigens begann dieses Gespräch mit Ihrer Frage, wie man den Blinkerhebel vor der Benutzung überprüft. Nun, Sie können es nicht überprüfen, aber bei dem Versuch, ein Handle eines geschlossenen Indikators zu verwenden, erhalten Sie den Fehler 4807 - also sollten Sie es nach jedem Aufruf von CopyBuffer() überprüfen, wenn es -1 zurückgibt.

 
fxsaber:
Ich kann den Handle über globale Variablen übergeben. Es ist also durchaus möglich, sie zu verwenden.
Ähm ... Globale Variablen für was? Terminal oder EA? Ich habe noch nie mit den Terminal-Variablen gearbeitet, deshalb werde ich nicht darüber sprechen. Und was die globalen Variablen von EA angeht, so ist das die wichtigste Methode. Wenn Indikatoren in OnInit initialisiert werden, aber IndicatorRelease in OnDeinit passiert, dann werden wir nur mit globalen Variablen (EA) die Handles übergeben.
 
A100:
Ausführungsfehler: 'ungültiger Zeigerzugriff' (*)
Worauf verweist A::a hier?