MetaTrader 5 herunterladen

Hilfe um die Fehlenden Parameter zu finden

Einloggen oder registrieren, um einen Kommentar zu schreiben
Linkin6Ecko
32
Linkin6Ecko  

Hallo bin ziemlich neu hier. 

Daher meine Frage. Was fehlen hier für Parameter zum ausführen der Handelsoptionen. 




bool  OrderCheck( 

   MqlTradeRequest&       request,      // Struktur der Anforderung  

   MqlTradeCheckResult&   result        // Struktur der Antwort 

   );

  

   input double  LossMM=0.1;   // Losses from the balance when Stop Loss is triggered

input uint DEVIATION=10;    // Price deviation

input uint STOPLOSS=300;    // Stop Loss in points from the current price

input uint TAKEPROFIT=800;  // Take Profit in points from the current price

input uint RTOTAL=4;        // Number of retries when the deals are failed

input uint SLEEPTIME=1; 

   

  

    


void OnTick()

  {

  //Erstelle jeweils ein Array für Preisdaten 

   double MeinGleitenderdurschnitt1[],MeinGleitenderdurschnitt2[],MeinGleitenderdurschnitt3[];

   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   double Balance=AccountInfoDouble(ACCOUNT_BALANCE);

   double Equity=AccountInfoDouble(ACCOUNT_EQUITY);

    

   // Definiere Eigenschaften für Meine Gleitendendurschnitte

   int GleitenderDurschnittDefinition1 = iMA (_Symbol,_Period,4,0,MODE_SMA,PRICE_CLOSE);

   int GleitenderDurschnittDefinition2 = iMA (_Symbol,_Period,9,0,MODE_SMA,PRICE_CLOSE);

   int GleitenderDurschnittDefinition3 = iMA (_Symbol,_Period,18,0,MODE_SMA,PRICE_CLOSE); 

   // Sotiert die Preisdaten für 3 Durschnitte absteigen!!

   ArraySetAsSeries(MeinGleitenderdurschnitt1,true);

   ArraySetAsSeries(MeinGleitenderdurschnitt2,true);

   ArraySetAsSeries(MeinGleitenderdurschnitt3,true);

   // Definition1,2 und 3, Eine Linie, aktuell 3 Kerzen, Resultat speichern

   CopyBuffer(GleitenderDurschnittDefinition1,0,0,3,MeinGleitenderdurschnitt1);

   CopyBuffer(GleitenderDurschnittDefinition2,0,0,3,MeinGleitenderdurschnitt2);

   CopyBuffer(GleitenderDurschnittDefinition3,0,0,3,MeinGleitenderdurschnitt3);

   

   //wenn keine offenen Positionen existieren

   if (OrdersTotal()==0)

   

  

    

    

    

   if ( // wenn die 4 und 9 durch 18er nach oben bricht dann kaufen

        (MeinGleitenderdurschnitt1[0]>MeinGleitenderdurschnitt3[0])

     && (MeinGleitenderdurschnitt2[1]>MeinGleitenderdurschnitt3[1])

     )

        {

         trade.Sell(0.01,NULL,Ask,40,(Ask-40 * _Point),NULL);

        }

       

        

     

   if ( // wenn die 4 und 9 durch 18er nach unten bricht verkaufen

        (MeinGleitenderdurschnitt1[0]<MeinGleitenderdurschnitt3[0])

     && (MeinGleitenderdurschnitt2[1]<MeinGleitenderdurschnitt3[1])

     )

       {

         trade.Buy(0.01,NULL,Ask,40,(Ask-40 * _Point),NULL);

       }  

           

}



Dazu der Fehlercode:    'trade' - undeclared identifier MA Chris.mq5 50 10

                                      'trade' - undeclared identifier MA Chris.mq5 60 10

Christian
2123
Christian  

Nutze bitte den Code Button beim Einfügen von Code.


bitte nochmal das ganze

Linkin6Ecko
32
Linkin6Ecko  
bool  OrderCheck( 

   MqlTradeRequest&       request,      // Struktur der Anforderung  

   MqlTradeCheckResult&   result        // Struktur der Antwort 

   );

  

   input double  LossMM=0.1;   // Losses from the balance when Stop Loss is triggered

input uint DEVIATION=10;    // Price deviation

input uint STOPLOSS=300;    // Stop Loss in points from the current price

input uint TAKEPROFIT=800;  // Take Profit in points from the current price

input uint RTOTAL=4;        // Number of retries when the deals are failed

input uint SLEEPTIME=1; 

   

  

    



void OnTick()

  {

  //Erstelle jeweils ein Array für Preisdaten 

   double MeinGleitenderdurschnitt1[],MeinGleitenderdurschnitt2[],MeinGleitenderdurschnitt3[];

   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   double Balance=AccountInfoDouble(ACCOUNT_BALANCE);

   double Equity=AccountInfoDouble(ACCOUNT_EQUITY);

    

   // Definiere Eigenschaften für Meine Gleitendendurschnitte

   int GleitenderDurschnittDefinition1 = iMA (_Symbol,_Period,4,0,MODE_SMA,PRICE_CLOSE);

   int GleitenderDurschnittDefinition2 = iMA (_Symbol,_Period,9,0,MODE_SMA,PRICE_CLOSE);

   int GleitenderDurschnittDefinition3 = iMA (_Symbol,_Period,18,0,MODE_SMA,PRICE_CLOSE); 

   // Sotiert die Preisdaten für 3 Durschnitte absteigen!!

   ArraySetAsSeries(MeinGleitenderdurschnitt1,true);

   ArraySetAsSeries(MeinGleitenderdurschnitt2,true);

   ArraySetAsSeries(MeinGleitenderdurschnitt3,true);

   // Definition1,2 und 3, Eine Linie, aktuell 3 Kerzen, Resultat speichern

   CopyBuffer(GleitenderDurschnittDefinition1,0,0,3,MeinGleitenderdurschnitt1);

   CopyBuffer(GleitenderDurschnittDefinition2,0,0,3,MeinGleitenderdurschnitt2);

   CopyBuffer(GleitenderDurschnittDefinition3,0,0,3,MeinGleitenderdurschnitt3);

   

   //wenn keine offenen Positionen existieren

   if (OrdersTotal()==0)

   

  

    

    

    

   if ( // wenn die 4 und 9 durch 18er nach oben bricht dann kaufen

        (MeinGleitenderdurschnitt1[0]>MeinGleitenderdurschnitt3[0])

     && (MeinGleitenderdurschnitt2[1]>MeinGleitenderdurschnitt3[1])

     )

        {

         trade.Sell(0.01,NULL,Ask,40,(Ask-40 * _Point),NULL);

        }

       

        

     

   if ( // wenn die 4 und 9 durch 18er nach unten bricht verkaufen

        (MeinGleitenderdurschnitt1[0]<MeinGleitenderdurschnitt3[0])

     && (MeinGleitenderdurschnitt2[1]<MeinGleitenderdurschnitt3[1])

     )

       {

         trade.Buy(0.01,NULL,Ask,40,(Ask-40 * _Point),NULL);

       }  

           

}





Dazu der Fehlercode:    'trade' - undeclared identifier MA Chris.mq5    50      10

                                      'trade' - undeclared identifier   MA Chris.mq5    60      10
Christian
2123
Christian  
CTrade - die geeignete Klasse für Handelsoperationen

Der Handel erfolgt in MQL5 lediglich durch zwei Funktionen, OrderSend() und OrderSendAsync(). Eigentlich handelt es sich dabei jedoch nur um zwei unterschiedliche Umsetzungen einer einzigen Funktion. Während OrderSend() eine Handelsanfrage abschickt und auf das Ergebnis von deren Erfüllung wartet, schickt die asynchrone Funktion OrderSendAsync() die Anfrage einfach ab und gestattet dem Programm weiterzuarbeiten, ohne auf eine Antwort des Handelsservers zu warten. Es ist also wirklich einfach, in MQL5 zu handeln, da eine Funktion für alle Handelsoperationen reicht.

Worin besteht dann die Herausforderung? Beide Funktionen erhalten als ersten Parameter das Gerüst MqlTradeRequest mit über zehn Feldern. Dabei müssen nicht unbedingt alle Felder gefüllt werden. Die Auswahl der erforderlichen Felder hängt von der Art der Handelsoperation ab. Die Angabe eines falschen Wertes oder ein freigelassenes Pflichtfeld führt zu einem Fehler, und die Anfrage wird schlicht nicht an den Server verschickt. 5 dieser Felder erfordern die Angabe korrekter Werte aus vorgegebenen Aufzählungen.

Diese große Zahl Felder ist durch die Notwendigkeit bedingt, in einer Handelsanfrage zahlreiche Eigenschaften des Auftrags anzugeben. Diese können wiederum je nach Ausführungsweise, Ablaufzeit und anderen Parametern variieren. Aber Sie müssen all diese Feinheiten nicht unbedingt lernen. Verwenden Sie einfach die vorgefertigte Klasse CTrade. In etwa folgendermaßen kann ihre Anwendung in Ihrem automatischen Handelssystem aussehen:

#include<Trade\Trade.mqh>
//--- object for performing trade operations
CTrade  trade;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- set MagicNumber for your orders identification
   int MagicNumber=123456;
   trade.SetExpertMagicNumber(MagicNumber);
//--- set available slippage in points when buying/selling
   int deviation=10;
   trade.SetDeviationInPoints(deviation);
//--- order filling mode, the mode allowed by the server should be used
   trade.SetTypeFilling(ORDER_FILLING_RETURN);
//--- logging mode: it would be better not to declare this method at all, the class will set the best mode on its own
   trade.LogLevel(1); 
//--- what function is to be used for trading: true - OrderSendAsync(), false - OrderSend()
   trade.SetAsyncMode(true);
//---
   return(0);
  }

Jetzt ist der richtige Zeitpunkt, um zu sehen, wie CTrade Handelsoperationen unterstützt.

Kauf/Verkauf zum aktuellen Kurs

Häufig muss der Kauf oder Verkauf zum aktuellen Kurs in Handelsstrategien umgehend abgeschlossen werden. CTrade ist damit vertraut und fragt lediglich nach dem erforderlichen Umfang der Handelsoperation. Alle übrigen Parameter (der Eröffnungskurs, die Bezeichnung des Kürzels, die Stop Loss- und Take Profit-Grenzen sowie die Kommentare zu dem Auftrag) können weggelassen werden.

//--- 1. example of buying at the current symbol
   if(!trade.Buy(0.1))
     {
      //--- failure message
      Print("Buy() method failed. Return code=",trade.ResultRetcode(),
            ". Code description: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

Als Voreinstellung verwendet CTrade die Bezeichnung des Kürzels, in dessen Diagramm sie aufgerufen wird, sofern keine andere Kürzelbezeichnung angegeben ist. Das ist bei einfachen Strategien recht angenehm. Bei Strategien mit mehreren Währungen muss das jeweilige Kürzel, für das die Handelsoperation ausgeführt werden soll, jedes Mal ganz genau angegeben werden.

//--- 2. example of buying at the specified symbol
   if(!trade.Buy(0.1,"GBPUSD"))
     {
      //--- failure message
      Print("Buy() method failed. Return code=",trade.ResultRetcode(),
            ". Code description: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }

Es können alle Auftragsparameter angegeben werden: Die Stop Loss-/Take Profit-Grenze, der Eröffnungskurs und die Kommentare.

//--- 3. example of buying at the specified symbol with specified SL and TP
   double volume=0.1;         // specify a trade operation volume
   string symbol="GBPUSD";    //specify the symbol, for which the operation is performed
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // point
   double bid=SymbolInfoDouble(symbol,SYMBOL_BID);             // current price for closing LONG
   double SL=bid-1000*point;                                   // unnormalized SL value
   SL=NormalizeDouble(SL,digits);                              // normalizing Stop Loss
   double TP=bid+1000*point;                                   // unnormalized TP value
   TP=NormalizeDouble(TP,digits);                              // normalizing Take Profit
//--- receive the current open price for LONG positions
   double open_price=SymbolInfoDouble(symbol,SYMBOL_ASK);
   string comment=StringFormat("Buy %s %G lots at %s, SL=%s TP=%s",
                               symbol,volume,
                               DoubleToString(open_price,digits),
                               DoubleToString(SL,digits),
                               DoubleToString(TP,digits));
   if(!trade.Buy(volume,symbol,open_price,SL,TP,comment))
     {
      //--- failure message
      Print("Buy() method failed. Return code=",trade.ResultRetcode(),
            ". Code description: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }


Schau dir den Text und den Code dazu an.

Dann siehst du was dir fehlt.

Gruß

Otto Pauser
1332
Otto Pauser  

Ui, der Code sieht sehr nach Raimund Bauer (YT) aus.

Der löscht immer alles oberhalb der OnTick() Funktion, weil er damit anscheinend nix anfangen kann.

Ein Handle zu einem Indikator zu erstellen ist aber ein relativ langsamer Vorgang und gehört deshalb in die OnInit() Funktion.

Es ändert sich ja auch weiter nichts an dieser Definition. Also bitte NICHT in die OnTick().

Christian hat dir da guten Quelltext gepostet. Die System-Library zu verwenden erspart viel Arbeit.

Grüße, Otto

Linkin6Ecko
32
Linkin6Ecko  

Vielen dank für eure Hilfe. 

Ja dieser Code kommt von YT auch von Raimund Bauer.

Jetzt fehlt nur das er nur einmal Tradet pro Signal und nicht wie jetzt 6000 Tickets eröffnet. 

Einloggen oder registrieren, um einen Kommentar zu schreiben