Grid maker 1.1 - Seite 3

 
Hallo nochmal

danke für deine Antwort, ich werde dich hinzufügen, wenn ich nach Hause komme
 
Ich finde, dass dieser Code manchmal Probleme hat, das Raster perfekt zu halten (zumindest wenn ich es als Pullback und nicht als Breakout-Raster ausführe). Ich habe gesehen, Löcher bilden und nicht aktualisiert werden, und ich habe gesehen, das Raster nicht vollständig bilden manchmal mit allen 10 Bestellungen. Außerdem scheint es keine Aktualisierungszeiteinstellungen zu mögen, die sehr kurz sind, und ich verstehe nicht, warum. Es scheint, dass 15 Minuten viel zu lang sind, um ein Raster zu aktualisieren (eher 15 Sekunden!), daher ist dies ein großes Problem. Ich würde gerne wissen, ob Sie solche Erfahrungen gemacht haben. Aber toll, dass Sie es überhaupt zum Laufen gebracht haben. Gute Arbeit.
 
soma,

Sie haben Recht, es war ein Fehler, dass jemand darauf hingewiesen, und scheint behoben werden. hier ist die neue Version. Ich habe auch das Intervall auf 1 Minute geändert - aber ich denke, 15 bis 30 Minuten ist besser... es wird einige Gegengeschäfte vermeiden, wenn sich der Markt sehr schnell bewegt.

Grüße,

//+------------------------------------------------------------------+ //| 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.4beta" extern string GridName = "Grid"; // identifiziert das Grid. ermöglicht mehrere nebeneinander existierende Grids extern double Lots = 0.1; // extern double GridSize = 6; // Pips zwischen den Orders - Grid oder Mesh Size extern double GridSteps = 12; // Gesamtzahl der zu platzierenden Orders extern double TakeProfit = 6; // Anzahl der Ticks für die Gewinnmitnahme. normalerweise = Grid Size, kann aber überschrieben werden extern double StopLoss = 0; // wenn Sie einen Stop Loss hinzufügen wollen. normale Grids verwenden keine Stop Losses extern double UpdateInterval = 1; // Aktualisierung der Orders alle x Minuten extern bool wantLongs = true; // wollen wir Long Positionen extern bool wantShorts = true; // wollen wir Short Positionen extern bool wantBreakout = true; // wollen wir Longs über dem Preis, Shorts unter dem Preis extern bool wantCounter = true; // wollen wir Longs unter dem Preis, Shorts über dem Preis extern bool limitEMA34 = false;      // wollen wir nur Longs oberhalb des Ema, nur Shorts unterhalb des Ema extern double LastUpdate = 0; // Zähler zum Notieren des Zeitpunkts der letzten Aktualisierung extern double GridMaxOpen = 0; // maximale Anzahl offener Positionen //+------------------------------------------------------------------+ //| Experteninitialisierungsfunktion | //+------------------------------------------------------------------+ int init() { //---- #property show_inputs // zeigt die Parameter an - danke Slawa...    
 if ( TakeProfit <= 0 ) // { TakeProfit = GridSize; } //---- return(0); } //+------------------------------------------------------------------------+ //| testet, ob es eine offene Position oder Order im Bereich von atRate gibt | //| prüft auf Longs, wenn checkLongs wahr ist, sonst prüft | //| auf Shorts | //+------------------------------------------------------------------------+ bool IsPosition(double atRate, double inRange, bool checkLongs ) { int totalorders = OrdersTotal();
     for(int j=0;j<totalorders;j++) // alle Aufträge und Positionen scannen... { OrderSelect(j, SELECT_BY_POS); if ( OrderSymbol()==Symbol() && OrderComment() == GridName )  // nur suchen, wenn mygrid und Symbol... { int type = OrderType(); if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // nicht nach exaktem Preis suchen, sondern nach Preisnähe (kleiner als 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; // runden auf eine durch GridSize teilbare Anzahl von Ticks k = startrate ; k = k * GridSize ; startrate = k * point - GridSize*GridSteps/2*point ;          // Berechnung des niedrigsten Einstiegspunktes double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0); for( i=0;i<GridSteps;i++) { traderate = startrate + i*Punkt*GridSize; if ( wantLongs && (!limitEMA34 || traderate > EMA34)) { if ( IsPosition(traderate,point*GridSize,true) == false )           // Teste, ob ich keine offenen Orders in der Nähe meines Preises habe: wenn ja, setze eine auf { double myStopLoss = 0; if ( StopLoss > 0 ) { myStopLoss = traderate-point*StopLoss ; } if ( traderate > Ask ) { entermode = OP_BUYSTOP; } 
              sonst { 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)== false )           // Teste, ob ich keine offenen Orders in der Nähe meines Preises habe: wenn ja, setze eine auf { myStopLoss = 0; if ( StopLoss > 0 ) { myStopLoss = traderate+point*StopLoss ; } if ( traderate > Bid ) { entermode = OP_SELLLIMIT; } 
              sonst { 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); } //+------------------------------------------------------------------+
 
Danke, hdb. Aber vielleicht verstehe ich nicht genau, wie du über Raster denkst, denn ich kann keinen Grund erkennen, warum eine zu frühe Aktualisierung schlecht sein sollte. Wenn ein Eintrag fehlt, kann das Raster sein volles Potenzial nicht ausschöpfen. Wenn ich es manuell ausführe, aktualisiere ich die Aufträge in der Sekunde, in der sich etwas ändert. Ich verwende Pullback-Grid und nicht Breakout-Grid, vielleicht liegt darin der Unterschied, aber bei Pullbacks profitiert man von Choppiness und daher ist es ideal, das Grid frei von Löchern zu halten.
 
soma,

ja, vielleicht haben Sie recht... also wäre es am besten, häufig zu aktualisieren, aber nur ein paar Rasterplätze? muss aber getestet werden. Ich habe keine feste Meinung.

Reagenzien,
 
Nun, ich habe auf einen günstigen Moment gewartet, um ein Update des Netzes zu posten - da seine Leistung in letzter Zeit wirklich lausig war.
In der Woche nach meinem letzten Update war ich im Urlaub und das Netz stand still. Letzte Woche lief das Netz die meiste Zeit.
Ich habe es ein paar Mal ausgeschaltet, wenn die verfügbare Marge null war, und bei den meisten Majors die Option "nur Longs" eingestellt.
Heute war ein Super-Comeback-Tag.

Stand: 93 (+10 seit vor 10 Tagen)
Genutzte Marge : +15k
Verfügbare Marge : +28k
unreal. p&l : -49k (-11 seit vor 10 Tagen)
Saldo : 44k

Netto ist 1k schlechter als vor 10 Tagen und 5k unter dem Startsaldo.

Das wirklich Schwierige an der ganzen Sache ist, den Drawdown zu begrenzen. Ich muss wirklich einen Weg finden, dies zu tun!
 
Ich denke, die einzige Möglichkeit, den Drawdown zu vermeiden, besteht darin, diskretionäre Methoden anzuwenden
d.h. zu wissen, wann man aufhört, Aufträge hinzuzufügen, und wann man, wie Sie es getan haben, aufhört, z.B. Short-Positionen hinzuzufügen.

Ich habe mit einem Guthaben von 100K begonnen, nachdem ich einen schlechten Start hatte, indem ich eine zu große Losgröße verwendete und gezwungen war, viele Positionen zu schließen.

Stand: 97 594,19 Stand vor etwa 2 Wochen 83k
Freie Marge: 6 016,88
Floating P/L: -38 960,45 war so schlecht wie -56k
Gewinnspanne: 52 616,86

in den letzten Tagen war das Margin-Niveau sehr niedrig und lag bei 93%.

aber jetzt scheinen alle Majors vorerst eine Kehrtwende gemacht zu haben
Die Gewinnspanne ist wieder auf etwa 130% gestiegen.
 
Einverstanden, darkstonexa, Ich denke, u kann richtig sein - aber ich teste ein paar automatisierte Variationen basierend om ema und macd...Ich bin nicht allzu optimistisch, obwohl.

Ein Freund hat auch eine mit einem Stoploss laufen... und es ist zu kämpfen, um über Wasser zu bleiben! Das löst das Drawdown-Problem aber wirklich!

In der Zwischenzeit habe ich meine Positionen aufgeräumt - alle Positionen mit einem starken negativen Carry Interest und weit im Verlust (einige 100 Pips) wurden geschlossen.

So sind meine Raster nun bereit für einen weiteren Schlag auf den Kopf (Margin bact auf 430%) !
 
Nun, was für schöne 2 Tage wir hatten... gestern sah mein Netz +5k im grünen Bereich (Eigenkapital war 54k, ich begann mit 49k) nach Wochen der ziemlich katastrophalen Handel.

Zum Glück können wir es auf Demokonten versuchen!

Jetzt, wo ich wieder in einer "vernünftigen" Position bin, habe ich alle Währungspaare so eingestellt, dass sie folgendes tun:
1) Handel nur in die Richtung des positiven Carry Interest (es sei denn, der Zins liegt nahe bei 0, dann in beide Richtungen)
2) longs nur über 34 ema, shorts nur unter 34 ema
3) bei 2-Wege-Währungen den Macd auf dem 5-Minuten-Chart verwenden, um zu entscheiden, ob long oder short

Wir werden sehen, was das ergibt!

ps. Ich wünschte, das Backtesting würde funktionieren!
 
Hallo hdb,

ich habe deinen Advisor auf EURUSD genommen und beide Seiten als Ausbruch gehandelt.

Nun möchte ich dich fragen, ob du schon auf folgendes Problem gestoßen bist:

Nach einiger Zeit habe ich mehr als eine Order auf einigen der gleichen Gitterpositionen. Manchmal sind es zwei, aber ich habe auch schon 5 und mehr davon gesehen.

Soweit ich den Code verstehe, sollte immer nur ein Auftrag auf einer Rasterposition offen sein.

Ich habe alle Doubles vor dem Vergleich in Int umgewandelt, weil ich in MQL2 ein ähnliches Problem beim Vergleich von Double-Werten festgestellt habe.

Sind Sie auf etwas Ähnliches gestoßen?

Mit freundlichen Grüßen,

cori