Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Nun Jungs, der erste Teil ist getan (Lesen aller Paare Kurse).
Nun muss ich die Kurse aller Paare, die mit der Funktion ArrayCopyRates kopiert wurden, verwenden, um einige grafische Indikatoren wie einen RSI zu erstellen... wie ich im Bild unten zeige:
In meiner ursprünglichen Frage beabsichtige ich wissen, wie dies zu tun... und nicht über das Lesen von Kursen. Ich glaube nicht, dass ich brauchen, um Raten zu kopieren, bevor es zu zeichnen, aber war gut zu wissen, wie zu tun... jetzt muss ich nur einen Weg zu entdecken, um den Indikator Bereich zu plotten alle Paare zu teilen...
Es gibt keine Möglichkeit, den Anzeigebereich zu teilen. Alles muss separat gezeichnet werden, keine Puffer, keine automatische Skalierung. Siehe
Haben Sie ein solches Bild gesehen? (MetaQuotes Software Corp.) - MQL4 forum - Seite 12
Haben Sie ein solches Bild gesehen? (MetaQuotes Software Corp.) - MQL4 forum - Seite 14
Haben Sie ein solches Bild gesehen? (MetaQuotes Software Corp.) - MQL4 forum - Seite 36
Es gibt keine Möglichkeit, den Anzeigebereich zu teilen. Alles muss separat gezeichnet werden, keine Puffer, keine automatische Skalierung. Siehe
Haben Sie ein solches Bild gesehen? (MetaQuotes Software Corp.) - MQL4 forum - Seite 12
Haben Sie ein solches Bild gesehen? (MetaQuotes Software Corp.) - MQL4 forum - Seite 14
Haben Sie ein solches Bild gesehen? (MetaQuotes Software Corp.) - MQL4 forum - Seite 36
Dies ist ein Indikator, den ich irgendwo aufgeschnappt habe, ich habe nie versucht, ihn zu entziffern. Er zeigt eine Darstellung von 3 Zeitrahmen des aktuellen Charts. Das Verrückte daran ist, dass die Kerzen mit Histogrammen gezeichnet werden. Ziemlich nett, aber nicht das, was ich im Moment mache.
Beste Wünsche
Ein Update für alle, die diesen Thread verfolgen!
Ich habe dem OP per PM geholfen, seinen Code zu korrigieren, da er Schwierigkeiten mit Englisch hat und wir beide Portugiesisch sprechen. Bei unseren Tests sind wir auf ein weiteres "komisches" Problem gestoßen, das mit der Funktion"ArrayCopyRates()" auftritt. Wenn man ein MqlRates-Array mit"ArrayCopyRates()" in einem EA verwendet, ist das Daten-Array ein virtuelles Array, das immer den aktuellen Stand der Dinge meldet, so dass die Daten immer frisch sind.
In einem Indicator scheint dies jedoch nicht der Fall zu sein. Das Array ist keine virtuelle Kopie, sondern eine statische Kopie, die zum Zeitpunkt des Aufrufs von"ArrayCopyRates()" festgelegt wurde. Die Daten werden nicht aktualisiert, wenn das Symbol nicht mit dem Diagrammsymbol übereinstimmt. Wenn es sich um dasselbe Symbol wie das Diagramm handelt, dann sind die Array-Daten "live" und werden wie erwartet aktualisiert, aber wenn es sich um ein anderes Symbol handelt, ist es eine statische Kopie.
Damit dies in einem Indikator funktioniert, muss die Funktion "ArrayCopyRates()" bei jedem Aufruf des Ereignisses OnCalculate() aufgerufen werden, wenn neue Daten benötigt werden.
Nur um Ihre Erkenntnisse zu erweitern Fernando - auch wenn Symbol ist das gleiche wie Chart-Symbol, wenn der Zeitrahmen ist anders, dann das Array ist statisch.
Um also eine virtuelle Kopie in einem Indikator zu haben, muss es das gleiche Symbol UND der gleiche Zeitrahmen sein. Alles andere ist statisch.
Angenommen, es ist Mitte der Woche, um den Höchst- und Tiefststand des Vortages zu finden, verwende ich einfach:
Lo = iLow(NULL, PERIOD_D1, 1);
Das ist gut, aber jetzt muss ich herausfinden, wann am Vortag der Höchst- und Tiefststand war. Ich beschloss, die Zeit der 1-Stunden-Kerze für Hoch und Tief mit iHighest und iLowest zu schätzen. Und damit begannen die Probleme.
PrevDayEnd = iBarShift(NULL, PERIOD_H1, iTime(NULL, PERIOD_D1, 0)-1);
PrevDayBegin--;
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1);
ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1);
ArrayCopyRates(mqlrates_array,NULL,0);
OnInit();
:
isHistoryLoading = true;
:
OnCalculate( ... )
:
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
if(isHistoryLoading)
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_D1,0) > 0) && (iTime(NULL,PERIOD_D1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_H1,0) > 0) && (iTime(NULL,PERIOD_H1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array,NULL,0)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,0,0) > 0) && (iTime(NULL,0,1) > 0))
{
isHistoryLoading = false;
if(DebugLog)
Print("Chart up-to-date!");
}
}
}
}
}
}
}
}
}
}
if(isHistoryLoading)
{
if(DebugLog)
Print("Waiting for chart to update!");
return(rates_total);
}
:
:
if(ObjectFind(Trend2Name) != -1) // Check whether mid range line exists
{
if((TimeDay(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeDay(TimeCurrent()))
&& (TimeMonth(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeMonth(TimeCurrent()))
&& (TimeYear(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeYear(TimeCurrent()))) // Indicator has already been ploted today
{
return(rates_total);
}
else // Indicator exists but in a past date, so delete it and plot it on current day
{
if(DebugLog)
Print("Indicator in a past date! Deleting it and creating it today!");
if(ObjectFind(FibName) != -1)
FiboLevelsDelete(0,FibName);
// Indicator will be created by the OnChartEvent() when it detects the fib was deleted.
}
}
else // Indicator doesn't exist, so create it
{
if(DebugLog)
Print("Indicator doesn't exist! Creating it.");
CreateIndicator();
}
:
Nach ein paar Ticks werden die Daten teilweise geladen, und der obige Code erkennt, dass die Linien an einem früheren Tag gezeichnet wurden, löscht die Fib und löst eine Neuberechnung der Bereiche und ein erneutes Zeichnen der Objekte aus (d. h. Fib, Trendlinien usw.).
CurrDayBegin = iTime(NULL, PERIOD_D1, 0);
while(TimeDayOfWeek(iTime(NULL, PERIOD_H1, iBarShift(NULL, PERIOD_H1, CurrDayBegin))) != TimeDayOfWeek(TimeCurrent()))
// If iBarShift can't find the 0am candle and returns the 11pm candle of prev day.
CurrDayBegin = CurrDayBegin + 3600; // Move 1h until you find the 1st candle of today.Dies sind Bildschirmfotos des Indikators:
(1) Berechnet mit einer unvollständigen Historie (bitte beachten Sie, dass die horizontalen Linien nicht am Anfang des Tages beginnen)
(2) Neu berechnet mit der vollständigen Historie (die horizontalen Linien beginnen am Anfang des Tages)