Abenteuer eines Neulings

 

Hey Leute, danke, dass ihr mir mit meinem Code geholfen habt, es ist 2.11 Uhr in London, und ich versuche schon seit einer Weile, dieses mql-Rätsel zu entschlüsseln. Übrigens, CodesGuru, danke für die Tutorials, sie sind klarer als das Standardmaterial, das angeboten wird, gute Arbeit!


Ich bin ein Neuling auf der Suche nach einer Strategie zu kodieren und wie immer brauchen die Profis Hilfe in diesem.


Unten ist ein Code, den ich zusammengestellt habe, aber aus irgendeinem Grund führt er nur kurze Trades aus.


Ich weiß nicht, warum. Außerdem muss ich dies noch hinzufügen: 1. Der Code muss sowohl Long- als auch Short-Trades ausführen, unabhängig davon, ob bereits ein Trade in der entgegengesetzten Richtung offen ist (z.B.: Wenn ein Long-Trade offen ist, sollte der Code trotzdem eine Short-Position eingehen, wenn die Bedingungen erfüllt sind). Ich denke, ich muss mit der Funktion'OrdersTotal()==0; herumspielen, aber ich weiß nicht, was ich tun soll.


Bitte helfen Sie. der Code ist beigefügt. (Ich habe versucht, es zu befestigen, aber aus irgendeinem Grund tut es nicht, irgendeine Idee, was los ist?)


Ich verspreche eine gute Flasche Champagner für die Person, die mir am meisten hilft, diesen Code zum Leben zu erwecken :-)


ps: Ich teste dies im mt4 Simulator/Strategietester.


Ich freue mich auf eure Hilfe, Leute!

nick

 
//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if(Bars<75)
      {
      Print("Bars less than 100");
      return(0); 
      }
   //Declaration
   
  double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3;
  
  ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
  ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
  ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
 e1under2= ema1< ema2;
 e2under3= ema2< ema3;
 e1over2= ema1> ema2;
 e2over3= ema2> ema3;

 
 

   if(OrdersTotal()==0)   // one order at the time
      {
      // Short  Entry
      static int ticket;
      if( e1under2 && e2under3)     // short function
         {                                                                    
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);   
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
            }
            if(OrdersTotal()==0)   // one order at the time
            if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
         
         {
         if( e1over2 && e2over3) //buy function                                                                    
         ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);   //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
            }
            else Print("Error opening BUY order : ",GetLastError());
            return(0);     
         }
 
            
            

            
            
            
            return(0);     
         }
         
         
  
   return(0);
   }
   }
Das ist der Code, Leute!
 

Wow! Ziemlich gute Programmierarbeit für einen "Neuling". Sie können Ihren Code viel prägnanter schreiben, als ich es kann.


Mir fällt auf, dass Sie zwei identische conditional-if Zeilen für den BUY Abschnitt haben, während der SELL Abschnitt nur eine hat.


Die zweite identische condition-if-Anweisung für die BUY-Funktion ist wahrscheinlich harmlos, aber ist sie notwendig?


            if(OrdersTotal()==0)   // jeweils eine Bestellung
if(e1over2 && e2over3) //das kann unübersichtlich sein, denn in der alten Version war ==1 für alle Variablen <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<hier ist die erste

{
if(e1over2 && e2over3) //Kauffunktion <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<hier ist die zweite
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); //Wofür ist 12345? I ADDED ASk-30*Point for stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}


Es scheint auch, dass Sie sowohl die Sell- als auch die Buy-Funktionen in derselben Conditional-if enthalten:



if(OrdersTotal()==0) // jeweils eine Order
{
// Short Entry
static int ticket;
if(e1under2 && e2under3) // short function
{ // Die passende Klammer hierfür befindet sich weit unterhalb der SELL und BUY Funktion<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<siehe unten
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point, "Short Order ",0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
}


if(OrdersTotal()==0) // jeweils eine Order
if(e1over2 && e2over3) //das kann chaotisch sein, weil die alte Version ==1 für alle Variablen hatte

{
if(e1over2 && e2over3) //Kauffunktion
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); //Wofür ist 12345? I ADDED ASk-30*Point for stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}







return(0);
} // dies ist die passende Klammer für die oben gezeigte<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<siehe oben


return(0);
}
}





Die BUY-Order unterliegt den SELL-Kriterien, so wie Sie die notierte conditional-if-Anordnung haben.









 
niko:
Das ist der Code, Leute!

Der Grund dafür, dass er nie eine lange Order ausführt, liegt darin, dass Sie den Codeblock, der die kurze Order ausführt, nicht mit einer schließenden geschweiften Klammer abgeschlossen haben. Das bedeutet, dass Sie im Grunde nur dann eine Long-Order ausführen, wenn (e1unter2 && e2unter3) UND (e1über2 && e2über3), was wohl nicht der Fall sein wird.


Sie sagen, dass Sie eine Order eröffnen wollen, auch wenn bereits eine Order in der anderen Richtung offen ist. Daraus schließe ich, dass Sie die Anzahl der Aufträge auf maximal einen in jeder Richtung begrenzen wollen. Durch die Prüfung, ob OrdersTotal() gleich Null ist, beschränken Sie die Anzahl der Aufträge auf insgesamt einen, nicht auf einen in jeder Richtung. Was Sie tun müssen, ist die Anzahl und die Art der vorhandenen Aufträge mit einer Schleife und Zählern zu überprüfen (viele Beispiele auf dieser Website), dann verwenden Sie das Ergebnis, um zu bestimmen, ob ein Auftrag gemacht werden sollte.


In Ihrem anderen Beitrag haben Sie erwähnt, dass Sie lernen wollen, MQL zu schreiben, also werde ich das nicht für Sie schreiben. Dieses Beispiel ist genau die richtige Art von einfachem Code und Logik, die für den Lernprozess wichtig ist.


Bitte machen Sie es selbst und lassen Sie mich wissen, wie Sie vorankommen.

 

Hey Jungs, ihr seid Legenden!!!

Vielen Dank für eure Kommentare FXTrader2008 und cloudbreaker. Ich habe nicht bemerkt, dass es eine wiederholte Bedingung für buy gibt, das habe ich herausgeschnitten, und es macht Sinn, dass die Klammer nicht geschlossen ist. Es war eine gute Idee, mir nicht die codierte Antwort zu geben, da ich den Code selbst lernen möchte. Ich werde online nach Schleifen/Zählern suchen.

Der Code ist deshalb so schön kompakt, weil mir ein Freund geholfen hat, ihn zusammenzustellen (er ist Programmierer).

Ich werde mit meiner Seite der Dinge fortfahren und wenn ich nicht weiterkomme, lasse ich es euch wissen!

Handelt ihr selbständig mit Live-Märkten oder arbeitet ihr für metaquotes?

 

Ich habe nicht tief in Ihren Code geschaut, aber ein erster Tipp:


Versuchen Sie, Ihren Code klarer zu strukturieren - wir machen das nicht zum Spaß, sondern zum besseren Lesen und Verstehen! Es hat keinen Einfluss auf den "Sinn" oder die Bedeutung des Codes...


Sehen wir uns an, wie Ihr Code aussehen SOLLTE (nur der wesentliche Teil):

if(OrdersTotal()==0)   // one order at the time
  {
   // Short  Entry
   static int ticket;
   if( e1under2 && e2under3)     // short function
     {                                                                    
      ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);  
      if( ticket>0)
        {
         if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
        }
      if(OrdersTotal()==0)   // one order at the time
      if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
        {
         if( e1over2 && e2over3) //buy function                                                                    
            ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);   //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError());
         return(0);    
        }
      return(0);    
     }
   return(0);
  }
 

Wie Sie jetzt sehen können: Sie testen nur auf Ihre "Short"-Bedingung

   // Short  Entry
   static int ticket;
   if( e1under2 && e2under3)     // short function

und innerhalb dieser testen Sie auf die "long"-Bedingung, und zwar zweimal - zur Sicherheit ; ) - das kann nicht funktionieren.

      if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
        {
         if( e1over2 && e2over3) //buy function                                                                    
 

Besser: (aber weit entfernt von perfekt)

if(OrdersTotal()==0)   // one order at the time
  {
   // Short  Entry
   static int ticket;
   if ( e1under2 && e2under3)     // short function
     {                                                                    
      ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);  
      if ( ticket>0)
        {
         if (OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
        } }
   if( e1over2 && e2over3) //buy function {
      ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);   //What's 12345 for? I ADDED ASk-30*Point for stop loss
      if ( ticket>0)
        {
         if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
        }
      else Print("Error opening BUY order : ",GetLastError());
     }
  return(0);
  }

Jetzt sollte es für kurze und lange Trades funktionieren.

Ich empfehle dringend, dieses Buch hier über MQL4 zu lesen - insbesondere den Abschnitt Erstellung eines normalen Programms - es ist sehr gut geschrieben und Sie können Ihre Strategie leicht umsetzen. Ich habe auch so angefangen...

Wenn du die Dateien dort herunterlädst und Probleme mit den Kommentaren hast (da sie kyrillisch sind), öffne "word", kopiere&einfüge den Quelltext jeder Datei von der Internet-Seite (da die Kommentare dort englisch sind) in word und schließlich kopiere&einfüge von word in Metaeditor. Von nun an können Sie die Programme in Englisch studieren.


Ich hoffe, ich konnte helfen...


(Nebenbei bemerkt: Ich bin auch sehr neu in MQL4, aber ich arbeite als Programmierer und so sind Syntax und Struktur kein Problem für mich...)


Grüße TuRRiCAN

 
Ooops, in der Zeit, die ich zum Antworten brauchte, waren die anderen schneller ...
 
TuRRiCAN wrote >>
Ooops, in der Zeit, die ich für die Antwort brauchte, waren die anderen schneller ...

Hey Tourrican, das ist sehr hilfreich, danke! Kyrillisch kein Problem, ich bin Russe, eigentlich aus Sibirien.

Ja, ich habe das mql-Buch studiert, aber es ist immer noch außerhalb des praktischen Lernens, es ist eine ganz andere Sache, es zu studieren und dann zu versuchen, selbst ein Programm zu schreiben (weil sie nicht klar mit Beispielen aus dem wirklichen Leben in jedem Teil des Buches erklären, warum und wie diese Dinge verwendet werden, weißt du.

Aber ich werde es schaffen, der brennende Wunsch in mir, das zu schaffen, ist größer als jedes Hindernis.

 
niko:

Handelt ihr selbständig mit Live-Märkten oder arbeitet ihr für metaquotes?

Um Ihre Frage zu beantworten, ich arbeite normalerweise als Hubschrauberpilot. Aufgrund der wirtschaftlichen Situation möchte das Unternehmen, für das ich arbeite, im Moment jedoch nicht fliegen. In der Zwischenzeit entwickle ich also EAs für ein Unternehmen, das meinem besten Freund gehört. Wir handeln live im Auftrag einiger ziemlich bekannter Fonds.

Ich freue mich, dass Sie versuchen, das Programmieren zu lernen, und werde Ihnen helfen, wo immer ich kann. Es ist erfrischend, jemanden zu finden, der dem Forum beitritt und lernen will, sich selbst zu versorgen.

Grund der Beschwerde: