Wie programmiert man? - Seite 322

 

Hallo,

meine Anfrage ist nur zur Information, für den Moment.

Wenn ich einen Indikator habe, der ein Offline-Diagramm erstellt, ohne die Vergangenheit zu berechnen, sondern nur die Live-Daten, ist es möglich, es in der Strategie-Tester-Vorlage anzuhängen und ein Offline-Diagramm mit den Daten aus der Geschichte zu erstellen?

Ich danke Ihnen.

 
mladen:
jayjonbeach,

Sie testen den Wert von trendCurr immer wieder in der Schleife, ohne ihn zu ändern (daher wird immer NONE zurückgegeben).

Versuchen Sie, iCustom() in die Schleife einzufügen und dann diesen Wert zu testen. Zum Beispiel so:

if (trendCurr>0)

{

for(int i=1; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

Sehr geehrter Herr. Ich habe nur zwei Worte dazu, aber sie müssen wiederholt werden...

DANKESCHÖN, DANKESCHÖN und DANKESCHÖN!!!

Ihr Code hat in der Tat perfekt funktioniert, und ich würde wetten, dass Sie mir weitere 12 oder noch mehr Stunden erspart haben, in denen ich andere "for"-Schleifen, Versuch und Irrtum usw. untersucht habe, bevor ich schließlich über das gestolpert bin, was Sie gepostet haben.

Ich dachte eigentlich, dass ich trendCurr immer und immer wieder in der Schleife testen wollte, aber jetzt sehe ich den Fehler dank Ihnen, und ich sehe, wie Ihre Lösung, den Stepbartotest mit "i" zu ändern, tatsächlich die perfekte Lösung ist, mit "i" hier ist eigentlich der Schlüssel, aber scheint nicht ganz offensichtlich, zumindest für einen Anfänger wie mich könnte es einige Zeit gewesen sein, bevor ich das herausgefunden habe...

Während Ihr Code wie beabsichtigt funktioniert, ist mein gesamter Block nicht, es gibt ein sehr interessantes unbeabsichtigtes Ergebnis, wenn diese Schleife innerhalb der LONG-Kriterien ausgeführt wird:

if(TwentyOneEMA > FiftyFiveEMA)

{

if (trendCurr>0) // Schrittfilter Strom prüfen

{

wenn (Bid > TwentyOneEMA)

{

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

{

int testValue = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

}

}

Wenn die Bedingungen erfüllt sind, wird die Schleife getestet, und wenn sie wahr ist, kauft sie, wenn nicht, tut sie nichts, toll. Allerdings verhält sich der gesamte Codeblock wie eine "while"-Schleife, denn solange if(TwentyOneEMA > FiftyFiveEMA) wahr ist, läuft der Rest des Codes darunter WEITER, und wenn alle anderen Bedingungen wahr werden, kauft der Trottel! Ich sehe den offensichtlichen Fehler in meiner Codestruktur hier.... (Ich denke, eine weitere ähnliche for-Schleife könnte die EMAs testen, um sicherzustellen, dass das EMA-Kreuz ein NEUES ist)

Dies ist nicht unbedingt eine schlechte Sache jedoch (wie einige Analyse implizieren würde), in der Tat ist dies eine Art wie das, was mein nächstes Ziel war, in einer anderen Art und Weise, es braucht viel mehr Tests, aber für jetzt werde ich diese Revision in Ort auf diesem Bot zu verlassen und starten Sie die nächsten Revisionen auf eine Kopie.

Was ich tun wollte, nachdem ich es Blick auf die Vergangenheit, war, wenn die Vergangenheit Schleife stellt sich heraus, falsch, ich wollte es zu überprüfen, die NÄCHSTEN 10 Bars für ein Step-Signal, und wenn es wahr wird, nehmen Sie den Handel (ich dachte über die Verwendung einer while-Schleife für diese?). So ist dies Art von bereits geschieht, außer es gibt KEINE 10 bar Grenze in seinem Blick nach vorn, und ich bin nicht sicher, wie ich die ganze Sache zu strukturieren, um richtig zu arbeiten. (Ich denke, ich könnte prüfen, Step-Signal, und wenn wahr, suchen Sie nach neuen MA Kreuz in den letzten 10 Bars, aber ich habe zu wiederholen, alle den Block für diese und denke, es muss besser sein, effizienter / eleganter Weg)

Vielen Dank noch einmal für Ihre Hilfe, das wird in SEHR nützlich in Zukunft Kodierung ich bin sicher, kommen.

 

Hallo!

Ich versuche, den beigefügten Indikator zu ändern. Pratically, wenn eine gleitende everage berühren den Preis es Alarm und ändern Sie den Zeitrahmen, wo es berührt wird. Ich habe eine Verzögerung in den Alarm, der Respekt ist, aber nach einem Alarm, wenn ich den Zeitrahmen ändern er ingnore es.

Es kann behoben werden?

Vielen Dankumedie_mobili.mq4

Dateien:
 

dasio

Mit Indikatoren können Sie das nicht ändern. Die Indikatoren setzen den globalen Bereich und die statischen Variablen auf die Standardwerte zurück, wenn Sie das tun, also können Sie einige Werte nicht beibehalten, wenn Sie den Zeitrahmen oder das Symbol ändern. Sie könnten die globalen Variablen verwenden (die mit "GlobalVariable..." Funktionen verwaltet werden), aber das würde Ihren Code sehr kompliziert machen (für mehrere Instanzen, mehrere Symbole, ...) und meiner Meinung nach ist es den Aufwand nicht wert

dasio:
Hallo,

Ich versuche, den beigefügten Indikator zu modifizieren. Wenn ein gleitender Durchschnitt den Preis berührt, schlägt er Alarm und ändert den Zeitrahmen, in dem er berührt wird. Ich habe eine Verzögerung in den Alarm, die respektiert wird, aber nach einem Alarm, wenn ich den Zeitrahmen ändern er ingnore es.

Kann es behoben werden?

Vielen Dankumedie_mobili.mq4
 

...

Nur eine Ergänzung zum vorherigen Beitrag: eine Sache, die nicht so weit bekannt ist - EAs behandeln diese Variablen (globaler Bereich und statische Variablen) anders - sie werden nicht zurückgesetzt, wenn Zeitrahmen oder Symbol geändert wird. Hier ist ein sehr, sehr einfacher EA, der denjenigen, die daran interessiert sind, zeigt, wie diese Werte in EAs nicht zurückgesetzt werden wie in Indikatoren

int counter = 0;

int init()

{

return(0);

}

int start()

{

static int counterStart = 0;

counterStart++;

counter++;

Comment("counter from start : "+counterStart," counter using global scope : "+counter);

return(0);

}

Das ist sogar eine Ursache für einige Fehler in einigen EAs (wenn der EA nicht berücksichtigt, dass die Variable nicht zurückgesetzt wird, wenn der Zeitrahmen oder das Symbol geändert werden, können einige sehr merkwürdige Fehler in der EA-Arbeit auftreten)

 
mladen:
dasio Aus dem Code kann ich nicht erkennen, was die Absicht des Codes ist. Wie auch immer, hier ist ein Code, in dem Sie wählen können, ob Sie den wahren Bereich als "Basis"-Wert des Indikators verwenden möchten (es ist der erste Teil Ihres Codes) oder ob Sie den zweiten Teil Ihres Codes als "Basis"-Wert verwenden möchten

Ein weiteres Mal danke mladen.

Ist es möglich, eine weitere Linie auf der Grundlage dieser Bedingung hinzuzufügen?

Zeichnen Sie eine horizontale Linie = zum Durchschnitt der Work[], die > von Avg[] sind, immer basierend auf der Tagesperiode?

Vielen Dank!

 

Signal-Änderung

Hallo Mladen,

ich möchte ein Stop-Selling- oder Stop-Buying-Signal zu diesem Code hinzufügen....., z.B. wenn die stochastische Signallinie über der Hauptlinie ist, Stop-Selling usw. Ich habe es zum Code hinzugefügt, aber es funktioniert nicht... bitte helfen Sie mir

if(Zeitraum()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PREIS_SCHLIESSEN,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PREIS_TYPISCH,0);

double b4trCCI=iCCI(NULL,240,14,PREIS_TYPISCH,1);

double nowtrCCI=iCCI(NULL,240,14,PREIS_TYPISCH,0);

// Warnungen

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Aktuelle Zeit ist ",TimeToStr(CurTime()),"\n",Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n", "Aktuelle Zeit ist ",TimeToStr(CurTime()),"\n",Symbol());

}

}

 

Sie können etwas wie dieses versuchen:

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MOD E_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,M ODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alerts

alertType = "do nothing";

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="buy";

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="sell";

}

if (alertType=="do nothing")

{

lastAlerted=Time[0]; Alert("Stop previous action","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}
Mastercash:
Hallo Mladen,

Ich möchte ein Stop-Selling- oder Stop-Buying-Signal zu diesem Code hinzufügen.....z.B. wenn die stochastische Signallinie über der Hauptlinie liegt, Stop-Selling e.t.c, ich habe es zum Code hinzugefügt, aber es funktioniert nicht...pls help

if(Zeitraum()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PREIS_SCHLIESSEN,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PREIS_TYPISCH,0);

double b4trCCI=iCCI(NULL,240,14,PREIS_TYPISCH,1);

double nowtrCCI=iCCI(NULL,240,14,PREIS_TYPISCH,0);

// Warnungen

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n", "Aktuelle Zeit ist ",TimeToStr(CurTime()),"\n",Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n", "Aktuelle Zeit ist ",TimeToStr(CurTime()),"\n",Symbol());

}

}
 

Nun bin ich wieder stecken. Ich versuche, die EA von Blick in die Zukunft aufgrund der Art, wie mein Code strukturiert war zu korrigieren.

Mein Signal-Code beginnt mit einem "if", und solange das wahr ist, der Rest des Codes folgenden hält die Ausführung, wie es sollte (dies war nicht ein Problem vor dem Einfügen der ersten for-Schleife, aber jetzt ist es). Ich habe also eine Reihe verschiedener Dinge ausprobiert, um dies zu korrigieren, aber nichts funktioniert Ich habe auch im Handbuch nachgeschaut, aber dort stand nichts, vielleicht sind zwei "for"-Schleifen im selben Block nicht erlaubt?

Hier ist, was ich denke, ist mein bester Versuch (nur zeigen LONG der Kürze halber), keine Fehler, aber der EA macht keine Trades, so wahrscheinlich habe ich die Schleife wieder vermasselt:

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

if (trendCurr>0)

{

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

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

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

if (testValue1 < testValue2-Abstand2)

{

if (Bid TwentyOneEMA) // Nachrichtenfilter

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

}

==========

Hinweis: Ich habe versucht, if (testValue1 < testValue2-Separation2) continue; zu verwenden, aber es hat 'continue' als Fehler markiert Wenn 2 Schleifen nicht erlaubt sind, dann schätze ich, dass meine nächste Aufgabe, eine weitere Schleife hinzuzufügen, fehlgeleitet sein könnte...

 
jayjonbeach:
Nun, ich stecke wieder fest. Ich versuche, den EA zu korrigieren, der aufgrund der Struktur meines Codes nicht in die Zukunft schaut.

Mein Signalcode beginnt mit einem "if", und solange das wahr ist, wird der Rest des folgenden Codes ausgeführt, wie es sollte (das war kein Problem, bevor ich die erste for-Schleife einfügte, aber jetzt ist es). Ich habe also eine Menge verschiedener Dinge ausprobiert, um dies zu korrigieren, aber nichts funktioniert Ich habe auch im Handbuch nachgeschaut, aber dort stand nichts, vielleicht sind zwei "for"-Schleifen im selben Block nicht erlaubt?

Hier ist, was ich denke, ist mein bester Versuch (nur zeigen LONG der Kürze halber), keine Fehler, aber der EA macht keine Trades, so wahrscheinlich habe ich vermasselt die Schleife wieder:

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

if (trendCurr>0)

{

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

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

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

if (testValue1 < testValue2-Abstand2)

{

if (Bid TwentyOneEMA) // Nachrichtenfilter

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

}

==========

Hinweis: Ich habe versucht, if (testValue1 < testValue2-Separation2) continue; aber es markiert 'continue' es als Fehler Wenn 2 Schleifen nicht erlaubt sind, dann schätze ich meine nächste Aufgabe des Hinzufügens einer weiteren Schleife könnte fehlgeleitet sein...

Okay, ich glaube, ich habe es herausgefunden. Es lag an der Art und Weise, wie ich die for-Schleife strukturiert habe, da die Dinge nicht direkt nach dieser ersten Schleife "beendet" wurden, musste sie etwas anders strukturiert werden als die zweite Schleife, zumindest ist das die Schlussfolgerung, zu der ich gekommen bin, als ich mir einige andere Bots angesehen habe. Ein Schnelltest zeigt, dass das Folgende funktioniert, es muss aber noch mehr getestet werden

NumOrders = CalculateCurrentOrders();

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

wenn (trendCurr>0)

{

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

{

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

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

if (testValue1 <! testValue2-Abstand2)

{

Print("No Trade");

break;

}

if (Bid TwentyOneEMA) continue; // Nachrichtenfilter

for(int j=0; j<=lookback; j++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+j);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

Grund der Beschwerde: