Einzelnen Beitrag anzeigen
  #71 (permalink)  
Alt 07.02.18
next user next user ist offline
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Lampe Beitrag anzeigen
Das mit dem LotSize wird ich morgen umsetzen. Ich habe halt ausserhalb von OnTick, also vermutlich Global, die LotSize Berechnung die ungefähr so aussieht:
Ja, da sieht du ja selbst, das ein double beim Aufruf zurückgegeben wird. Dein loser Aufruf weiter oben, ohne den Rückgabewert
in einer Variablen zu speichern, oder in OrderSend direkt aufzurufen, ist also wertlos.
Hab dir oben schon zwei Beispiele geschrieben, wie du die Funktion nutzen kannst.

Zitat:
Zitat von Lampe Beitrag anzeigen
Wie schaffe ich es denn dann, das er die Fehlerhafte Order noch sendet?
Das ist ja der Knackpunkt. Ausgeführt wird eine Order ja eben nur dann, wenn OrderSend kein Problem hatte.
Also muss die Ursache für das Scheitern der Orderausführung beseitigt werden.

Zitat:
Zitat von Lampe Beitrag anzeigen
Alternativ, habe ich denn noch andere Möglichkeiten ausser mit einer Schleife zu arbeiten?

*ich wechsel mal kurz in den Editor und schreib dann hier weiter*

So. Ich habe jetzt mal folgendes geschrieben.

Code:
if(a==0)
         if(t==0)
            {
            LotSize();
            LongOrder1=OrderSend(NULL,OP_BUYSTOP,LotSize,KaufPreis,NULL,VerkaufPreis,0,"DAX_H1_StrategieLong",MagicNummer,0,clrGreenYellow);
            ShortOrder1=OrderSend(NULL,OP_SELLSTOP,LotSize,VerkaufPreis,NULL,KaufPreis,0,"DAX_H1_StrategieShort",MagicNummer,0,clrRed);
            if(LongOrder1<=0)
               {
               LongOrder1=OrderSend(NULL,OP_BUYSTOP,LotSize,KaufPreis,NULL,VerkaufPreis,0,"DAX_H1_StrategieLong",MagicNummer,0,clrGreenYellow);
               }
            if(ShortOrder1<=0)
               {
               ShortOrder1=OrderSend(NULL,OP_SELLSTOP,LotSize,VerkaufPreis,NULL,KaufPreis,0,"DAX_H1_StrategieShort",MagicNummer,0,clrRed);
               }   
            if((LongOrder1>0)&&(ShortOrder1>0))
               {
               TradeActionVierZehnUhr++;
               }
            } 
         }
Mein Gedanke, wenn eine der beiden Orders nach dem ersten Senden noch keine Ticketnummer hat, geht er in die if Bedingung und sendet die fehlende Order nach. Wenn am Ende beide ne Ordernummer haben also größer als 0 sind => TradeAction++.

Ist das eine Herangehensweise die irgendwo Sinn macht oder ist das Blödsinn?
Die Herangehensweise an sich kann unterschiedlich sein. Ob jetzt mit if's oder ne Schleife spielt keine entscheidende Rolle.
In deinem Code würde er beim Fehlschlag halt nur noch EIN EINZIGES MAL versuchen zu senden.
Da die meisten Fehlschläge aber mit einem Fehler in der Parameterliste, und nicht mit einem "zufällig" fehlgeschlagenem Abarbeiten seitens des Brokers
zu tun haben, würden weitere, direkte OrderSend-Versuche einfach nur die gleichen, unveränderten Parameter mitgeben und
wieder und wieder fehlschlagen.

Deshalb:
Zitat:
Zitat von Lampe Beitrag anzeigen
Die Entscheidene Frage ist ja auch, muss ich zwangsläufig FehlerCodes abfragen?
JA, denn die sagen dir ja, WIESO dein OrderSend fehlgeschlagen ist. Nur dann kannst du ja auch RICHTIG darauf reagieren.
Vor allem, wenn ein EA vollautomatisch für dich traden soll, du also nicht "zuschaust", muss der EA ja auf solche Probleme selber reagieren können.

Hier findest du die ErrorCodes, von denen wohl am meisten die 128-134 ausschlagen dürften.

Eine mögliche Umsetzung könnte z.B so aussehen:
Code:
double lot = LotSize();

ResetLastError();
LongOrder1 = OrderSend(NULL,OP_BUYSTOP,lot,KaufPreis,NULL,VerkaufPreis,0,"DAX_H1_StrategieLong",MagicNummer,0,clrGreenYellow);

if(LongOrder1 == -1)
{
   // Ein paar Fehler anschauen:
   switch(GetLastError())
   {
      case 129:
      {
         // Falscher Preis...
         break;
      }
      case 130:
      {
         // Falscher Stop.
         // Häufiger Fehler bei der Berechnung(Kurs,Stop,Punkt) ist das Vertauschen
         // von +/- zum Kurs (Kurs +/- Stop*Point)
         break;
      }
      case 131:
      {
         // Falsches Volumen (Lot).
         // Mögliche Ursachen:
         //    - Angabe, die nicht mit den Lot-Schritten (MODE_LOTSTEP) übereinstimmt.
         //    - Der momentane Account (z.B. Microaccount) erlaubt keine größeren
         //      Lot als ...
         break;
      }
      ...
   }
}

ResetLastError();
ShortOrder1 = OrderSend(NULL,OP_SELLSTOP,lot,VerkaufPreis,NULL,KaufPreis,0,"DAX_H1_StrategieShort",MagicNummer,0,clrRed);

if(ShortOrder1 == -1)
{
   // Entsprechend wie oben...
}

if(LongOrder1 > 0 && ShortOrder1 > 0)
   TradeActionVierZehnUhr++;