|
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 |
|
|||
Was gibt es da nicht durchzusteigen? Das Problem ist nur allzu häufig, ihr wollt EAs programmieren und es fehlen häufig die grundlegenden Programmkenntnisse. Bei der Zeile:
if OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); muss es natürlich lauten: if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) Dieser Fehler war aus Post #4 mitgeführt worden. U.a. nach if und for folgt immer!! ein Klammerausdruck (...) und kein ; Das return(summe) sitzt im Post #11 an der korrekten Stelle. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hallo traderdoc,
ich bitte vielmals um Entschuldigung. Die zusätzlich einzufügenden if-Klammern waren mir auch schon aufgefallen und "return(summe)" bzw. "Print("Summe", summe);" standen selbstverständlich an der richtigen Stelle. Melde mich in Kürze, sobald es etwas Neues zu berichten gibt. LG. piptrade |
|
|||
Lieber traderdoc,
ich mühe mich redlich, - und das seit Stunden ! Im Allgemeinen hast Du schon recht, alle wollen sich einen EA "basteln" aber keiner will dessen Sprache verstehen. Im Besonderen gibt es aber auch User, welche die Sprache erlernen und richtig anwenden wollen. - Und das versuche ich seit nunmehr einem Jahr (Stück für Stück - und immer, wenn es die Zeit erlaubt). Momentan muss ich mich aber mit "no body is perfect" zufrieden geben ! Was meine aktuellen Bemühungen angeht, bin ich jetzt HIER angelangt: Code:
extern string LastDays = "Today=0, Yesterday=1 aso."; extern int Shift = 0; double Profit(); int Line(); int Text(); //+------------------------------------------------------------------+ // CustomIndicator initialization function | //+------------------------------------------------------------------+ int init() { initGraph(); { if (IsConnected()) main(); } return(0); } //+------------------------------------------------------------------+ // CustomIndicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { ObjectsDeleteAll(0,OBJ_LABEL); return(0); } //+------------------------------------------------------------------+ // CustomIndicator start function | //+------------------------------------------------------------------+ int start() { if (IsConnected()) main(); return(0); } //+------------------------------------------------------------------+ // CustomIndicator function | //+------------------------------------------------------------------+ void main() { //+--- get Profit() global scope ------------------------------------+ double Profit() { double x = 0; double Summe = 0; for(int i = OrdersHistoryTotal() - 1 ; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol() == Symbol()) { if (OrderCloseTime() >= iTime(NULL, PERIOD_D1, Shift) && OrderCloseTime() < iTime(NULL, PERIOD_D1, Shift-1)) { x = OrderProfit() Summe += x; } } } Print("Summe", Summe); } return(Summe); } //+--- Unterscheidg. Prof/Loss bzw. CLRgreen_up/CLRred_down double prof = Profit(); // Rückgabewerte für Variablen if(prof >= 0) paintProf(prof); // (prof) für Weiterverarbtg. unter paintProf if(prof < 0) paintLoss(prof); // (prof) für Weiterverarbtg. unter paintLoss //+--- paint-Bereich ------------------------------------------------+ paintLine(); paintSign(); paintsumme(); } //+------------------------------------------------------------------+ void initGraph() { ObjectsDeleteAll(0,OBJ_LABEL); objectCreate("Line",10,17,"-----------------------------------",10,"Arial",LightSlateGray); // Line objectCreate("Sign",10,7,"PROFIT(euro):",9,"Arial Narrow",LightSlateGray); // Text objectCreate("Summe",134,25,DoubleToStr(9,1),10,"Arial Narrow",Silver); // Wert / DoubleToStr(9,1) (value,digits) objectCreate("Prof",130,67); // Rectangle 1 green objectCreate("Loss",130,61); // Rectangle 2 red WindowRedraw(); } //+--- Label, Positionierg., Hintergrundfarbe und Textvorgaben ----------------------------------------------------------------+ void objectCreate(string name,int x,int y,string text="-",int size=12, string font="Arial",color colour=CLR_NONE) { ObjectCreate(name,OBJ_LABEL,0,0,0); ObjectSet(name,OBJPROP_CORNER,3); ObjectSet(name,OBJPROP_COLOR,colour); ObjectSet(name,OBJPROP_XDISTANCE,x); ObjectSet(name,OBJPROP_YDISTANCE,y); ObjectSetText(name,text,size,font,colour); } //+--- Zuordnung Farb-Eigenschaften --------------------------------------------------------------------------------------------+ void paintLine() { ObjectSet("ZeroLine",OBJPROP_COLOR,LightSlateGray); } void paintSign() { ObjectSet("Sign",OBJPROP_COLOR,LightSlateGray); } void paintsumme(int value) { if(value >= 0) ObjectSetText("Summe",DoubleToStr(value,0),10,"Arial Black",Green); // für sich ändernde Wert-Angabe + summe in EUR if(value < 0) ObjectSetText("Summe",DoubleToStr(value,0),10,"Arial Black",Maroon); // für sich ändernde Wert-Angabe - summe in EUR } void paintM1(double value) { if (value >= 0) ObjectSet("Prof",OBJPROP_COLOR,Green); // Rectangle Prof // ObjectSetText("...",DoubleToStr(value,0),8,"Arial Narrow",Green); // Part 2: für sich ändernde Wert-Angabe in Point/pip } void paintM5(double value) { if (value < 0) ObjectSet("Loss",OBJPROP_COLOR,Maroon); // Rectangle Loss // ObjectSetText("...",DoubleToStr(value,0),8,"Arial Narrow",Maroon); // Part 2: für sich ändernde Wert-Angabe in Point/pip } //+--- The PRG-End -------------------------------------------------------------------------------------------------------------+ 1. "Profit"-function can be declared only in the globalscope 2. "paintProf" - function not defined 3. "paintLoss" - function not defined und 4. "PaintSumme" - wrong parameters count Ursprünglich waren es 23 errors und ?? warnings, welche ich ausräumen konnte, - jetzt komme ich aber einfach nicht weiter. Vielleicht kannst Du nochmals einen Blick darüber werfen und mir mit Deinen Hinweisen zur Seite stehen ? Wäre richtig toll. LG. piptrade PS.: Auf dem angehängten JPG werden die abgeschlossenen Trades (EA arbeitet momentan OHNE Filter!) bereits dargestellt - die programm-technische Umsetzung der manuell eingefügten Grafik ist das Ziel des obigen Codes. So hat man vielleicht eine bessere Vorstellung. |
|
|||
1. "Profit"-function can be declared only in the globalscope
double Profit() muss genauso extern deklariert werden wie z.B. void paintSign() 2. "paintProf" - function not defined Die Funktion paintProf() wurde zwar aufgerufen aber wurde nirgends deklariert. 3. "paintLoss" - function not defined Die Funktion paintLoss() wurde zwar aufgerufen aber wurde nirgends deklariert. 4. "PaintSumme" - wrong parameters count Die Funktion paintsumme() wurde mit der Übergabe eines Parameters deklariert, sie wird aber ohne Parameterübergabe aufgerufen. Das geht natürlich nicht. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Ohhh, - eine Antwort im "Kästchen" !
- jetzt wird`s wieder heiß für mich. Werde mich sofort und erneut in die Materie stürzen und hoffe noch heute Abend grünes Licht geben zu können. Bis dahin ganz LG. piptrade |
|
|||
Hallo traderdoc,
bis zum jetzigen Zeitpunkt zeigt sich lediglich ein grünlicher Schimmer am Ende des Tunnels. Ein "GRÜNES LICHT" ist das noch nicht. Die letzten 3 Punkte habe ich (so glaube ich zumindest) verstanden und den Code auch dahingehend verändert. Resultat für diese 3 Punkte: No Errors / No Warnings ! Insoweit bin ich erst einmal über das Erreichte recht froh. Danke. Darüber hinaus habe ich etwas "aufgeräumt", überflüssige Dopplungen entfernt und Kleinigkeiten in Übereinstimmung gebracht. Soweit, wie gesagt, ist alles o.k.. Was es aber in sich hat, ist der Part mit der externen Deklaration von double Profit() ! Egal, wohin ich dieses Teil verschiebe, egal, wie ich es umforme oder ergänze, - das PRG will nach wie vor die globale Deklaration !!! (... oder schlimmeres !) Kannst Du mir bei dem hoffentlich letzten "Brocken" nochmals helfen ? LG. piptrade |
|
|||
@piptrade, Du kannst einen schon beschäftigen.
Code:
extern string LastDays = "Today=0, Yesterday=1 aso."; extern int Shift = 0; //+------------------------------------------------------------------+ // CustomIndicator initialization function | //+------------------------------------------------------------------+ int init() { initGraph(); if (IsConnected()) main(); return(0); } //+------------------------------------------------------------------+ // CustomIndicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { ObjectsDeleteAll(0,OBJ_LABEL); return(0); } //+------------------------------------------------------------------+ // CustomIndicator start function | //+------------------------------------------------------------------+ int start() { if (IsConnected()) main(); return(0); } //+------------------------------------------------------------------+ // CustomIndicator function | //+------------------------------------------------------------------+ void main() { //+--- Unterscheidg. Prof/Loss bzw. CLRgreen_up/CLRred_down double prof = Profit(); //Rückgabewerte für Variablen if(prof >= 0) paintProf(prof); //(prof) für Weiterverarbtg. unter paintProf if(prof < 0) paintLoss(prof); //(prof) für Weiterverarbtg. unter paintLoss //+--- paint-Bereich ------------------------------------------------+ paintLine(); paintSign(); paintsumme(); //hier fehlt laut Deklaration der Funktion ein int-Parameter in den Klammern! } //+------------------------------------------------------------------+ double Profit() { double x = 0; double Summe = 0; for(int i = OrdersHistoryTotal() - 1 ; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol() == Symbol()) { if (OrderCloseTime() >= iTime(NULL, PERIOD_D1, Shift) && OrderCloseTime() < iTime(NULL, PERIOD_D1, Shift-1)) { x = OrderProfit(); //Zeile korrigiert Summe += x; } } } Print("Summe", Summe); } return(Summe); } void paintProf(double prof) { } void paintLoss(double prof) { } void initGraph() { ObjectsDeleteAll(0,OBJ_LABEL); objectCreate("Line",10,17,"-----------------------------------",10,"Arial",LightSlateGray); // Line objectCreate("Sign",10,7,"PROFIT(euro):",9,"Arial Narrow",LightSlateGray); // Text objectCreate("Summe",134,25,DoubleToStr(9,1),10,"Arial Narrow",Silver); // Wert / DoubleToStr(9,1) (value,digits) objectCreate("Prof",130,67); // Rectangle 1 green objectCreate("Loss",130,61); // Rectangle 2 red WindowRedraw(); } //+--- Label, Positionierg., Hintergrundfarbe und Textvorgaben ----------------------------------------------------------------+ void objectCreate(string name,int x,int y,string text="-",int size=12, string font="Arial",color colour=CLR_NONE) { ObjectCreate(name,OBJ_LABEL,0,0,0); ObjectSet(name,OBJPROP_CORNER,3); ObjectSet(name,OBJPROP_COLOR,colour); ObjectSet(name,OBJPROP_XDISTANCE,x); ObjectSet(name,OBJPROP_YDISTANCE,y); ObjectSetText(name,text,size,font,colour); } //+--- Zuordnung Farb-Eigenschaften --------------------------------------------------------------------------------------------+ void paintLine() { ObjectSet("ZeroLine",OBJPROP_COLOR,LightSlateGray); } void paintSign() { ObjectSet("Sign",OBJPROP_COLOR,LightSlateGray); } void paintsumme(int value) { if(value >= 0) ObjectSetText("Summe",DoubleToStr(value,0),10,"Arial Black",Green); // für sich ändernde Wert-Angabe + summe in EUR if(value < 0) ObjectSetText("Summe",DoubleToStr(value,0),10,"Arial Black",Maroon); // für sich ändernde Wert-Angabe - summe in EUR } void paintM1(double value) { if (value >= 0) ObjectSet("Prof",OBJPROP_COLOR,Green); // Rectangle Prof //ObjectSetText("...",DoubleToStr(value,0),8,"Arial Narrow",Green); // Part 2: für sich ändernde Wert-Angabe in Point/pip } void paintM5(double value) { if (value < 0) ObjectSet("Loss",OBJPROP_COLOR,Maroon); // Rectangle Loss //ObjectSetText("...",DoubleToStr(value,0),8,"Arial Narrow",Maroon); // Part 2: für sich ändernde Wert-Angabe in Point/pip } //+--- The PRG-End -------------------------------------------------------------------------------------------------------------+ Auch diese Zeile kann der Compiler nicht bearbeiten: x = OrderProfit() Da fehlt nicht viel, aber etwas Entscheidendes, nämlich das ; Beim Programmieren wird der kleinste Syntaxfehler geahndet. Diese Funktionen waren immer noch nicht deklariert und müssen mit Leben erfüllt werden. paintsumme(); //hier fehlt laut Deklaration der Funktion ein int-Parameter in den Klammern! (das ist in diesem Code jetzt noch der einzige Syntaxfehler!!) Die init()-Funktion funktioniert auich nur so richtig: int init() { initGraph(); if (IsConnected()) main(); return(0); } Und alles noch etwas aufgehübscht. So, nu is aber gut. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. Geändert von traderdoc (01.02.17 um 21:22 Uhr) |
|
|||
"So, nun is aber gut !"
Das hast Du sehr schön gesagt: - und Du hast sicher auch Recht damit ! Danke, Danke, Danke! - für Dein neustes Statement. Bin voller Spannung, Deine Ausführungen zu inhalieren, - sorry, - aber bitte erst morgen. Melde mich so schnell als möglich und auch nur dann, wenn es Sinn macht. Gute Nacht, alles liebe und bis dahin ... piptrade |
|
|||
Nachtrag:
Lieber traderdoc, dass ich Dich "schon beschäftigen" kann, hatte ich übersehen (die CodeUmschreibung war in diesem Moment wichtiger !) - sorry ! Dennoch empfinde ich es als bewundernswert, - einfach nur als toll und als fair, dass Du, wie ein Terrier, `dran bleibst, den richtigen Biss hast, und ... spitzenmäßig und selbstlos weiterhilfst ! Bis hier her nochmals: DANKE ! ... und natürlich die LG. piptrade |
|
|||
Hallo, traderdoc,
wenn ich Dich richtig verstanden habe, bestand das Hauptproblem im Fehlen eines int-Parameters innerhalb der Klammer. Bei dem angehängten Vorschlag wurde in der Deklaration unter void "value" gegen "summe" ersetzt, so dass der int-Parameter innerhalb der Klammer ebenfalls "summe" sein müßte. - Gesagt, getan ! Jetzt wurde eine erneute Deklaration verlangt, die ich vorerst mit "double summe = OrderProfit();" gelöst habe. - Zumindest gibt es "no error" / "no warning" ! - Und "SO" sieht es dann im Code aus: Code:
double summe = OrderProfit(); paintSumme(summe); ... ... ... void paintSumme(double summe) { if(summe >= 0) ObjectSetText("Summe",DoubleToStr(summe,0),10,"Arial Black",Green); if(summe < 0) ObjectSetText("Summe",DoubleToStr(summe,0),10,"Arial Black",Maroon); } Bis zum Eintreffen Deiner mit Spannung erwarteten Antwort werde ich mich um die letzten 2 "void-Blöcke" kümmern und die provisorischen Bezeichnungen gegen die relevanten austauschen. Auch hier sind sich verändernde Variable notwendig, so dass ich auch hier auf das obige Problem stoßen werde. Nun denn ... LG. piptrade |
Lesezeichen |
Stichworte |
gewinn, mql4, orderhistorytotal, orderhistrory, profit, programmierung, programmierung metatrader, programmierung mql4, verlust |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|