Ein paar Wichtige grundlegende Fragen wie in MT4 trotzdem etwas funktionieren kann

 

Hallo Liebe Forennutzder,

ich wäre euch extrem dankbar, wenn ihr Ordnung in meine Verwirrung schaffen könntet:

(Mein Broker macht momentannur MT4 und werde deswegen erstmal nicht wechseln. &

Es wird irgendwie trotzdem eine Lösung geben Müssen, schließlich resultiert bei der Optimierung im strategietester auf irgendeine art und weise eine Positive Summe.)


1.Copybuffer gibts nicht in MT4, bzw ist dieses ganze Array & Buffer drumherumgerede in MT4 überhaupt nötig? (in MT5 ist es ja unumgänglich)(In MT4 ... 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().)

vvvvvvvvv

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:)

double MAlangBuffer[], MAkurzBuffer[];

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);
   }}

5. Zuguterletzt noch eine letzte Frage zu MQL 5 Wie kann ich Den Ask- und Bid-kurs so aufrufen, dass ich ihn in einen Buffer speichern kann (und wie kriege ich letzeres hin)... (Copybuffer kann nur Int als "Indicator type" verarbeiten---> Forexpaare haben aber Dezimalstellen (=double)
 
  1. MQL4 arbeitet nicht mit Handels für Indikatoren sondern direkt mit denen - stell den Kursor auf iMA im Editor und drück F1 und lese, was iMA() zurückgibt!! MQL4 und MQL5 unterscheiden sich das grundsätzlich nicht vermischen!!
  2. MQL4 kann keine Indikatoren (in OnDeinit()) 'freigeben', wenn Du zB iMA mit immer neuen Parametern startest kannst Du so viele iMA starten, bis der ganze RAM weg ist und der PC abstürzt.
  3. Warum orientiert Du Dich nicht an einem EA mit zwei oder drei MA (zB. Alligator) aus der Codebase und kopierst von da, was Du brauchst?
  4. Wenn OrderModify 130 auswirft ist meist der Preis Schuld: Ask und Bid vertauscht, Preis zu nah am aktuellen oder auf der 'falschen' Seite! Druck den aktuellen, die gesendeten und den Eröffnungspreis aus. Tipp Ich verwende für SL und TP nicht Bid und Ask sondern einfach OrderClosePrice() ist dann immer der richtige!
  5. MQL5 hat jetzt diese Funktion für historische Ticks: https://www.mql5.com/de/docs/series/copyticksrange
Allgemeiner Tipp: Es gibt fast nix, was nicht schon für MQL4/5 programmiert wurde! Warum also das Rad neu erfinden, wenn Du es Dir einfach aus der CodeBase abholen kannst?
Dokumentation zu MQL5: Zugang zu Zeitreihen und Indikatoren / CopyTicksRange
Dokumentation zu MQL5: Zugang zu Zeitreihen und Indikatoren / CopyTicksRange
  • www.mql5.com
erfolgt die Indizierung der Ticks von der Vergangenheit in die Gegenwart, d.h. das älteste Tick ist das Tick mit dem Index 0. Für die Analyse eines Ticks muss das Feld [out]  Ein statisches oder dynamisches Array MqlTick für das Erhalten von Ticks. Wenn das statische Array nicht alle abgerufenen Ticks aus dem angegebenen Bereich speichern...
 

@Carl Schreiber

Okay damit ich das verstanden habe:


1. Ich brauche in MQL4 keine Handles... Hat das Nachteile?


2.Keine OnDeinit()... Verstanden. Bei 2 iMA's sollte es jedoch keine Probleme geben oder?


3. danke für den Link zur CodeBase... Alligator ist ja Indikator & noch dazu für den MT5

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
//--- check for rates total
   if(rates_total<ExtBarsMinimum)
      return(0); // not enough bars for calculation
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtJawsHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtJawsHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtTeethHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtTeethHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtLipsHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtLipsHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }
//---- get ma buffers
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtJawsHandle,0,0,to_copy,ExtJaws)<=0)
     {
      Print("getting ExtJawsHandle is failed! Error",GetLastError());
      return(0);
     }
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtTeethHandle,0,0,to_copy,ExtTeeth)<=0)
     {
      Print("getting ExtTeethHandle is failed! Error",GetLastError());
      return(0);
     }
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtLipsHandle,0,0,to_copy,ExtLips)<=0)
     {
      Print("getting ExtLipsHandle is failed! Error",GetLastError());
      return(0);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

   -> Welchen Teil des OnCalculate müsste ich nun Daraus Kopieren & durch "MAlang" & "MAkurz" ersetzen (Bzw was kann ich mir sparen)?

    ->Was sind denn nun Handles & Wofür wird on Calculate verwendet?


4.Bid & Ask verwende ich nur für das eröffnungssignal... Für das Setzen von SL & TP wird kein Bid/Ask verwendet sondern "OrderOpenPrice() * XYZ"...:

  ->Das Problem müsste also daran liegen, dass der "Preis zu nah am aktuellen oder auf der 'falschen' Seite!" liegt.

  -> Wie printe ich in diesem Fall den aktuellen Preis & den gesendeten Preis aus? (Eröffnungspreis ist ja (OrderOpenPrice()"))

Grund der Beschwerde: