Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1496

 
Aleksandr Slavskii #:

"Finde den Maximalwert im Ticks-Array" - den Maximalwert von was finden wir?

ticks[copied-1].bid oder ticks[copied-1].flags

Nur ein Scherz)))))


Wahrscheinlich haben Sie CopyTicks mit CopyRates verwechselt, obwohl Sie auch dort ein Array von Strukturen haben und angeben, welches Element der Struktur Sie benötigen.

double PrevClose = rates[copied-1].close;

Sie haben eine zusätzliche Zeile in Ihrem Code.

Die brauchen Sie nicht, weil CopyTicks und CopyRates die Arraygröße beim Kopieren selbst zuweisen.

Vielen Dank für den Hinweis. Das wusste ich nicht. Ich füge diese Zeile nur für den Fall ein.

Verstehe ich deinen Scherz richtig, dass bei Rates alle Preise gemittelt werden und den Bar berücksichtigen, bei Ticks hingegen nicht? Deshalb habe ich mit Tick ein beliebiges Zeitintervall gemeint, nicht die Bar-Preise. CopyRates in meiner ähnlichen Formel füllte die kopierte Variable mit dem maximalen Wert vom Typ ulong für das Stundenintervall. Auch dieses Problem konnte ich nicht lösen.

 
maxvoronin74 #:

Danke für den Tipp. Das habe ich nicht gewusst. Ich füge diese Zeile nur für den Fall ein.

Verstehe ich deinen Scherz richtig, dass die Kurse alle Preise gemittelt haben und den Balken berücksichtigen, die Ticks aber nicht? Deshalb habe ich mit Tick ein beliebiges Zeitintervall gemeint, nicht die Balkenpreise. CopyRates in meiner ähnlichen Formel füllte die kopierte Variable mit dem maximalen Wert vom Typ ulong für das Stundenintervall. Auch dieses Problem konnte ich nicht lösen.

Alles ist falsch.

MqlRates ist eine Struktur, und Sie behandeln sie wie eine Variable.

MqlTick ist auch eine Struktur.

Sie versuchen, warm und weich zu kombinieren, und der Compiler versteht Sie nicht.

Genauso wenig wie I))))).

Vielleicht könnte ich etwas Nützliches vorschlagen, aber aus Ihrem Code geht nicht klar hervor, was Sie zu finden versuchen.

 
Aleksandr Slavskii #:

Das ist alles falsch.

MqlRates ist eine Struktur, und Sie behandeln sie wie eine Variable.

MqlTick ist auch eine Struktur.

Sie versuchen, warm und weich zu kombinieren, so dass der Compiler Sie nicht versteht.

Ich auch nicht))))

Vielleicht könnte ich etwas Nützliches vorschlagen, aber aus Ihrem Code geht nicht klar hervor, was Sie zu finden versuchen.

Die Aufgabe besteht darin, WPR (Williams Percent Range) so zu modifizieren, dass die Differenz der WPR-Werte für einen beliebigen Zeitraum, unabhängig von den Balken, ermittelt wird.
 
maxvoronin74 #:
Die Aufgabe besteht darin, WPR (Williams Percent Range) so zu modifizieren, dass man die Differenz der WPR-Werte für einen beliebigen Zeitraum erhält, unabhängig von den Balken.

Es ist möglich (aber nicht sicher), dass dies das ist, was Sie erhalten wollten.

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double bid[];
   for(int i = 0; i < copied; i++)
      bid[i] = ticks[i].bid;
   double PrevClose = bid[copied - 1]; // Получаем последний элемент массива как значение PrevClose
   double highestHigh = ArrayMaximum(bid, 0, copied); // Находим максимальное значение в массиве ticks
   double lowestLow = ArrayMinimum(bid, 0, copied); // Находим минимальное значение в массиве ticks
 
Aleksandr Slavskii #:
double lowestLow = ArrayMinimum(bid, 0, copied);

Ich danke Ihnen. Wenn ich die Lektion richtig verstanden habe, habe ich folgendes Ergebnis:

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
double ask_arr[];
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
double highestBid = ArrayMaximum(bid_arr, 0, copied-1);
double lowestBid = ArrayMinimum(bid_arr, 0, copied-1);
double highestAsk = ArrayMaximum(ask_arr, 0, copied-1);
double lowestAsk = ArrayMinimum(ask_arr, 0, copied-1);
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR
Aber leider ist der Expert Advisor in der Zeile bid_arr[i] = ticks[i].bid; wegen Array out of range in 'namemyexpert.mq5' (204,12) aus dem Chart gefallen.
 
maxvoronin74 #:

Ich danke Ihnen. Das ist das Ergebnis, wenn ich meine Lektion richtig gelernt habe:

Da wir sowieso eine Schleife über alle Ticks machen, können wir in dieser Schleife nicht kopieren, sondern gleich nach den Maximal-Minimalwerten suchen.

Übrigens, wenn wir kopieren, wäre es gut, zuerst die Größen der Arrays festzulegen, in die wir kopieren, die Schleife wird das nicht für uns tun, wir werden bei der ersten Iteration aus dem Array herausfliegen. Nur CopyTicksRange wird die Größe des Ziel-Arrays selbst ändern.

 
JRandomTrader #:

Da wir ohnehin alle Ticks durchlaufen, können wir in diesem Zyklus nicht kopieren, sondern gleich nach diesen Maximal-Minimalwerten suchen.

Übrigens, wenn wir kopieren, wäre es gut, zuerst die Größe des Arrays festzulegen, in das wir kopieren, die Schleife wird das nicht für uns tun, wir werden bei der ersten Iteration aus dem Array herausfliegen. Nur CopyTicksRange wird die Größe des Ziel-Arrays selbst ändern.

Ich bin ein Perfektionist, einzelne Elemente eines Arrays von Strukturen zu sortieren ist, als würde man Glas mit Styropor schlagen.
Was das nicht zugewiesene Array angeht, habe ich einen guten Grund. Es ist ein Uhr nachts und meine Frau liegt mir im Ohr und sagt: "Es ist Zeit zu schlafen, es ist Zeit zu schlafen". ))))))
 
Aleksandr Slavskii #:
Ich bin ein Perfektionist, das Sortieren einzelner Elemente eines Arrays von Strukturen ist wie Glas mit Styropor zu schlagen.
Dafür, dass ich das Array nicht verteile, habe ich einen guten Grund. Es ist ein Uhr morgens und meine Frau liegt mir im Ohr mit den Worten "es ist Zeit zu schlafen, es ist Zeit zu schlafen". ))))))
Was, Nachts oder Morgens eine Zahl).
Ja, Sie haben Recht, wenn Sie nach dem Maximum auf einmal suchen. So ist es viel bequemer. Ich bin heute Morgen ein bisschen dumm.
 
JRandomTrader #:

Da wir ohnehin alle Ticks durchlaufen, können wir in diesem Zyklus nicht kopieren, sondern gleich nach diesen Maximal-Minimalwerten suchen.

Übrigens, wenn wir kopieren, wäre es gut, zuerst die Größe des Arrays festzulegen, in das wir kopieren, die Schleife wird das nicht für uns tun, wir werden bei der ersten Iteration aus dem Array herausfliegen. Nur CopyTicksRange wird die Größe des Ziel-Arrays selbst ändern.

Entschuldigung. Meine Unaufmerksamkeit. Korrigiert. Danke. Ich hatte vergessen, dass der ArrayMaximum-Wert ein Index und kein Preis ist. Aber das ist jetzt korrigiert.

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
ArrayResize(bid_arr,copied,100000);
double ask_arr[];
ArrayResize(ask_arr,copied,100000);
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
int IndMaxBid = ArrayMaximum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с максимальной ценой
double highestBid = bid_arr[IndMaxBid]; // Самая высокая цена bid за период
int IndMinBid = ArrayMinimum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с минимальной ценой
double lowestBid = bid_arr[IndMinBid]; // Самая низкая цена bid за период
int IndMaxAsk = ArrayMaximum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с максимальной ценой
double highestAsk = ask_arr[IndMaxAsk]; // Самая высокая цена ask за период
int IndMinAsk = ArrayMinimum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с минимальной ценой
double lowestAsk = ask_arr[IndMinAsk]; // Самая низкая цена ask за период
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR

Da ArrayMaximum nicht mit dem Ticks-Array funktionierte, habe ich alternative Berechnungen mit if in einer Schleife versucht. Warum ist das besser?

 
maxvoronin74 #:

Warum ist es besser?

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double highestHigh = 0, lowestLow = DBL_MAX;
   for(int i = 0; i < copied; i++)
     {
      if(highestHigh < ticks[i].ask) // Находим максимальное значение в массиве ticks
         highestHigh = ticks[i].ask;
      if(lowestLow > ticks[i].bid) // Находим минимальное значение в массиве ticks
         lowestLow = ticks[i].bid;
     }
Grund der Beschwerde: