|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
||||
OK das vorhin war ein noch ein sehr fehler behafteter Code ... hab aus versehen denn falschen eingestellt:
im nachfolgend hab ich schon die kleineren Fehler ausgebügelt 3 fehler kann ich allerdings nicht lösen: hier hab ich wohl ein double-int Kompatibilitätsproblem: da [Periode-1] eine int ist? Code:
double Du[Periode-1]; // erstellt Extern Eingestellte Anzahl an "Du" Variablen (z.B. Du 0-9) genau so auch beiden beiden anderen fehlern hier nochmal der korrigierte code mit denn 3 Fehlern Code:
//+------------------------------------------------------------------+ //| Signal Idee Dax.mq4 | //| Markus | //| https://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "Markus " #property link "https://www.mql4.com" #property version "1.00" #property strict // GLOBALE VARIABLEN --- UM SIE IN ALLEN FUNKTIONEN ZU VERWENDEN!!! //+------------------------------------------------------------------+ // --- Variablen vom Benutzer Festlegen: (Global) //+------------------------------------------------------------------+ extern double HandelsLots = 0.1; // Größe der Handels Lots extern double SL_Prozent = 0.5; // StopLoos in Prozent extern double TP_Prozent = 1.5; // TakeProfit in Prozent extern int MagicNummer = 12345; extern int Periode = 10; // Perioden Länge Extern einstellen //+------------------------------------------------------------------+ // --- Variablen fest Festlegen: (Global) //+------------------------------------------------------------------+ datetime PeriondenStartZeit; // zum feststellen einer neuen Perionde bool NeuePeriodeBegonnen; bool LongSignal; bool ShortSignal; int LongOrder; int ShortOrder; //+------------------------------------------------------------------+ // --- Variablen für Durschnitts Berechnungen AnzahlMA20 //+------------------------------------------------------------------+ double Du[Periode-1]; // erstellt Extern Eingestellte Anzahl an "Du" Variablen (z.B. Du 0-9) int PeriodenVergleich = Periode; // PeriodenVergleich wird nicht mehr geändert und dient als Reverenz double Durchschnitt[5]; //insgesammt 6 Perioden Durchschnitte sollen erstellt werden int PeriodenStueckzahl=5; //Anzahl der Letzten Perioden die für Berechnungen zwischen gespeichert werden sollen (6Stück) bool BerechnungsFreigabe; // --- Strings für Symbole des Dax30 festlegen string syDax = "EUREX.FDX"; //+------------------------------------------------------------------+ //| Expert initialization function - Start von EA | //+------------------------------------------------------------------+ int OnInit() { //--- PeriondenStartZeit = Time[0]; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function - Ausführen beim Ende von EA | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function (StartZeit | //+------------------------------------------------------------------+ void OnTick() { //--- //+------------------------------------------------------------------+ // --- Variablen für ST/TP Berechnungen | //+------------------------------------------------------------------+ double StoppLossLO, StoppLossSO; double TakeProfitLO, TakeProfitSO; bool OrderAngepasst; int TPLO, TPSO; int SLLO, SLSO; double NachkommaTPLO, NachkommaTPSO; double NachkommaSLLO, NachkommaSLSO; // Überprüfen ob ein neuer Periodenbeginn vorliegt if (PeriondenStartZeit != Time[0]) { NeuePeriodeBegonnen = true; PeriondenStartZeit = Time[0]; } else NeuePeriodeBegonnen = false; // --- MA20 für Dax Abfragen - Symbole durch die Strings ersetzt double maDAX = iMA(syDax,0,20,0,MODE_SMA,PRICE_CLOSE,0); // ---Aktuellen BID für Dax Abfragen double bidDax = MarketInfo(syDax, MODE_BID); //+------------------------------------------------------------------+ //| Berechnung AnzahlMA20 | //+------------------------------------------------------------------+ double AnzahlMA20 = bidDax - maDAX; // Anzeige auf Bildschirm Comment("DAX =",AnzahlMA20); //+------------------------------------------------------------------+ //| Durchschnitte für AnzahlMA20 Berechnen | //+------------------------------------------------------------------+ if (Periode<PeriodenVergleich+1 && Periode>0) //wenn Perioder 0-9 (10Stück) { Du[Periode-1] = AnzahlMA20; //Du[9]=AnzahlMA20 .... Du[8]=AnzahlMA20 ... ---> Du[0]=AnzahlMA20 Periode --; // 10-1=9 ... 9-1=8 ... 8-1=7 ---> 1-1=0 } if (Periode<=1) //Wenn alle Werte der Variablen von 9-0 vergeben sind { double ZwSumm = 0; for(int i=0; i<PeriodenVergleich;i++) // so lange "i" kleiner als "PeriodenVergleich"(10) ist wird "Du" zusammengezählt { ZwSumm = ZwSumm + Du[i]; // Rechnet alle Du0-Du9 zusammen } Durchschnitt[PeriodenStueckzahl] = NormalizeDouble (ZwSumm/PeriodenVergleich,2); //Errechnet denn Durchschnitt und kürzt auf 2 Kommastellen PeriodenStueckzahl--; if (PeriodenStueckzahl<0) { PeriodenStueckzahl=0 // Stellt "PeriodenStueckzahl" auf 0 wenn alle [0-5] Durchschnitte befüllt sind, um im nächsten Durchlauf denn Durchschnitt der aktuellen Periode berechnen zu können Periode = PeriodenVergleich; } } if (Durchschnitt[5]>0 && Durchschnitt[4]>0 && Durchschnitt[3]>0 && Durchschnitt[2]>0 && Durchschnitt[1]>0 && Durchschnitt[0]>0) //Wennn die 6 letzten Durchschnitte berechnet wurden { BerechnungsFreigabe = true; } else BerechnungsFreigabe = false; //+------------------------------------------------------------------+ //| HandelsSignale ermitteln / Beispiel | //+------------------------------------------------------------------+ if (NeuePeriodeBegonnen == true) { if (BerechnungsFreigabe == true) { // --- Kauf Signal --- if (Durchschnitt[0]>Durchschnitt[1]) { LongSignal = true; } else LongSignal = false; // --- Verkauf Signal --- if (Durchschnitt[0]<Durchschnitt[1]) { ShortSignal = true; } else ShortSignal = false; } } else { LongSignal = false; ShortSignal = false; } //+----------------------------------------------------------------------------------------+ //| Speicher des Aktuellen "Durchschnitte[0]" auf 0 Stellen und denn Rest um 1 Verschieben | //+----------------------------------------------------------------------------------------+ if (BerechnungsFreigabe == true) { Durchschnitt[5]=Durchschnitt[4]; Durchschnitt[4]=Durchschnitt[3]; Durchschnitt[3]=Durchschnitt[2]; Durchschnitt[2]=Durchschnitt[1]; Durchschnitt[1]=Durchschnitt[0]; Durchschnitt[0]=0; } //+------------------------------------------------------------------+ //| Kauf / Verkauf Signal umsetzen | //+------------------------------------------------------------------+ |
|
||||
leider wurde meine überarbeitete Version von heute morgen noch nicht frei gegeben .... aber zudem hab ich wohl noch 2 Logische Probleme erkannt und versucht zu beheben ....
bei (Periode <=1) darf keine 1 stehen sondern eine 0: Code:
if (Periode <=0) //Wenn alle Werte der Variablen von "DU [9]-[0]" vergeben sind so sollte das richtiger sein: Code:
if (Periode <=0) //Wenn alle Werte der Variablen von "DU [9]-[0]" vergeben sind { double ZwSumm = 0; // "ZwSumm" bekommt denn Startwert 0 Periode = PeriodenVergleich; // "Periode" wird wieder auf AusgangsWert zurück gestellt for(int i=0; i<PeriodenVergleich;i++) // so lange "i" kleiner als "PeriodenVergleich"(10) ist wird "Du" zusammengezählt { ZwSumm = ZwSumm + Du[i]; // Rechnet alle Du0-Du9 zusammen } Durchschnitt[PeriodenStueckzahl] = NormalizeDouble(ZwSumm/PeriodenVergleich,2); //Errechnet denn Durchschnitt und kürzt auf 2 Kommastellen PeriodenStueckzahl--; if (PeriodenStueckzahl<0) PeriodenStueckzahl=0 // Stellt "PeriodenStueckzahl" auf 0 wenn alle [0-5] Durchschnitte befüllt sind, um im nächsten Durchlauf denn Durchschnitt der aktuellen Periode berechnen zu können } |
|
||||
Ok, also ein weiteres der Probleme hab ich nach langem Forschen jetzt glaub ich zumindest mal selber wieder einkreisen können ....
Ich Versuche hier am Anfang Code:
double Du[Periode-1]; // erstellt Extern Eingestellte Anzahl an "Du" Variablen (z.B. Du 0-9) Was ich noch nicht ganz nachvollziehen kann. Denn währe die Variable "Periode" noch nicht mit einem Wert bestückt währe die Sache ja klar, da der Compiler wissen muss wieviel Speicher er belegen soll, das könnte er aber in diesem Fall nicht, da er erst zur Laufzeit festlegen kann wieviel Speicher er braucht. Darum könnte der Code also gar nicht kompiliert werden, und deswegen würde es einen Fehler geben .... Nur in meinem Fall hab ich ja die "extern int Periode = 10;" am Anfang schon auf "10" voreingestellt !? Also müsste er sie doch berechnen können? Oder hab ich da was falsch verstanden? Mfg |
|
|||
Es ist immer für uns nützlich, auch den Fehler als Ausgabetext hier mit dazuzuschreiben.
traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
||||
die Fehlermeldung die unten steht ist :
'[' - invalid index value ... also "[" - ungültiger Indexwert und zudem noch diese 3: ... (obwohl ich mir sicher bin das kein Semicolon zuviel oder zu wenig hab) '}' - semicolon expected Forum TestDatei.mq4 143 4 '}' - unexpected end of program Forum TestDatei.mq4 355 1 '}' - unexpected end of program Forum TestDatei.mq4 355 1 |
|
|||
Es gibt zwei Möglichkeiten:
1. Man deklariert das Array z.B. mit double Array[5];, also einer konkreten Feldgröße oder 2. Man deklariert das Array allgemein mit double Array[]; und später über ArrayResize(Array, x); traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
||||
ahja ok .... also quasi am Anfang:
extern int PeriodenLaenge = 10; double Du[]; und dann in: void OnTick() ArrayResize(Du,PeriodenLaenge-1); das heist also man kann ein Array nicht mal eben über ein Du[Variable] erstellen sondern muss denn Umweg über ArrayResize(Du,Variable); nehmen hab das jetzt mal so umgesetzt und der Fehler ist jetzt weg Super Danke hab jetzt auch endlich die anden 3 Fehlermeldungen lösen können manchmal sind die schon ziemlich verwirrend zeigt mir 3 fehlermeldungen obwohl letztlich nur ein ";" gefehlt hatte |
|
|||
Zitat:
traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
||||
Ok, das werd ich mal machen wenn ich wieder Zuhause bin
Hab heute morgen mal nen Testlauf auf demokonto gestartet, nur leider scheint der EA noch nicht zu funktionieren Auf meinem mobilen MT4 wird angezeigt das er noch keinen einzigen Handel getätigt hat ... |
Lesezeichen |
Stichworte |
double, double wert, mql4, programmierung, programmierung metatrader, wert |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|