Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Hilfe bei Programmierung eines Loops (http://www.expert-advisor.com/forum/showthread.php?t=2925)

trader99 09.05.13 00:02

Hilfe bei Programmierung eines Loops
 
Hallo, ich trade zwar schon seit Jahren, bin aber das erste mal in einem Forum. Ich befürchte, diesmal brauche ich wirklich Hilfe. Ich habe mir das Coden mit Tutorials erst vor kurzem beigebracht, habe mich durch zig Handbücher und Guides gequält, aber die meisten fangen bei Adam und Eva an und wenn man mal etwas leicht spezielleres braucht, ist es fast unmöglich, eine Anleitung zu finden. Ich habe auch viel gelernt indem ich mir andere EAs angeschaut und die Logik nachvollzogen habe und dann in meine eingebaut. Aber hier bin ich nun leider anscheinend an die Grenzen meiner Möglichkeiten gestoßen.

Folgendes Problem: Ich will eine Schleife (Zählung) einbauen, die unter anderem eine Einstiegsbedingung sein soll. Der Indikator , den ich dazu gebaut habe, funktioniert und ist vorab im EA schon definert, der Einfachheit halber nenne ich ihn hier nur Indicator.

Bedingung soll sein: Der Wert des Indikators war in der Vergangenheit =< -40 und seitdem noch nicht wieder >0 (für Long, umgekehrt für Short). Ich habe das so versucht:

bool Buycondition= false;
bool Sellcondition = false;
int x=1;
while(x>0)
{
if(Indicator <=-40) {Buycondition= true;break;}
if(Indicator<=-40) { for(int y=1; y<x; y++) {if(Indicator>0) Buycondition =false; break; }}

if(Indicator >= 40) {Sellcondition= true;break;}
if(Indicator >=40) { for(int z=1; z<x; z++) {if(Indicator<0) Sellcondition =false; break; }}

x++;}

Ein Programmierer wird wahrscheinlich die Hände über dem Kopf zusammenschlagen, aber leider ist mir nichts besseres eingefallen. Im Backtest scheint es mir so, als ob er mit dieser Schleife zwar immer erkennt, ob der Indikator größer oder kleiner war, aber das zweite und vierte“ if“ ignoriert er scheinbar total und tradet, sobald er unter -40 oder über 40 war ohne Rücksicht, ob er danach schon mal über Null war oder nicht.

Ich wäre sehr dankbar, wenn mir jemand sagen könnte, wie man diese Schleife richtig codet, denn ich probiere jetzt seit fast ner Woche daran rum aber kriege es nicht hin. Vielen Dank schon mal vorab, wenn sich jemand die Mühe machen sollte.

trader99 09.05.13 03:27

Hier nochmal der Loop, weil ich die Variable vergessen hatte. Im Editor war die Variable natürlich drin, trotzdem funktioniert es nicht, also daran lag es leider nicht.

bool Buycondition= false;
bool Sellcondition = false;
int x=1;
while(x>0)
{
if(iCustom(NULL,0,”Indicator”,0,x) <=-40) {Buycondition= true;break;}
if(iCustom(NULL,0,”Indicator”,0,x) <=-40)
{for(int y=1; y<x; y++) {if(iCustom(NULL,0,”Indicator”,0,x) >0) Buycondition =false; break; }}

if(iCustom(NULL,0,”Indicator”,0,x) >= 40) {Sellcondition= true;break;}
if(iCustom(NULL,0,”Indicator”,0,x) >=40)
{for(int z=1; z<x; z++) {if(iCustom(NULL,0,”Indicator”,0,x) <0) Sellcondition =false; break; }}

x++;}

traderdoc 09.05.13 10:50

Sorry, ich habe mal etwas Struktur in den Code gelegt. Und dann ist es besser Code auch unter# (im Nachrichtenmenü!) zu schreiben. sonst wird es zu unübersichtlich.

Code:

bool Buycondition= false;
bool Sellcondition = false;
int x=1;
while(x>0) {
  if(iCustom(NULL,0,”Indicator”,0,x) <=-40) {
      Buycondition= true;
      break;
  }
  if(iCustom(NULL,0,”Indicator”,0,x) <=-40) {
      for(int y=1; y<x; y++) {
        if(iCustom(NULL,0,”Indicator”,0,x) >0) {
            Buycondition =false;
            break;
        }
      }
  }

  if(iCustom(NULL,0,”Indicator”,0,x) >= 40) {
      Sellcondition= true;
      break;
  }
  if(iCustom(NULL,0,”Indicator”,0,x) >=40) {
      for(int z=1; z<x; z++) {
        if(iCustom(NULL,0,”Indicator”,0,x) <0) {
            Sellcondition =false;
            break;
        }
      }
  }
  x++;
}

Das der EA nicht in den Ausführungsteil der 2. und 5.!! if-Abfrage springt, liegt daran, dass der EA nur die Werte <= -40 und >= 40 berücksichtigt, denn sowohl mit
Code:

if(iCustom(NULL,0,”Indicator”,0,x) <=-40) {
  Buycondition= true;
  break;
}

als auch mit
Code:

if(iCustom(NULL,0,”Indicator”,0,x) >= 40) {
  Sellcondition= true;
  break;
}

springt der EA aufgrund des Befehls break aus der While-Schleife, wenn eben der Indikator <= -40 oder eben >= 40 beträgt. Da in der 2. und 5. if-Abfrage aber dieselben Werte genommen werden, kann er nicht in deren Ausführungsteil springen, weil er vorher ausgestiegen ist oder zwischen -39 und + 39 die 2. und 5. if-Abfrage false ergibt!

Was mir daran aber nicht klar ist:
"Bedingung soll sein: Der Wert des Indikators war in der Vergangenheit =< -40 und seitdem noch nicht wieder >0 (für Long, umgekehrt für Short)."

Soll ein Long Signal solange gegeben sein, bis der Indikator-Wert wieder > 0 ist (das hieße dann Long für alle! Werte < 0) und dann in ein Short Signal umschlägt oder soll das Long-Signal nur kommen, solange der Wert <= -40 und für Sell >= 40 ist, d.h. zwischen -39 und +39 überhaupt kein Signal?

traderdoc

trader99 09.05.13 16:58

Hi Traderdoc,

also erstmal vielen Dank, dass Du Dir die Mühe gemacht hast, Dich mit der Schleife auseinanderzusetzen.

Jetzt ist mir auch klar, warum er alles was nach dem ersten if kommt, nicht mehr beachtet, egal was ich da eingegeben habe. Klar, logisch, aber mit der Zeit kriegt man manchmal auch ein Brett vor dem Kopf, wenn man seit ner Woche an so ner Schleife sitzt. Außerdem hast Du mich dahingehend beruhigt, dass ich schon gedacht habe, ich grundlegend die while-Schleife total verkehrt gecodet, das scheint aber nicht der Fall zu sein, sonst hättest Du es sicher erwähnt.

Zu Deiner Frage: Es soll ein Long Signal gegeben sein, wenn der Wert <= -40 war und dann das erste Mal >0 wird. Danach soll kein Signal mehr sein, erst wieder, wenn der Wert erneut <= -40 war. Zu dem Zweck habe ich beim Einstieg noch die zusätzliche Bedingung: iCustom(NULL,0,”Indicator”,0,1) <=0 && iCustom(NULL,0,”Indicator”,0,0) > 0 in der späteren Entscheidungsschleife, ob ein Kauf stattfinden soll. Die habe ich hier allerdings zwecks der Übersichtlichkeit nicht mit reinkopiert, hätte ich vielleicht noch erwähnen sollen. Übrigens war noch ein Fehler im Code den ich hier reinkopiert hatte, ich hatte statt y und z jedesmal x gesetzt. Das war aber in meinem Editor auch nicht der Fehler.

Die Antwort auf Deine Frage ist also: Ja, es soll in dieser Schleife Long-Signal gegeben sein, jedesmal wenn der Wert <= -40 war. Da y seinen ersten Wert mit 1 hat, also die Vorperiode, müsste das doch eigentlich passen, denn wenn er in der laufenden Periode >0 wird, hat er sein einziges Einstiegssignal, wenn ich hier richtig gedacht habe.

Jetzt habe ich es mal so probiert:

Code:


bool Buycondition= false;
bool Sellcondition = false;
int x=1;
while(x>0) {
 
  if(iCustom(NULL,0,”Indicator”,0,x) <=-40) {
      for(int y=1; y<x; y++) {
        if(iCustom(NULL,0,”Indicator”,0,y) <=0) {
            Buycondition =true;
            break;
        }
      }
  }

 
  if(iCustom(NULL,0,”Indicator”,0,x) >=40) {
      for(int z=1; z<x; z++) {
        if(iCustom(NULL,0,”Indicator”,0,z) >=0) {
            Sellcondition =true;
            break;
        }
      }
  }
  x++;
}

Jetzt macht er allerdings im Backtest gar nichts mehr, der grüne Balken fängt nicht mal mehr an zu laufen, scheinbar ist das nicht rechenbar, was ich hier eingebe. Wenn Du eine Idee hast, wie man die Schleife richtig programmiert, wäre ich Dir sehr dankbar, ich habe echt langsam keine Ahnung mehr. Vielen Dank für Deine Mühe.

traderdoc 09.05.13 17:53

OK, dann lösen wir das mal ganz einfach!

In den Variablenteil (über init() und nicht! in start()) kommt:
bool LowRangeFlag = false;
bool HighRangeFlag = false;
double IndiValue;
bool Buycondition= false;
bool Sellcondition = false;

In die start()-Funktion kommt:
Code:

IndiValue = iCustom(NULL,0,”Indicator”,0,0); //Value auf der aktuellen Kerze, sonst statt der letzten 0 eine 1
if (IndiVakue <=-40) LowRangeFlag = true;
if (LowRangeFlag && IndiVakue > 0) Buycondition = true;
.
.
.
if (IndiVakue >= 40) HighRangeFlag = true;
if (HigRangeFlag && IndiVakue < 0) Sellcondition = true;

Hinter der Stelle, wo die Order gesetzt wurde, schreibst Du:
Für die Buy-Order:
Code:

LowRangeFlag = false;
Buycondition = false;

Für die Sell-Order entsprechend:
Code:

HighRangeFlag = false;
Sellcondition = false;

Damit werden die bool-Variablen wieder resettet.

Das ist alles, was Du brauchst.

Viel Erfolg!

traderdoc

trader99 09.05.13 18:47

Hi Traderdoc, das ist DIE Lösung, und natürlich funzt es so. Der Ansatz, dass man die bool-Variablen VOR dem Start definiert und er dann auch beim nächsten Rechnen die vorherigen bool-Werte beibehältet, bis man sie resettet, da bin ich einfach nicht drauf gekommen. Das revolutioniert nun mein Coding im Gesamten, weil dadurch vieles ganz leicht möglich wird, was ich bisher immer durch komplexe Zählungen versucht habe zu lösen, weil ich bisher nicht wusste, wie man es anstellen kann, dass er sich einen Vorwert für den nächsten Rechenschritt merken kann.

Super, damit hast Du für mich im Coding neue Horizonte eröffnet. Das sind halt Dinge, die Antwort darauf habe ich in keinem Tutorial gefunden, weil es zu speziell ist, seit einer Woche sitze ich an diesem und anderen Problemen, aber jetzt kann ich auch die anderen mit diesem Ansatz lösen.

Tausend Dank dafür, das hat mich jetzt in vielerlei Hinsicht ein großes Stück weiter gebracht !!! (Auch wenn der erste Backtest leider enttäuschend verlief, aber die Werte stimmen.)

Eine Frage hab ich noch: Funktioniert das auch mit anderen Variablen oder nur mit bools? Also z.B. angenommen ich definiere ein "double x=0;" vor dem Startteil. Wenn der Preis ein bestimmtes Hoch nimmt, erhält im Programmteil Start das x den Wert des Hochs. Merkt sich das Programm dann auch diesen Wert für die nächsten Ticks immer noch? Solange bis z.B. die Variable durch ein neues Hoch oder sonst eine Bedingung, die man setzt, verändert wird ?

traderdoc 09.05.13 19:40

Wenn eine Variable, egal welcher Typ, in einer Funktion deklariert wird, also z.B. double wert = ......; dann wird der Wert dieser Variablen nach dem Sprung aus der Funktion wieder gelöscht. Deshalb muß so eine Variable, die über die gesamte Dauer des Programms existieren soll, im externen Teil deklariert werden.

traderdoc

trader99 09.05.13 20:03

Vielen Dank für die Antwort, alles klar, hast mir sehr weitergeholfen !!


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:51 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum