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: 4972
Beiträge: 43257
Benutzer: 7.216
Aktive Benutzer: 84
Links: 84
Wir begrüßen unseren neuesten Benutzer: bb1107
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 2 Tagen
- bb1107
vor einer Woche
- rg-trader
vor 2 Wochen
- toshistyle
vor 2 Wochen
- Robin
vor 3 Wochen
- mMmaanu

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

Empfehlungen

Like Tree3Likes
Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 04.04.13
Neues Mitglied
 
Registriert seit: Apr 2013
Beiträge: 11
CKAE befindet sich auf einem aufstrebenden Ast
Standard erster EA

Hallo Zusammen,

ich bin neu hier und dabei mich in mql4 einzuarbeiten, verstehe aber nicht wie ich den Startkurs in einer Variable speichern kann.

Ich versuche mal zu beschreiben was der EA machen soll.

1. Egal auf welcher Zeitebene oder Währungspaar man den EA startet, soll in diesem Moment des starten´s, eine horizontale Linie in den Chart gezeichnet werden die den aktuellen Kurs, beim Starten des EAs anzeigt. Dieser Kurs soll jetzt in einer Variable (Startkurs) gespeichert werden, damit die PendingOrders erstellt werden können.

2. Jetzt sollen zwei PendingOrders erstellt werden:

• Buystop 1lot mit 100pip Abstand zum Startkurs und eine
• Sellstop 1lot mit 100pip Abstand zum Startkurs

Jeweils ohne TP & SL.

Viele Grüße und Danke vorab
  #2 (permalink)  
Alt 05.04.13
Mitglied
 
Registriert seit: Apr 2011
Ort: Osnabrück
Beiträge: 103
Racki befindet sich auf einem aufstrebenden Ast
Standard

Helas, um den Startkurs in eine Variable zu speichern, musst du diese nur zuweisen.
Code:
double Startkurs = 0.0;

int init() { Startkurs = Bid; return (0); }
Für eine horizontale Linie sollte dir das hier weiterhelfen:
Code:
ObjectCreate("Startkurs", OBJ_HLINE,0,Time[0],Startkurs);
ObjectSet("Startkurs", OBJPROP_COLOR, Yellow);
Pendings:
Code:
OrderSend(Symbol(), OP_BUYSTOP, 1.0, Bid+0.01, 0, 0, 0, "Buystop", 123, Blue);
Wenn ich jetzt keinen Parameter ausgelassen habe sollte es in etwa passen.
An sonsten hilft dir das Syntaxhighlighting sicher weiter.
Bei nem Sellstop entsprechend anpassen
  #3 (permalink)  
Alt 05.04.13
Gesperrter Benutzer
 
Registriert seit: Sep 2011
Ort: Kassel
Beiträge: 749
JoeDormann befindet sich auf einem aufstrebenden Ast
JoeDormann eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Racki Beitrag anzeigen
Helas, um den Startkurs in eine Variable zu speichern, musst du diese nur zuweisen.
Code:
double Startkurs = 0.0;

int init() { Startkurs = Bid; return (0); }
Für eine horizontale Linie sollte dir das hier weiterhelfen:
Code:
ObjectCreate("Startkurs", OBJ_HLINE,0,Time[0],Startkurs);
ObjectSet("Startkurs", OBJPROP_COLOR, Yellow);
Pendings:
Code:
OrderSend(Symbol(), OP_BUYSTOP, 1.0, Bid+0.01, 0, 0, 0, "Buystop", 123, Blue);
Wenn ich jetzt keinen Parameter ausgelassen habe sollte es in etwa passen.
An sonsten hilft dir das Syntaxhighlighting sicher weiter.
Bei nem Sellstop entsprechend anpassen
Gefällt mir, aber ob sinnvoll ist ja nicht das Thema.

Kurze prägnante Lösung ;-)

Gruß Joe
  #4 (permalink)  
Alt 10.04.13
Neues Mitglied
 
Registriert seit: Apr 2013
Beiträge: 11
CKAE befindet sich auf einem aufstrebenden Ast
Standard das hat alles soweit geklappt, danke.

Hallo Racki,

Ich versuche gerade in der expert start function eine Abfrage einzubauen, die Prüft wann eine der beiden Pending Oders in den Markt eintritt.

Meine Überlegung ist jetzt, dass ich die PendingOrder, die er in der initialization function absetzt vorher auch mit einer Variable versehen muss oder?

z.B.
double SellStopOrderNr [0]
double BuyStopOrderNr [0]

Wenn eine der beiden StopOrders in den Markt eintritt soll die andere nämlich gelöscht werden und eine neue erstellt werden.

Ich hoffe es ist alles verständlich was ich hier Schreibe, ich poste mal den aktuellen EA damit man die Zusammenhänge besser verstehen kann.

Grüße

Code:
#property link      ""
#define  MAGIC    08042010
double   startkurs = 0.0;
double   diff = 1.2;
double   buystop;
double   sellstop;
bool     CheckedToday = FALSE;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()   

  {
//----
            startkurs = Bid; 
            buystop = startkurs + diff;
            sellstop = startkurs - diff;

         //+------------------------------------------------------------------+
         //| Horizontale Linie zeichnen                                       |
         //+------------------------------------------------------------------+
         
            ObjectCreate("startkurs", OBJ_HLINE,0,Time[0],startkurs);
            ObjectSet("startkurs", OBJPROP_COLOR, Yellow);      

         //+------------------------------------------------------------------+
         //| Pending Orders absetzen                                          |
         //+------------------------------------------------------------------+

           {
           OrderSend(Symbol(), OP_SELLSTOP, 0.01, (sellstop), 0, 0.0, 0.0, "SellStop Order", MAGIC);
           OrderSend(Symbol(), OP_BUYSTOP, 0.01, (buystop), 0, 0.0, 0.0, "SellStop Order", MAGIC);
          
             {
             Print("OrderSend failed with error #",GetLastError());
             return(0);
             }
           }            
           
//----
   return;
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int Tick;
int start()
   {  



   
         Tick++;
         Comment("Ticknummer: ",Tick);
         Print ("Letztes Hoch = ", High[0]);
         Print ("Letztes Tief = ", Low[0]);
         Print ("Startpreis = ", startkurs);
         Print ("BUYSTOP ist = ",buystop);
         Print ("SELLSTOP ist = ",sellstop);  

         //+------------------------------------------------------------------+
         //| Prüfe ob eine Pending Order ausgefürt wurde                      |
         //+------------------------------------------------------------------+


          //----     
               
          //----   
         return(0);    
   }   


//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
   int deinit()
  {
   //----
   
   //----
   return(0);
  }
  #5 (permalink)  
Alt 10.04.13
Mitglied
 
Registriert seit: Apr 2011
Ort: Osnabrück
Beiträge: 103
Racki befindet sich auf einem aufstrebenden Ast
Standard

Ich habe deinen Code entsprechend angepasst und so ein paar Kleinigkeiten eingesetzt.
Z.B. die Prints durch Comment ersetzt, damit mir die Logs nicht vollgeschrieben werden^^

PHP-Code:
#property link      ""
#define  MAGIC    08042010
double   startkurs 0.0;
extern double   diff 1.2;
double   buystop;
double   sellstop;
bool     CheckedToday FALSE;
extern double LOT 0.1;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()   

  {
//----
            
startkurs Bid
            
buystop startkurs + (diff*ThisPip()) ;
            
sellstop startkurs - (diff*ThisPip()) ;

         
//+------------------------------------------------------------------+
         //| Horizontale Linie zeichnen                                       |
         //+------------------------------------------------------------------+
         
            
ObjectCreate("startkurs"OBJ_HLINE,0,Time[0],startkurs);
            
ObjectSet("startkurs"OBJPROP_COLORYellow);      

         
//+------------------------------------------------------------------+
         //| Pending Orders absetzen                                          |
         //+------------------------------------------------------------------+

           
{
           
OrderSend(Symbol(), OP_SELLSTOPLOT, (sellstop), 00.00.0"SellStop Order"MAGIC);
           
OrderSend(Symbol(), OP_BUYSTOPLOT, (buystop), 00.00.0"SellStop Order"MAGIC);
          
             {
             Print(
"OrderSend failed with error #",GetLastError());
             return(
0);
             }
           }            
           
//----
   
return;
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int Tick;
int start()
   {  
   
string ThisComment "Ticknummer: " Tick "\nLetztes Hoch = " High[0];
   
ThisComment ThisComment "\nLetztes Tief = " Low[0] + "\nStartpreis = " startkurs;
   
ThisComment ThisComment "\nBUYSTOP ist = " buystop "\nSELLSTOP ist = " sellstop;

   
         
Tick++;
         
Comment(ThisComment);
         
         
//+------------------------------------------------------------------+
         //| Prüfe ob eine Pending Order ausgefürt wurde                      |
         //+------------------------------------------------------------------+


          //----     
            
if (CountLong(Symbol(),MAGIC)+CountShort(Symbol(),MAGIC) > 0ClosePending(Symbol(),MAGIC);   
          
//----   
         
return(0);    
   }   


//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
   
int deinit()
  {
   
//----
   
   //----
   
return(0);
  }
//+------------------------------------------------------------------+
//| MSP bestimmen                                                    |
//+------------------------------------------------------------------+
double ThisPip() 
   {
   
//----
      
double returnPoint 0.000001;
      
int ThisDigits MarketInfo(Symbol(), MODE_DIGITS);
         if (
ThisDigits == || ThisDigits == 3returnPoint 0.01;
         if (
ThisDigits == || ThisDigits == 5returnPoint 0.0001;
      return(
returnPoint);
   
//----
   
}
//+------------------------------------------------------------------+
//| Anzahl der Longpositionen                                        |
//+------------------------------------------------------------------+
void ClosePending(string ThisSymbol="EURUSD",int ThisMagigNumber=123)
{
   
int ThisOrdersTotal OrdersTotal();
   for (
int ThisCounter 0ThisCounter ThisOrdersTotalThisCounter++)
   {
      
OrderSelect(ThisCounter,SELECT_BY_POS,MODE_TRADES);
      if (
OrderMagicNumber() == ThisMagigNumber && OrderSymbol() == ThisSymbol && (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) )
      {
         
OrderDelete(OrderTicket());
      }
   }
}

int CountLong(string countLongSymbolint countLongMagic)
{
   
int CountLongReturn 0;
   
int ThisOrdersTotal OrdersTotal();
   if (
ThisOrdersTotal )
   {
       for(
int counterCountLong 0counterCountLong ThisOrdersTotalcounterCountLong++)
       {
           
OrderSelect(counterCountLongSELECT_BY_POSMODE_TRADES);
           if(
OrderSymbol() == countLongSymbol && OrderMagicNumber() == countLongMagic)
           {
              if(
OrderType() == OP_BUY)
                 {
                    
CountLongReturn++;
                 }
           }
       }
   }
   return (
CountLongReturn);
}
//+------------------------------------------------------------------+
//| Anzahl der Shortpositionen                                       |
//+------------------------------------------------------------------+
int CountShort(string countShortSymbolint countShortMagic)
{
   
int CountShortReturn 0;
   
int ThisOrdersTotal OrdersTotal();
   if (
ThisOrdersTotal )
   {
       for(
int counterCountShort 0counterCountShort ThisOrdersTotalcounterCountShort++)
       {
           
OrderSelect(counterCountShortSELECT_BY_POSMODE_TRADES);
           if(
OrderSymbol() == countShortSymbol && OrderMagicNumber() == countShortMagic)
           {
              if(
OrderType() == OP_SELL)
                 {
                    
CountShortReturn++;
                 }
           }
       }
   }
   return (
CountShortReturn);

  #6 (permalink)  
Alt 11.04.13
Neues Mitglied
 
Registriert seit: Apr 2013
Beiträge: 11
CKAE befindet sich auf einem aufstrebenden Ast
Standard OrderSend failed with errors

ich hab den EA jetzt 1zu1 kopiert. Wenn ich ihn auf EUR/USD starte kommt die Meldung: OrderSend failed with error#130, bei USD/JPY auch.

Bei Gold kommt die Meldung: OrderSend failed with error#4107, invalid price 1557.8720000000 for OrderSend function
  #7 (permalink)  
Alt 11.04.13
Mitglied
 
Registriert seit: Apr 2011
Ort: Osnabrück
Beiträge: 103
Racki befindet sich auf einem aufstrebenden Ast
Standard

130 invalid Stops , 4107 ist invalid Price param.
Teste mal auf eurusd. Da hat es vorher funktioniert, oder zwischen CoRD und Der Zwischenablage bestand noch ein älterer Code.
  #8 (permalink)  
Alt 11.04.13
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.732
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Die ThisPip()-Funktion ist unzureichend definiert. Die Unterscheidung, ob es ein 4- oder 5-Digitbroker ist, muß anders automatisiert werden. So wie es umgesetzt wurde, funktioniert es nur z.T. richtig.

Bei der Berechnung des TP und SL muß unbedingt der Wert für
MarketInfo(Sysmbol(), MODE_STOPLEVEL) berücksichtigt werden. Die beiden Marken müssen mindestens um diesen Wert vom Entry entfernt sein.

Schönheitsfehler: im OrderSend des BuyStop muss auch im Kommentar das Richtige stehen.

traderdoc
  #9 (permalink)  
Alt 11.04.13
Neues Mitglied
 
Registriert seit: Apr 2013
Beiträge: 11
CKAE befindet sich auf einem aufstrebenden Ast
Standard Schritt zurück

Hallo Racki,

vielen Dank nochmal für die Mühen.

Ich bin dafür wir gehen nochmal einen Schritt zurück. Ich verstehe nämlich gerade den EA selbst nicht mehr und das war genau das was ich nicht wollte!
Der Teil der mir klar ist Poste ich jetzt hier:

Code:
#property link      ""
#define  MAGIC    08042010
double   startkurs = 0.0;
double   diff = 1.2;
double   buystop;
double   sellstop;
bool     CheckedToday = FALSE;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()   

  {
//----
            startkurs = Bid; 
            buystop = startkurs + diff;
            sellstop = startkurs - diff;

         //+------------------------------------------------------------------+
         //| Horizontale Linie zeichnen                                       |
         //+------------------------------------------------------------------+
         
            ObjectCreate("startkurs", OBJ_HLINE,0,Time[0],startkurs);
            ObjectSet("startkurs", OBJPROP_COLOR, Yellow);      

         //+------------------------------------------------------------------+
         //| Pending Orders absetzen                                          |
         //+------------------------------------------------------------------+

           {
           OrderSend(Symbol(), OP_SELLSTOP, 0.01, (sellstop), 0, 0.0, 0.0, "SellStop Order", MAGIC);
           OrderSend(Symbol(), OP_BUYSTOP, 0.01, (buystop), 0, 0.0, 0.0, "SellStop Order", MAGIC);
          
             {
             Print("OrderSend failed with error #",GetLastError());
             return(0);
             }
           }            
           
//----
   return;
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int Tick;
int start()
   {     
    string ThisComment = "Ticknummer: " + Tick + "\nLetztes Hoch = " + High[0];
    ThisComment = ThisComment + "\nLetztes Tief = " + Low[0] + "\nStartpreis = " + startkurs;
    ThisComment = ThisComment + "\nBUYSTOP ist = " + buystop + "\nSELLSTOP ist = " + sellstop;
   
         Tick++;
         Comment(ThisComment);


          //----     
               
          //----   
         return(0);    
   }   


//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
   int deinit()
  {
   //----
   
   //----
   return(0);
  }
Wenn wir step by step weiter machen wäre es bestimmt besser nachvollziehbar.

Ganz einfach, bis dato, beim aktivieren des EAs:

1. Zeichnet er eine Line mit dem Aktuellen Kurs in den Chart
2. Setzt je eine PedingOrder, Sellstop und Buystop
3. Die Comments sind im Chart zu sehen

Nächster Schritt wäre folgender.

Wenn eine der beiden PendingOrders ausgeführt wird. Soll die nicht ausgeführte PendingOrder gelöscht werden und durch eine neue ersetzt werden.

Die neue PendingOrder, soll exakt den gleichen Kurseinstieg haben wie die alte PendingOrder, nur mit einer erhöhten lotsitze. z.B. +0.01 lot
  #10 (permalink)  
Alt 11.04.13
Mitglied
 
Registriert seit: Apr 2011
Ort: Osnabrück
Beiträge: 103
Racki befindet sich auf einem aufstrebenden Ast
Standard

@traderdoc Also perfekt umgesetzt ist es nicht, aber die Methoden lassen sich ja anpassen
Wenn CKAE das allerdings leicht verständlich haben möchte, dann könnte man allerdings auch eine extern double ThisPip = 0.*; je nach Symbol als Parameter verwenden.

Mit der Zeile
PHP-Code:
if (CountLong(Symbol(),MAGIC)+CountShort(Symbol(),MAGIC) > 0ClosePending(Symbol(),MAGIC); 
und den dazugehörigen Funktionen, sollte sich das schließen der offenen Pending nach Eröffnung der anderen Stop-Order jedoch realisieren lassen.

s.l.
Racki
CKAE likes this.
Thema geschlossen

Lesezeichen

Stichworte
ea, erster ea, erster expert advisor, expert advisor, metatrader, mql4, mql4 lernen, programmieren, 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 +1. Es ist jetzt 03:25 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.
-----------------------------------------------------------------------------------------------------------------------------