Bitte um Hilfe!

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

Hallo Community,

Bin neu hier deswegen stell ich mich mal vor.

Christian mein Name bin 24 Jahre alt. Beruf: Industriemechaniker.

Trading Erfahrung seit 5 Monaten. Erfahrung mit Stochastik, Bollinder Bands, MA´s RSI und Fibonacci.  Leider mit dem Beruf sehr wenig zeit zum Traden.

Hier mein anliegen;

Das System soll kaufen oder verkaufen wenn die 9 MA durch die 18 MA nach oben geht kaufen [1x]. Mit TP und SL angesichert.

Anderen falls wenn die 9 MA durch die 18 nach unten geht verkaufen [1x]. Mit TP und SL angesichert.

Nun kauft er sich kaputt. Wie richtet man ein Ticket Limit ein. 

Sorry aber leider wenig mit diesem System beschäftigt und auch keine Zeit mich richtig damit zu befassen.

Danke im Vorraus.

#include<Trade\Trade.mqh>
#include <Object.mqh>


CTrade  trade;





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
        
      (MeinGleitenderdurschnitt2[1]<MeinGleitenderdurschnitt3[1])
     && (MeinGleitenderdurschnitt1[1]<MeinGleitenderdurschnitt3[1])
     ) 
     
        {
          if(!trade.Buy(0.05))
     {
      //--- Fehl Meldung
      Print("Buy() method failed. Return code=",trade.ResultRetcode(),
            ". Code description: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }
        }
       
        
     
   if ( // wenn die 4 und 9 durch 18er nach unten bricht verkaufen
         (MeinGleitenderdurschnitt2[0]>MeinGleitenderdurschnitt3[0])
    &&     (MeinGleitenderdurschnitt1[0]>MeinGleitenderdurschnitt3[0])
         )
     
       {
          if(!trade.Buy(0.05))
     {
      //--- Fehl Meldung
      Print("Buy() method failed. Return code=",trade.ResultRetcode(),
            ". Code description: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }
       } 
Carl Schreiber
Moderator
7432
Carl Schreiber  

Warum selber machen - mit all den Fehlern?

  1. Es gibt zwei oder mehr EA, die als Beispiel dienen können,
  2. Es gibt die CodeBase nit noch VIEL MEHR EAs,
  3. Es gibt hier eine Suchfunktion (die Lupe oben rechts) und es gibt Google, denn
  4. Es gibt fast nichts, was es für MT4/5 nicht gibt!

Also Warum so etwas noch einmal programmieren?

Erst suchen und dann einen bestehenden EA nahmen und etwas abändern, sie schauen fast alle gleich aus:

a) Positionsmanagement (was mache ich mit der offenen Position)

b) Signalmanagement (wann kaufen, verkaufen oder schließen)

Linkin6Ecko
31
Linkin6Ecko  

Dieses Programm hat keine Fehler. So läuft es auf dem Strategietester

Es fehlt diese eine Funktion oder Parameter noch. 

Carl Schreiber
Moderator
7432
Carl Schreiber  
Sorry aber leider wenig mit diesem System beschäftigt und auch keine Zeit mich richtig damit zu befassen.

Du kannst aber nicht erwarten, dass wir für Dich den EA programmieren, weil Du keine Zeit hast?!

Dafür gibt es die Freelancer (ab 30-)

Otto Pauser
1099
Otto Pauser  

@Calli: Ja, da bin ich teilweise bei dir, ABER....... Chistian ist ja noch jung und will was lernen!
           In der Codebase gibt es Beispiele wie Sand am Meer, da sind aber nur wenige Perlen darunter.

@Christian: Der Hauptfehler ist ab der Zeile

if (OrdersTotal()==0)

also wenn keine Position offen ist....

Dieses if bezieht sich nur auf die nächste Anweisung! Da gehört ein geschweiftes Klammernpaar {} über den Code auf den sich das bezieht.
Weiters sollte die Abfrage ob eine neue Kerze entstanden ist eingebaut werden.

Am Code erkenne ich einen YouTuber mit einem MQL5-Tutorial, der immer alles oberhalb der OnTick() Funktion löscht...... Stimmt's? oder hab ich recht?
Auch die Variablennamen sind etwas schräg.

Ich hab da was in der Tischlade (auf der Festplatte) das hänge ich morgen hier dran, mit dem kannst du sicher was anfangen.

LG, Otto

Otto Pauser
1099
Otto Pauser  

Ups, da habt ihr mich 2x überholt !

@Christian: Dieses Programm hat EINIGE Fehler, vor Allem fehlt dem noch unendlich viel um ein vollwertiges Tradingsystem zu werden.

Habe gerade bemerkt, daß in beiden Fällen eine BuyOrder abgesetzt wird. Soweit zu 'Dieses Programm hat keine Fehler'

amando
1105
amando  

Hallo,


endlich mal jemand der proggen lernen will, da helfen die sinnlosen kommentare auch nicht.


so wie ich dich verstehe willst du eine market order absetzen welche dann als position im terminal angezeigt wird.

bevor du die order Bedingungen abfrägst musst du dann aber positiontotal verwenden

eine position ist offener trade

eine order eine pending order welche noch nicht ausgeführt ist


deine bedining muss also sein position total =0 nicht order total


noch ein tipp, wenn du für variablen englische bezeichnungen verwendest wird der code besser lesbar, das deutsche verwende ich persönlich nur für kommentare


lg

amando

Otto Pauser
1099
Otto Pauser  
amando:

Hallo,

endlich mal jemand der proggen lernen will, da helfen die sinnlosen kommentare auch nicht.

so wie ich dich verstehe willst du eine market order absetzen welche dann als position im terminal angezeigt wird.

bevor du die order Bedingungen abfrägst musst du dann aber positiontotal verwenden

eine position ist offener trade

eine order eine pending order welche noch nicht ausgeführt ist

deine bedining muss also sein position total =0 nicht order total

noch ein tipp, wenn du für variablen englische bezeichnungen verwendest wird der code besser lesbar, das deutsche verwende ich persönlich nur für kommentare

lg

amando

Hi amando,

mit den 'sinnlosen Kommentaren' meinst du hoffentlich weder meine, noch die vom Calli. Also welche Kommentare meinst du?

Wie versprochen poste ich hier meine Vorstellung von einem rudimentären EA.

#include <Trade\Trade.mqh>

CTrade   Trade;                                    // Instanz von CTrade definieren

#define  SPACER   "—————————————————————"          // simle definition
#define  PRICE    ENUM_APPLIED_PRICE               // simple abbreviation
#define  METHOD   ENUM_MA_METHOD                   // simple abbreviation

input    string   txt_MA1        = SPACER;         // MA1 Settings
input    int      inp_MA1Period  =  14;            // Period
input    METHOD   inp_MA1Method  = MODE_SMA;       // Method
input    int      inp_MA1Shift   = 0;              // Shift
input    PRICE    inp_MA1Price   = PRICE_WEIGHTED; // Price

input    string   txt_MA2        = SPACER;         // MA2 Settings
input    int      inp_MA2Period  =  50;            // Period
input    METHOD   inp_MA2Method  = MODE_SMA;       // Method
input    int      inp_MA2Shift   = 0;              // Shift
input    PRICE    inp_MA2Price   = PRICE_WEIGHTED; // Price

input    string   txt_MA3        = SPACER;         // MA3 Settings
input    int      inp_MA3Period  = 200;            // Period
input    METHOD   inp_MA3Method  = MODE_SMA;       // Method
input    int      inp_MA3Shift   = 0;              // Shift
input    PRICE    inp_MA3Price   = PRICE_WEIGHTED; // Price

input    string   txt_MA4        = SPACER;         // Other Settings
input    double   inp_Lotsize    = 0.05;           // LotSize

int      haMA1,            // handles für die MAs
         haMA2,
         haMA3;

double   buMA1[],          // buffer für die MAs
         buMA2[],
         buMA3[];

int      copyRates = 3;    // copy rates to buffer

int OnInit()
{
   haMA1=iMA(_Symbol, _Period, inp_MA1Period, inp_MA1Shift, inp_MA1Method, inp_MA1Price);
   if(haMA1==INVALID_HANDLE)
      return(INIT_FAILED);
   
   haMA2=iMA(_Symbol, _Period, inp_MA2Period, inp_MA2Shift, inp_MA2Method, inp_MA2Price);
   if(haMA2==INVALID_HANDLE)
      return(INIT_FAILED);
   
   haMA3=iMA(_Symbol, _Period, inp_MA3Period, inp_MA3Shift, inp_MA3Method, inp_MA3Price);
   if(haMA3==INVALID_HANDLE)
      return(INIT_FAILED);
   
   ArraySetAsSeries(buMA1, true);      // indizierung festlegen (da wird nix sortiert!)
   ArraySetAsSeries(buMA2, true);      // das ist nur 1x notwendig !!!
   ArraySetAsSeries(buMA3, true);
   
   return(INIT_SUCCEEDED);
}

void OnTick()
{

   if(CopyBuffer(haMA1,0,0,copyRates,buMA1)!=copyRates) return;
   if(CopyBuffer(haMA2,0,0,copyRates,buMA2)!=copyRates) return;
   if(CopyBuffer(haMA3,0,0,copyRates,buMA3)!=copyRates) return;

   if(PositionSelect(_Symbol))         // check ob offene position vorhanden
      {                                // position existiert
         switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))
           {
            case  POSITION_TYPE_BUY:
                                       // prüfen auf buy schließen
                                       // und schließen falls erforderlich
               return;                 // break kann durch return ersetzt werden

            case  POSITION_TYPE_SELL:
                                       // prüfen auf sell schließen
                                       // und schließen falls erforderlich
               return;                 // break kann durch return ersetzt werden
           }    
      }
   else
      {                                // keine position offen
         if(Condition_Buy())           // prüfen auf buy und kaufen, falls bedingungen zutreffen
            return;

         if(Condition_Sell())          // prüfen auf sell und verkaufen, falls bedingungen zutreffen
            return;
      }
}

