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)
-   -   Signal-Logik gibt nur Short auch bei Long (http://www.expert-advisor.com/forum/showthread.php?t=4494)

skynat 01.10.15 09:07

Signal-Logik gibt nur Short auch bei Long
 
Guten Morgen,

langsam komme ich mir blöd vor...
Ich habe einen EA auf Basis von drei EMAs geschrieben...nun habe ich das Problem (nebst vielen Anderen) dass er NUR Shortsignale umsetzt...leider aber auch wenn es eigentlich Long sein sollte...Ich vermute den Fehler in der Logik aber finde ihn ums verrecken nicht...

Code:

//+------------------------------------------------------------------+
//|                    Handelssignale generieren                    |
//|                                                                  |
//+------------------------------------------------------------------+
   
   
    if(NeuePeriodeBegonnen==true)
      {
          //LongSignal
          if(Close[1]>EMA1_15min>EMA2_15min>EMA3_15min>EMA4_15min)
            {
              if(Close[1]>EMA1_1h>EMA2_1h>EMA3_1h>EMA4_1h)
                  {
                    if(Close[1]>EMA1_4h>EMA2_4h>EMA3_4h>EMA4_4h)
                        {
                          Longsignal = true;
                          Print ("Long");
                        }
                  }
                 
            }
          else Longsignal = false;
         
          //ShortSignal
          if(Close[1]<EMA1_15min<EMA2_15min<EMA3_15min<EMA4_15min)
            {
              if(Close[1]<EMA1_1h<EMA2_1h<EMA3_1h<EMA4_1h)
                  {
                    if(Close[1]<EMA1_4h<EMA2_4h<EMA3_4h<EMA4_4h)
                        {
                          Shortsignal = true;
                          Print ("Short");
                        }
                       
                  }
                 
            }
         
          else Shortsignal = false;
         
      }
    else
    {
      Longsignal = false;
      Shortsignal = false;
    }


skynat 01.10.15 11:08

Zitat:

Zitat von skynat (Beitrag 31194)
Guten Morgen,

langsam komme ich mir blöd vor...
Ich habe einen EA auf Basis von drei EMAs geschrieben...nun habe ich das Problem (nebst vielen Anderen) dass er NUR Shortsignale umsetzt...leider aber auch wenn es eigentlich Long sein sollte...Ich vermute den Fehler in der Logik aber finde ihn ums verrecken nicht...

Code:

//+------------------------------------------------------------------+
//|                    Handelssignale generieren                    |
//|                                                                  |
//+------------------------------------------------------------------+
   
   
    if(NeuePeriodeBegonnen==true)
      {
          //LongSignal
          if(Close[1]>EMA1_15min>EMA2_15min>EMA3_15min>EMA4_15min)
            {
              if(Close[1]>EMA1_1h>EMA2_1h>EMA3_1h>EMA4_1h)
                  {
                    if(Close[1]>EMA1_4h>EMA2_4h>EMA3_4h>EMA4_4h)
                        {
                          Longsignal = true;
                          Print ("Long");
                        }
                  }
                 
            }
          else Longsignal = false;
         
          //ShortSignal
          if(Close[1]<EMA1_15min<EMA2_15min<EMA3_15min<EMA4_15min)
            {
              if(Close[1]<EMA1_1h<EMA2_1h<EMA3_1h<EMA4_1h)
                  {
                    if(Close[1]<EMA1_4h<EMA2_4h<EMA3_4h<EMA4_4h)
                        {
                          Shortsignal = true;
                          Print ("Short");
                        }
                       
                  }
                 
            }
         
          else Shortsignal = false;
         
      }
    else
    {
      Longsignal = false;
      Shortsignal = false;
    }


Okay ich finde den Editor nicht...Leider hat sich meine HD eben verabschiedet... Muss wohl noch einmal schreiben

Gesendet von meinem D6603 mit Tapatalk

Bobs 02.10.15 09:15

Vielleicht im EA Optionen \ Allgemeine einfach "Short only" Positionen ausgewählt?

Raul0 02.10.15 22:33

Was willst Du damit überhaupt sagen?

Zitat:

Close[1]>EMA1_15min>EMA2_15min>EMA3_15min>EMA4_15min
Soll nun Close größer als EMA1 sein und Close größer als EMA2 ..oder ist Close größer als EMA1 und EMA1 größer EMA2 ...?

skynat 02.10.15 22:55

Ja ich habe es schon ausbaldowert. Ich wollte es zu genau und darum konnte es nicht funktionieren. Habe es jetzt auf reihe und kann morgen gern mal die vorläufige Version Posten. Werde das noch umbauen sodass der ea eine Unterstützung darstellt und kein eigenständiger ea der selbst handelt. Habe in den backtests gesehen dass zu viele fehltrades zustande kommen.

Gesendet von meinem D6603 mit Tapatalk

traderdoc 03.10.15 10:52

Zitat:

Zitat von Raul0 (Beitrag 31198)
Was willst Du damit überhaupt sagen?
Soll nun Close größer als EMA1 sein und Close größer als EMA2 ..oder ist Close größer als EMA1 und EMA1 größer EMA2 ...?

Die dahinterliegende mathemathische Logik ist eineindeutig, denn in dieser Vergleichskette liegt absteigend das größte Glied links, also Close.

Ob das tradetechnisch sinnvoll ist, wäre dann aber eine ganz andere Frage.

traderdoc

skynat 03.10.15 10:59

Ist es nicht. Habe ich ja nun schon gemerkt xD

Gesendet von meinem D6603 mit Tapatalk

traderdoc 03.10.15 13:11

Zitat:

Zitat von skynat (Beitrag 31201)
Ist es nicht. Habe ich ja nun schon gemerkt xD

Gesendet von meinem D6603 mit Tapatalk

Mein vorheriger Kommentar bezog sich hauptsächlich auf den unnötigen Einwurf von @Raul0, denn die mathematische Logik läßt keine! Interpretation zu.
Wenn es so nicht gewollt ist, ist das eine andere Baustelle.

traderdoc

Raul0 03.10.15 18:52

So unnötig war der Einwurf nicht, da ich mit genau solch einem Aufbau Probleme hatte:

PHP-Code:

EMA1_15min EMA2_15min EMA3_15min EMA4_15min 

Der EA funktionierte nach einer Änderung:

PHP-Code:

EMA1_15min EMA2_15min && EMA2_15min EMA3_15min && EMA3_15min EMA4_15min 

Die Logik bleibt die gleiche, jedoch nahm der EA seine Funktion anschließend war.

Wie ist es nun richtig?

skynat 03.10.15 19:01

Liste der Anhänge anzeigen (Anzahl: 2)
Raul0

deine zweite Variante habe ich dann auch umgesetzt - allerdings in Klammern der übersicht halber für mich.

das Problem bei mir lag scheinbar einfach darin dass ich metatrader auf einem mac ausgeführt habe und wine dadurch probleme gemacht hat.

später hat er keine trades umgesetzt weil ich die vorgegebenen regeln für drei zeitcharts gleichzeitig anwenden wollte um den einstieg zu bekommen. dies stellte sich allerdings als schwieriger heraus als gedacht - vielleicht überarbeite ich das nochmal.



am dienstag besitze ich dann wieder einen windows pc und kann dann auch mal die datei hochladen die nun soweit ich das möchte funktioniert (nicht wundern dort ist noch eine menge unnötiges zeug auskommentiert)

ich würde den EA nun gern so umrüsten, dass er mich bei meinen trades lediglich unterstützt - sprich mir signale gibt und meinen SL nachzieht so wie vorgesehen

das thema mit dem einstieg werde ich dann nochmal überdenken und ggf anpassen. wenn die datei hochgeladen ist steht es euch frei diese zu nutzen oder zu verändern/verbessern - letzteres ist sicher notwendig da ich mit dem programmieren (damals moderat c++ programmiert) erst nach jahren wieder angefangen habe

in diesem zuge würde ich mich über vorschläge und anregungen freuen :)

//edit
ich habe die backupdatei noch gefunden und hänge sie an

traderdoc 03.10.15 23:56

"Wie ist es nun richtig?"

Du mußt mal unterscheiden zwischen mathematischer und programmtechnischer Logik. Das sind zwei verschiedene Schuhe.
Insofern bleibt es wie es ist, mathematisch logisch, programmtechnisch falsch umgesetzt.

Also die Antwort auf die o.g. Frage:
"Mathematisch:
EMA1_15min > EMA2_15min > EMA3_15min > EMA4_15min"

"Programmtechnisch richtig!:
EMA1_15min > EMA2_15min && EMA2_15min > EMA3_15min && EMA3_15min > EMA4_15min"

Insofern bleibt es im Sinne meines letzten Posts.

traderdoc

skynat 07.10.15 08:21

So,

nachdem ich meinen Rechner wieder fit habe und meinen Code aufräumen konnte, stehe ich nur noch vor einem Problem(chen?)

Der EA eröffnet Trades, zieht den SL nach etc. Alles wie es soll.

Allerdings möchte ich nun gern, dass er auch manuell gesetzte Trades modifiziert und den SL für mich nach zieht und entsprechend auch keine neue POS öffnet - da ja schon eine offen ist.

Ich bin beim Googlen zwar über OrdersTotal() gestolpert, allerdings komme ich damit nicht recht weiter.
Aktuell wähle ich ja meine Orders via SELECT_BY_TICKET im OrderSelect aus. Es muss doch aber eine Möglichkeit geben dort über eine Oder-Verknüpfung eine gewisse Halbautomatik hinzubekommen.

Code:

  //Shortsignale umsetzen in Deals
    if(Shortsignal==true)
      {
        //Eventuelle LongOrder schliessen
        if (LongOrder>0)
            {
              if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
              {
              bool LongOrderClosed = OrderClose(LongOrder,OrderLots(),Bid,10,Orange);
              if (LongOrderClosed == true) LongOrder = 0;
              }
            }
       
        //ShortOrder eröffnen
        while(ShortOrder<=0)
            {
              ShortOrder = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"ShortOrder",MagicNumber,0,Red);
            }
      }
     
//+------------------------------------------------------------------+
//|                                                                  |
//|                        SL bzw TP setzen                        |
//|                                                                  |
//+------------------------------------------------------------------+   

      //StopLoss Longdeals setzen
      if(NeuePeriodeBegonnen==true)
      {
      if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
        {
            if(OrderCloseTime()==0&&OrderStopLoss()==0)
              {
                  double StopLoss=NormalizeDouble((MA3),Digits);
                  bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
              }
        }


Und hier dann noch das Nachziehen des SL
Code:

//+------------------------------------------------------------------+
//|                                                                  |
//|                    Ticketnummer zurücksetzen                    |
//|                                                                  |
//+------------------------------------------------------------------+   

      //Ticketnummer nach SL oder TP zurücksetzen
      if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
        {
            if(OrderTicket()>0 && OrderCloseTime()>0) LongOrder=0;
        }
       
      if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true)
        {
            if(OrderTicket()>0 && OrderCloseTime()>0) ShortOrder=0;
        }
   
   
//+------------------------------------------------------------------+
//|                                                                  |
//|                    Stops nachziehen auf MA3_1d                  |
//|                                                                  |
//+------------------------------------------------------------------+   
   
    //LongOrder Stop nachziehen
    if (LongOrder>0 && OrderType() == OP_BUY&&NeuePeriodeBegonnen==true)
      {
        Print ("SL wird nachgezogen");
        bool result=false;
        result=OrderSelect(LongOrder,SELECT_BY_TICKET);
        bool result1=false;
        result1=OrderModify(OrderTicket(),OrderOpenPrice(),MA3,0,1);
        Print ("SL ",OrderTicket()," nachgezogen!");
      }


traderdoc 07.10.15 10:06

Entscheidend ist hierbei, an welcher Stelle bekommt der EA die TicketNumber in Form der Variablen LongOrder bzw. ShortOrder? Bei EA-geöffneten Orders entweder über die OrderSend()-Funktion direkt oder die OrderSelect-Abfrage, die aber an dieser Stelle! nur über SELECT_BY_POS und nicht! über SELECT_BY_TICKET geht.
Wenn nun bei der Methode über SELECT_BY_POS zusätzlich noch über die MagicNumber selektiert werden soll, dann versagt die Selektion bei manuell geöffneten Orders, weil es dort keine Möglichleit der Angabe der MagicNumber gibt.
Einziger Ausweg: entweder ohne MagicNumber selektieren oder die im EA verwendete MagicNumber in die Kommentarzeile beim manuellen Öffnen eingeben und bei OrderSelect() dann die MagicNumber als Kommentartext auslesen und wie gewohnt vergleichen.

traderdoc

skynat 07.10.15 20:36

Okay das macht durchaus Sinn

Nach deiner Aussage habe ich beschlossen nochmal einen eigenen EA für das Manuelle Trading zu schreiben und diesen dann stumpf nur den SL nachziehen zu lassen.

Allerdings bin ich mir etwas unsicher was die Syntax angeht. Die Hilfe hilft mir leider nicht so recht weiter.

Code:

//+------------------------------------------------------------------+
//|                                                                  |
//|                    Stops nachziehen auf MA 20                    |
//|                                                                  |
//+------------------------------------------------------------------+   
    //LongOrder Stop nachziehen
    if (OrdersTotal()>0 && OrderType() == OP_BUY&&NeuePeriodeBegonnen==true)
      {
        Print ("SL wird nachgezogen");
        bool result=false;
        result=OrderSelect(OP_BUY,SELECT_BY_POS);
        bool result1=false;
        result1=OrderModify(OrderTicket(),OrderOpenPrice(),MA_SL,0,1);
        Print ("SL ",OrderTicket()," nachgezogen!");
      }
   
 
      //ShortOrder Stop nachziehen
    if (OrdersTotal()>0 && OrderType() == OP_SELL&&NeuePeriodeBegonnen==true)
      {
        Print ("SL wird nachgezogen");
        bool result=false;
        result=OrderSelect(OP_SELL,SELECT_BY_POS);
        bool result1=false;
        result1=OrderModify(OrderTicket(),OrderOpenPrice(),MA_SL,0,1);
        Print ("SL ",OrderTicket()," nachgezogen!");
      }


Somit versuche ich zunächst abzufragen ob überhaupt Orders offen sind (OrdersTotal()) und ob es die richtigen sind für den Stop bzw Long (wobei das hinfällig sein dürfte da ich den SL auf einen EMA ziehe)

jetzt bin ich etwas unsicher was das OrderSelect angeht - wie man sehen kann versuche ich mit dem Ordertypen zu selektieren - allerdings steht ja in der Hilfe, dass er, wenn er mittels POS selektieren soll in einen Pool greift und man den Index nun in der ersten Variable zuweisen soll. Daher bin ich unschlüssig ob das mittels dem "OP_SELL" bzw dem "OP_BUY" so klappt...

traderdoc 07.10.15 21:16

Nein, wenn man die TicketNumber nicht kennt muß man wie folgt selektieren:

Code:

//i ist die Position der Order im internen Orderbuch
for (int i = OrdersTotal() - 1; i >= 0; i--) { //hier wird die neueste Order zuerst abgefragt - rückwärts gezählt
//mit for (int i = 0; i < OrdersTotal(); i++) { wird die älteste Order zuerst abgefragt - vorwärts gezählt
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_Number) {
            TN = OrderTicket();
            if (OrderType() == OP_BUY)  Buy = true;
            if (OrderType() == OP_SELL) Sell = true;
            break; //springt aus der for-Schleife, falls nur die letzte geöffnete Order gesucht wird
        }
      }
  }

// nun kann TN als TicketNumber weiterverwendet werden.

traderdoc

skynat 08.10.15 00:24

Super vielen Dank

Auf die Idee eine Zählschleife zu verwenden bin ich gar nicht gekommen - kurioserweise hat mein Ansatz auch funktioniert...irgendwie...manchmal


Dann werde ich mich noch um ein paar Dinge versuchen zu kümmern die ich gern angezeigt bekommen hätte :)


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