Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4978
Beiträge: 43261
Benutzer: 7.222
Aktive Benutzer: 72
Links: 84
Wir begrüßen unseren neuesten Benutzer: Mane
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Mane
vor 2 Wochen
- AlbertZiz
vor 2 Wochen
- michak
vor 2 Wochen
- Amateur
vor 2 Wochen
- infos1982

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 244
Gesamt: 244
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 30.09.14
Neues Mitglied
 
Registriert seit: Jan 2014
Beiträge: 8
Mole696 befindet sich auf einem aufstrebenden Ast
Standard 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

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
  #2 (permalink)  
Alt 30.09.14
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #3 (permalink)  
Alt 01.10.14
Neues Mitglied
 
Registriert seit: Jan 2014
Beiträge: 8
Mole696 befindet sich auf einem aufstrebenden Ast
Standard

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
  #4 (permalink)  
Alt 01.10.14
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #5 (permalink)  
Alt 01.10.14
Neues Mitglied
 
Registriert seit: Jan 2014
Beiträge: 8
Mole696 befindet sich auf einem aufstrebenden Ast
Standard

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
  #6 (permalink)  
Alt 01.10.14
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Thema geschlossen

Lesezeichen

Stichworte
andrew r., checkonceperbar, ea programming, ema crossover, order schließung, programmierung, programmierung metatrader

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 21:43 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------