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)
-   -   erster EA (http://www.expert-advisor.com/forum/showthread.php?t=2823)

CKAE 04.04.13 20:10

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

Racki 05.04.13 02:25

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

JoeDormann 05.04.13 09:22

Zitat:

Zitat von Racki (Beitrag 20245)
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

CKAE 10.04.13 21:02

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


Racki 10.04.13 23:18

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



CKAE 11.04.13 08:59

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

Racki 11.04.13 12:07

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.

traderdoc 11.04.13 12:39

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

CKAE 11.04.13 20:03

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

Racki 11.04.13 23:03

@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


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:58 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