[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 479

 
midorum:
Versuchen Sie den Barren-30
Nein, das ist es nicht. Es würde logischerweise links 30 Takte einrücken und bis zum 0. Takt ziehen.
 
SetIndexDrawBegin(0,Bars-30);//первый бар отрисовки индикатора 

Ich weiß nicht, was Ihre Logik ist, bei mir zeichnet diese Einstellung die letzten 30 Balken des Indikators

Auch hier berechnet SetIndexDrawBegin() die Balken vom linken Ende des Diagramms aus

prüfen, bevor Sie anfangen zu streiten

 
merkulov.artem:

GUT. Ich werde versuchen, den Kern des Problems zu umreißen, vielleicht kann jemand vorschlagen oder helfen, es auf eine einfachere Weise zu implementieren.

Wir arbeiten an einem Minutendiagramm. Nehmen wir den Ein-Minuten-Balken (Hoch+Tief/2 - Durchschnittswert des Balkens) auf dem Diagramm vom 29.10.12 um 00:00 Uhr - er wird als Referenzpunkt dienen.

Dann prüfen wir die Abweichung von diesem Preis nach oben um 10 Pips (jede korrekte Abweichung ist +1).

Wenn wir die 10-Punkte-Abweichung vom Ausgangspunkt erreicht haben - der +1-Zähler; und wir beginnen, weitere Abweichungen zu überprüfen, aber von dem Punkt aus, an dem wir die 10-Punkte-Abweichung erreicht haben, und warten auf den nächsten 10-Punkte-Kursanstieg.

Wir erhalten zum Beispiel:

Wenn (Startpunkt) + 10 Pips <= Preis (wir verwenden alle nachfolgenden Preise der Balken vom Startpunkt.) Wir erhalten einen Zähler = Zähler +1; und wir beginnen den Startpunkt bereits von diesem Punkt -(Startpunkt + 10 Pips).

Wenn (Startpunkt + 10 Pips) +10 Pips <= Preis (alle nachfolgenden Preise der Balken ab dem Referenzpunkt werden verwendet), erhalten wir counter=Counter+1; und wir beginnen von diesem Punkt-(Startpunkt + 10 Pips) +10 Pips.

Wenn(Startpunkt + 10 Pips+10 Pips) + 10 Pips <= Preis (wir verwenden alle nachfolgenden Preise der Bars vom Referenzpunkt aus.) erhalten wir counter=Counter+1; und wir beginnen von diesem Punkt -(Startpunkt + 10 Pips+ 10Pips) + 10 Pips.

und so weiter...

Bis wir einen Zähler von 10 erreichen(Zähler == 10).

Und bei jedem neu gebildeten1-Minuten-Balken (Hoch+Tief/2 - Durchschnittswert des Balkens) prüfen wir auf diese Bedingung und warten, bis der Zähler10 erreicht(Zähler == 10). Angenommen, es vergingen zwei Tage, bei jedem neuen Balken, den wir bildeten, überprüften und verschoben wir, ob die Bedingungen korrekt waren .....

Und wenn wir den Zähler =10 erreicht haben, geben wir die Meldung "Zähler == 10" aus. Wir verschieben den Startpunkt um 2 Tage nach vorne, d.h. vom29.10.12 um 00:00 Uhr auf den 31.10.12 um 00:00 Uhr und wiederholen den Zyklus.

Wiederholen Sie den Zyklus und gehen Sie so durch den Zeitplan.

D.h. wir sollten die neu gebildeten Balken nehmen und(Hoch+Tief/2 - Durchschnittswert des Balkens) zeichnen. Prüfen Sie die Bedingungen und schalten Sie sie wie oben beschrieben um, wenn sie korrekt sind.

Ich habe versucht, es durch ein Array zu implementieren, es ist sehr verwirrend und gibt falsche Werte! Bitte helfen Sie mir, wie ich diesen Algorithmus implementieren kann!


Sie brauchen hier überhaupt keine Arrays. Ist dies überhaupt ein Expert Advisor, ein Skript oder ein Indikator? Das Problem ist, dass der Code des Expert Advisors sich von dem des Indikators für die Umsetzung dieser Aufgabe unterscheidet.

Und hier gibt es einen erheblichen Nachteil. Sehen Sie, wir haben den Startpunkt markiert, und er liegt genau auf dem Höhepunkt des Aufwärtstrends. Nehmen wir an, dass wir den Stand dieser Kerze beim weiteren Abholen von 10 Punkten nicht berücksichtigen - nennen wir sie die Startkerze. Also, die nächste Kerze geht nach unten und wir fangen keines der beiden Niveaus = Startpunkt + 10 Pips: der Preis geht nach unten. Wir können also sagen, dass wir für eine lange Zeit feststecken - der Preis ist gefallen und wird vielleicht trotzdem auf und ab gehen - er wird das Niveau des Ausgangspunkts sowieso nicht erreichen - die Bären haben ihn fest gedrückt. Aber nehmen wir an, dass wir Glück hatten und der Kurs nach 5.000 Kerzen auf das Niveau des Startpunktes zurückkehrte und sogar 10 Pips nach oben ging. Wir haben viel Zeit verschwendet, aber jetzt können wir den Preis, der dem Ausgangspunkt + 10 Punkte entspricht, in die Variable eingeben und warten, bis der Preis das Niveau = Variablenniveau + 10 Punkte erreicht... Kurz gesagt, wir brauchen das alles nicht - Ihrer Beschreibung nach zu urteilen, fangen wir das Niveau = Startpunkt + 10*10 = Startpunkt + 100 Pips. Sobald dieses Niveau erreicht ist, verschieben wir das Startdatum um 2 Tage in die Zukunft und berechnen einen neuen Startpunkt. Das ist kompliziert - es gibt einen einfacheren Weg.

Wir legen das Startdatum in benutzerdefinierten Variablen fest (im Code mit extern vorangestellt). Deklarieren Sie eine Variable vom Typ datetime. Angenommen, es handelt sich um die Variable dt_StartDate (Startdatum), der wir im Initialisierungsblock den in der benutzerdefinierten Variablen gespeicherten Wert zuweisen. Dann suchen wir die Kerze, die zu diesem Datum passt, und berechnen den Startpunkt mit Hilfe Ihrer Formel. Es ist jedoch nicht der Ausgangspunkt, sondern das Ausgangspreisniveau. Deklarieren Sie eine Variable vom Typ double, z. B. d_StartLevel (Startlevel), und tragen Sie den Wert des berechneten Levels in die Variable ein. Oder es geht noch einfacher: Sie deklarieren keine Variable, sondern ziehen eine horizontale Linie durch den errechneten Startpreis. Nennen wir sie StartLevel. Zeichnen wir nun die zweite Linie auf dem Diagramm in einem Abstand = 100 Punkte vom Ausgangsniveau - nennen wir sie OtlovLevel. Darüber hinaus benötigen wir keine Arrays - wir beobachten einfach bei jedem Tick, ob der Preis über dem OtlovLevel liegt oder nicht. Sobald dies der Fall ist, erhöhen wir den Wert der Variablen dt_StartDate um 2 Tage, berechnen den Startlevel neu und verschieben die Startlinie dorthin. Danach nehmen wir wieder 100 Punkte von der Startlinie nach oben und ziehen die OtlovLevel-Linie dorthin. Das ist alles, die Aufgabe ist gelöst. Jedes Mal können wir den Preis abfragen, bei dem eine beliebige Linie gesetzt wurde, und ihn mit dem aktuellen Preis oder dem Höchstpreis der aktuellen Kerze vergleichen.

 
midorum:

Ich weiß nicht, was Ihre Logik ist, bei mir zeichnet diese Einstellung die letzten 30 Balken des Indikators

Auch hier berechnet SetIndexDrawBegin() die Balken vom linken Ende des Diagramms aus

Prüfen Sie es, bevor Sie argumentieren.

Ich will also nicht streiten. Hier ist ein Blick darauf. Nehmen wir einen Standard-CCI-Indikator. Ich habeCCIPeriod durch(Bars- CCIPeriod) in der Funktion SetIndexDrawBegin ersetzt. Ich habe nur die gelbe Markierung im Code geändert...

Hier ist der Code:

//+------------------------------------------------------------------+
//|                                                          CCI.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
//---- input parameters
extern int CCIPeriod = 14;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 3 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(1, RelBuffer);
   SetIndexBuffer(2, DevBuffer);
   SetIndexBuffer(3, MovBuffer);
//---- indicator lines
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, CCIBuffer);
//----
   if(CCIPeriod <= 0)
       CCIPeriod = 14;
//----
   SetIndexDrawBegin(0, Bars - CCIPeriod);
  
//---- name for DataWindow and indicator subwindow label
   short_name="CCI(" + CCIPeriod + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i, k, counted_bars = IndicatorCounted();
   double price, sum, mul; 
   if(CCIPeriod <= 1)
       return(0);
   if(Bars <= CCIPeriod) 
       return(0);
//---- initial zero
   if(counted_bars < 1)
     {
       for(i = 1; i <= CCIPeriod; i++) 
           CCIBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           DevBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           MovBuffer[Bars-i] =0.0;
     }
//---- last counted bar will be recounted
   int limit = Bars - counted_bars;
   if(counted_bars > 0) 
       limit++;
//---- moving average
   for(i = 0; i < limit; i++)
       MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);
//---- standard deviations
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   mul = 0.015 / CCIPeriod;
   while(i >= 0)
     {
       sum = 0.0;
       k = i + CCIPeriod - 1;
       while(k >= i)
        {
          price =(High[k] + Low[k] + Close[k]) / 3;
          sum += MathAbs(price - MovBuffer[i]);
          k--;
        }
       DevBuffer[i] = sum*mul;
       i--;
     }
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       price = (High[i] + Low[i] + Close[i]) / 3;
       RelBuffer[i] = price - MovBuffer[i];
       i--;
     }
//---- cci counting
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       if(DevBuffer[i] == 0.0) 
           CCIBuffer[i] = 0.0;
       else 
           CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
       i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Logischerweise, wennCCIPeriod gleich 14. Dann sollteSetIndexDrawBegin(0, Bars - CCIPeriod) nur die 14 letzten Bars zeichnen. Sie beginnt mit dem Wert (Bar - 14). Aber auf dem Bildschirm sehe ich Folgendes

 
hoz:

Ich will also nicht streiten. Hier ist ein Blick darauf. Nehmen Sie den CCI-Standardindikator. Ich habeCCIPeriod in der Funktion SetIndexDrawBegin durch(Bars- CCIPeriod) ersetzt. Ich habe nur die gelbe Markierung im Code geändert...

Hier ist der Code:

Logischerweise, wennCCIPeriod gleich 14. Dann sollteSetIndexDrawBegin(0, Bars - CCIPeriod) nur die 14 letzten Bars zeichnen. Sie beginnt mit dem Wert (Bar - 14). Aber auf dem Bildschirm sehe ich Folgendes

Das sehe ich auf dem Bildschirm

oben der native Indikator, unten geändert in SetIndexDrawBegin(0, Bars-CCIPeriod);

 
midorum, ich bitte um Entschuldigung. Mein Fehler. MetaEditor öffnete ein weiteres Terminal... Es funktioniert jetzt. Ich danke Ihnen!
 
hoz:
midorum, ich bitte um Entschuldigung. Mein Fehler. MetaEditor öffnete ein weiteres Terminal... Es funktioniert jetzt. Ich danke Ihnen!
Ja, ich habe auch ständig mit diesem Problem zu kämpfen - 3 Terminals, und Editor verwirrt die Ordner. Besser ist es, das Programm über die Schaltfläche im Terminal auszuführen und die Datei dort manuell zu öffnen.
 

Guten Tag Leute, bitte geben Sie mir eine Antwort, wie zu bestimmen, dass die 15-Minuten-Kerze geöffnet, ich habe eine verwirrende Zeichenfolge, aber wie sich herausstellte, nicht immer die Kerze öffnet nach der Zeit... Ich denke, es gibt einen einfacheren Weg, um herauszufinden, dass die Kerze geöffnet... aber ich verstehe es nicht...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)

 
stater:

Guten Tag Leute, bitte geben Sie mir eine Antwort, wie zu bestimmen, dass die 15-Minuten-Kerze geöffnet, ich habe eine verwirrende Zeichenfolge, aber wie sich herausstellte, nicht immer die Kerze öffnet nach der Zeit... Ich denke, es gibt einen einfacheren Weg, um herauszufinden, dass die Kerze geöffnet... aber ich verstehe es nicht...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)


https://www.mql5.com/ru/forum/131853/page4#504607
 
stater:

Guten Tag Leute, bitte geben Sie mir eine Antwort, wie zu bestimmen, dass die 15-Minuten-Kerze geöffnet, ich habe eine verwirrende Zeichenfolge, aber wie sich herausstellte, nicht immer die Kerze öffnet nach der Zeit... Ich denke, es gibt einen einfacheren Weg, um herauszufinden, dass die Kerze geöffnet... aber ich verstehe es nicht...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)


bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
Die Funktion gibt true zurück, wenn ein neuer Balken auf M15 erscheint
Grund der Beschwerde: