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)
-   -   Trade-Ergebnisse aus OrderHistory auslesen (http://www.expert-advisor.com/forum/showthread.php?t=5428)

traderdoc 01.02.17 09:19

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

piptrade 01.02.17 11:09

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

piptrade 01.02.17 14:46

Liste der Anhänge anzeigen (Anzahl: 1)
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 -------------------------------------------------------------------------------------------------------------+

Sieht für den Laien vielleicht recht gut aus, ist aber mit 4 Fehlern behaftet:
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.

traderdoc 01.02.17 17:04

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

piptrade 01.02.17 18:03

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

piptrade 01.02.17 19:46

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

traderdoc 01.02.17 20:59

@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 -------------------------------------------------------------------------------------------------------------+

So nun habe ich den Code so umgeschrieben, wie vorher beschrieben, die Funktion Profit wurde extern deklariert. Deklarierungen von Funktionen dürfen in keinen anderen Funktioen stehen.
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

piptrade 01.02.17 21:54

"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

piptrade 01.02.17 22:12

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

piptrade 02.02.17 11:15

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);
  }

Ist das soweit tatsächlich richtig ?

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


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:33 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