Abenteuer eines Neulings - Seite 4

 

Hallo Legenden von mql. Ich habe während meiner Mittagspause auf der Arbeit den Pseudocode für euch gebastelt. Hier ist er. Lasst mich wissen, was noch fehlt und ich füge es hinzu.

N&P Pseudo Code
Mit dieser Strategie wollen wir einen Code haben, der an jedes beliebige Diagramm angehängt werden kann, und der auf 5 Währungen läuft, wobei wir sowohl Short- als auch Long-Positionen für jede Währung eingehen, wenn die Regeln erfüllt sind.
---EURUSD---
Wenn ema7>ema14>sma50 und PriceNow < TopFilterLevel ist (z.B.:1.3080 für eurusd. Dies werde ich täglich anpassen) dann:
EURUSD Lots kaufen (Lots sind eine externe Variable, z.B. 0,01). Andernfalls: (d.h. Bedingungen nicht erfüllt) nicht kaufen.

Wenn ema7<ema14<sma50 und PriceNow > BottomFilterLevel ist (z.B.: 1.1508 für eurusd), dann:
Short EURUSD Lots (wieder, externe Variable). Andernfalls (d.h. wenn die Bedingungen nicht erfüllt sind, wird nicht geshortet).

Wenn die BUY-Position 20 Pips vom Einstiegspunkt aus erreicht, dann: TAKEPROFIT auf EURUSD.
Wenn die SHORT-Position 20 Pips ab dem Einstiegspunkt erreicht, dann: TAKEPROFIT auf EURUSD.
Wenn 20 Pips nicht erreicht werden (entweder kaufen oder verkaufen), dann bleiben Sie im Markt, bis die Position geschlossen wird.

manuell. (idealerweise packen wir das in die OrderSend-Funktion, um den Code kürzer zu halten).

----GBPUSD---
genau derselbe Code wie oben.

----USDJPY---
GENAUSO WIE OBEN

---USDCHF---
GENAU WIE OBEN

----AUDUSD---
GLEICH WIE OBEN

**Code-Besonderheiten
Sowohl Kauf- als auch Leerverkäufe können für jede beliebige Währung gleichzeitig ausgeführt werden, wenn die oben genannten Kriterien erfüllt sind.
***Kein Stoploss ist für diesen Code erforderlich

**kein Geldverwaltungscode für diese Funktion

Wie sieht das also aus?

 
niko:

Hallo Legenden von mql. Ich habe während meiner Mittagspause auf der Arbeit den Pseudocode für euch gebastelt. Hier ist er. Lasst mich wissen, was noch fehlt und ich füge es hinzu.

N&P Pseudo-Code
Mit dieser Strategie wollen wir 1 Code haben, in der Lage sein, es zu jedem Diagramm anhängen, und es würde auf 5 Währungen laufen, Eingabe sowohl kurz und lang Positionen auf jedem, wenn die Regeln erfüllen.
---EURUSD---
Wenn ema7>ema14>sma50 und PriceNow < TopFilterLevel ist (z.B.:1.3080 für eurusd. Dies werde ich täglich anpassen) dann:
EURUSD Lots kaufen (Lots sind eine externe Variable, z.B. 0,01). Andernfalls: (d.h. Bedingungen nicht erfüllt) nicht kaufen.

Wenn ema7<ema14<sma50 und PriceNow > BottomFilterLevel ist (z.B.: 1.1508 für eurusd), dann:
Short EURUSD Lots (wieder, externe Variable). Andernfalls (d.h. wenn die Bedingungen nicht erfüllt sind, wird nicht geshortet).

Wenn die BUY-Position 20 Pips vom Einstiegspunkt aus erreicht, dann: TAKEPROFIT auf EURUSD.
Wenn die SHORT-Position 20 Pips ab dem Einstiegspunkt erreicht, dann: TAKEPROFIT auf EURUSD.
Wenn 20 Pips nicht erreicht werden (entweder kaufen oder verkaufen), dann bleiben Sie im Markt, bis die Position geschlossen wird.

manuell. (idealerweise packen wir das in die OrderSend-Funktion, um den Code kürzer zu halten).

----GBPUSD---
genau derselbe Code wie oben.

----USDJPY---
GENAUSO WIE OBEN

---USDCHF---
GENAU WIE OBEN

----AUDUSD---
GLEICH WIE OBEN

**Code-Besonderheiten
Sowohl Kauf- als auch Leerverkäufe können für jede beliebige Währung gleichzeitig ausgeführt werden, wenn die oben genannten Kriterien erfüllt sind.
***kein Stoploss ist für diesen Code erforderlich

**kein Geldverwaltungscode für diese Funktion

Also, wie sieht das aus?

Hey Leute, das grundlegende Tutorial zur Programmierung hat mir wirklich geholfen, das Ganze zu verstehen (obwohl der detaillierte Teil der Programmierung fehlt). Um euch zu zeigen, dass ich fleißig war, habe ich den Code unten angehängt. Die Idee, die ich denke, ist da, aber es gibt immer noch eine Menge Fehler. Sie werden sehen, alles ist unter einer großen Klammer in Start() der Grund, warum ich das tat, ist, weil mql immer wieder mit dem Fehler, dass Variable nicht global deklariert werden kann, und wenn ich es alle in 1 Klammer schien es, dass Fehler gestoppt haben (obwohl viele andere Fehler fortgesetzt). Ich habe Notepad++ verwendet, um die Ausrichtung der Klammern zu überprüfen. Bin ich damit also wenigstens auf dem richtigen Weg?

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


   //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }


   // Order counting code
   // Return:  0 = no orders
   //          >0 = # long orders
   //          <0 = # short orders
      int CalcOpenOrders()
         {
         int long=0,short=0;
      for(int i=0; i<OrdersTotal(); i++)   
         //i set to 0 to stop bugs from
         //crawling in, i<Orderstotal means if i is behind the number of orders
         //in market then start counting orders and make i that number
         {
         if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)==false)break;
         //this function selects an order for further processing
         if(OrderType()==OP_BUY)long++;
         if(OrderType()==OP_SELL)short++;
         }
      if(long>0)return(long);
      if(short>0)return(-short);
      }

//------------ (fingers crossed this is right). I still don't get it why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
   {
   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(Bars<75)
      {
      Print("Bars less than 100");
      return(0);
      }


   //------------------EURUSD Block-------------------------
   //check order type, if it doesn't equal to buy already then buy


   //here i am setting a condition which will be
   //checked before a trade is opened, it shoudl state 'It's okay to enter
   //into long trade so long as there is either 1 order in place already or
   //none)
  
   // Call function. the returnvalue (output) of the function is stored into ReturnVal
   int ReturnVal = CalcOpenOrders();
  
   // Check output of function
   if ( ReturnVal >0)  // >0 = long orders. See CalcOpenOrders() 
      eurusdbuyok=1;
      else
      {
      eurusdbuyok=0;
      return(0);
      }

   if ( ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
      eurusdshortok=1;
      else
      {
      eurusdshortok=0;
      return(0);
      }


   //--------------condition ends

   if( eurusdshortok==1)
      {
      static int ticket;
      // deleted if(OrdersTotal()==0)
      if( e1under2 && e2under3)     // short function
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"ShortOrder ",0,0,Red);
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
            Print("SHORT order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }



   //  -------------------------------------------------------------------------------------------
   if ( eurusdbuyok==1)
      {
      static int ticket1;
      // deleted if(OrdersTotal()==0)
      if( e1over2 && e2over3 && eurusdbuyok==1) //buy function
         {
         ticket1=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( ticket1>0)
            {
            if(OrderSelect( ticket1, SELECT_BY_TICKET, MODE_TRADES))
            Print("BUY order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }

   return(0);
   } 
Dies ist die neueste Version des Codes. syntaktisch alles scheint in Ordnung zu sein, aber wenn ich es durch Strategie-Tester laufen es gibt keine Trades. etwas ist falsch mit Logik. brauchen Hilfe. Ich bin immer ganz vertraut mit Code jetzt, gut die Struktur des Programms Seite von ihm.
 
niko wrote >>

Hallo Legenden von mql. Ich habe während meiner Mittagspause auf der Arbeit den Pseudocode für euch gebastelt. Hier ist er. Lasst mich wissen, was noch fehlt und ich füge es hinzu.

N&P Pseudo-Code
Mit dieser Strategie möchten wir einen Code haben, der an ein beliebiges Diagramm angehängt werden kann, und der auf 5 Währungen läuft, wobei wir sowohl Short- als auch Long-Positionen für jede Währung eingehen, wenn die Regeln erfüllt sind.
---EURUSD---
Wenn ema7>ema14>sma50 und PriceNow < TopFilterLevel ist (z.B.:1.3080 für eurusd. Dies werde ich täglich anpassen) dann:
EURUSD Lots kaufen (Lots sind eine externe Variable, z.B. 0,01). Andernfalls: (d.h. Bedingungen nicht erfüllt) nicht kaufen.

Wenn ema7<ema14<sma50 und PriceNow > BottomFilterLevel ist (z.B.: 1.1508 für eurusd), dann:
Short EURUSD Lots (wieder, externe Variable). Andernfalls (d.h. wenn die Bedingungen nicht erfüllt sind, wird nicht geshortet).

Wenn die BUY-Position 20 Pips vom Einstiegspunkt aus erreicht, dann: TAKEPROFIT auf EURUSD.
Wenn die SHORT-Position 20 Pips ab dem Einstiegspunkt erreicht, dann: TAKEPROFIT auf EURUSD.
Wenn 20 Pips nicht erreicht werden (entweder kaufen oder verkaufen), dann bleiben Sie im Markt, bis die Position geschlossen wird.

manuell. (idealerweise packen wir das in die OrderSend-Funktion, um den Code kürzer zu halten).

----GBPUSD---
genau derselbe Code wie oben.

----USDJPY---
GENAUSO WIE OBEN

---USDCHF---
GENAU WIE OBEN

----AUDUSD---
GLEICH WIE OBEN

**Code-Besonderheiten
Sowohl Kauf- als auch Leerverkäufe können für jede beliebige Währung gleichzeitig ausgeführt werden, wenn die oben genannten Kriterien erfüllt sind.
***kein Stoploss wird für diesen Code benötigt

**kein Geldverwaltungscode für diese Funktion

Und wie sieht das aus?

Hallo Niko

Dein Pseudocode sieht für einen ersten Versuch ziemlich gut aus.

Ich würde ihn jedoch gerne etwas strukturierter sehen und es gibt ein paar Fragen, die er für mich aufwirft.

Ich konnte ihn einfach und schnell in das Format bringen, das ich normalerweise selbst verwenden würde. Sie ist hier als Textdatei angehängt, damit Sie sie sich ansehen können. Sie müssen diese Datei speichern und in Notepad oder einem ähnlichen Editor öffnen, um die Formatierung zu sehen.

Beachten Sie, dass wir in diesem Stadium nicht in einer bestimmten Computersprache schreiben. Wir versuchen lediglich, klar und eindeutig zu beschreiben, was wir zu tun versuchen.

Sie werden feststellen, dass der Pseudocode ziemlich spezifisch und "legalistisch" ist. So müssen wir mit Computern sprechen. Wir müssen ihnen ganz klar sagen, was sie tun sollen. Andernfalls neigen sie dazu, Müll zu erzeugen.

Sie werden auch die Verwendung von "Blöcken" bemerken, um Dinge in logischen Gruppen anzuordnen. Diese können später nützlich sein, um den Code richtig zu strukturieren. Wie jemand in dieser Diskussion bereits erwähnt hat, tun wir das nicht nur zum Spaß. Wir tun es, um den Code lesbarer, verständlicher, wartbarer und letztendlich zuverlässiger und fehlerfrei zu machen. Letzteres ist extrem wichtig bei Software, die für den Live-Handel eingesetzt werden soll, es sei denn, Sie haben eimerweise Geld, das Sie wegwerfen wollen :) . Im Ernst, der Handel ist schon schwierig genug, ohne dass man sich auch noch mit fehlerhafter Software herumschlagen muss.

Bitte sehen Sie sich an, was ich Ihnen geschickt habe, und nehmen Sie die Änderungen vor, die Sie für notwendig halten. In meinem Pseudocode fehlen noch ein paar wichtige Punkte. Können Sie sie finden?

Vielleicht möchten Sie sich auch mit den beiden Fragen befassen, die ich im Pseudocode aufgeworfen habe. Es gibt noch eine Reihe anderer Fragen, aber die sollten Sie besser bis zur eigentlichen Kodierungsphase warten.

Falls Sie dies noch nicht getan haben, sollten Sie den Editor Notepad++ ausprobieren, den FXtrader2008 bereits erwähnt hat. Verwenden Sie alle Tools, die Ihnen das Leben ein wenig leichter machen. Bitte senden Sie mir Ihren überarbeiteten Pseudocode als Textdateianhang zurück. Ich finde den Versuch, strukturierten Code, ob Pseudo oder nicht, in diesem HTML-Editor zu schreiben, etwas mühsam und unübersichtlich.

Mit freundlichen Grüßen

Tim

Dateien:
 
TSWilson:

Hallo Niko

Dein Pseudocode sieht für einen ersten Versuch ziemlich gut aus.

Ich würde ihn jedoch gerne etwas strukturierter sehen, und es gibt ein paar Fragen, die er für mich aufwirft.

Ich konnte ihn einfach und schnell in das Format bringen, das ich normalerweise selbst verwenden würde. Sie ist hier als Textdatei angehängt, damit Sie sie sich ansehen können. Sie müssen diese Datei speichern und in Notepad oder einem ähnlichen Editor öffnen, um die Formatierung zu sehen.

Beachten Sie, dass wir in diesem Stadium nicht in einer bestimmten Computersprache schreiben. Wir versuchen lediglich, klar und eindeutig zu beschreiben, was wir zu tun versuchen.

Sie werden feststellen, dass der Pseudocode ziemlich spezifisch und "legalistisch" ist. So müssen wir mit Computern sprechen. Wir müssen ihnen ganz klar sagen, was sie tun sollen. Andernfalls neigen sie dazu, Müll zu erzeugen.

Sie werden auch die Verwendung von "Blöcken" bemerken, um Dinge in logischen Gruppen anzuordnen. Diese können später nützlich sein, um den Code richtig zu strukturieren. Wie jemand in dieser Diskussion bereits erwähnt hat, machen wir das nicht nur zum Spaß. Wir tun es, um den Code lesbarer, verständlicher, wartbarer und letztendlich zuverlässiger und fehlerfrei zu machen. Letzteres ist extrem wichtig bei Software, die für den Live-Handel eingesetzt werden soll, es sei denn, Sie haben eimerweise Geld, das Sie wegwerfen wollen :) . Im Ernst, der Handel ist schon schwierig genug, ohne dass man sich auch noch mit fehlerhafter Software herumschlagen muss.

Bitte sehen Sie sich an, was ich Ihnen geschickt habe, und nehmen Sie die Änderungen vor, die Sie für notwendig halten. In meinem Pseudocode fehlen noch ein paar wichtige Punkte. Können Sie sie finden?

Vielleicht möchten Sie sich auch mit den beiden Fragen befassen, die ich im Pseudocode aufgeworfen habe. Es gibt noch eine Reihe anderer Fragen, aber die sollten Sie besser bis zur eigentlichen Kodierungsphase warten.

Falls Sie dies noch nicht getan haben, sollten Sie den Editor Notepad++ ausprobieren, den FXtrader2008 bereits erwähnt hat. Verwenden Sie alle Tools, die Ihnen das Leben ein wenig leichter machen. Bitte senden Sie mir Ihren überarbeiteten Pseudocode als Textdateianhang zurück. Ich finde den Versuch, strukturierten Code, ob Pseudo oder nicht, in diesem HTML-Editor zu schreiben, etwas mühsam und unübersichtlich.

Mit freundlichen Grüßen

Tim

Hallo TSW. Vielen Dank für diesen Artikel. Ich kann sehen, dass du ziemlich viel Zeit in dieses Projekt gesteckt hast, also weiß ich es wirklich zu schätzen. Ich habe den aktualisierten Pseudocode angehängt, aber für den Fall, dass er nicht angehängt wurde, ist er hier unten. Ich habe versucht, herauszufinden, was du übersehen hast, konnte es aber nicht ganz herausfinden, ein paar Dinge habe ich hinzugefügt, aber das waren nur Klarstellungen.


Wie geht es jetzt weiter? Während wir diesen "richtigen" Code erstellen, versuche ich immer noch, das Rätsel des obigen Codes zu lösen. Er entspricht nicht unserem Pseudocode, da es sich um einen alten gepatchten Code handelt, aber ich bin immer noch ziemlich verwirrt, da er zumindest für eine Währung funktionieren sollte. Das Wichtigste ist, dass ich durch diese unorganisierte, planlose Vorgehensweise die eigentlichen Kodierungselemente lerne (z. B. wie sich Klammern auf das Skript auswirken, wo man Variablen deklariert usw.). Irgendwelche Ideen, warum der Code nicht so funktioniert, wie er jetzt ist?

Program Title  - N&P Pseudo Code

START BLOCK - List of Currency Pairs

     EURUSD
     GBPUSD
     USDJPY
     USDCHF
     AUDUSD

END BLOCK - List Of Currency Pairs



START BLOCK - Configuration Parameters

      Set the value of TopFilterLevel manually on a daily basis for EURUSD
      Set the value of BottomFilterLevel manually on a daily basis EURUSD
      Set the value of TopFilterLevel manually on a daily basis for GBPUSD
      Set the value of BottomFilterLevel manually on a daily basis GBPUSD

      Set the value of TopFilterLevel manually on a daily basis for USDJPY
      Set the value of BottomFilterLevel manually on a daily basis USDJPY
      Set the value of TopFilterLevel manually on a daily basis for USDCHF
      Set the value of BottomFilterLevel manually on a daily basis USDCHF

      Set the value of TopFilterLevel manually on a daily basis for AUDUSD
      Set the value of BottomFilterLevel manually on a daily basis AUDUSD

      Set Lot size manually for All positions at once (same lot size)

END BLOCK - Configuration Parameters



START BLOCK  - Entry Rules

     If   the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is greater than the  50 period Simple Moving Average       AND
          Current Price   is less than TopFilterLevel  THEN
                       Signal a  BUY (Long) entry condition

     If   the  7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average       AND
          Current Price   is less than  BottomFilterLevel  THEN
                       Signal a  SELL (Short) entry condition

     ***  Question ***
      What time periods do you want to use for your moving averages? Are the periods  Minutes, Hours, Days, Weeks, Months or  do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.

END BLOCK - Entry Rules
      


START BLOCK - Manual Close

      **** Question ***
      You say 
                  "Keep being in the market until the position is closed manually.
                   (ideall we put this into OrderSend function to keep code shorter)."
       
       What exactly do you want the program to do in this block?

***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think

END BLOCK - Manual Close  



START BLOCK  - Exit Rules

     If  any Open Position is greater than or equal to 20 pips from the entry level THEN
        Close the Position

END BLOCK  - Exit Rules



START BLOCK - Main  - This block controls the whole flow of the program
         With each Currency Pair in the List of Currency Pairs block do all of the following

                  Process the Exit Rules Block - 
                                    (Note that in practice this would normally just be the automatic execution of a Take Profit  Stop
                                    but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
                                    such as using the program to close an open position—nope not for this code.)
                  Check the Entry Rules block  to see if a BUY or SELL  condition exists for this Currency Pair 

                  Check to see if  there is already  an open  BUY  position for this Currency Pair
                  Check to see if  there is already  an open SELL  position for this Currency Pair

                  If there is no open BUY position  for this currency pair   AND
                      a Buy condition exixts for this currency pair THEN
                              Open a BUY Position  for this currency pair
				Size: Pre-determined Lots

ELSE		If there is already 1 open BUY position for this currency pair		DO NOT OPEN BUY Position for this currency pair.

                   If there is no open SELL position  for this currency pair   AND
                      a SELL condition exixts for this currency pair THEN
                              Open a SELL Position  for this currency pair 
				Size predetermined lots.
  
ELSE		If there is already 1 sell position open for this currency pair		Do not open SELL Positions for this currency pair     
              
END BLOCK - Main 




PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way? 

**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
 
niko wrote >>

Hey Leute, das grundlegende Tutorial über die Codierung wirklich geholfen, meinen Kopf um diese zu bekommen (obwohl die detaillierte Codierung Teil fehlt). Um Ihnen zu zeigen, ich war beschäftigt, habe ich den Code unten angehängt. Die Idee, die ich denke, ist da, aber es gibt immer noch eine Menge Fehler. Sie werden sehen, alles ist unter einer großen Klammer in Start() der Grund, warum ich das tat, ist, weil mql immer wieder mit dem Fehler, dass Variable nicht global deklariert werden kann, und wenn ich es alle in 1 Klammer schien es, dass Fehler gestoppt haben (obwohl viele andere Fehler fortgesetzt). Ich habe Notepad++ verwendet, um die Ausrichtung der Klammern zu überprüfen. Bin ich damit wenigstens auf dem richtigen Weg?

Dies ist die neueste Version des Codes. syntaktisch scheint alles in Ordnung zu sein, aber wenn ich es durch den Strategietester laufen lasse, gibt es keine Trades zurück. irgendetwas ist mit der Logik falsch. brauche Hilfe. Ich bin immer ziemlich vertraut mit Code jetzt, gut die Struktur des Programms Seite davon.

Hey Jungs/Mädels, könnt ihr mir mit dem obigen Code helfen (nicht der Pseudocode, sondern der Code), während ich lerne, wie man es richtig macht.

Ich hatte heute einen Geistesblitz, ich denke, dass der Fehler vielleicht darin liegt, dass es eine Funktion gibt, die die Aufträge zählt, und stattdessen brauche ich vielleicht 2 Funktionen getrennt, eine zählt die Käufe und eine andere die Verkäufe. Ich habe den Code unten programmiert (ein paar Dinge geändert, um dies zu berücksichtigen), können Sie unten sehen. Aber es war trotzdem alles durcheinander, da ich noch ein kompletter Anfänger bin. Hat jemand eine Idee für dieses Problem?

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


  //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}


  // Order counting code
  // Return:  0 = no orders
  //          >0 = # long orders
  //          <0 = # short orders
     int CalcOpenOrders()
        {
        int long=0,short=0;
     for(int i=0;i<OrdersTotal();i++)
        //i set to 0 to stop bugs from
        //crawling in, i<Orderstotal means if i is behind the number of orders
        //in market then start counting orders and make i that number
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
        //this function selects an order for further processing
        if(OrderType()==OP_BUY)long++;
        if(OrderType()==OP_SELL)short++;
        }
     if(long>0)return(long);
     if(short>0)return(-short);
     }

//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
  {
  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(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }


  //------------------EURUSD Block-------------------------
  //check order type, if it doesn't equal to buy already then buy


  //here i am setting a condition which will be
  //checked before a trade is opened, it shoudl state 'It's okay to enter
  //into long trade so long as there is either 1 order in place already or
  //none)

  // Call function. the returnvalue (output) of the function is
stored into ReturnVal
  int ReturnVal = CalcOpenOrders();

  // Check output of function
  if (ReturnVal >0)  // >0 = long orders. See CalcOpenOrders()
     eurusdbuyok=1;
     else
     {
     eurusdbuyok=0;
     return(0);
     }

  if (ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
     eurusdshortok=1;
     else
     {
     eurusdshortok=0;
     return(0);
     }


  //--------------condition ends

  if(eurusdshortok==1)
     {
     static int ticket;
     // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
        if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           Print("SHORT order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }



  //  -------------------------------------------------------------------------------------------
  if (eurusdbuyok==1)
     {
     static int ticket1;
     // deleted if(OrdersTotal()==0)
     if(e1over2 && e2over3 && eurusdbuyok==1) //buy function
        {
        ticket1=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(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
           Print("BUY order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }

  return(0);
  }

 
niko wrote >>

Hey Jungs / Mädels, jede Hilfe mit dem oben genannten Bit des Codes (nicht die Pseudo-Code, aber der Code-Code), während ich lerne, wie man es richtig zu tun.

Ich hatte heute einen Geistesblitz, ich denke, dass der Fehler vielleicht darin liegt, dass es eine Funktion gibt, die die Aufträge zählt, und stattdessen brauche ich vielleicht 2 Funktionen getrennt, eine zählt die Käufe und eine andere die Verkäufe. Ich habe den Code unten programmiert (ein paar Dinge geändert, um dies zu berücksichtigen), können Sie unten sehen. Aber es war trotzdem alles durcheinander, da ich noch ein kompletter Anfänger bin. Hat jemand eine Idee für mich?

Hallo Niko

mit Bezug auf den Pseudo-Code

Aus dem Code:
*** Frage ***
Welche Zeiträume wollen Sie für Ihre gleitenden Durchschnitte verwenden? Sind die Zeiträume Minuten, Stunden, Tage, Wochen, Monate oder müssen sie variabel sein?
***Antwort *** Ausgezeichnete Frage. Es werden 5-Minuten-Perioden für alle gleitenden Durchschnitte sein, sie müssen nicht variabel sein.

Dann würde ich vorschlagen, dem Pseudocode im Bereich der Konfigurationsparameter eine Anweisung hinzuzufügen, etwa wie

"5-Minuten-Zeitrahmen für Indikatoren verwenden"


Sie sagten:
***Ich war mir vorher nicht ganz klar, ich bitte um Entschuldigung. Es sollte keinen Block wie diesen im Code geben.

Ich werde Positionen bei Bedarf manuell über das Handels-/Terminalfenster beenden

(Ich nehme an, dass das möglich ist und die EA-Ausführung nicht beeinträchtigt, richtig).

Ich weiß also eigentlich nicht, ob wir diese Flexibilität codieren müssen oder nicht? Was denken Sie


Dann schlage ich vor, dass Sie diesen Block einfach aus dem Pseudocode löschen.

Es sollte kein Problem sein, den EA so zu kodieren, dass Sie das Terminal verwenden können, um eine Position manuell zu schließen, ohne etwas durcheinander zu bringen.

Sie haben diese Zeilen hinzugefügt:

ELSE Wenn es bereits eine offene KAUF-Position für dieses Währungspaar gibt, darf keine KAUF-Position für dieses Währungspaar eröffnet werden.

ELSE Wenn bereits 1 Verkaufsposition für dieses Währungspaar offen ist, keine VERKAUFS-Positionen für dieses Währungspaar eröffnen


*** Frage *** Warum müssen Sie ausdrücklich angeben, was das Programm NICHT tun soll, nachdem die vorherigen Zeilen gerade

geben Sie an, was das Programm Ihrer Meinung nach tun soll. Meiner Meinung nach ist der Pseudocode der richtige Ort, um Ihre Logik sorgfältig zu durchdenken. Andernfalls werden Sie wahrscheinlich

in ein Durcheinander geraten, wenn Sie mit der eigentlichen Codierung beginnen.


Sie sagten:
PS: Ich werde oft nur 1 Richtung auf ein Währungspaar (zB: nur kurz, für eurusd für 2 Tage zum Beispiel) verwenden. Wie könnten wir dies in den Code einbauen. Ich gehe davon aus, dass ich einfach '//' vor die Teile des Codes setzen kann, die ich nicht verwenden möchte (z. B. vor Kauf- oder Verkaufsaufträge für jedes Währungspaar), und diese dann entfernen kann, wenn ich diesen Teil des Codes das nächste Mal verwenden muss. Funktioniert das mit einem so strukturierten Code?


Das Auskommentieren von Code, wie Sie es vorschlagen, ist kein sehr eleganter Weg. Wenn Sie z.B. den Abschnitt "LONG" des Codes auskommentieren, würden Sie auch die Funktion zum Eröffnen von Long-Positionen für alle Währungspaare auskommentieren, es sei denn, Sie erzeugen einen Code mit vielen Doppelungen. Auch dies ist nicht sehr elegant und führt leicht zu Fehlern.

In einem bestimmten Zeitraum möchten Sie vielleicht EURUSD long und GBPUSD short halten und USDCHF überhaupt nicht handeln. Das ist recht einfach zu bewerkstelligen, aber ich würde gerne sehen, dass Sie versuchen, herauszufinden, wie Sie das selbst im Pseudocode beschreiben können.


Hier sind ein paar Hinweise auf eine mögliche Herangehensweise.

1. Schauen Sie sich an, wie Ihre Levels aufgebaut sind und eingesetzt werden

2. Die Ebenen werden als Dezimalzahlen dargestellt. Für "Go/No Go"-Situationen ist es üblich, eine andere Art der Darstellung zu verwenden, die als Boolean oder Flag bekannt ist. Wäre es möglich, Flaggen zu verwenden, um das zu erreichen, was Sie tun wollen?


Sie sagten:

**Um ehrlich zu sein, fällt mir nichts ein, was Sie absichtlich ausgelassen haben. Es sei denn, es soll überprüft werden, ob genügend Mittel für den Handel vorhanden sind, aber das ist noch nicht notwendig.

Vielleicht in zukünftigen Versionen der Strategie.


Nein, es geht nicht darum, zu prüfen, ob genügend Geld vorhanden ist. Sie sagten ausdrücklich, dass es nicht um Geldverwaltung geht, außer natürlich um die Festlegung der Losgröße. Es geht um etwas viel Grundsätzlicheres.

Welche Informationen benötigen Sie, um einen Auftrag zu erteilen? Wo und wie wird jedes dieser Elemente im Pseudocode beschrieben und behandelt?


Sie sagten:

Wie geht es jetzt weiter? Während wir diesen "richtigen" Code erstellen, versuche ich immer noch, das Rätsel des obigen Codes zu lösen. Er folgt nicht unserem Pseudocode, da es sich um einen alten, geflickten Code handelt, aber ich bin immer noch ziemlich verwirrt, da er zumindest für eine Währung funktionieren sollte. Das Wichtigste ist, dass ich durch diese unorganisierte, planlose Vorgehensweise die eigentlichen Kodierungselemente lerne (z. B. wie sich Klammern auf das Skript auswirken, wo man Variablen deklariert usw.). Irgendwelche Ideen, warum der Code nicht so funktioniert, wie er jetzt ist?


Ich verstehe Ihre Frustration. Ich habe einen kurzen Blick auf den alten Code geworfen, aber offen gesagt macht das, was Sie zu tun versuchen, logisch keinen Sinn. Ich könnte dieses Stück Code in etwa 15 Minuten umschreiben und es würde das tun, was Sie wollen, aber darum geht es nicht, oder? Sie sagten, Sie wollten lernen, wie man Code schreibt. Ich bemühe mich, Ihnen beizubringen, wie Sie es selbst tun können.


Nico, ich glaube nicht, dass du zu weit davon entfernt bist, mit dem Schreiben von (neuem) richtigem Code zu beginnen, aber es ist wichtig, dass du zuerst so viel wie möglich von dem, "was du tun willst", im Pseudocode genau festhältst.

Es wird das Programmieren "sooo viel einfacher" machen, wie Sie bald sehen werden.


Mach weiter mit der guten Arbeit

Vielen Dank

Tim

 

Hallo Tim,


wie immer schätze ich deine Zeit mit mir sehr. Ich werde weitergehen und den Pseudocode ändern, damit er deine Kommentare widerspiegelt. Über echten Code, keine Sorge, lassen Sie uns es richtig tun (ich bin nur ein bisschen ungeduldig manchmal :), wie Lernen ist mächtiger als alles andere.

 

Hallo Tim,


ich bin den Pseudocode noch einmal durchgegangen und habe so viel gemacht, wie mein Anfängerhirn zu diesem Zeitpunkt herausfinden konnte. Bitte finden Sie es beigefügt, ich freue mich auf Ihre Kommentare!

Dateien:
 
niko wrote >>

Hallo Tim,

ich bin den Pseudocode noch einmal durchgegangen und habe so viel gemacht, wie mein Anfängerhirn zu diesem Zeitpunkt herausfinden konnte. Du findest ihn im Anhang, ich freue mich auf deine Kommentare!

Hallo Nick

das sieht alles sehr gut aus.

Ich bin deinen letzten Pseudocode durchgegangen und habe einige Fragen beantwortet usw.

Ich denke, wir sind fast bereit, mit der Programmierung zu beginnen.


Als grobe Faustregel kann man sagen, dass 1/3 der Programmierzeit für die Spezifikation, 1/3 für die Programmierung und 1/3 für die Fehlersuche und das Testen verwendet werden sollte.


Wir können also sagen, dass wir jetzt ungefähr 1/3 des Weges durch dieses kleine Projekt zurückgelegt haben!

Lassen Sie uns nun über die MT4-Sprache sprechen.


Alle Computersprachen haben eine bestimmte Art und Weise (ein Format), in der die Sprache geschrieben werden muss, damit der Computer verstehen kann, was Sie ihm sagen wollen. Diese und andere sprachspezifische Informationen finden Sie in der Dokumentation. Die Dokumentation für MT4 ist online in diesem Forum verfügbar. Falls Sie es noch nicht getan haben, würde ich vorschlagen, dass Sie etwas Zeit damit verbringen, sich die Informationen anzusehen, die in der Dokumentation zur Verfügung stehen. Wenn Sie dann Informationen zu einem bestimmten Thema oder einer Funktion benötigen, wissen Sie, wo Sie danach suchen müssen.


Um Ihnen das Leben etwas zu erleichtern, verwenden viele moderne Computersprachen, einschließlich MT4, Vorlagen, die ein grundlegendes Programmlayout für Sie erstellen. Diese Programmvorlagen werden oft als "Assistenten" bezeichnet. Sie finden den EA-Assistenten unter dem Menüpunkt "Neu" im MetatEditor mit dem grünen Kreuz.


Wenn Sie diesen öffnen, finden Sie eine Vorlage für "Expert Advisor". Wählen Sie diese aus und Sie werden aufgefordert, einen EA-Namen, Autorendaten etc. und Parameter anzugeben. Die Parameter können später hinzugefügt oder geändert werden, aber in diesem Stadium sollten Sie die Parameter aus dem Konfigurationsblock eingeben.

Sie müssen jedem Parameter einen Namen, einen Typ und einen Anfangswert geben


Die Parameternamen sollten immer aussagekräftig sein, was sie sind


zum Beispiel EURUSD_TopFilterLevel ist ein sinnvoller Name ex1 IS NOT. Die Verwendung von aussagekräftigen Datennamen erleichtert das Verständnis des Programms, die Fehlersuche und die spätere Änderung. Beachten Sie, dass in MT4 bei den Datennamen zwischen Groß- und Kleinschreibung unterschieden wird. LOTSize ist nicht dasselbe wie LotSize. Sie müssen bei den Datennamen vorsichtig und konsistent sein.


Sie müssen auch einen Datentyp (Typ) für jeden Parameter angeben. MT4 verwendet nur 4 Datentypen: Integer Number (int), Decimal Number (double), Text (string) und True / False oder Flag (bool).


Auch hier müssen wir mit den Datentypen vorsichtig sein und dürfen sie nicht unwissentlich verwechseln, sonst können wir subtile Fehler einführen.


Sobald Sie Ihre Vorlage mit dem Assistenten erstellt haben, würde ich vorschlagen, dass Sie mit der "Strukturierung" Ihres Programms beginnen. Die Grundeinheit der Struktur in MT4 ist die FUNKTION.


Die einfachste Grundfunktion, die so wie sie hier geschrieben ist, eigentlich nichts tut, ist -



void MyBasicFunction()

{

}


Die vom Metatrader-Assistenten generierte Vorlage enthält bereits drei leere Funktionen.



int init()

{

return(0)

}



init deinit()

{

return(0)

}



int start()

{

return(0)

}


Die init-Funktion wird jedes Mal aufgerufen, wenn der EA gestartet wird, wenn Sie ihn auf einen Chart ziehen und auf die Schaltfläche Expert Advisor ON

Die Funktion deinit wird jedes Mal aufgerufen, wenn der EA anhält, wenn Sie ihn aus einem Diagramm ziehen oder auf die Schaltfläche Expert Advisor OFF klicken


Die Funktion starten Funktion wird bei JEDEM NEUEN TICK aufgerufen, den der Chart, an den sie angehängt ist, empfängt. Das bedeutet, dass sie mehrmals pro Minute oder öfter aufgerufen werden kann, je nachdem, wie aktiv der Markt ist. Von hier aus werden wir den größten Teil unserer Arbeit erledigen.


Vorerst schlage ich vor, dass Sie den gesamten Pseudocode aus dem Hauptblock in die Startfunktion einfügen und dann den Pseudocode mit // in jeder Zeile auskommentieren.


Erstellen Sie dann eine eigene neue Funktion für den Block mit den Eingaberegeln und kommentieren Sie den Pseudocode darin auf die gleiche Weise aus.


Lassen Sie die Funktionen init und deint vorerst leer und so wie sie sind.


Sie sollten in der Lage sein, diesen Code ohne Fehler zu kompilieren, aber natürlich wird er in diesem Stadium nichts tun.


Machen Sie weiter so!


Mit freundlichen Grüßen

Tim

(PS: Wir können uns bei Bedarf über Skype unterhalten, aber schauen wir erst einmal, wie es mit dem Forum läuft)

Dateien:
 

Hallo Tim,

Wie immer ist deine Hilfe und Zeit von unschätzbarem Wert! Als Dankeschön würde ich dir gerne eine schöne Flasche Champagner schicken, sobald wir mit der Codierung fertig sind.

Ja, ich habe das mql-Buch einige Male durchgelesen, die Schwierigkeit war, die Theorie in die Praxis umzusetzen. Ich habe auch etwa 10 oder so EAs ausgedruckt, die auf dieser Website gepostet wurden, um zu sehen, wie die Dinge kodiert und zusammengesetzt sind, um zu versuchen, sie zu verstehen. Und ich verbringe viel Zeit im Simulator Trader auf MT4 (dh Backtesting und Lernen bereits bestehende EA's).

Ich beginne mit dem Kodierungsprozess und mache die Blöcke sehr klar und getrennt, damit wir beide sehen können, was vor sich geht. Und sende sie an Sie über das Forum.

1 Frage: Sie sagten, dass Brokerfirmen Dinge einführen, um aggressives Pipping zu verhindern. 1. Wie definieren Sie aggressives Pipping? 2. Welche Maßnahmen werden ergriffen?

Ich pflegte zu manuell scalp eurusd auf 1min timeframes (mit einem Spreadbetting-Methode), das ging wirklich gut, bis die brokerage klickte in und begann zu setzen Verzögerungen für die Ausführung (entry und exit). So jetzt gibt es keinen Punkt überhaupt tun dies mit diesem Brokerage, auch wenn es illegal ist, Verzögerungen werden immer noch passieren und durcheinander den ganzen Tag (wie, wenn Sie in der Regel Skalp nur für 1 Stunde, 2 Verzögerungen und Sie verloren die wertvolle Zeit). Ich habe das gesamte Geld für verspätete Trades zurückbekommen, nachdem ich aggressiv mit einem Gerichtsverfahren gedroht habe.

2 Frage: Benutzen Sie verschiedene Broker? Welche Makler würden Sie empfehlen? (falls Sie hier Namen nennen dürfen)

danke,

nick

Grund der Beschwerde: