Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Hilfe bei Programmierung

Geschrieben

MQL Anfänger hat eine Bitte an euch,ich habe versucht ein für euch leichten E/A zu schreiben.

Der E/A besteht aus drei MA.

Die 1 Funktion Long

sollte wenn der kurzfristiger gl.D.(ma1)über dem mittelfristigen(ma2),und der mittefristige über dem langfristigen (ma3)ist,Long gehen also Buy. und den Trade schließen wenn (ma1) unter (ma2) fällt.

 

Die 2 Funktion Short

wenn der kurzfristiger (ma1)unter dem mittelfristigen(ma2),und der mittelfristige

unter dem langfristigen(ma3) ist, Short gehen also Sell.

und den Trade schließen wenn (ma1)über den (ma2) steigt.

 

So die Beschreibung,

der Editor meldet keine Fehler,aber das hat ja für die Funktionen keine

Bedeutung.

Im Long bereicht kauft er und verkauft auch.das wars aber schon,

Ich muß in der Logik,oder im Programmcode fehler haben,

kann einer von euch mir weiterhelfen.das der E/A Funktioniert.?

Bis bald

karlos10

 

-------------------------------------------------------------------------------------

extern int Profit= 80;
extern int Stopp = 25;
extern int MagicNumber = 700;
extern int ima1 = 5;
extern int ima2 = 35;
extern double lot = 0.1;
extern int Slippage = 2;


int CalcCurOrd(string symbol)
 {
  int buys=0,sells=0;

  for(int i=0;i<OrdersTotal();i++)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
       {
        if(OrderType()==OP_BUY) buys++;
        if(OrderType()==OP_SELL) sells++;
       }
    }

  if(buys>0) return(buys);
  else       return(-sells);
 }


bool Funktion_1_Long()    
 {
  double ma1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,0);
  double ma2 = iMA(NULL,0,40,0,MODE_SMA,PRICE_CLOSE,0);
  double ma3 = iMA(NULL,0,200,0,MODE_SMA,PRICE_CLOSE,0);
  
  if (ma1>ma2 && ma2 > ma3)   // kurzfristiger gl.D. liegt über dem mittelfristigen
                            // und der mittefristige über dem langfristigen
  
  return(true); else return(false);
  }
 
   
bool Funktion_2_Short()    
 {
  double ma1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,0);
  double ma2 = iMA(NULL,0,40,0,MODE_SMA,PRICE_CLOSE,0);
  double ma3 = iMA(NULL,0,200,0,MODE_SMA,PRICE_CLOSE,0);
  
  if (ma1<ma2 && ma2<ma3)   // kurzfristiger gl.D. liegt unter dem mittelfristigen
                            // und der mittefristige unter dem langfristigen
  
  return(true); else return(false);
   
 
 }

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() 
 {
  int res;
  
     if(Funktion_1_Long())
    
        {
         res=OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,
                       0,0,"long",MagicNumber,0,White);
        }
 //----OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,
 //                   0,0,"long",MagicNumber,0,White);
 //                   prevtime = Time[0]; return;

    if(Funktion_2_Short())
    
     
        {
         res=OrderSend(Symbol(),OP_SELL,lot,Bid,Slippage,
                       0,0,"short",MagicNumber,0,Red);
        }
       
  }
  
// Check for close order conditions

void CheckForClose()
 {    
  for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;
      if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;     
      
      // Check order type
            
      if(OrderType()==OP_BUY)
        {      
         if (Bid>(OrderOpenPrice()+Profit*Point)) 
           {
            OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Green);
            return(0);
           }
        }
        
         
      if(OrderType()==OP_SELL)
        {    
         if (Ask<(OrderOpenPrice()-Profit*Point))
           {
            OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
            return(0);
           }
        }
                
     }
  return(0);
 }
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
 {
   
  if(CalcCurOrd(Symbol())==0) CheckForOpen();
  if(CalcCurOrd(Symbol())!=0) CheckForClose();

 }
//+------------------------------------------------------------------+

karlosMA.mq4

Bearbeitet von whipsaw
mql tag hinzugefügt

  • Antworten 98
  • Aufrufe 10,8Tsd
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Most Popular Posts

  • Das Selbe macht Ehlers auch mit US Treasury Bond Futures. Die Zeitachse wird in Sektoren von z.B. 10 Bars eingeteilt und es wird für jeden Bar geschaut, wo - bezogen auf das Hoch und das Tief innerha

Veröffentlichte Bilder

Featured Replies

Geschrieben
Hallo,was meinst du mit " Das System ncht auf Close-Basis arbeitet"?

 

Das gleiche wie der Unterschied zwischen den beiden Varianten aus meinem Post.

 

Variante1: nicht auf Close-Basis: Der EA rechnet alle Schritte zu jedem Tick (also auch mitten in den Bars) so als wäre der Bar gerade zu ende (was er aber nicht ist).

 

Variante 2: auf Close-Basis: Der EA rechnet nur am Ende jedes Bars. Dadurch rechnet der EA nur mit Werten die sich nicht mehr ändern und somit auch hinterher im Chart in der Form sichtbar sind.

 

Wenn man ein System entwickelt indem man auf den fertigen Chart mit den Indikatoren schaut, dann entwickelt man es im Prinzip auf Close-Basis (da man für die Analyse die Indikatorwerte verwendet die jeweils beim Close des Bars berechnet wurden).

Deswegen macht es hier auch Sinn auf Close-Basis zu programmieren (also nur nach dem Close eines Bars eine Tradingaktion zu setzen).

 

Hoffe ich hab das jetzt halbwegs verständlich ausgedrückt. Wenn nicht bitte nochmal nachfragen, ich tu mir grad schwer das zu formulieren...

 

Nochmal sicherheitshalber: du bekommst ein gutes Bild davon, wenn du den Strategietester im visuellen Modus laufen lässt und dabei einen GD auf den Chart ziehst. bei jedem neuen Tick ändert sich der aktuelle Wert des Indikators. Verarbeitet man alle diese Werte anstatt nur den finalen Wert pro Bar zu betrachten, dann arbeitet man nicht auf Close Basis.

Geschrieben
  • Autor
Nochmal langsam:

 

Was der EA gerade tut (nur für den Long Fall):

1. Bei jedem Tick werden die aktuellen GDs berechnet (die sich auch bei jedem Tick ändern), zusätzlich werden die GDs auf Basis des letzten bereits fertigen Bars (also Close[1]) berechnet (diese ändern sich nicht mehr).

2. Es wird verglichen: "Gilt für die aktuellen GDs schneller > mittlerer > langsamer" und "Gilt für die "alten" GDs schneller < mittlerer". Wenn ja wird Position eröffnet.

 

 

Eine Kreuzung liegt vor, wenn für den vorigen Bar gilt "schneller < mittlerer" und für den aktuellen Bar gilt "schnell > mittlerer".

 

Es gäbe 2 Varianten: Betrachtet man die GDs immer nur am Ende eines Bars (also nur die endgültigen Werte die sich nicht mehr ändern) oder betrachtet man sie auch mittendrin.

 

Du hast geschrieben das du die "auch mittendrin" Variante betrachten willst und genau das tut der EA.

 

Also entweder du hast den Code inzwischen verändert, oder du willst das der EA was anderes tut als du hier geschrieben hast, weil die Einstiege vom EA tun gerade genau das was du hier an Anforderung geschrieben hast.

Hallo es ist manchmal schwer das was mann denkt zu schreiben,ich wollte das " sofort " nach der kreuzung

also bevor sich die erste Kerze ausbildet die Order gemacht wird,also beim starten der Kerze,oder besser gesagt vor dem starten der ersten Kerze.Hmmmm

Ich habe beim dem Standar Moving Average den Befehl " Volume [0]> 1" gesehen,wäre das vielleicht der bessere Weg,mit einer anderen Funktion.??

Geschrieben

Hallo karlos,

jetzt wissen wir, wie du es dir vorgestellt hast.

Also die Berechnung soll in deinem Fall zu Eröffnung jedes neuen Bars erfolgen - sprich nur zu den Schlusskursen

der vorigen Bars, dadurch entfällt die permanante Berechnung auf dem aktuellen Bar

und die visuelle Seiteneffekte durch die "falsche" Signaltriggerung werden vermieden.

 

Um diesen Effekt ohne Umprogrammierung im Strategietester zu erreichen, reicht es lediglich TestingMode auf only_open_prices einzustellen.

Geschrieben
Ich habe beim dem Standar Moving Average den Befehl " Volume [0]> 1" gesehen,wäre das vielleicht der bessere Weg,mit einer anderen Funktion.??

 

entweder damit oder sicherer ist es die Eröffnungszeit des letzten Bars zu überwachen.

ich schreibe deinen EA etwas um, damit du die Verwendung der Funktion sehen kannst

Geschrieben
  • Autor
entweder damit oder sicherer ist es die Eröffnungszeit des letzten Bars zu überwachen.

ich schreibe deinen EA etwas um, damit du die Verwendung der Funktion sehen kannst

 

Hallo titanfx

das würde mir bestimmt weiterhelfen,

wenn du dir die Arbeit machsd,danke ich dir.

Geschrieben
Hallo es ist manchmal schwer das was mann denkt zu schreiben,ich wollte das " sofort " nach der kreuzung

also bevor sich die erste Kerze ausbildet die Order gemacht wird,also beim starten der Kerze,oder besser gesagt vor dem starten der ersten Kerze.Hmmmm

 

ok, also auf Close Basis. "Direkt am Close" kann man ja leider nicht arbeiten, da man nie weiß wann genau der letzte tick war. Man weiß es erst, wenn man den ersten Tick des neuen Bars hat.

 

Ich habe beim dem Standar Moving Average den Befehl " Volume [0]> 1" gesehen,wäre das vielleicht der bessere Weg,mit einer anderen Funktion.??

Ist eine Möglichkeit, aber wie titan schon sagte nicht die "sicherste". Schöner ist die von ihm vorgeschlagene Zeitvariante.

 

zB (damit wir auch Codeschnippsel im Thread haben und andere Leser nicht den EA vergleichen müssen):


start()
{
 static datetime last_bar= 0;
 
 if(last_bar == Time[0])
   return 0; // kein neuer Bar
 else
   last_bar= Time[0];

 //bisheriger Code wie gehabt
}

 

"static" sorgt dafür das der Wert von last_bar zwischen den Aufrufen von start() nicht vergessen wird. Der restliche Code von start() wird jetzt nur ausgeführt, wenn die Zeit des aktuellen Bars von der gespeicherten abweicht, also wenn seit dem letzten Tick ein neuer Bar gestartet wurde.

 

Was noch zu ändern ist:

Da du jetzt ja die GDs etc vom letzten Bar berechnest, musst du im Aufruf den Shift um eines erhöhen:

double ma1   = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,1);
double ma2   = iMA(NULL,0,40,0,MODE_SMA,PRICE_CLOSE,1);
double ma1_1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,2);
double ma2_1 = iMA(NULL,0,40,0,MODE_SMA,PRICE_CLOSE,2);
double ma3   = iMA(NULL,0,200,0,MODE_SMA,PRICE_CLOSE,1);

 

ansonsten sollte alles direkt funktionieren. falls was unklar ist oder bei weiteren Problemen, einfach fragen ;)

Geschrieben

@ karlos10

 

EA habe ich also radikal umgeschrieben, vereinfacht und korriegiert,

die Signaldefinitionen habe ich aus deinem ersten Post übernommen.

EA ist jetzt somit modular aufgebaut und kann jetzt auch als Schablone für die

andere Strategien verwendet werden, es muss eigentlich nur eine Funktion, die für die Signaldefinition zuständig ist modifiziert werden. Dadurch werden auch die Berechnungen schneller, da der EA jetzt pro Zyklus nur einmal

die Indikatoren und andere notwendige Daten aufbereitet.

 

Jetzt also zum EA,

die MA-einstellungen habe ich global ausgeführt, damit die auch optimiert werden können,

Stoploss und TakeProfit Platzierung verändert (korriegiert, verbessert)

als zusätzliche Parameter habe ich noch 2 weitere Parameter eingefügt

karlos.png

 

TradeOnlyNewBar - lässt den EA nur zur Eröffnung des neuen Bars ( also zu den Schlusskursen ) handeln

SignalShift - Verzögerung des Signals in Bars,

bei 0 - wird Signal auf dem aktuellen Bar angewendet, was natürlich nicht ganz korrekt ist, da der Bar und somit die MA-Berechnung noch nicht abgeschlossen ist. Das wird aber trotzdem bei vielen bevorzugt, da man die übliche Verzögerung nicht abwarten möchte

bei 1 - erfolgt die Berechnung ausschliesslich auf schon komplett abgeschlossenen Bars, diese Einstellung ist absolut technisch korrekt, bereitet aber vielen Tradern Kopfschmezen, da man in dem Fall "zu spät" in den Markt reinkommt

karlosMA.mq4

Geschrieben
  • Autor
EA habe ich also radikal umgeschrieben, vereinfacht und korriegiert,

Hallo titanfx,erst noch mal danke für die mühe die du dir gemacht hast,ich bin gerade mal am testen.

es kommt immer diese Fehlermeldung.??

post-780-1258738335_thumb.jpg

Bearbeitet von ronner
Zitat gekürzt

Geschrieben
  • Autor
Hallo titanfx,erst noch mal danke für die mühe die du dir gemacht hast,ich bin gerade mal am testen.

es kommt immer diese Fehlermeldung.??

Was ist das für ein Fehlern 4107

Geschrieben
Was ist das für ein Fehlern 4107

 

Siehe MQL_Docu:

ERR_INVALID_PRICE_PARAM 4107 Invalid price.

 

Bedeutet das der an die OrderSend übergebene Preis nicht den "Wünschen" entspricht, vermutlich fehlt ein NormalizeDouble(). (Müsste mir den Code anschauen, moment )

 

Edit: hmm also an dem Code von titan seh ich jetzt keinen Fehler... Könntest du mal bitte in der Funktion "open_order" direkt vor der Zeile "OrderSend..." folgende Zeile einfügen:

Print("Trying to send order ",cmd," at:",price," current quote:",Bid,"/",Ask);

 

Das könnte Aufschluss geben.

Geschrieben
Was ist das für ein Fehlern 4107

 

Wie schon Mythos sagte, der Fehler wird von einem fehlerhaften Preis in OrderSend-Funktion verursacht

Wie es aussieht liegt das Problem in deinen historischen Daten:

- dein Broker verwendet die 4-stellige Quottierung nach der Komma

- in der OrderSend taucht eine 5-stellige Quottierung auf

Ich kann nur daraf schliessen, dass historische Daten gemischt sind und es wird logischerweise der obengenannte Fehler verursacht.

Du hast vermutlich die History von History-Center heruntergeladen und automatisch die Daten von Alpari bekommen, die 5-stellig quotieren.

 

Also als Tip: alle Daten löschen und nur die von deinem Broker herunterladen, in dem du im aktiven Chart zurückscrollst

Geschrieben

@karlos,

 

Ich würde Dich bitten, die Zitate auf das wesentliche zu beschränken. Du zitierst immer den kompletten Text des Vorposters, das ist unnötig. Entferne einfach den Text zwischen den Klammern soweit, bis nur noch das dasteht was Du beantworten möchtest.

Geschrieben

Hallo karlos10

Der Verdacht hat sich also bestätigt.

Der Fehler konnte ich nachtsellen und es liegt tatsächlich an den historischen Daten, die im Strategie gemischt sind.

Also alles löschen und die Daten nur von dem Broker verwenden

Geschrieben

... oder man trickst den StrategieTester so aus, dass der gar nichts mitkriegt :empathy2:

hier ist also die Korrektur, die du auch auf gemischten Daten anwenden kannst

karlosMA.mq4

Geschrieben
  • Autor

meine Daten sind nur von SigTrader 4

 

Hmm wenn ich das richtig sehe,wird wieder am ende der ersten Kerze gekauft.?oder

1 Bild SignalShift 1

2 Bild SignalShift 0 geht nicht ist wohl zu groß??

die Fehlermeldung ist auf jedenfall weg.

post-780-1258818388_thumb.jpg

Geschrieben
  • Autor

ja klar Fehler können jedem passieren,ich habe aber noch mal kontrolliert.

die Datei (Bild jpg)soll zu groß sein? 203 Kb.??

wie kann ich das Bild hochladen?

Geschrieben
  • Autor

Ich versuchs nochmal,geht nicht

Meldung??

Speicher für Anhänge: 534.33KB von 500KB

Hochladen fehlgeschlagen. Die Datei war größer als der verfügbare Speicherplatz

 

 

jetzt hab ich das Bild mit Paint auf 160 KB verkleinert,geht auch nicht ?

wie macht Ihr das?

Geschrieben
jetzt hab ich das Bild mit Paint auf 160 KB verkleinert,geht auch nicht ?

wie macht Ihr das?

 

 

Muss ich mal schauen, was da los ist. Scheint ein Fehler zu sein.

Wenn ich das nicht hinbekomme, müssen wir auf Eve warten.

 

Alternativ kannst Du Dir auch ein Album anlegen und die Bilder verlinken.

Geschrieben
  • Autor

ich hab da mal eine andere Frage,in der Verwaltung oder Profil

hier,steht * Zusatzpaket erwerben * was ist das ?

Geschrieben

Du kannst auch per Imageshack Bilder hochladen (schräg links unter dem normalen Bildupload). Die einzige Einschränkung ist dann, das die Bilder nicht auf unserem Server sind, sondern bei Imageshack.

 

hier,steht * Zusatzpaket erwerben * was ist das ?

 

das ist, falls man im Board irgendwann mal etwas kostenpflichtiges anbieten würde wollen. Aktuell ist da aber nichts verfügbar bei uns.

Geschrieben
...

Hmm wenn ich das richtig sehe,wird wieder am ende der ersten Kerze gekauft.?oder

1 Bild SignalShift 1

2 Bild SignalShift 0 geht nicht ist wohl zu groß??

die Fehlermeldung ist auf jedenfall weg.

 

Mir ist nicht klar, ob das der letzte Stand ist ... hast du deinen EA mal im Strategytester langsam ablaufen lassen? Da könnte man mit beliebigem Tempo das Arbeiten des EAs sehen und du würdest sofort erkennen, ob das von dir gewünschte Szenario abgearbeitet wird oder nicht. Am besten das test-template mit den gewünschten EMAs ausstatten.

Geschrieben
  • Autor

Ja Okay das werde ich machen.

Hier steht schon wieder

 

Wähle eine Datei

Speicher für Anhänge: 534.33KB von 500KB

 

was bedeutet das?

Geschrieben
...

Wähle eine Datei

Speicher für Anhänge: 534.33KB von 500KB

 

was bedeutet das?

Dass diese Datei oder diese Dateien 534,33kB groß sind von erlaubten 500, ergo zu groß :empathy2:

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.