Hilfe bei der Codierung - Seite 557

 
mntiwana:
Liebste MLADEN,

kann meine vorherige Anfrage versehentlich gelöscht, wie meist Dinge laufen hier und da, suchen und passen ihre genaue Stelle, aber wir sind einfach und Komfort mit unseren Job zu tun, als eine Erinnerung, die ich Sie für einige einfache Trailing-Stop mit BE-Code, die ich hinzufügen / fusionieren in beigefügten EA, die ich mit Ihrer freundlichen Hilfe und Führung geändert, aber ich bin nicht in Eile, wenn es möglich ist für Sie, ich weiß, wie viel Zeug spread-ed und warten auf Sie, danke.

Grüße

einfach_ma_cross_eamod-hp.mq4

OK. Wird gemacht

 
 

Hallo zusammen,

vielen Dank, dass Sie sich die Zeit genommen haben, meinen Beitrag zu lesen. Ich bin ein absoluter Neuling, wenn es um Code kommt. Ich habe ein paar Dinge ausprobiert, um diesen EA zum Laufen zu bringen, aber sie waren nicht die Lösung. Ich studiere globale Variablen, da ich denke, dass er diese braucht, um sich zu merken, was passiert ist, anstatt neu zu starten, wenn ein Refresh/Reload etc. stattgefunden hat. Es funktioniert perfekt in einem Backtest, aber aus irgendeinem Grund, wenn es live läuft, wird es einfach aufhören, Geschäfte zu machen oder sie zu schließen, und ich kann es einfach nicht herausfinden. Ich versuche auch zu lernen, wie man diese Dinge zu tun, aber ich bin nur gerade erst anfangen, so verzeihen Sie mir, wenn ich die Dinge falsch machen. Der EA hat eine Start- und Stoppzeit und in dieser Zeit kann er x Trades öffnen und wenn dieser schließt dann ein Zyklus abgeschlossen. Es ist so eingestellt, dass nur 1 Zyklus pro Zeitperiode erlaubt ist.

Kann jemand einen Blick auf diesen Code, um zu sehen, was das Problem ist bitte. Vielen Dank für jede Hilfe

maa1

quantum_shaolin_1.3.2.mq4

quantum.mq4

Dateien:
 

Hallo Mladen,

Ich habe einen Scanner-Indikator, der anzeigt, wie viele Indikatoren eine Kauf- oder Verkaufsmöglichkeit für ein bestimmtes Symbol anzeigen, und er scannt das Symbol auf mehreren Zeitrahmen.

Das Problem ist, dass der Indikator sagt, dass es immer Indikatoren gibt, auch wenn sie in der Tat nicht tun. Wenn dies der Fall ist, ist der Indikatorbetrag immer die gleiche Zahl.

Schauen Sie sich bitte den unten stehenden Code an:

double BufferALL[22];

int Timeframe[7][3]={15,,, 60,,, 240,,, 1440,,, 10080,,, 43200,, ,,};

for(x=0; x<=5; x++) {

if ((SymbolBars[y][x]==iBars(symbol[y],Timeframe[x][0]))&&(SymbolBars[y][x+1]==iBars(symbol[y],Timeframe[x+1][0]))) continue;

BufferALL[0]=indi1(symbol[y],Timeframe[x][0]);

//BufferALL[1]=ind2i(symbol[y],Timeframe[x][0]);

BufferALL[2]=ind3i(symbol[y],Timeframe[x][0]);

BufferALL[3]=ind4i(symbol[y],Timeframe[x][0]);

BufferALL[4]=ind5i(symbol[y],Timeframe[x][0]);

BufferALL[5]=indi(symbol[y],Timeframe[x][0]);

BufferALL[6]=indi(symbol[y],Timeframe[x][0]);

BufferALL[7]=indi(symbol[y],Timeframe[x][0]);

BufferALL[8]=indi(symbol[y],Timeframe[x][0]);

BufferALL[9]=indi(symbol[y],Timeframe[x][0]);

BufferALL[10]=indi(symbol[y],Timeframe[x][0]);

BufferALL[11]=indi(symbol[y],Timeframe[x][0]);

BufferALL[12]=indi(symbol[y],Timeframe[x][0]);

BufferALL[13]=indi(symbol[y],Timeframe[x][0]);

BufferALL[14]=indi(symbol[y],Timeframe[x][0]);

BufferALL[15]=indi(symbol[y],Timeframe[x][0]);

BufferALL[16]=indi(symbol[y],Timeframe[x][0]);

BufferALL[17]=indi(symbol[y],Timeframe[x][0]);

BufferALL[18]=indi(symbol[y],Timeframe[x][0]);

BufferALL[19]=indi(symbol[y],Timeframe[x][0]);

BufferALL[20]=indi(symbol[y],Timeframe[x][0]);

BufferALL[21]=indi(symbol[y],Timeframe[x][0]);

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

} // end of timeframe loop 6 iterations

Wenn alles in einer Warnmeldung angezeigt wird, erhalte ich etwas wie EURUSD: 15m/60m/4u/1d/1w/1mo zeigt eine Kaufgelegenheit an 7/7/7/7/7/7/.

Dies bedeutet, dass es 7 Indikatoren für jeden Zeitrahmen summiert, die eindeutig fehlerhaft ist. Das zeigt sich auch, wenn ich alle Funktionsaufrufe herausnehme. Wenn ich dies tue, sind alle Elemente von BufferALL[] leer.

Aber anscheinend ist der Wert EMPTY immer noch ein Wert, der mit einem anderen Wert wie z.B. 534653647457 verglichen werden kann. Wenn ich den Vergleich >= oder = 534653647457 zu == 534653647457 verwende, hören die /7/7/7/7/7/7/7/7 Meldungen auf. Wie kann ich das Problem lösen?

 
mrcodix:
Hallo Mladen,

Ich habe einen Scanner-Indikator, der anzeigt, wie viele Indikatoren auf eine Kauf- oder Verkaufsgelegenheit für ein bestimmtes Symbol hinweisen, und er scannt das Symbol auf mehreren Zeitrahmen.

Das Problem ist, dass der Indikator angibt, dass es immer Indikatoren gibt, auch wenn sie in Wirklichkeit nicht vorhanden sind. Wenn dies der Fall ist, ist der Indikatorbetrag immer die gleiche Zahl.

Schauen Sie sich bitte den unten stehenden Code an:

double BufferALL[22];

int Timeframe[7][3]={15,,, 60,,, 240,,, 1440,,, 10080,,, 43200,, ,,};

for(x=0; x<=5; x++) {

if ((SymbolBars[y][x]==iBars(symbol[y],Timeframe[x][0]))&&(SymbolBars[y][x+1]==iBars(symbol[y],Timeframe[x+1][0]))) continue;

BufferALL[0]=indi1(symbol[y],Timeframe[x][0]);

//BufferALL[1]=ind2i(symbol[y],Timeframe[x][0]);

BufferALL[2]=ind3i(symbol[y],Timeframe[x][0]);

BufferALL[3]=ind4i(symbol[y],Timeframe[x][0]);

BufferALL[4]=ind5i(symbol[y],Timeframe[x][0]);

BufferALL[5]=indi(symbol[y],Timeframe[x][0]);

BufferALL[6]=indi(symbol[y],Timeframe[x][0]);

BufferALL[7]=indi(symbol[y],Timeframe[x][0]);

BufferALL[8]=indi(symbol[y],Timeframe[x][0]);

BufferALL[9]=indi(symbol[y],Timeframe[x][0]);

BufferALL[10]=indi(symbol[y],Timeframe[x][0]);

BufferALL[11]=indi(symbol[y],Timeframe[x][0]);

BufferALL[12]=indi(symbol[y],Timeframe[x][0]);

BufferALL[13]=indi(symbol[y],Timeframe[x][0]);

BufferALL[14]=indi(symbol[y],Timeframe[x][0]);

BufferALL[15]=indi(symbol[y],Timeframe[x][0]);

BufferALL[16]=indi(symbol[y],Timeframe[x][0]);

BufferALL[17]=indi(symbol[y],Timeframe[x][0]);

BufferALL[18]=indi(symbol[y],Timeframe[x][0]);

BufferALL[19]=indi(symbol[y],Timeframe[x][0]);

BufferALL[20]=indi(symbol[y],Timeframe[x][0]);

BufferALL[21]=indi(symbol[y],Timeframe[x][0]);

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

} // end of timeframe loop 6 iterations

Wenn alles in einer Warnmeldung angezeigt wird, erhalte ich etwas wie EURUSD: 15m/60m/4u/1d/1w/1mo zeigt eine Kaufgelegenheit an 7/7/7/7/7/7/.

Dies bedeutet, dass es 7 Indikatoren für jeden Zeitrahmen summiert, die eindeutig fehlerhaft ist. Das zeigt sich auch, wenn ich alle Funktionsaufrufe herausnehme. Wenn ich dies tue, sind alle Elemente von BufferALL[] leer.

Aber anscheinend ist der Wert LEER immer noch ein Wert, der mit einem anderen Wert wie z.B. 534653647457 verglichen werden kann. Wenn ich den Vergleich >= oder = 534653647457 zu == 534653647457 verwende, hören die /7/7/7/7/7/7/7/7 Meldungen auf. Wie kann ich das Problem lösen?

mrcodix

Ohne genau zu wissen, was die Indikatoren tun (was sind ihre Rückgabewerte), kann ich nur wilde Vermutungen anstellen, und das würde überhaupt nicht helfen

 
mladen:

mrcodix

Ohne genau zu wissen, was die Indikatoren tun (was ihre Rückgabewerte sind), kann ich nur wilde Vermutungen anstellen, und das würde überhaupt nicht helfen

Lieber Mladen,

Sie brauchen die Rückgabewerte nicht zu kennen, denn es sind nicht die Indikatoren, die der Übeltäter sind. Sehen Sie, genau das gleiche Problem tritt auf, wenn ich alle Aufruffunktionen deaktiviere, indem ich ein "//" vor jeder Codezeile einfüge (und sie so zu Kommentarzeilen mache). Das gleiche gilt für die Werte hinter dem = an dieser Stelle:

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}[/CODE]

it might aswell be something like

for(z=0; z<=14; z++){

if (BufferALL[z] >=1111111111111) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=2222222222222) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 333333333333) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 444444444444) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

it will give the same exact alert message that says /15m/60m/4u/1d/1w/1mo/ is indicating a buying opportunity /7/7/7/7/7/7/. I disabled all the function call lines with // so the BufferALL[22] elements should be EMPTY, they shoulden't contain any value whatsoever. Yet, when the computer comes at the if condition parts BufferALL[z] >=1111111111111 etc it ALWAYS states that the "value" thats inside BufferALL[z] is larger then 11111111111 (or any value you wish to put behind it). The only way to make these additions stop is by changing the if condition = into ==. When the computer asks whether the empty value of BufferALL[z] is exactly the same as 11111111 or 22222 or whatever value you wish to compare, it doesen't return a true and Timeframe is not added with +1. Please try it for youself. I will add the message construction code below:

[CODE]

int SymbolBars[216][7];

if (((Timeframe[0][1] > 0) && (Timeframe[1][1] > 0) && (SymbolBars[y][0]!=iBars(symbol[y],Timeframe[0][0]))&&(SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))) || ((Timeframe[1][1] > 0) && (Timeframe[2][1] > 0)&& (SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))&&(SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))) || ((Timeframe[2][1] > 0) && (Timeframe[3][1] > 0)

&& (SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))&&(SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))) || ((Timeframe[3][1] > 0) && (Timeframe[4][1] > 0) && (SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))&&(SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0]))) || ((Timeframe[4][1] > 0) && (Timeframe[5][1] > 0)&& (SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0])) &&(SymbolBars[y][5]!=iBars(symbol[y],Timeframe[5][0]))))

{

if (Timeframe[0][1]>0)

{

StringAdd(alarmbericht,"15m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[0][1],"/"));

SymbolBars[y][0]=iBars(symbol[y],15);

}

if (Timeframe[1][1]>0)

{

StringAdd(alarmbericht,"60m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[1][1],"/"));

SymbolBars[y][1]=iBars(symbol[y],60);

}

if (Timeframe[2][1]>0)

{

StringAdd(alarmbericht,"4u/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[2][1],"/"));

SymbolBars[y][2]=iBars(symbol[y],240);

}

if (Timeframe[3][1]>0)

{

StringAdd(alarmbericht,"1d/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[3][1],"/"));

SymbolBars[y][3]=iBars(symbol[y],1440);

}

if (Timeframe[4][1]>0)

{

StringAdd(alarmbericht,"1w/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[4][1],"/"));

SymbolBars[y][4]=iBars(symbol[y],10080);

}

if (Timeframe[5][1]>0)

{

StringAdd(alarmbericht,"1mo/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[5][1],"/"));

SymbolBars[y][5]=iBars(symbol[y],43200);

}

Alert(+symbol[y]+" "+alarmbericht+" are indicating a selling opportunity. " +indicatoraantal+".");

alarmbericht = "";

indicatoraantal = "";

}

if (((Timeframe[0][2] > 0) && (Timeframe[1][2] > 0) && (SymbolBars[y][0]!=iBars(symbol[y],Timeframe[0][0]))&&(SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))) || ((Timeframe[1][2] > 0) && (Timeframe[2][2] > 0)&& (SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))&&(SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))) || ((Timeframe[2][2] > 0) && (Timeframe[3][2] > 0)

&& (SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))&&(SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))) || ((Timeframe[3][2] > 0) && (Timeframe[4][2] > 0) && (SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))&&(SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0]))) || ((Timeframe[4][2] > 0) && (Timeframe[5][2] > 0)&& (SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0])) &&(SymbolBars[y][5]!=iBars(symbol[y],Timeframe[5][0]))))

{

if (Timeframe[0][2]>0)

{

StringAdd(alarmbericht,"15m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[0][2],"/"));

SymbolBars[y][0]=Bars(symbol[y],15);

}

if (Timeframe[1][2]>0)

{

StringAdd(alarmbericht,"60m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[1][2],"/"));

SymbolBars[y][1]=Bars(symbol[y],60);

}

if (Timeframe[2][2]>0)

{

StringAdd(alarmbericht,"4u/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[2][2],"/"));

SymbolBars[y][2]=Bars(symbol[y],240);

}

if (Timeframe[3][2]>0)

{

StringAdd(alarmbericht,"1d/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[3][2],"/"));

SymbolBars[y][3]=Bars(symbol[y],1440);

}

if (Timeframe[4][2]>0)

{

StringAdd(alarmbericht,"1w/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[4][2],"/"));

SymbolBars[y][4]=Bars(symbol[y],10080);

}

if (Timeframe[5][2]>0)

{

StringAdd(alarmbericht,"1mo/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[5][2],"/"));

SymbolBars[y][5]=Bars(symbol[y],43200);

}

Alert(+symbol[y]+" "+alarmbericht+" are indicating a buying oppertunity. " +indicatoraantal+".");

alarmbericht = "";

indicatoraantal = "";

}
 

Mladen,

Hier ist ein Beispiel für die kontinuierliche Alarmmeldung, wenn ich alle Indikatoraufrufe entferne, indem ich sie in Kommentarzeilen verwandle.

Wenn es eine Kaufgelegenheit ist, ist die Summe aller Indikatoren in allen möglichen Zeitrahmen 15. Wenn es sich um eine Verkaufsgelegenheit handelt, sind es 7. Der BufferALL[] ist LEER, also macht das überhaupt keinen Sinn.

Abschließend möchte ich noch etwas erwähnen, das nicht zum Thema gehört. In der Vergangenheit habe ich etwas über den Scanner-Indikator gefragt, der mehrere Symbole nacheinander scannt. Ich habe mich gefragt, ob er nicht alle Ticks in den sich häufiger ändernden Symbolen erhält, wenn der Indikator an einen Chart angehängt ist, in dem das aktuelle Symbol nicht so häufig aktualisiert wird (weniger Ticks pro Sekunde). Das würde bedeuten, dass der Indikator theoretisch immer noch im 5-Minuten-Balken von 20:05 Uhr sein könnte, während die sich schneller aktualisierenden Symbole, die er ebenfalls scannen soll, bereits bei 20:10 Uhr sind. Ganz einfach, weil ein neuer Balken mit dem ersten Tick nach 20:04:59 beginnt und nicht, wenn die Uhr 20:05:00 schlägt. Sie haben darauf geantwortet, dass alle Symbole mit einer festen Prüfgeschwindigkeit geprüft werden, weil in der neuen Metatrader-Version die Start {return}-Prozedur nicht mehr bei jedem neuen Tick aktiviert wird. Stattdessen wird sie in einem festen Rhythmus aktiviert. Dies stellte sich als nicht zutreffend heraus. Nachdem ich alle meine Indikatoren in Funktionen umgewandelt hatte, die im Code meines Scanner-Indikators selbst enthalten sind, fror der gesamte Indikator immer noch ein, wenn ich ihn ausführte. Wenn ich also iCustom() benutze, um den Code aufzurufen, oder wenn ich den Code einfüge und ihn in eine interne Funktion verwandle, macht das keinen Unterschied, er friert immer noch ein. Aber ich habe eine Lösung für dieses Problem gefunden, indem ich die 215 Iterationen lange Master-For-Schleife (bei jeder Iteration wird ein anderes Symbol aus symbol[y] behandelt) durch eine Variable ersetzt habe, die nach jedem Tick einen Zusatz erhält. Ich verwende diese Variable, um dem Computer mitzuteilen, welches Symbol er verwenden soll, so dass jetzt nicht mehr versucht wird, alle 216 Symbole bei jedem Tick zu analysieren (was die ganze Sache einfrieren lässt), sondern nur noch ein Symbol bei jedem Tick analysiert wird. Wenn die Additionsvariable den Wert 215 erreicht, wird sie auf 0 zurückgesetzt, und der ganze 216-Zyklus beginnt von neuem. Jetzt werden alle Symbole analysiert, wenn auch etwas langsamer, als wenn sie alle 216 bei jedem Tick analysiert worden wären (wenn es nicht einfrieren würde) .... Wie auch immer. Der Punkt ist, dass Start{} nur aktiviert wird, wenn das aktuelle Symbol im Diagramm aktualisiert wird. Das bedeutet, dass es länger dauert, alle 216 Symbole durchzugehen, wenn der Indikator ein weniger aktives Symbol (wie eine Aktie) im Gegensatz zu einem sehr aktiven Symbol (wie EURUSD) ist. Start{} wird also weiterhin bei jedem neuen Tick aktiviert.

Dateien:
 

Hallo Mladen und Mrtools, ich bitte um eine große Freude.

Es wäre nett, das Problem der zwei Fehler beim Kompilieren des beigefügten Indikators zu lösen.

Vielen Dank im Voraus

Moreno

PS: Ich entschuldige mich für mein Englisch :-)

Dateien:
 
morenokosta:
Hallo Mladen und Mrtools, ich frage eine große Freude.

Es wäre nett, das Problem der zwei Fehler beim Kompilieren des beigefügten Indikators zu lösen.

Ich danke Ihnen im Voraus

Moreno

PS: Ich entschuldige mich für mein Englisch :-)

morenokosta

Der Indikator ist so wie er ist in Ordnung.

Keine Notwendigkeit, irgendeine Codeänderung vorzunehmen

 

Hallo Mladen

Kannst du bitte einen Alarm zu diesem Indikator hinzufügen, ich bin ein Neuling.

Vielen Dank

Dateien:
cross.mq4  2 kb