Hilfe bei der Codierung - Seite 352

 
freakout:
Guten Tag,

Liebe mladen, ich habe eine kleine Bitte an Dich - könntest Du die ganzen Infos, die der unten angehängte Indikator in der linken oberen Ecke anzeigt, abschalten?

vielen Dank im Voraus ;-)

Ich habe eine Option zum Ein- und Ausschalten von Kommentaren eingerichtet.

Dateien:
 
paradise77:
Hallo,

Ich bin neu hier. Ich möchte ein Rechteck-Objekt zu aktualisieren, aber nicht wissen, wie. Der Code unten ich verwendet, um Objekt Rechtecke zu erstellen, wenn EMAs gekreuzt. Diese Rechtecke müssen beendet werden, wenn der Preis zurück und berühren Sie es. Wie kann man das machen?

Vielen Dank im Voraus.

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 clrLime

#property indicator_width1 2

#property indicator_color2 clrMagenta

#property indicator_width2 2

extern int EMA1 = 3;

extern int EMA2 = 21;

extern int EMA3 = 63;

extern double arrowDistance = 0.0003;

extern color upRectColor = clrYellow;

extern color dnRectColor = clrDodgerBlue;

extern color touchRectColor = clrDarkGray;

//---

extern double rectHigh = 0.0001;

extern int rectDays = 3;

extern int bars_limit = 2000;

extern bool showRectangle = true;

double upArrow[];

double dnArrow[];

double prev2EMA1, prev2EMA2, prev2EMA3;

double prevEMA1, prevEMA2, prevEMA3;

double curEMA1, curEMA2, curEMA3;

double prevOpenPrc, prevClosePrc, prevLowPrc, prevHighPrc;

string objRectName;

string rectArray[];

string indiName = "Emac";

int rectValidity = 0;

int arrayMaxAmounts = 99999;

int arrayCurAmount = 0;

int arrayLastAmount = 0;

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

//| INIT() |

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

int init() {

if (Period() != PERIOD_H1) {

Alert("Use only @ TF: H1");

return(0);

}

ArrayResize(rectArray,arrayMaxAmounts,arrayMaxAmounts);

IndicatorBuffers(2);

SetIndexBuffer(0,upArrow);

SetIndexBuffer(1,dnArrow);

SetIndexStyle(0,DRAW_ARROW);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(0,233);

SetIndexArrow(1,234);

SetIndexEmptyValue(0,0.0);

SetIndexEmptyValue(1,0.0);

SetIndexLabel(0,"Up");

SetIndexLabel(1,"Dn");

return(0);

}

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

//| DEINIT() |

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

int deinit() {

int k=0;

while (k<ObjectsTotal()) {

string objname = ObjectName(k);

if (StringSubstr(objname,0,StringLen("Emac")) == "Emac")

ObjectDelete(objname);

else

k++;

}

return(0);

}

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

//| START() |

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

int start() {

if (Period() != PERIOD_H1) {

Alert("Use only @ TF: H1");

return(0);

}

int limit,i,k;

int counted_bars=IndicatorCounted();

//---- last counted bar will be recounted

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

//---

if (limit>bars_limit-1 && bars_limit!=0) limit=bars_limit-1;

if (Bars<EMA1 || Bars<EMA2 || Bars0 && bars_limit0 && bars_limit0 && bars_limit<EMA3)) {

Alert("Adjust limit settings or put more bars on your chart!");

return(0);

}

//---

for (i=0; i<limit; i++) {

prev2EMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+2);

prev2EMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+2);

prev2EMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+2);

prevEMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+1);

prevEMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+1);

prevEMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+1);

curEMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

curEMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

curEMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i);

prevOpenPrc = iOpen(NULL,0,i+1);

prevClosePrc = iClose(NULL,0,i+1);

prevLowPrc = iLow(NULL,0,i+1);

prevHighPrc = iHigh(NULL,0,i+1);

rectValidity = rectDays*86400;

if ( (prev2EMA1=prevEMA2)&&(curEMA1>curEMA2)&&(prevEMA2>=prevEMA3)&&(curEMA2>curEMA3) ) { // up

upArrow = prevLowPrc - arrowDistance;

if (showRectangle == true) {

//----------------------- Draw Rectangle ----------------------

objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time,0));

if (ObjectFind(objRectName) == -1) { // not exists

ObjectCreate(objRectName, OBJ_RECTANGLE, 0,Time,prevLowPrc,Time+rectValidity,prevLowPrc+rectHigh);

ObjectSet(objRectName, OBJPROP_COLOR, upRectColor);

ObjectSet(objRectName, OBJPROP_WIDTH, 0);

ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);

//--- put information to Array ---

arrayCurAmount = ArraySize(rectArray);

rectArray[arrayCurAmount] = StringConcatenate(objRectName,"$up$",Time,"$",prevClosePrc,"$0"); // 0=new, not yet touched

} // if

} // if

} // if

if ( (prev2EMA1>prev2EMA2)&&(prevEMA1<=prevEMA2)&&(curEMA1<curEMA2)&&(prevEMA2<=prevEMA3)&&(curEMA2<curEMA3) ) { // down

dnArrow = prevHighPrc + arrowDistance;

if (showRectangle == true) {

//----------------------- Draw Rectangle ----------------------

objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time,0));

if (ObjectFind(objRectName) == -1) { // not exists

ObjectCreate(objRectName, OBJ_RECTANGLE, 0, Time,prevHighPrc,Time+rectValidity,prevHighPrc-rectHigh);

ObjectSet(objRectName, OBJPROP_COLOR, dnRectColor);

ObjectSet(objRectName, OBJPROP_WIDTH, 0);

ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);

//--- put information to Array ---

arrayCurAmount = ArraySize(rectArray);

rectArray[arrayCurAmount] = StringConcatenate(objRectName,"$dn$",Time,"$",prevClosePrc,"$0"); // 0=new, not yet touched

} // if

} // if

} // if

} // for

//----------------------- Edit Rectangle, change time2 & color, if price touched ----------------------

return(0);

} // start

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

void DelObjects(string id) {

int ot1=ObjectsTotal();

while(ot1>=0) {

if (StringFind(ObjectName(ot1),id,0)>-1) {

ObjectDelete(ObjectName(ot1));

}

ot1--;

}

return;

}

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

string FuncPeriodToStr(int thePeriod) {

switch(thePeriod) {

case 1: return("M1");

case 5: return("M5");

case 15: return("M15");

case 30: return("M30");

case 60: return("H1");

case 240: return("H4");

case 1440: return("D1");

case 10080: return("W1");

case 43200: return("MN1");

default: return("MN1");

}

}

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

@Mladen,

Könnten Sie mir bitte helfen, einen Hinweis zur Bearbeitung des Rechtecks zu geben?

Ich habe folgendes gefunden :

*) Objekttypen - MQL4 Dokumentation

*) Objekt-Eigenschaften - MQL4-Dokumentation

Ich kann die Rechteck-Eigenschaften (time1, price1, time2, price2, color) erhalten, dann vergleichen Sie die price1 oder price2 zu aktuellen Ask/Bid-Preis. Wenn der Ask/Bid Preis den price1 oder price2 berührt, dann muss ich folgendes tun:

a) Ich brauche kein Array, sondern schaue mir nur jedes Rechteckobjekt an.

Löschen Sie das Objekt, erstellen Sie es erneut mit new time2 und newcolor.

b) Wie kann ich die Kerzenposition bei OBJPROP_PRICE1 ermitteln? Normalerweise verwenden wir eine "for"-Schleife wie

for (i=limit; i>0; i--)

Wie können wir das "i" des Balkens erhalten, der Preis1 hat?

c) Wenn ich das Rechteck nicht lösche und neu erstelle, kann ich dann einfach ObjectSet verwenden, um das Rechteck time2 und color zu ändern?

Ich danke Ihnen.

 
paradise77:
@Mladen,

Könnten Sie mir bitte helfen, einen Hinweis zur Bearbeitung des Rechtecks zu geben?

Ich habe folgendes gefunden :

*) Objekttypen - MQL4 Dokumentation

*) Objekt-Eigenschaften - MQL4-Dokumentation

Ich kann die Rechteck-Eigenschaften (time1, price1, time2, price2, color) erhalten, dann vergleichen Sie die price1 oder price2 zu aktuellen Ask/Bid-Preis. Wenn der Ask/Bid Preis den price1 oder price2 berührt, dann muss ich folgendes tun:

a) Ich brauche kein Array, sondern schaue mir nur jedes Rechteckobjekt an.

Löschen Sie das Objekt, erstellen Sie es erneut mit new time2 und newcolor.

b) Wie kann ich die Kerzenposition bei OBJPROP_PRICE1 ermitteln? Wir verwenden normalerweise eine "for"-Schleife wie

wie können wir das "i" des Balkens erhalten, der Preis1 hat?

c) Wenn ich das Rechteck nicht lösche und neu erstelle, kann ich dann einfach ObjectSet verwenden, um das Rechteck time2 und color zu ändern?

Ich danke Ihnen.

In Ihrem Fall sind Ihre Preise in Ordnung. Sie müssen die Zeiten verwenden, um die Felder von links und rechts zu begrenzen.

 

Cosmiclifeform,

Vielen Dank für dieses Stück, eigentlich habe ich instaforex demo.I heruntergeladen die 1M Preise fiest als die normale Methode.I dann tun Sie die Einstellung, mit EURUSD, siehe die screenshorts unten auf der Registerkarte Bericht und das Protokoll.

//reports, noting aber zerp, warum?

cosmiclifeform:
Hallo Mastercash,

Ich habe den EA auf einem FXDD-Demokonto ausgeführt...und habe nichts Besonderes gemacht...habe den EA einfach im Strategy Tester mit den Standardeinstellungen ausgeführt.

Ich wünschte, ich könnte mehr helfen... aber ohne spezifische Hinweise (Fehlerprotokolle, Screenshots und andere Bedingungen) ist es unmöglich, herauszufinden, warum Sie leere Ergebnisse erhalten.

Alles, was ich empfehlen kann, ist...

Probieren Sie zunächst einen guten EA im Testprogramm aus, von dem Sie wissen, dass er gut funktioniert.

Damit stellen Sie sicher, dass sowohl Ihre Demokonten als auch Ihre Verfahren in Ordnung sind.

Vergewissern Sie sich zunächst, dass alles so funktioniert, wie es soll.

Dann probieren Sie Ihren Nice TraderEA aus...und schreiben Sie genau auf, was passiert. Selbst ein leerer Bildschirm sollte Protokolle zum Überprüfen enthalten.

Versuchen Sie, überall PRINT- und COMMENT-Anweisungen hinzuzufügen... und überprüfen Sie dann Ihre Protokolle erneut... sowohl auf der EA-Registerkarte als auch auf der Journal-Registerkarte...

Auch Ihre COMMENT-Anweisungen werden auf dem Bildschirm angezeigt... Sie sollten also tatsächlich sehen, ob Ihr EA funktioniert oder nicht.

Die Quintessenz, um gute Hilfe bei der Codierung zu bekommen...

Ist es, die meisten Hinweise zu geben, die Sie finden können, was mit Ihrem EA passiert...

Versuchen Sie weiterhin alles Mögliche... und lassen Sie uns die Ergebnisse wissen.

Pass auf dich auf,

Robert
Dateien:
backtest1.png  14 kb
backtest2.png  3 kb
 
mladen:
In Ihrem Fall sind Ihre Preise in Ordnung. Sie müssen Zeiten verwenden, um die Boxen von links und rechts zu begrenzen

Danke mladen. Meinen Sie, dass ich die Zeit2 dynamisch verwenden muss? Time1, price1 & price2 ist fest. Aber Time2 ist abhängig von aktuellen bar (i), und bewegt sich, bis der Preis berühren Rechteck, oder es ist mehr als Standard-Rechteck Einstellung Zeit.

Mit anderen Worten, ist es unmöglich, die Farbe & time2 eines Rechtecks zu ändern?

Vielen Dank

 
paradise77:
Danke mladen. Meinst du ich muss die Time2 dynamisch verwenden ? Time1, price1 & price2 sind fest. Aber Time2 ist abhängig von der aktuellen bar (i), und ist in Bewegung, bis der Preis berühren Rechteck, oder es ist mehr als Standard-Rechteck Einstellung Zeit.

Mit anderen Worten, es ist unmöglich, die Farbe und die Zeit2 eines Rechtecks zu ändern?

Danke

paradies77

Ja, das müssen Sie.

Auf diese Weise passt du immer den rechten Rand des Rechtecks an (wenn er angepasst werden muss, natürlich)

 

Hallo Herr Mladen und Mrtools.

Ich mag wirklich nicht zu viele Alarme, weil ich eher ein visuelles System mag, so dass all das Rauschen und Popup-Fenster mich nur ablenken. Ich stelle nur einige Alarme des CCI ein, wenn ich überkauft oder überverkauft bin, das war's.

Aber es gibt einen Alarm, den ich gerne hätte, nämlich wenn "mein" SSA + MA den MA kreuzt, entweder nach oben oder nach unten.

Und noch etwas: Ich füge diesem schönen Tool immer drei Niveaus hinzu; natürlich die Null-Linie, 0,0, aber auch -0,3 und 0,3.

Ich möchte auch einen Alarm erhalten, wenn der SSA das -0,3-Niveau und das 0,3-Niveau überschreitet. Der Wert 0,0 ist nicht erforderlich.

Als Alarm ein einfacher Ton und ein Popup, das ist alles.

Ich danke Ihnen!

Dateien:
ssa__ma.mq4  5 kb
 
Wulong10:
Hallo Herr Mladen und Mrtools.

Ich mag wirklich nicht zu viele Alarme, weil ich ein visuelles System bevorzuge, so dass all das Rauschen und die Popup-Fenster mich nur ablenken. Ich setze nur einige Warnungen des CCI, wenn überverkauft oder überkauft, das war's.

Aber es gibt einen Alarm, den ich gerne hätte, nämlich wenn "mein" SSA + MA einen Schnittpunkt mit dem MA bildet, entweder nach oben oder nach unten.

Und noch etwas: Ich füge diesem schönen Tool immer drei Niveaus hinzu; natürlich die Null-Linie, 0,0, aber auch -0,3 und 0,3.

Ich möchte auch einen Alarm erhalten, wenn der SSA das -0,3-Niveau und das 0,3-Niveau überschreitet. Der Wert 0,0 ist nicht erforderlich.

Als Alarm ein einfacher Ton und ein Popup, das ist alles.

Dankeschön!

Wulong10

Das Problem mit SSA ist, dass es sich um einen neu berechnenden Algorithmus handelt. Das Hinzufügen von Alarmen ist, zumindest meiner Meinung nach, nicht sinnvoll, da sich dadurch immer die Position der Kreuze ändert und die Kreuze manchmal ganz verschwinden. Besser ist es, ihn im Nicht-Signalisierungsmodus zu verwenden (nur Schätzung).

 

Hallo Mladen,

ich weiß, dass die SSA auf höheren Zeitskalen neu berechnet wird.

Wenn ich es auf dem M5 benutze, ändert es sich ein wenig, auf dem M15 viel mehr, aber auf dem M1 habe ich dieses Indy viel getestet und bin sehr zufrieden damit. Mit meinen Einstellungen passt er sich wirklich kaum an, er ist sogar sehr genau.

Natürlich ist er bei einem langen Anstieg oder einem langen Fall des Preises nicht sehr zuverlässig, aber ist das nicht bei vielen Indikatoren so?

Dann verwendet man zur Sicherheit einen einfachen gleitenden Durchschnitt auf dem Chart ...

Vielleicht kann jemand anderes die Alerts nicht verwenden, aber ich schon.

Die Warnungen des CCI sind auch nicht immer richtig, aber es ist nur ein Hinweis darauf, was als nächstes passieren könnte.

Wenn also die SSA eine Warnung ausgibt, muss ich entscheiden, was zu tun ist, und darin werde ich immer besser.

Außerdem glaube ich, dass ich nicht der Einzige bin, der die SSA mag ...

Kreuze, die verschwinden? Das kommt beim M1 nicht sehr oft vor, und ich beobachte diesen Chart schon seit Tagen ...

Also, ich würde wirklich gerne die Alerts, wenn möglich.

Danke schön!

 
Wulong10:
Hallo Mladen,

Ich weiß, dass die SSA auf höheren Zeitskalen neu berechnet wird.

Wenn ich es auf dem M5 verwende, ändert es sich ein wenig, auf dem M15 noch viel mehr, aber auf dem M1 habe ich dieses Indy schon oft getestet und bin sehr zufrieden damit. Mit meinen Einstellungen passt er sich wirklich kaum an, er ist sogar sehr genau.

Natürlich ist er bei einem langen Anstieg oder einem langen Fall des Preises nicht sehr zuverlässig, aber ist das nicht bei vielen Indikatoren so?

Dann verwendet man zur Sicherheit einen einfachen gleitenden Durchschnitt auf dem Chart ...

Vielleicht kann jemand anderes die Alerts nicht verwenden, aber ich schon.

Die Warnungen des CCI sind auch nicht immer richtig, aber es ist nur ein Hinweis darauf, was als nächstes passieren könnte.

Wenn also die SSA eine Warnung ausgibt, muss ich entscheiden, was zu tun ist, und darin bin ich gut.

Außerdem glaube ich, dass ich nicht der Einzige bin, der die SSA mag ...

Kreuze, die verschwinden? Das kommt beim M1 nicht sehr oft vor, und ich beobachte diesen Chart schon seit Tagen ...

Ich würde mich also sehr über Warnungen freuen, wenn möglich.

Danke schön!

Wulong10

SSA berechnet immer neu (glauben Sie mir, denn ich war derjenige, der die dll zur Berechnung erstellt hat). Es gibt keine Ausnahme von dieser Regel (es spielt keine Rolle, in welchem Zeitrahmen Sie es verwenden).

Wenn die Anzahl der Berechnungen auf > 1 eingestellt ist, werden alle Balken neu errechnet. Wenn die Anzahl der Berechnungen auf 1 gesetzt wird, dann werden zumindest die "lag"-Balken neu berechnet.