Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 790

 
Forexman77:

Die Frage ist noch nicht vom Tisch. Also, zunächst einmal.

Es wird ein Maximum gefunden, gegen das dann eine Linie gezeichnet wird. Der Abstand zwischen dieser maximalen Linie und dem aktuellen Minimum wird überprüft. Überschreitet er "Rmax", wird ein Pfeil auf den Balken gesetzt, an dem das Maximum gefunden wurde. Der Pfeil ist platziert, aber nicht vorhanden. Um dies zu verdeutlichen, habe ich den Puffer "BufferLow[i]" hinzugefügt, der die Differenz anzeigt und dessen Daten im Explorer-Fenster zu sehen sind.

Das ist immer so. Man kann im Winter nicht auf Schnee warten) Ich habe es selbst gemacht.

Falls jemand von einer ähnlichen Idee gequält wurde, hier ist der Code:

#property copyright "Kamil Gazizullin"
#property link      "forexman77@yandex.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 5
#property  indicator_color1 Magenta
#property  indicator_color2 Aqua
#property  indicator_color3 SlateBlue
#property  indicator_color4 SlateBlue
#property  indicator_color5 clrNONE
//--- input parameters
extern int       Period_=10;
extern double diapazon  =0.003;
//--- buffers
double Max[];
double Min[];
double MaxIndex[];
double MinIndex[];
double rAZNOST[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(5);
   SetIndexBuffer(0,MaxIndex);
   SetIndexBuffer(1,MinIndex);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,116);
   SetIndexEmptyValue(1,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,116);
   SetIndexEmptyValue(0,0.0);
   SetIndexBuffer(2,Max);
   SetIndexBuffer(3,Min);
   SetIndexBuffer(4,rAZNOST);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),limit, i,k,r,p,t,f;
    double minimum,maximum,Dmax,Dmin;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
   for(i=0;i<limit;i++)
   {
      maximum=High[iHighest(NULL,0,MODE_HIGH,Period_,i)];
      minimum=Low[iLowest(NULL,0,MODE_LOW,Period_,i)];
      Max[i]=maximum;
      Min[i]=minimum;
   }
   for(i=0;i<limit;i++)
   {
      k=iHighest(NULL,0,MODE_HIGH,Period_,i);
      t=iLowest(NULL,0,MODE_LOW,Period_,i);
      Dmax=Max[i]-Low[i];
      Dmin=High[i]-Min[i];
      if (Dmax > diapazon){p=k;for(r=p;r>=k;r--)MaxIndex[k]=Max[k];}
      if (Dmin > diapazon){p=t;for(f=p;f>=t;f--)MinIndex[t]=Min[t];}
      if (MaxIndex[i]==Max[i+1])MaxIndex[i]=0;
      if (MinIndex[i]==Min[i+1])MinIndex[i]=0;
      rAZNOST[i]=Max[i]-Min[i];
   }
   return(0);
  }
 
Awwl:

Das eingebaute Heiken Ashi sieht etwas unterentwickelt aus (ich frage mich, ob das nur bei mir auf dem 745 so ist?), aber ich verstehe, wie es funktioniert. Und es ist unklar, wie WmiFor aufgebaut ist!

Im Heiken Ashi-Code wird eine Kerze aus 4 Balkenhistogrammen gezogen:

Das heißt, dass mit zunehmender Puffernummer (von 0 bis 3) neue Balken über die alten gezeichnet werden. Die Reihenfolge ist wie folgt:

NiedrigHoch - HochTief - Offen - Geschlossen.

Die Reihenfolge der Kerzenhalter sollte wie folgt sein, damit sie mit ihren Körpern und Schwänzen so aussehen, wie sie sein sollten:

max(Open,Close)//dicke farbige Linie// - min(Open,Close)//dickes Weiß// - High//dicke farbige Linie// - Low//dickes Weiß//.

Erstellen wir den Indikator, setzen wir ihn auf das Diagramm und sehen wir uns die Probleme an (siehe Abbildung).

Diese Methode hat jedoch wie Heiken Ashi einen Nachteil: Unter jeder "Kerze" erscheint eine weiße Schleife in der Hintergrundfarbe, die alles darunter Liegende verdeckt. Aber mit WmiFor ist alles perfekt! Undokumentierte Funktionen?

Erstes Bild - Heiken Ashi (in einem separaten Fenster), zweites Bild - WmiFor, der Hintergrund ist zur Verdeutlichung hellgrün.

Wir vergleichen einen weichen und einen runden? Warum sollte der Haken in einem separaten Fenster angezeigt werden, wenn er für ein Diagrammfenster konzipiert ist und dort als Kerze mit Schatten und Körper gezeichnet wird? Wenn sich der Pufferwert ändert, ändert sich die Größe desselben Balkens und es wird kein neuer Balken darüber gezeichnet.

Der MT4 verfügt nicht über eine Methode zum Zeichnen in Form von Candlesticks, so dass nur ein Histogramm möglich ist, und wie Sie die Pufferwerte berechnen, ist Ihre eigene Sache. WmiFor zeichnet übrigens auch ein Histogramm, das wir ebenfalls in ein separates Fenster packen und auf seine Pannen starren )))

Damit Kerzenständer in einem separaten Fenster wie Kerzenständer mit Schatten aussehen, sollten sie relativ 0 gezeichnet werden, wie der Accelerator. Oder man kann sie mit Objekten zeichnen, siehe zum Beispiel All_Stars.

 

Guten Tag zusammen!

Ich habe keine Antwort in der Dokumentation gefunden, aber vielleicht ist jemandem das Problem schon einmal begegnet. Hier ist die Linie im Expert Advisor (Anteil der positiven Trades):

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd,",2/5*100,",100*2/5);

Druckt es in das Journal (z.B.):

3/6=0.00=0 0 40

Wenn die Lösung gleichzeitig 1:

3/3=1.00=1 0 40

Die Variable BestOd=OderPluseCount/OderTotal ist vom Typ double, die übrigen Variablen sind int.

Das heißt, sobald ein Wert kleiner als 1 angetroffen wird, wandelt der Compiler ihn automatisch in 0 um... Die letzten beiden Ausdrücke aus Konstanten liefern überraschende Ergebnisse - sieht aus wie dasselbe, aber nicht ))))

Ich habe verschiedene Ersetzungen ausprobiert, und alles, was größer als 1 ist, hat den richtigen Bruchteil.

 
Igor_:

Guten Tag zusammen!

Ich habe keine Antwort in der Dokumentation gefunden, aber vielleicht ist jemandem das Problem schon einmal begegnet. Hier ist die Linie im Expert Advisor (Anteil der positiven Trades):

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd,",2/5*100,",100*2/5);

druckt es in das Journal (z.B.):

3/6=0.00=0 0 40

Wenn die Lösung gleichzeitig 1:

3/3=1.00=1 0 40

Die Variable BestOd=OderPluseCount/OderTotal ist vom Typ double, die übrigen Variablen sind int.

Das heißt, sobald ein Wert kleiner als 1 angetroffen wird, wandelt der Compiler ihn automatisch in 0 um... Die letzten beiden Ausdrücke aus Konstanten liefern überraschende Ergebnisse - sieht aus wie dasselbe, aber nicht ))))

Ich habe verschiedene Substitutionen ausprobiert, alles, was größer als 1 ist, hat den richtigen Bruchteil.

Versuchen Sie dies

DoubleToStr((double)(OderPluseCount/OderTotal),2)

 
AlexeyVik:

Versuchen Sie dies

DoubleToStr((double)(OderPluseCount/OderTotal),2)

Das ist nicht hilfreich. Aber danke )
 
Igor_:
Das ist nicht hilfreich. Aber danke )
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)
 
Vinin:
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)

So funktioniert es, vielen Dank. Sieht aus wie Schamanismus ))))

Ehrlich gesagt, mache ich mir mehr Sorgen um die korrekteBestOd-Berechnung als um die Anzeige.Ich musste es auch korrigieren.

Ich habe es so gemacht:

BestOd=(OderPluseCount/(OderTotal*1.0));

Gibt es dafür eine Erklärung? Schließlich wäre es sehr schwierig, diesen Fehler zu erkennen, wenn er nicht aufgedruckt wäre. In welchen Fällen könnte sie auftreten?

 
Igor_:

So funktioniert es, vielen Dank. Klingt nach Schamanismus )))

Ehrlich gesagt, mache ich mir keine Sorgen um die Anzeige, sondern um die korrekte Berechnungvon BestOd. Ich musste es auch korrigieren.

Ich habe es so gemacht:

BestOd=(OderPluseCount/(OderTotal*1.0));

Gibt es dafür eine Erklärung? Schließlich wäre es sehr schwierig, diesen Fehler zu erkennen, wenn er nicht aufgedruckt wäre. In welchen Fällen kann sie auftauchen?

Bei jeder Operation mit ganzzahligen Werten ist das Ergebnis eine ganze Zahl.
 

Ich habe die Antwort selbst im Nachschlagewerk gefunden, Abschnitt"Type conversion".

Если два значения объединяются бинарным оператором, то перед выполнением операции операнд младшего типа преобразовывается к более старшему типу в соответствии с приоритетом, указанным на схеме: 

Aber der Doppeltyp in diesem Schema ist der älteste. Und ich hatte beide int's. Daher ist das Ergebnis eine ganze Zahl. Einführung einer Konstante eines höheren Typs (double, float), Konvertierung aller int's in diesen Typ.

Sie lernen lange und konsultieren die Dokumentation)))

 
Hallo, ich habe die folgende Frage.
Wie kann ich einen EA erstellen, der offene Positionen durchläuft und ändert, so dass er die Aufträge, die beim nächsten Durchlauf geändert wurden, nicht wiederholt ändert. Man muss sie irgendwie "ölen".
Ich kann mir nichts vorstellen.
Ich wäre Ihnen dafür sehr dankbar.