bool Condition_Buy()
{
                                       // hier prüfen auf kaufen und return(true) falls gekauft wurde.
   return(false);                      // kaufbedingung war nicht zutreffend
}

bool Condition_Sell()
{
                                       // hier prüfen auf verkaufen und return(true) falls verkauft wurde.
   return(false);                      // verkaufsbedingung war nicht zutreffend
}

Die Erzeugung der Handles ist in der OnInit() bestens aufgehoben, ebenso das ArraySetAsSeries().
Das in die OnTick() reinzunehmen ist gleichbedeutend wie Autofahren mit angezogener Handbremse. (Aber der Raimund Bauer versteht das nicht).
Ein weiterer Hinweis: die Handles sollten auf Gültigkeit überprüft werden. Besonders bei der Verwendung von iCustom() !!!

Zur Abfrage einer offenen Position verwende ich nicht PositionsTotal() sondern PositionSelect(). Begründung siehe Reference zu PositionsSelect().

Function PositionSelect() copies data about a position into the program environment, and further calls of PositionGetDouble(), PositionGetInteger() and PositionGetString() return the earlier copied data.
This means that the position itself may no longer exist (or its volume, direction, etc. has changed), but data of this position still can be obtained.
To ensure receipt of fresh data about a position, it is recommended to call PositionSelect() right before referring to them.

MfG, Otto

PS: Die Parameter als Input anzugeben ist wegen der allgemeinen Verwendung und der Optimierung im Tester sinnvoll.
Die Vorgabewerte 14/50/200 sind aus der Literaur entnommen. (Dein Tradingplan, Holger Schack)

Otto Pauser
1099
Otto Pauser  

https://www.mql5.com/de/forum/233899

Linkin6Ecko Schurke: Bitte keine mehrfachposts zu gleichem Thema!

Hilfe um die Fehlenden Parameter zu finden
Hilfe um die Fehlenden Parameter zu finden
  • 2018.03.31
  • www.mql5.com
Hallo bin ziemlich neu hier. Daher meine Frage. Was fehlen hier für Parameter zum ausführen der Handelsoptionen...
amando
1105
amando  

Seh ich das richtig, das du überprüfst ob du eine offene position hast, die schliesst du dann und wenn keine offene position da ist eröffnest du eine?

das ist ein perpetum mobile der Selbstzerstörung 


Du musst dir auch klar werden ob du im hedging mode proggst oder im netting mode. Da sind noch welten dazwischen. 


Ich hab mir angewöhnt alles für den hedge zu schreiben, das funkt im netting auch.

position select im hedge funktioniert so nicht, so wie du fas schreibst funkt das nur im netting, da es im netting nur eine position gibt.


im hedge must du die position auch noch selektieren

Linkin6Ecko
31
Linkin6Ecko  
Ich bedanke mich für diese Tipps. 
Sehr nett. Ich würde mich gerne mit dem beschäftigen aber momentan Meister neben der normalen Arbeit... 
Soviel zu dem Carl. Ich erwarte nichts und irgendwo wirst du dir auch die einen oder andere Information eingeholt haben. 
Otto vielen Dank für dein Beispiel und Beschreibung. 


12
Einloggen oder registrieren, um einen Kommentar zu schreiben