Roman Sharanov: Wie erstellt man ein Array von Klasseninstanzen? Ich habe ClassName* className[], dann ArrayResize auf sie, aber es gibt mir keinen ZugriffaufMethoden
Ihre Klasse, deren Instanzen Sie in einem Array sammeln wollen, muss von CObject geerbt werden.
Und dann ist es ganz einfach: Erstellen Sie eine Liste (Array) von Objekten CArrayObj, und fügen Sie Ihre Objekte dazu.
Wenn man nach den Worten "Indikatorvorlage" und Ihrem Namen sucht, findet man nichts, und Sie haben hier bereits über den Band Krieg und Frieden geschrieben.
Jede beliebige Kombination von Wörtern aus dem Beitrag kommt mir in den Sinn.
Tja, tut mir leid, das mit der Indikatorvorlage habe ich wohl verwechselt - die Schleppnetzvorlage wurde gepostet.
Sagen wir es mal so: Erstellen Sie eine Indikatorvorlage im Editor, fügen Sie die gewünschte Anzahl von Eingangsvariablen und Puffern hinzu, die gezeichnet werden sollen.
Als Nächstes schlüsseln Sie auf, was Sie für die jeweilige Aufgabe tun müssen.
Wenn Sie sagen, dass es schlecht ist, sagen Sie mir, wie man es gut macht. Verschieben Sie die Berechnungen nach OnInit?
Fairer Tadel )) Hier eine Variante des Codes, der hier veröffentlicht wurde:
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
if(prev_calculated == 0) {
limit = rates_total - 1; //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
}
else limit = rates_total - prev_calculated + 1;
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
}
return(rates_total);
Versuchen Sie, es so zu machen. Sie müssen nichts zu OnInit verschieben.
Ich habe solchen Code hier nicht veröffentlicht - das ist nicht mein Ding :)
Ich verwende andere Konstruktionen, die einfacher und klarer sind.
Es ist meins, wie könnte es einfacher sein? ))) (zumindest habe ich in meiner Vorlage auch den Kommentarlimit = rates_total - 1;//--- Erster Aufruf des Indikators oder Wechsel des Zeitrahmens oder Laden von Daten aus der Historie) und meine Art der Formatierung - eine geschweifte Klammer bei for() {
Um zu lernen, einen eigenen Indikator zu schreiben, nehmen Sie die obige Vorlage und fügen Sie mindestens den Schlusskurs hinzu, um Ihren ersten Indikator zu erhalten, und lernen Sie dann, den MAH aus diesem Schlusskurs zu bilden
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
Buffer[i] = close[i];
}
Es ist nicht Ihr Code. Er wurde von einigen meiner Kollegen veröffentlicht, aber ich weiß nicht mehr, von wem und wo. Diesen Code habe ich gemeint, als ich sagte, dass nichts nach OnInit verschoben werden sollte, aber nicht der Quellcode. Ich war nicht ganz klar.
Und welche Konstruktion würden Sie empfehlen? Dies scheint sehr einfach zu sein.
Ah, da ist der Autor des Artikels )))) Vor mir. Übrigens verwende ich auch diese Art der Formatierung - mit einer öffnenden geschweiften Klammer in einer Zeile.
Andrei Novichkov: Ah, hier ist der Autor des Schnipsels )))) Vor mir. Übrigens verwende ich auch diese Art der Formatierung - mit einer öffnenden geschweiften Klammer in einer Zeile.
Sie führen den Assistenten zur Erstellung eines Indikators aus, wählen Linientyp und -farbe aus und fügen gegebenenfalls Eingabefelder hinzu.
und das ist alles, der Indikator ist fertig, dann kopieren Sieden Körper vonOnCalculate() der Vorlage und schreiben die Berechnungen ,
Sie können Ihren ersten Indikator in 1 Minute schreiben, den Code "Hello word I indicator! - Ich habe es gezeigt :)
ZS: Übrigens, die Indikatoren können in dieser Form von MT4 auf MT5 übertragen werden, die Hauptsache ist, die Indikatorpuffer richtig einzurichten, in MT5 gibt es einen Fauxpas bei der Indizierung der Arrays unter den Puffern.... Sie sind einfach Arrays mit der üblichen Array )))) Indizierung .... Früher war es schwierig, sich an die Indexierung der Indikatorpuffer in MT4 zu gewöhnen, jetzt ist es im Gegenteil unmöglich, sich daran zu gewöhnen und zu MT5 zu wechseln ))))
Dies ist nicht Ihr Code. Er wurde von einem meiner Kollegen veröffentlicht, aber ich weiß nicht mehr, von wem und wo. Es war dieser Code, den ich meinte, als ich sagte, dass nichts nach OnInit verschoben werden sollte, aber nicht der Quellcode. Ich war nicht ganz klar.
Und welche Konstruktion würden Sie empfehlen? Diese Aufgabe scheint sehr einfach zu sein.
Ah, da ist der Autor des Artikels )))) Vor mir.
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.if(limit>1)
// если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории// если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,// при подгрузке истории и на первом запуске - перерасчёт всей истории
{
limit=rates_total-1;
// здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
}
//--- Расчёт индикатораfor(int i=limit; i>=0 && !IsStopped(); i--)
{
// необходимые действия по расчёту индикатора
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
Ja, wofür ist der Code der Indikatorvorlage gut? Führen Sie den Assistenten aus, um einen Indikator zu erstellen , wählen Sie die Typen und Farben der Linien und fügen Sie bei Bedarf Eingaben hinzu
und das war's, der Indikator ist fertig, dann kopieren Sie den Körper aus der Vorlage OnCalculate()und schreiben Sie die Berechnungen,
Sie können Ihren ersten Indikator in 1 Minute schreiben, der obige Code lautet "Hallo Wort I Indikator!!!" Ich zeigte :)
PS: Übrigens, in dieser Form können Indikatoren von MT4 auf MT5 übertragen werden, die Hauptsache ist, die Indikatorpuffer richtig einzurichten, in MT5 gibt es einen Horror, dass mit der Indizierung von Arrays für Puffer ... es sich nur um Arrays handelt mit der üblichen Array)))) Indizierung .. .. früher war es schwierig, sich an die Indizierung von Indikatorpuffern in MT4 zu gewöhnen, jetzt ist es im Gegenteil unmöglich, sich daran zu gewöhnen und zu MT5 zu wechseln))))
Nichts kompliziertes. Ein Beispiel für einen plattformübergreifenden Indikator (verwendet eine Klasse), aber die Vorlage kann herausgezogen werden - entfernen Sie die Klasse und alles Überflüssige, das danach Fehler verursacht - die plattformübergreifende Vorlage bleibt bestehen.
Dieser Indikator funktioniert auf beiden Plattformen ohne Änderung gleich - nur Kompilierung mit der erforderlichen Erweiterung. Ich musste den Code in zwei Teile aufteilen - die Klasse und den Indikator selbst (alles war in einem Listing)
Wie erstellt man ein Array von Klasseninstanzen?
Ich habe ClassName* className[], dann ArrayResize auf sie, aber es gibt mir keinen Zugriff auf Methoden
Ihre Klasse, deren Instanzen Sie in einem Array sammeln wollen, muss von CObject geerbt werden.
Und dann ist es ganz einfach: Erstellen Sie eine Liste (Array) von Objekten CArrayObj, und fügen Sie Ihre Objekte dazu.
Wenn man nach den Worten "Indikatorvorlage" und Ihrem Namen sucht, findet man nichts, und Sie haben hier bereits über den Band Krieg und Frieden geschrieben.
Jede beliebige Kombination von Wörtern aus dem Beitrag kommt mir in den Sinn.
Tja, tut mir leid, das mit der Indikatorvorlage habe ich wohl verwechselt - die Schleppnetzvorlage wurde gepostet.
Sagen wir es mal so: Erstellen Sie eine Indikatorvorlage im Editor, fügen Sie die gewünschte Anzahl von Eingangsvariablen und Puffern hinzu, die gezeichnet werden sollen.
Als Nächstes schlüsseln Sie auf, was Sie für die jeweilige Aufgabe tun müssen.
Wenn Sie sagen, dass es schlecht ist, sagen Sie mir, wie man es gut macht. Verschieben Sie die Berechnungen nach OnInit?
Fairer Tadel )) Hier eine Variante des Codes, der hier veröffentlicht wurde:
Versuchen Sie, es so zu machen. Sie müssen nichts zu OnInit verschieben.
Fairer Tadel )) Hier eine Variante des Codes, der hier veröffentlicht wurde:
Versuchen Sie, es so zu machen. Und Sie brauchen nichts zu OnInit zu verschieben.
Ich habe solchen Code hier nicht veröffentlicht - nicht mein Ding :)
Ich verwende andere Konstruktionen - das ist einfacher und klarer.
In OnInit() sollte sie übertragen werden. Warum müssen Sie dem Indikatorpuffer bei jedem Tick ein Array zuweisen?
Ich habe solchen Code hier nicht veröffentlicht - das ist nicht mein Ding :)
Ich verwende andere Konstruktionen, die einfacher und klarer sind.
Es ist meins, wie könnte es einfacher sein? ))) (zumindest habe ich in meiner Vorlage auch den Kommentarlimit = rates_total - 1;//--- Erster Aufruf des Indikators oder Wechsel des Zeitrahmens oder Laden von Daten aus der Historie) und meine Art der Formatierung - eine geschweifte Klammer bei for() {
Um zu lernen, einen eigenen Indikator zu schreiben, nehmen Sie die obige Vorlage und fügen Sie mindestens den Schlusskurs hinzu, um Ihren ersten Indikator zu erhalten, und lernen Sie dann, den MAH aus diesem Schlusskurs zu bilden
Ich habe solchen Code hier nicht veröffentlicht - das ist nicht mein Ding :)
Ich verwende andere Konstruktionen - einfachere und klarere.
Es muss nichts in OnInit() kopiert werden. Warum sollte ich dem Indikatorpuffer bei jedem Tick ein Array zuweisen?
Es ist nicht Ihr Code. Er wurde von einigen meiner Kollegen veröffentlicht, aber ich weiß nicht mehr, von wem und wo. Diesen Code habe ich gemeint, als ich sagte, dass nichts nach OnInit verschoben werden sollte, aber nicht der Quellcode. Ich war nicht ganz klar.
Und welche Konstruktion würden Sie empfehlen? Dies scheint sehr einfach zu sein.
Ah, da ist der Autor des Artikels )))) Vor mir. Übrigens verwende ich auch diese Art der Formatierung - mit einer öffnenden geschweiften Klammer in einer Zeile.Ah, hier ist der Autor des Schnipsels )))) Vor mir. Übrigens verwende ich auch diese Art der Formatierung - mit einer öffnenden geschweiften Klammer in einer Zeile.
Sie führen den Assistenten zur Erstellung eines Indikators aus, wählen Linientyp und -farbe aus und fügen gegebenenfalls Eingabefelder hinzu.
und das ist alles, der Indikator ist fertig, dann kopieren Sieden Körper vonOnCalculate() der Vorlage und schreiben die Berechnungen ,
Sie können Ihren ersten Indikator in 1 Minute schreiben, den Code "Hello word I indicator! - Ich habe es gezeigt :)
ZS: Übrigens, die Indikatoren können in dieser Form von MT4 auf MT5 übertragen werden, die Hauptsache ist, die Indikatorpuffer richtig einzurichten, in MT5 gibt es einen Fauxpas bei der Indizierung der Arrays unter den Puffern.... Sie sind einfach Arrays mit der üblichen Array )))) Indizierung .... Früher war es schwierig, sich an die Indexierung der Indikatorpuffer in MT4 zu gewöhnen, jetzt ist es im Gegenteil unmöglich, sich daran zu gewöhnen und zu MT5 zu wechseln ))))Dies ist nicht Ihr Code. Er wurde von einem meiner Kollegen veröffentlicht, aber ich weiß nicht mehr, von wem und wo. Es war dieser Code, den ich meinte, als ich sagte, dass nichts nach OnInit verschoben werden sollte, aber nicht der Quellcode. Ich war nicht ganz klar.
Und welche Konstruktion würden Sie empfehlen? Diese Aufgabe scheint sehr einfach zu sein.
Ah, da ist der Autor des Artikels )))) Vor mir.Ja, wofür ist der Code der Indikatorvorlage gut? Führen Sie den Assistenten aus, um einen Indikator zu erstellen , wählen Sie die Typen und Farben der Linien und fügen Sie bei Bedarf Eingaben hinzu
und das war's, der Indikator ist fertig, dann kopieren Sie den Körper aus der Vorlage OnCalculate() und schreiben Sie die Berechnungen,
Sie können Ihren ersten Indikator in 1 Minute schreiben, der obige Code lautet "Hallo Wort I Indikator!!!" Ich zeigte :)
PS: Übrigens, in dieser Form können Indikatoren von MT4 auf MT5 übertragen werden, die Hauptsache ist, die Indikatorpuffer richtig einzurichten, in MT5 gibt es einen Horror, dass mit der Indizierung von Arrays für Puffer ... es sich nur um Arrays handelt mit der üblichen Array)))) Indizierung .. .. früher war es schwierig, sich an die Indizierung von Indikatorpuffern in MT4 zu gewöhnen, jetzt ist es im Gegenteil unmöglich, sich daran zu gewöhnen und zu MT5 zu wechseln))))Nichts kompliziertes. Ein Beispiel für einen plattformübergreifenden Indikator (verwendet eine Klasse), aber die Vorlage kann herausgezogen werden - entfernen Sie die Klasse und alles Überflüssige, das danach Fehler verursacht - die plattformübergreifende Vorlage bleibt bestehen.
Dieser Indikator funktioniert auf beiden Plattformen ohne Änderung gleich - nur Kompilierung mit der erforderlichen Erweiterung. Ich musste den Code in zwei Teile aufteilen - die Klasse und den Indikator selbst (alles war in einem Listing)
Klasse:
Indikator: