Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Order Schließung && CheckOncePerBar (http://www.expert-advisor.com/forum/showthread.php?t=3886)

Mole696 30.09.14 21:20

Order Schließung && CheckOncePerBar
 
Guten Tag werte Programmierer/-innen

Seit einiger Zeit studiere ich Andrew R. Youngs Buch "EA Programming" und leider funktionierte schon sein erstes Besipiel eines EMA Crossover Systems nicht:( Ich stattete die Orders mit SL und TP aus, und nahm Teile raus dann lief es.

Nun bin ich an meinem eigenen System dran und habe Probleme mit der Order Schließung. Weil er macht sie nicht.
Bei der OrderSelect Funktion bekomme ich den Error: "unknow ticket 118 for OrderClose function"
Doch bei OrderSelect müsste ich ja um die Ticket Nummer zu erhalten, die Order Richtung eingeben?
Außerdem bekomme ich eine Warnung "return value of OrderSelect should be checked". Wäre dies return(true)? Oder Ticket?

Code:

OrderSelect(BuyTicket,SELECT_BY_TICKET);
   
      if(PreviousCloseM5-1<EMA12 && OrderType() == OP_BUY)
        {
            double BuyCloseLots = OrderLots();
            double BuyClosePrice = Bid;
           
            bool Closed = OrderClose(BuyTicket,BuyCloseLots,BuyClosePrice,Slippage,Red);


Mein zweites Prob. ist dass ich nur einmal per Bar einen Check haben will, weil sonst eröffnet er 4-500 Positionen. Das nicht so toll.
Dies ist auch aus Herr Youngs Buch. Allerdings meldet der Kompiler, dass es undeclarierte Variablen gibt, was aber nicht der Wahrheit entspricht.
Dieses Problem hatte ich schonmal. Dann habe ich ein neues Programm aufgemacht, den ganzen Code rüber kopiert und alles hat funktioniert:confused:

Code:

extern bool CheckOncePerBar == true;
//Globale Variabel
datetime = CurrentTimeStamp;

//Init function
int init()
  {
      CurrentTimeStamp = Time[0];
      return(0);
  }
int start()
{
if(CheckOncePerBar == true)
        {
            int BarShift = 1;
            if(CurrentTimeStamp != Time[0])
              {
                  CurrentTimeStamp = Time[0];
                  bool NewBar = true;
              }
            else NewBar = false;
          }
      else
        {
            NewBar = true;
            BarShift = 0;
        } 

        if(NewBar == true)
      {
            // weiter führender Code zur Order Ausführung
}

Naja vielleicht erkennt es ja jemand. Ggf. schreibe ich den ganzen Code rein falls notwendig.

MfG und bestem Dank
Mole696

traderdoc 30.09.14 21:50

Das erste Problem kann man nur lösen, wenn man weiss, wo die Variable BuyTicket herkommt.

Das zweite Problem löst, man ganz einfach:

In den externen Variablen:
int OldBar;

Im start()-Teil:
if (Time[0] != OldBar) {
...
OldBar = Time[0];
}

Da, wo die .... stehen kann nun der Check stehen, oder ein Funktionsaufruf dahin oder sonst etwas, was nur einmal pro Kerze aufgerufen werden soll.

traderdoc

Mole696 01.10.14 10:51

Danke Dir für die rasche Antwort.

die Variable BuyTicket ist eine Globale Variable.

Nun habe ich kurz den ganzen Code zwischen
if(Time[0] != OldBar){
...
OldBar = Time[0];
}

reingesetzt. Er eröffnet leider aber auch Positionen die in der Definition nicht vorhanden sind. Kurz zu den Regeln des Systems:
Wenn der EMA 12 über der EMA 100 ist und der Preis über dem EMA12 war und zurückkommt unter die EMA 12 kommt und wieder nach oben durchgeht wird eine Buy Order eröffnet. Ich will eine Kerze mit Schlusskurs unter der EMA 12 und die darauffolgende über der EMA 12. Sobald die Kerze über der EMA 12 schließt soll eine Position eröffnet werden.

Ich kopiere nun kurz den ganzen Code rein. Evtl. kannst es kurz in ein leeres Prorgamm ziehen oder mir sagen ob ich das so richtig gemacht hab?

Habe nun allerdings noch SL und TP drinnen, soll aber eigentlich durch close unter der EMA 12 beendet werden. Z.B. am 1. August wäre da im DAX in short Richtung 150 Pkt. drinnen gewesen auf M5.

Code:

extern double FixedLotSize = 1;
extern double StopLoss = 10;
extern double TakeProfit = 26;

extern int MagicNumber = 125128;
extern int Slippage = 1;

extern int FastEMA = 12;
extern int SlowEMA = 100;



// Globale variables
int BuyTicket;
int SellTicket;

int OldBar;


//Init function

 

// start function
int start()
{
       
      //EMA zuweisung
      double EMA12 = iMA(Symbol(),0,FastEMA,0,MODE_EMA,PRICE_TYPICAL,0);           
      double EMA100 = iMA(Symbol(),0,SlowEMA,0,MODE_EMA,PRICE_TYPICAL,0);
     
   
      if(Time[0] != OldBar)
      {
      // calculating StopLoss & TakeProfit
      double BuyStopLoss = Ask - (StopLoss * 1);
      double BuyTakeProfit = Ask + (TakeProfit * 1);
     
      // Kerzenbestimmung
      double PrePreviousCloseM5 = iClose(Symbol(),PERIOD_M5,2);      //close des vorletzten Bars           
      double PreviousCloseM5 = iClose(Symbol(),PERIOD_M5,1);      //close des letzten Bars                       
      double PreviousOpenM5 = iOpen(Symbol(),PERIOD_M5,1);        //open des letzten Bars                         
   
     
      // Buy Order Bedingung und anschließende Eröffnung
      if(EMA12>EMA100 && (PrePreviousCloseM5-1)<EMA12 && PreviousCloseM5>EMA12)
        {
        BuyTicket = OrderSend(Symbol(),OP_BUY,FixedLotSize,Ask,Slippage,BuyStopLoss,BuyTakeProfit,"Buy Order opened",MagicNumber,0,Green);
       
        if(BuyTicket>0)
          {
            if(OrderSelect(BuyTicket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Kauforder eröffnet : ",OrderOpenPrice());
          }
          else Print("Fehler bei der Kauforder-Eröffnung : ",GetLastError());
          return(0);
        }
       
        // BuyOrder Schließung durch Close under EMA 12
   
      OrderSelect(BuyTicket,SELECT_BY_TICKET);
   
      if(PreviousCloseM5-1<EMA12 && OrderType() == OP_BUY)
        {
            double BuyCloseLots = OrderLots();
            double BuyClosePrice = Bid;
           
            bool Closed = OrderClose(BuyTicket,BuyCloseLots,BuyClosePrice,Slippage,DarkOrange);
                   
        } 
   
      // SellOrder Bedingung und Eröffnung
 
      double SellStopLoss = Bid + StopLoss;
      double SellTakeProfit = Bid - TakeProfit;
     
      if(EMA12<EMA100 && (PrePreviousCloseM5+1)>EMA12 && PreviousCloseM5<EMA12)
        {
        SellTicket = OrderSend(Symbol(),OP_SELL,FixedLotSize,Bid,Slippage,SellStopLoss,SellTakeProfit,"Sell Order opened",MagicNumber,0,Red);
       
        if(SellTicket>0)
          {
            if(OrderSelect(SellTicket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Sellorder eröffnet : ",OrderOpenPrice());
          }
          else Print("Fehler bei der Sellorder-Eröffnung : ",GetLastError());
          return(0);
        }
     
      // SellOrder Schließung durch Close über EMA 12
     
      OrderSelect(SellTicket,SELECT_BY_TICKET,MODE_TRADES);
   
      if(PreviousCloseM5+1>EMA12 && OrderType() == OP_SELL && OrderCloseTime() == 0)
        { 
     
            double SellCloseLots = OrderLots();
            double SellClosePrice = Ask;
           
           
            bool Closed = OrderClose(SellTicket,SellCloseLots,SellClosePrice,Slippage,DarkOrange); 
                   
        } 
                 
        OldBar=Time[0];
      }
     
     
     
     

                     
                                                                                               
      return(0);
     
}

Vielen Dank nochmals.
Mole696

traderdoc 01.10.14 11:29

Also, durch die Handelslogik hangele ich mich jetzt nicht durch.
Definitiv wird die Abfrage if (Time[0] != Oldbar) nur einmal nach einem Kerzenwechsel durchlaufen.
Aber bereits bei der BuyStopLoss-Abrechnung (und folgende) würde das Programm aussteigen, weil Du zum Kurs einen Pipwert addierst oder subtrahierts. Das führt unweigerlich zu einen Invalid StopLoss-Fehler.

Desweiteren steht die Zeile
OrderSelect(BuyTicket,SELECT_BY_TICKET);
immer dann in der Luft, wenn nicht gerade eine Order gesendet wurde und das sollte die absolute Mehrzahl sein.

traderdoc

Mole696 01.10.14 11:42

Is auch nicht so tragisch. Hab eben noch ein MQL4 Tutorial gefunden und werde dies mal durcharbeiten um mehr Erfahrung zu sammeln.

BuyStopLoss hat jedoch bisher immer wunderbar funktioniert.

Nur mit der OrderSelect Funktion ist es nun so, dass er manche Positionen einfach schließt.

Doch das mit dem Kerzenwechsel funktioniert.

Mfg Mole696

traderdoc 01.10.14 12:07

Wenn das mit dem BuyStopLoss immer funktioniert, dann muß irgendwo ein Zwischenschritt sein, der die Pipzahl der externen Variablen in eine Dezimalzahl wandelt, sonst kann das nicht gehen!

traderdoc


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:26 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum