Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 242

 
Youri Lazurenko:

Ich kann ein scheinbar einfaches Problem nicht lösen. Irgendwo auf dem Diagramm gab es eine MA-Kreuzung. Nach der Kreuzung finden wir eine Bar. Wie berechne ich die Anzahl der Balken von diesem Balken bis zum aktuellen Balken?

Die Nummer des jeweiligen Balkens. Nein?
 
Youri Lazurenko:

Ich kann ein scheinbar einfaches Problem nicht lösen. Irgendwo auf dem Diagramm gab es eine MA-Kreuzung. Nach der Kreuzung finden wir eine Bar. Wie berechne ich die Anzahl der Balken von diesem Balken bis zum aktuellen Balken?


Es scheint erledigt zu sein (zumindest ist der Kommentar auf dem Bildschirm korrekt). Dank der"Anzahl der Balken" glaube ich, die Lösung gefunden zu haben. Ich verwende die Funktion iTime, um den Zeitpunkt des benötigten Balkens zu bestimmen. Die Skizze sieht wie folgt aus:

void OnTick()

{

int nBarsUp, nBarsDn;

datetime date_dn = iTime(NULL, 0, IntersectionDN());

datetime date_up = iTime(NULL, 0, IntersectionUp());

datetime date_1 = iTime(NULL, 0, 1);

nBarsUp = Bars(Symbol(), 0, date_up, date_1);

nBarsDn = Bars(Symbol(), 0, date_dn, date_1);

Comment("Anzahl der langen Takte: " + nBarsUp + "\n "+ "Anzahl der kurzen Takte: " + nBarsUp + "\n")

"Anzahl der kurzen Takte:" + nBarsDn);

}

//+------------------------------------------------------------------+

int SchnittpunktDN()

{

for(int i = 0; i < 36; i++)

{

if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

zurück(i-1);

}

zurück(-1);

}

int IntersectionUp()

{

for(int i = 0; i < 36; i++)

{

if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

zurück(i-1);

}

zurück(-1);

}

 
Youri Lazurenko:

Es scheint funktioniert zu haben (zumindest ist der Kommentar auf dem Bildschirm korrekt). Dank der"Anzahl der Balken" habe ich wohl eine Lösung gefunden. Ich habe die Funktion iTime verwendet, um den Zeitpunkt des gewünschten Balkens zu bestimmen. Die Gliederung sieht wie folgt aus:

void OnTick()

{
   int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
   
   Comment("Количество длинных баров: " + nBarsUp + "\n"+
           "Количество коротких баров: " + nBarsDn);     
}

//+------------------------------------------------------------------+

int IntersectionDN()

{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   }  
   return(-1);
}

int IntersectionUp()
{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   } 
   return(-1);  

}

Sie suchen nach einer Kreuzung in der Schleife. Und von Null auf tief in die Geschichte. Ihre Funktion SchnittpunktXX() gibt also die Taktnummer zurück.

Wozu ist das alles gut?

int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
 
Artyom Trishkin:

Sie suchen nach einer Kreuzung in der Schleife. Und zwar vom Nullpunkt bis zum Ende der Geschichte. SchnittpunktXX() gibt also die Taktnummer zurück.

Wozu ist das alles gut?


Die Bar-Nummer, ja. Aber ich muss die Anzahl der Balken wissen - von diesem Balken tief in der Historie bis zum Null-Balken. Kurz gesagt, ich brauche den Winkel der Neigung des Balkens vom MA. Aber da es nicht so berechnet werden kann, wie es mir scheint (Preis auf der vertikalen Linie und Balken auf der horizontalen Linie in einem gewissen Abstand zueinander - es sind unvereinbare Werte). Es gab einmal einen Vorschlag im Forum, einen Koeffizienten einzuführen - die Preisdifferenz geteilt durch die Anzahl der Balken. Die Idee scheint mir vernünftig zu sein. Ich möchte es in die Praxis umsetzen, aber da ich selbst ein Dummkopf bin, versuche ich, etwas zu finden und es selbst durch Versuch und Irrtum auszuprobieren.

P.S. Wie fügt man Code in MQL4 ein (wie Ihrer, nicht wie meiner)?
 

Kann mir jemand sagen, wie ich dieses Problem lösen kann?


Nach dem Wechsel der TF ist die Platte verzogen

 
Youri Lazurenko:

Die Anzahl der Balken, ja. Aber ich muss die Anzahl der Balken wissen - von diesem einen Balken im hinteren Teil der Geschichte bis zum 0ten Balken. Kurz gesagt, ich brauche den Winkel des Balkens vom MA. Aber da er nicht berechnet werden kann, scheint es mir (auf der Vertikalen - der Preis, auf der Horizontalen - die Balken, die in einem gewissen Abstand zueinander platziert sind - die Werte sind nicht kompatibel). Es gab einmal einen Vorschlag im Forum, einen Koeffizienten einzuführen - die Preisdifferenz geteilt durch die Anzahl der Balken. Die Idee scheint mir vernünftig zu sein. Ich möchte es in die Praxis umsetzen, aber da ich selbst ein Dummie bin, versuche ich, etwas zu finden und mich durch Versuch und Irrtum zu versuchen.

P.S. Wie fügt man Code in MQL4 ein (so wie Sie es haben, nicht so wie ich es habe)?
Wenn dies der zehnte Takt ist, woher weiß ich dann den Unterschied zwischen dem zehnten und dem nullten Takt? 10-0=10
Und wozu dient die Subtraktion?

 

Hallo! Die beidenMinuszahlen q und wwerden falsch verglichen, wenn sie gleich sind, denkt der if-Operator, dass die eine größer ist als die andere.Worin liegt der Fehler? Wenn q = -0,0002 und w ebenfalls -0,0002 ist, ist res12=falsch, warum?

 

Hallo! Die beidenMinuszahlen q und wwerden falsch verglichen, wenn sie gleich sind, denkt der if-Operator, dass die eine größer ist als die andere.Worin liegt der Fehler? Wenn q = -0,0002 und w ebenfalls -0,0002 ist, ist res12=falsch, warum?

static bool res12=true;

start()
{   

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред

   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}
 
Jenya77769:

Hallo! Die beidenMinuszahlen q und wwerden falsch verglichen, wenn sie gleich sind, denkt der if-Operator, dass die eine größer ist als die andere.Worin liegt der Fehler? Wenn q = -0,0002 und w ebenfalls -0,0002 ist, ist res12=falsch, warum?


Ich denke, wir müssen normalisieren und das war's. Ohne Normalisierung kann man keine Doppelgänger miteinander vergleichen.

wenn NormalizeDouble (q<=w)
 
Vyacheslav Kornev:

Ich glaube, ich muss normalisieren, und das war's, denn ohne Normalisierung ist es nicht möglich, das Doppelte zwischen ihnen zu vergleichen.


Danke, es hat funktioniert, aber ich habe q und w getrennt normalisiert!

if(NormalizeDouble(q,4)> NormalizeDouble(q,4))
Grund der Beschwerde: