Grid maker 1.1

 
Hier ist Version 1.1 des 'Grid maker'... ein Skript oder Expert Advisor, der eine Reihe von gleichmäßig verteilten Kauf- oder Verkaufsaufträgen einrichtet und unterhält.
Diese Version ist entweder ein Skript oder ein Expert Advisor, Sie können die Aktualisierungshäufigkeit ändern, Long- und/oder Shortpositionen auswählen, usw. Siehe die Parameter für eine Erklärung.

Ich glaube, ich habe die meisten Varianten getestet, aber es gibt keine Garantien, dass es in allen Fällen funktioniert! Wenn Sie es ausprobieren und Probleme finden, lassen Sie es mich wissen.

Dies ist wahrscheinlich die letzte Version, die ich veröffentliche. Ich habe sie entwickelt, um MT4 zu testen. Zukünftige Versionen werden komplexer sein und externe Daten wie Unterstützungs- und Widerstandsniveaus benötigen, so dass es nicht angebracht ist, sie zu veröffentlichen.



//+------------------------------------------------------------------+
//|                                                     MakeGrid.mq4 |
//|                                            Copyright © 2005, hdb |
//|                                       http://www.dubois1.net/hdb |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, hdb"
#property link      "http://www.dubois1.net/hdb"
//#property version      "1.1beta"

extern string GridName = "Grid";       // identifies the grid. allows for several co-existing grids
extern double Lots = 0.1;              // 
extern double GridSize = 6;            // pips between orders - grid or mesh size
extern double GridSteps = 10;          // total number of orders to place
extern double UpdateInterval = 15;     // update orders every x minutes
extern bool   wantLongs = true;        //  do we want long positions
extern bool   wantShorts = true;       //  do we want short positions
extern bool   wantBreakout = true;     // do we want longs above price, shorts below price
extern bool   wantCounter = true;      // do we want longs below price, shorts above price
extern bool   limitEMA34 = false;      // do we want longs above ema only, shorts below ema only
extern double LastUpdate = 0;          // counter used to note time of last update
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
 #property show_inputs              // shows the parameters - thanks Slawa...    
//----
   return(0);
  }
//+------------------------------------------------------------------------+
//| test if there is an open position or order in the region of atRate     |
//|     will check for longs if checkLongs is true, else will check        |
//|     for shorts                                                         |
//+------------------------------------------------------------------------+

bool IsPosition(double atRate, double inRange, bool checkLongs )
  {
  
     int totalorders = OrdersTotal();
     for(int j=0;j<totalorders;j++)                                // scan all orders and positions...
      {
        OrderSelect(j, SELECT_BY_POS);
        if ( OrderSymbol()==Symbol() && OrderComment() == GridName )  // only look if mygrid and symbol...
         {  int type = OrderType();
            if (MathAbs( OrderOpenPrice() - atRate) < inRange) // dont look for exact price but price proximity (less than gridsize)
              { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT  || type == OP_BUYSTOP ) )  || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT  || type == OP_SELLSTOP ) ) )
                 { return(true); }
              }
         }
      } 

   return(false);
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//---- 
   int    i, j,k, ticket, entermode, totalorders;
   bool   doit;
   double point, startrate, traderate;
 
//----
  if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60)           // we update the first time it is called and every UpdateInterval minutes
   {
   LastUpdate = CurTime();
   Print("Updating");
   point = MarketInfo(Symbol(),MODE_POINT);
   startrate = ( Ask + point*GridSize/2 ) / point / GridSize;    // round to a number of ticks divisible by GridSize
   k = startrate ;
   k = k * GridSize ;
   startrate = k * point - GridSize*GridSteps/2*point ;          // calculate the lowest entry point
   
   double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0);
   
   for( i=0;i<GridSteps;i++)
   {
     traderate = startrate + i*point*GridSize;
     if ( wantLongs && (!limitEMA34 || traderate > EMA34))
       {
         if (!IsPosition(traderate,point*GridSize,true) )           // test if i have no open orders close to my price: if so, put one on
          {
             if ( traderate > Ask ) 
              { entermode = OP_BUYSTOP; } 
              else 
              { entermode = OP_BUYLIMIT ; } 
             if ( (traderate > Ask ) && (wantBreakout) || ((traderate < Ask ) && (wantCounter)) ) 
              { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,0,traderate+point*GridSize,GridName,16384,0,Green); }
          }
       }

     if ( wantShorts && (!limitEMA34 || traderate < EMA34))
       {
         if (!IsPosition(traderate,point*GridSize,false) )           // test if i have no open orders close to my price: if so, put one on
          {
             if ( traderate > Bid ) 
              { entermode = OP_SELLLIMIT; } 
              else 
              { entermode = OP_SELLSTOP ; } 
              
              if ( (traderate < Bid ) && (wantBreakout) || ((traderate > Bid ) && (wantCounter)) ) 
                { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,0,traderate-point*GridSize,GridName,16384,0,Red); }
          }
       }

    }
   }
   return(0);
  }
//+------------------------------------------------------------------+
 
Hallo hdb,

ich verfolge diese Idee schon seit langem in den Foren von MoneyTec (Simspeed), ET (ElectricSavant) und Oanda (MarkVH und Sympatico) und ich habe darüber nachgedacht, wie ich einen Experten entwickeln kann, um das erste Skript, das Sie ins Forum geschickt haben, zu verbessern, vielleicht könnten wir zusammenarbeiten, um schneller zu etwas zu kommen :) Bitte lassen Sie mich wissen, wenn Sie interessiert sind, meine E-Mail lautet artefactodigital@gmail.com

Mit freundlichen Grüßen,
Fernando.

Hier ist Version 1.1 des 'Grid maker'... ein Skript oder Expert Advisor, der eine Reihe von gleichmäßig verteilten Kauf- oder Verkaufsaufträgen einrichtet und unterhält. <br / translate="no"> Diese Version ist entweder ein Skript oder ein Expert Advisor, Sie können die Aktualisierungshäufigkeit ändern, Longs und/oder Shorts auswählen, usw. Siehe die Parameter für eine Erklärung.

Ich glaube, ich habe die meisten Varianten getestet, aber es gibt keine Garantien, dass es in allen Fällen funktioniert! Wenn Sie es ausprobieren und Probleme finden, lassen Sie es mich wissen.

Dies ist wahrscheinlich die letzte Version, die ich veröffentliche. Ich habe sie entwickelt, um MT4 zu testen. Zukünftige Versionen werden komplexer sein und externe Daten wie Unterstützungs- und Widerstandsniveaus benötigen, so dass es nicht angebracht ist, sie zu veröffentlichen.
 
Ok, klingt gut... siehe meine E-Mail...
 
übrigens, u sind frei, es zu versuchen, verwenden Sie es, ändern Sie es, aber bitte nicht verkaufen!

Ich biete keine Garantien hinsichtlich seiner effektiven Arbeitsbedingungen und jeder Handel u kann mit ihm tun es auf eigene Gefahr.
Ich übernehme keine Verantwortung für direkte oder indirekte Verluste aufgrund dieses Skripts.


Wenn Sie es benutzen, posten Sie bitte gelegentlich Feedback - Ergebnisse, Einstellungen, Bugs, Beobachtungen, etc.

Viel Spaß
 
Ok, jetzt geht's los... eine große Marktbewegung später, überlebt das Netz! Ich habe vor zwei Wochen ein Demokonto mit 50k eröffnet.
Ich habe 1k verloren, um den Gridmaker zu testen, und dann, kurz vor dem Einbruch des Euro, habe ich den Standard-GridMaker-Experten auf 9 Währungspaare gesetzt:
EUR/CHF, USD/JPY, GBP/JPY, EUR/GBP, USD/CHF, AUD/USD, GBP/USD, EUR/USD, EUR/JPY.

Der Rasterabstand beträgt 6 Ticks für alle Währungen, und TP bei 6 Ticks. Ich habe 0,1 Lot-Größe eingesetzt. Ich ging alle 6 Ticks für jedes Währungspaar long UND short.
Die Aktualisierung erfolgte alle 15 Minuten (d.h. das Raster wurde alle 15 Minuten neu generiert), außer für EUR/USD und GBP/USD bei 5 Minuten.

Der Saldo ist um 10k (20%) gestiegen, die verwendete Marge beträgt 13k (26%), die freie Marge 26k (52%) und der nicht realisierte Gewinn und Verlust beträgt -19k.

Das Nettoergebnis des Euro-Knalls (bis jetzt) ist, dass ich -9k verloren habe. Ich hatte mit viel mehr gerechnet!

Das Netz erhöht die Bilanz um 600 bis 2000 pro Tag!

Ich bin gespannt, wie das nächste Woche aussehen wird.

Lang lebe das Netz!!
 
Nun ja, eine Woche später hat das Gitter wirklich einen Schlag abbekommen! Mein Fehler, denn ich habe die notwendigen Berechnungen der Losgröße und des Rasterabstandes nicht durchgeführt
die notwendig sind, um zu sehen, wie viel man mit dem verfügbaren Eigenkapital verkraften kann.

Wie auch immer, der Kontostand entwickelt sich ziemlich gut: 700 bis 1800 pro Tag Anstieg - Kontostand ist jetzt 65k (begann mit 49k, also +16k)
Die verbrauchte Marge liegt jetzt bei 15k, die verfügbare Marge bei 21k - noch viel Spielraum, um bei Bedarf Positionen hinzuzufügen.
Der nicht realisierte Gewinn beträgt -29k, was einen Nettoverlust von 13k ergibt, 4 weniger als letzte Woche.

Positiv ist, dass ich die Einstellungen geändert habe, um Gegengeschäfte zu vermeiden (CounterTrade flag false), und der nicht realisierte P&L scheint sich stabilisiert zu haben.
Zu einem bestimmten Zeitpunkt lag er bei -36k.

Was mir an diesem Vorwärtstest gefällt, ist, dass er mit einem großen Schlag begann - dem Euro-Einbruch der letzten Woche -, so dass es jetzt interessant sein wird, zu sehen, wie und wann sich das
System sich erholt. Ich habe keinen Zweifel, dass es das wird.

Ich kann es kaum erwarten, die Ergebnisse nächste Woche zu sehen!!!

ps. Ich habe eine v1.2 mit der Möglichkeit, den TP zu ändern und einen SL hinzuzufügen. Poste hier, wenn du es willst.
 
Ich habe mit diesem ein ziemlich viel spielen. nur laufen alles auf Standard auf allen Paaren...
Ich muss sagen, ich bin sehr beeindruckt, wie es funktioniert.

Es gibt nur eine große niggle mit diesem..

lässt nur Short-Positins nehmen.. als Preis fällt die Short-Aufträge aktiviert werden.. aber viele Male können Sie 2 Aufträge auf der kurzen Seite erhalten, bevor der Preis beschließt, umzukehren.

dh der Take-Profit ist zum gleichen Preis wie die nächste kurze eingeleitet werden und berücksichtigt nicht den Spread dh Geld- und Briefkurse.

so um zu verhindern, dass 2 Aufträge offen, bevor die Preise auf die lange Seite umkehren TP muss zur gleichen Zeit geschehen, wie die nächste kurze Bestellung platziert wird.

Ich rechne, wenn dies möglich ist meine Drawdown derzeit könnte in der Hälfte geschnitten werden..

Ich vermute, dass Ihre neueste Version dieses Problem lösen würde.

Wenn Sie sie also posten könnten, wäre das fantastisch...
 
Hallo,

ich bin froh, dass Sie es lustig finden.. so tue ich...

Es gibt keine Möglichkeit, gleichzeitig einen TP = Gittergröße zu haben und die Möglichkeit zu eliminieren, 2 offene Positionen bei einem Reversal zu haben.
Dies ist kein Softwareproblem, sondern hängt einfach mit den Spreads zusammen.

Die einzige Möglichkeit, dies theoretisch völlig auszuschließen, besteht darin, den Spread jedes Mal zu verlieren:
D.h. Sie gehen short bei 1,2006 (Bid), TP bei 1,2000 (Ask) und short bei 1,1996 (Bid), wenn Sie einen Spread von 4 Ticks haben.
Sie verlieren einfach 4/10 der Spanne.

In der neuen Version können Sie die Rastergröße und den TP auf verschiedene Zahlen einstellen, so dass Sie das umsetzen können, was Sie suchen
was Sie suchen: Setzen Sie das Raster auf 10 und den TP auf 6, wenn Sie einen Spread von 4 Punkten haben.

Ich bin mir nicht sicher, ob es den dd um die Hälfte reduzieren wird - aber es wird sicherlich Ihren Gewinn deutlich reduzieren.

Lassen Sie es mich wissen.

ps. v1.2 im nächsten post
 
hier ist v1.2 von gridmaker.

die einzigen Unterschiede sind:
1) Ich habe einen optionalen Stoploss hinzugefügt, wenn Sie einen wollen. 0 bedeutet keinen Stoploss, jede positive Zahl bedeutet einen Stoploss.
wenn Sie einen Stoploss in einem Raster verwenden, sollten Sie ihn groß machen.
2) Sie können einen TP angeben, der von der Rastergröße abweicht. darkstonexa, im vorherigen Beitrag, möchte doppelte "hängende" Positionen vermeiden.
Meine ursprüngliche Absicht war es, größere TPs im Verhältnis zur Rastergröße auszuprobieren.

speichern Sie es im Expert Advisor-Ordner (etwa C:\Program Files\MetaTrader 4\experts\) und eine optionale Kopie im Skript-Ordner
, wenn Sie es als Skript haben möchten (C:\Program Files\MetaTrader 4\experts\scripts\).

Ich habe ein Skript, um offene Rasteraufträge zu entfernen, wenn Sie möchten. Es ist sehr nützlich, wenn Sie die Einstellungen ändern möchten.

HINWEIS: Die Standardeinstellungen können sich seit der letzten Version geändert haben. Stellen Sie sicher, dass Sie Ihre bevorzugten Einstellungen vor dem Neukompilieren setzen.

FRAGE an einen Administrator: Vielleicht sollte ich diese Art von Dingen in die Expert Advisor Library stellen. Ist das richtig?

//+------------------------------------------------------------------+
//|                                                     MakeGrid.mq4 |
//|                                            Copyright © 2005, hdb |
//|                                       http://www.dubois1.net/hdb |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, hdb"
#property link      "http://www.dubois1.net/hdb"
//#property version      "1.2beta"

extern string GridName = "Grid";       // identifies the grid. allows for several co-existing grids
extern double Lots = 0.1;              // 
extern double GridSize = 6;            // pips between orders - grid or mesh size
extern double GridSteps = 10;          // total number of orders to place
extern double TakeProfit = 6 ;         // number of ticks to take profit. normally is = grid size but u can override
extern double StopLoss = 0;            // if u want to add a stop loss. normal grids dont use stop losses
extern double UpdateInterval = 15;     // update orders every x minutes
extern bool   wantLongs = true;        //  do we want long positions
extern bool   wantShorts = true;       //  do we want short positions
extern bool   wantBreakout = true;     // do we want longs above price, shorts below price
extern bool   wantCounter = false;      // do we want longs below price, shorts above price
extern bool   limitEMA34 = false;      // do we want longs above ema only, shorts below ema only
extern double LastUpdate = 0;          // counter used to note time of last update
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
 #property show_inputs                  // shows the parameters - thanks Slawa...    
 if ( TakeProfit <= 0 )                 // 
   { TakeProfit = GridSize; }
//----
   return(0);
  }
//+------------------------------------------------------------------------+
//| tests if there is an open position or order in the region of atRate    |
//|     will check for longs if checkLongs is true, else will check        |
//|     for shorts                                                         |
//+------------------------------------------------------------------------+

bool IsPosition(double atRate, double inRange, bool checkLongs )
  {
  
     int totalorders = OrdersTotal();
     for(int j=0;j<totalorders;j++)                                // scan all orders and positions...
      {
        OrderSelect(j, SELECT_BY_POS);
        if ( OrderSymbol()==Symbol() && OrderComment() == GridName )  // only look if mygrid and symbol...
         {  int type = OrderType();
            if (MathAbs( OrderOpenPrice() - atRate) < inRange) // dont look for exact price but price proximity (less than gridsize)
              { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT  || type == OP_BUYSTOP ) )  || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT  || type == OP_SELLSTOP ) ) )
                 { return(true); }
              }
         }
      } 

   return(false);
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//---- 
   int    i, j,k, ticket, entermode, totalorders;
   bool   doit;
   double point, startrate, traderate;
 
//----
  if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60)           // we update the first time it is called and every UpdateInterval minutes
   {
   LastUpdate = CurTime();
   Print("Updating");
   point = MarketInfo(Symbol(),MODE_POINT);
   startrate = ( Ask + point*GridSize/2 ) / point / GridSize;    // round to a number of ticks divisible by GridSize
   k = startrate ;
   k = k * GridSize ;
   startrate = k * point - GridSize*GridSteps/2*point ;          // calculate the lowest entry point
   
   double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0);
   
   for( i=0;i<GridSteps;i++)
   {
     traderate = startrate + i*point*GridSize;
     if ( wantLongs && (!limitEMA34 || traderate > EMA34))
       {
         if (!IsPosition(traderate,point*GridSize,true) )           // test if i have no open orders close to my price: if so, put one on
          {
             double myStopLoss = 0;
             if ( StopLoss > 0 )
               { myStopLoss = traderate-point*StopLoss ; }
               
             if ( traderate > Ask ) 
              { entermode = OP_BUYSTOP; } 
              else 
              { entermode = OP_BUYLIMIT ; } 
             if ( (traderate > Ask ) && (wantBreakout) || ((traderate < Ask ) && (wantCounter)) ) 
              { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,16384,0,Green); }
          }
       }

     if ( wantShorts && (!limitEMA34 || traderate < EMA34))
       {
         if (!IsPosition(traderate,point*GridSize,false) )           // test if i have no open orders close to my price: if so, put one on
          {
             myStopLoss = 0;
             if ( StopLoss > 0 )
               { myStopLoss = traderate+point*StopLoss ; }
             if ( traderate > Bid ) 
              { entermode = OP_SELLLIMIT; } 
              else 
              { entermode = OP_SELLSTOP ; } 
              
              if ( (traderate < Bid ) && (wantBreakout) || ((traderate > Bid ) && (wantCounter)) ) 
                { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,16384,0,Red); }
          }
       }

    }
   }
   return(0);
  }
//+------------------------------------------------------------------+
 
Das ist großartig.

Nur die Lösung für das Problem im Moment mit einer TP-Option.

Ich könnte über die Höhe der Drawdown geschätzt haben.. aber es wird hoffentlich stoppen viele der Fälle, in denen ich 2 Aufträge am Ende eines Bereichs gesehen habe
jeder mit einem Verlust von $2000 + wird eine Sache der Vergangenheit sein :)

Die letzte Sache, die von Nutzen sein könnte, ist die Einstellung der Expire-Option bei Limit-Orders.
Derzeit ist es so eingestellt, dass sie nicht ablaufen...
also muss man sie manuell löschen.

Derzeit habe ich eine Reihe von Aufträgen, die etwa 3 Tage alt sind und wahrscheinlich nicht in nächster Zeit getroffen werden.

Nun, ich möchte sagen, tolle Arbeit :)
 
hier ist ein Skript, um alle offenen Aufträge für ein bestimmtes Währungspaar zu entfernen. der Code ist ein bisschen böse, aber es scheint zu funktionieren...

//+------------------------------------------------------------------+
//|                                                   RemoveGrid.mq4 |
//|                                            Copyright © 2005, hdb |
//|                                       http://www.dubois1.net/hdb |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, hdb"
#property link      "http://www.dubois1.net/hdb"

extern string GridName = "Grid";

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {

 #property show_inputs              // shows the parameters - thanks Slawa... 

//---- 
  int total = OrdersTotal();
  int i ;
  
      for(i=total-1; i>=0;i--)
 
      {
        OrderSelect(i, SELECT_BY_POS);
        int type   = OrderType();

        if ( OrderSymbol()==Symbol() && OrderComment() == GridName )
        {
          bool result = false;
    
          switch(type)
          {
             case OP_BUY       : result = true ;
      
            case OP_SELL      : result = true ;

            //Close pending orders
            case OP_BUYLIMIT  : result = OrderDelete( OrderTicket() ); 
            case OP_BUYSTOP   : result = OrderDelete( OrderTicket() ); 
            case OP_SELLLIMIT : result = OrderDelete( OrderTicket() ); 
            case OP_SELLSTOP  : result = OrderDelete( OrderTicket() ); 
          }
    
          if(result == false)
          {
     //       Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
     //       Sleep(3000);
          }  
        }
      }
 
//----
   return(0);
  }
//+------------------------------------------------------------------+
Grund der Beschwerde: