Why werden nicht alle Order Entrys genutzt? (bzw einige ausgelassen)

Einloggen oder registrieren, um einen Kommentar zu schreiben
Baynez
30
Baynez  

Warum wird hier nicht geordert?

Hey in der Lage sind den Fehler zu finden:

Habe eine Moving Average lang & kurz strategie, bei der, wenn Kurs Größer oder gleich dem MA50  (hier rot) ist && wenn gleichzeitig MA50 größer als MA200 (hier blau) ist eine LongOrder ausgelöst werden soll.

Das Problem liegt darin, dass (obwohl derMA50 größer als der MA200 ist und der Kurs höher liegt als der MA50) einfach keine Order ausgeführt wird.

(Zugegebenermaßen, dass erste rot markierte feld liegt außerhalb des täglichen Handelszeitfenster, welches dazu programmiert wurde & an einem Donnerstag-> hätte also eigentlich getradet werden müssen oder?)

Hier der Code für die Ausführung:

extern int MA_langperiode =110;
extern int MA_kurzperiode =42;
extern double Lot = 0.01;
int LongOrder,ShortOrder;
int MagicNummer = 12345;


int OnInit()
  {
double MAlanghandle =iMA (NULL,PERIOD_M30,MA_langperiode,0,MODE_SMA,PRICE_CLOSE,0);
double MAkurzhandle = iMA(NULL,PERIOD_M30,MA_kurzperiode,0,MODE_SMA,PRICE_CLOSE,0);
   return(INIT_SUCCEEDED);
  }


void OnDeinit(const int reason)
  {


  }

void OnTick()
  {
 
  
  double MAlanghandle =iMA (NULL,0,MA_langperiode,0, MODE_SMA, PRICE_CLOSE,1);
double MAlangVorperiode =iMA(NULL,0,MA_langperiode,0, MODE_SMA, PRICE_CLOSE,2);
double MAkurzhandle =iMA(NULL ,0,MA_kurzperiode,0, MODE_SMA, PRICE_CLOSE,1);
double MAkurzVorperiode =iMA (NULL ,0,MA_kurzperiode,0, MODE_SMA, PRICE_CLOSE,2);
  
//Order Auslösen
   //Long
 
if (DayOfWeek()==0 && Hour()<23 && DayOfWeek()==5 && Hour()<23){return;}
else if (Hour()>6.5 && Hour()<20)
{
   if (LongOrder<=0 && MAkurzhandle>MAlanghandle && Bid>=MAkurzhandle){
   LongOrder = OrderSend(Symbol(),OP_BUY,Lot,Bid,10,0,0,"einfach Long",MagicNummer,0,Green);
   LongOrder++;}
   
   
   
   //Short
   
   if (ShortOrder<=0 && MAkurzhandle<MAlanghandle && Ask<=MAkurzhandle){
   ShortOrder = OrderSend(Symbol(),OP_SELL,Lot,Ask,10,0,0,"einfach Short",MagicNummer,0,Green);
   ShortOrder++;}
Baynez
30
Baynez  
Bitte verschieben zu den allgemeinen Diskussionen (an admin)
Otto Pauser
1056
Otto Pauser  

Ui, das ist aber ganz daneben. In der OnTick must du mit CopyBuffer(...) arbeiten.

Ich hab da fertigen Code, den poste ich dir gleich.........

Carl Schreiber
Moderator
7391
Carl Schreiber  

Dein Code hate verschiedene Fehler oder 'macht man nicht so':

  1. Alle handles zu den Indikatoren sollten in OnInit() definiert werden, inkl Fehlerbehandlung, wenn's schief geht - sonst gibt's immer mehr offene handles, die nicht geschossen werden!
    Orientiere Dich einfach den den Beispielen in der Referenz (im Editor Kursor auf iMA und F1 drücken).
  2. iMA gibt in MQL5 ein handle zurück nicht den Wert (siehe 1.)
  3. Erst suchen! Es gibt fast nix, was nicht schon für Mt4/5 programmiert wurde! Warum das Rad neu erfinden, wenn es in der CodeBase liegt zum abkupfern?
    Und aus Vielem aus der CodeBase oder den Artikeln kann man sich seinen Teil 'rauskopieren!

Otto Pauser
1056
Otto Pauser  

Carl hat, wie immer, recht. Artikel 100 ist ein Beispiel wie man es machen kann.

Es sind aber auch viele Beispiele vollkommen überladen und auch sinnentleert dokumentiert.

In der OnInit() wird das Handle erzeugt und der Buffer mit SetAsSeries(..) eingestellt. Das ist wichtig um mit index 0 auf die aktuelle Kerze zugreifen zu können.

In der OnTick() wird dann der Buffer mit CopyBuffer(........) mit Daten gefüllt.

Aber Achtung: Kerze 0 verändert sich noch. Erst Kerze mit Index 1 und 2 sind in Stein gemeisselt.

amando
1068
amando  
Otto Pauser:

Carl hat, wie immer, recht. Artikel 100 ist ein Beispiel wie man es machen kann.

Es sind aber auch viele Beispiele vollkommen überladen und auch sinnentleert dokumentiert.

In der OnInit() wird das Handle erzeugt und der Buffer mit SetAsSeries(..) eingestellt. Das ist wichtig um mit index 0 auf die aktuelle Kerze zugreifen zu können.

In der OnTick() wird dann der Buffer mit CopyBuffer(........) mit Daten gefüllt.

Aber Achtung: Kerze 0 verändert sich noch. Erst Kerze mit Index 1 und 2 sind in Stein gemeisselt.

Alle verändern sich, ein MA ist repaintend. Daher ist immer die periode des MA repaintend, ausser man verwendet den open kurs

Baynez
30
Baynez  

Zuallererst glaube ich die Definition eines Handles nicht ganz verstanden zu haben, Was ist das wenn es nicht einfach die Values abgibt? in copybuffer() werde ich mich gleich einlesen, trade jedoch in MQL4. Gibt es sowa wie Artikel 100 in verständlich auch für MQL 4?

1. Der angegebene Code ist natürlich nur ein Ausschnitt. Was ich jedoch (in MQL4) nicht zu codieren weiß wäre den SetAsSeries() & Copybuffer()

Hätte dann die Handles für die jeweiligen Perioden folgendermaßen festgelegt (und vorher als double deklariert): ... Und nun?

int OnInit()
  {

//---

MAlanghandle =iMA (NULL,PERIOD_M30,MA_langperiode,0,MODE_SMA,PRICE_CLOSE,0);
MAkurzhandle = iMA(NULL,PERIOD_M30,MA_kurzperiode,0,MODE_SMA,PRICE_CLOSE,0);
MAlanghandle1 =iMA (NULL,0,MA_langperiode,0, MODE_SMA, PRICE_CLOSE,1);
MAlangVorperiode =iMA(NULL,0,MA_langperiode,0, MODE_SMA, PRICE_CLOSE,2);
MAkurzhandle1 =iMA(NULL ,0,MA_kurzperiode,0, MODE_SMA, PRICE_CLOSE,1);
MAkurzVorperiode =iMA (NULL ,0,MA_kurzperiode,0, MODE_SMA, PRICE_CLOSE,2);

2. Wie checke ich ob genügend bars im Spiel sind?

3. jetzt wo die Handles in der Onit() Funktion und nicht mehr im OnTick() sind wird gar keine Order mehr im Tester ausgeführt

Otto Pauser
1056
Otto Pauser  
Vergiss den MT4 ;)
Bayne
108
Bayne  

Nix "vergiss MT4", Mein Broker macht nunmal nur MT4 und werde deswegen erstmal nicht wechseln.


Es wird dafür doch irgendwie eine Lösung geben Müssen. Schließlich resultiert bei der Optimierung eine Positive Summe.


1.Copybuffer gibts nicht in MT4, bzw ist dieses ganze Array & Buffer drumherumgerede in MT4 überhaupt nötig? (ich glaube eher weniger...Funktioniert nämlich überhaupt nicht wenn ich irgendwas versuche in der OnInit() zu starten. (bzw habe dann logischerweise auch keinen zugriff auf die Deklaration in der OnTick().)


2. Gibt es nicht eine Alternative um sicherzugehen, dass genug Arrays im Buffer sind? Copybuffer geht nicht in MT4, aber was ist mit der ArrayCopy() funktion??? wie müsste ich diese im Beispiel unten anwenden? (Das sind die 2 MA's:)

MAlanghandle =iMA (NULL,PERIOD_M30,MA_langperiode,0,MODE_SMA,PRICE_CLOSE,0);
MAkurzhandle = iMA(NULL,PERIOD_M30,MA_kurzperiode,0,MODE_SMA,PRICE_CLOSE,0);

3.1 Was zum **** ist denn nun ein "Handle"? (für dummies) (bekomme ständig ein neues bild davon -> Verwirrung)        3.2 Was macht OnCalculate? (verstehe die definition im forum nicht ganz)-> wozu brauch ich das?


4.Was kann ich Tun um Fehler vorzubeugen?  Folgendes kommt mir da in den Sinn:

 a) bekomme andauernd Fehlercode #1 und #130 rein, (#1 ist egal, weil Ordermodify versucht wird mit dem exact gleichen Ordermodyfy auszutauschen), #130 jedoch macht mir ein bisschen Sorgen und kommt auch durch den Ordermodyfy bei JEDER einzelnen message im Journal. Habe nämlich eine SL verschiebung, sobald 90% des Take Profits erreicht werden (SL auf kurz unter dem bisherigen TP und Neuer TP dann ca auf dass doppelte hoch) (s. unten)

  //Long
if (LongOrder<=0 && MAkurzhandle>MAlanghandle && Bid>=MAkurzhandle){
   LongOrder = OrderSend(Symbol(),OP_BUY,Lot,Bid,10,0,0,"einfach Long",MagicNummer,0,Blue);
   LongOrder++;}
   
   
   
   //Short
   
   if (ShortOrder<=0 && MAkurzhandle<MAlanghandle && Ask<=MAkurzhandle){
   ShortOrder = OrderSend(Symbol(),OP_SELL,Lot,Ask,10,0,0,"einfach Short",MagicNummer,0,Red);
   ShortOrder++;}
   

//SL für LongOrder setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderStopLoss()==0)//Order noch nicht geschlossen & SL nochnicht gesetzt
      {
     StopLossLong = NormalizeDouble(OrderOpenPrice()/(1+(SL_prozent/100)),Digits);
     SL_Setzen = OrderModify(OrderTicket(),OrderOpenPrice(),StopLossLong,OrderTakeProfit(),0,Yellow);
      }
   }
   
   
 //SL für ShortOrder setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderStopLoss()==0) //Order noch nicht geschlossen & SL nochnicht gesetzt
      {
     StopLossShort=NormalizeDouble(OrderOpenPrice()*(1+(SL_prozent/100)),Digits);
      SL_Setzen=OrderModify(OrderTicket(),OrderOpenPrice(),StopLossShort,OrderTakeProfit(),0,Yellow);
      }
   }
//TP für LongOrder Setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderTakeProfit()==0) //Order noch nicht geschlossen & TP nochnicht gesetzt
      {
    TakeProfitLong=NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent/100)),Digits);
    TP_Setzen=OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(),TakeProfitLong,0,Orange);
      }
   }
   }
   
//TP für ShortOrder setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderTakeProfit()==0) //Order noch nicht geschlossen & TP nochnicht gesetzt
      {
     TakeProfitShort=NormalizeDouble(OrderOpenPrice()/(1+(TP_prozent/100)),Digits);
     TP_Setzen=OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(),TakeProfitShort,0,Orange);
      }
      //*
//TP auf erhöhen wenn 90% & Sl auf -0.1 unter altem TP setzen

if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
   {if (siglong==true && OrderCloseTime()==0)//Order noch nicht geschlossen & sig ausgelöst
      {
double TakeProfitLong2=NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent2/100)),Digits);
   if (TakeProfitLong2>TakeProfitLong){
          TP_Setzen=OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(),TakeProfitLong2,0,Orange);
            }
   double StopLossLong2 = NormalizeDouble(OrderOpenPrice()*(1+((TP_prozent-SL_konstante)/100)),Digits);
     if (StopLossLong2 < StopLossShort){ //nur wenn SL auch tiefer liegen würde als vorher
            SL_Setzen2 = OrderModify(OrderTicket(),OrderOpenPrice(),StopLossLong2,OrderTakeProfit(),0,Yellow);}
            }
            
    }
     
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
   {if (sigshort==true && OrderCloseTime()==0)//Order noch nicht geschlossen &sig ausgelöst
      {
     double TakeProfitShort2=NormalizeDouble(OrderOpenPrice()/(1+(TP_prozent2/100)),Digits);
     if (TakeProfitShort2>TakeProfitShort){
         TP_Setzen2=OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(),TakeProfitShort2,0,Orange);
         }
 double StopLossShort2=NormalizeDouble(OrderOpenPrice()/(1+((TP_prozent-SL_konstante)/100)),Digits);
 if (StopLossShort2< StopLossShort){//nur wenn SL auch höher liegen würde als vorher
      SL_Setzen2=OrderModify(OrderTicket(),OrderOpenPrice(),StopLossShort2,OrderTakeProfit(),0,Yellow);
      }


(bei auflösen der Order wird der zähler der orders natürlich wieder auf 0 gesetzt)

b) In MQL4 gibts keinen IndicatorRelease()... was kann ich stattdessen in den DeInit() Befehl rein klatschen?

c)Was tun wenn eine Order nicht Modyfiziert werden kann (einfach keinen SL oder TP zugewiesen? Mein Lösungsansatz wäre der hier)?
  //Zur sicherheit schließen, wenn es keine SL gibt
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true){
   if (OrderStopLoss()==false){
   OrderClose(OrderSelect(ShortOrder,SELECT_BY_TICKET),Lot,Bid,Slippage,clrMagenta);
   }}
if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true){
   if (OrderStopLoss()==false){
   OrderClose(OrderSelect(LongOrder,SELECT_BY_TICKET),Lot,Ask,Slippage,clrMagenta);
   }}
Einloggen oder registrieren, um einen Kommentar zu schreiben