Jump to content
Tom Next - Daytrading Community

Das Zusammenspiel von OrderSelect() und OrderModify()


sill3000

Recommended Posts

Einen schönen guten Tag, Abend.

 

Ich habe da einige Probleme mit dem Zusammenspiel von OrderSelect() und Order Modify().

 

Habe da so ca. 10 Trades offen und möchte sie anhand eines Trailing-Stops überwachen.

 

Hier ist der Code:

 

total=OrdersTotal();
   //Hier ist der Trailing Stop
 
 
       for(int cnt=0;cnt<total;cnt++)
           {
             OrderSelect(cnt, OrderTicket(),MODE_TRADES);
              if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
                  {
                   if(OrderType()==OP_BUY) // long position is opened
                      {
                               
                       
// check for trailing stop
                        if(TrailingStop>0)
                              {
                                 if(Bid-OrderOpenPrice()>Point*TrailingStop)
                                    {
                                      if(OrderStopLoss()<Bid-Point*TrailingStop)
                                          {
                                            OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                                            return(0);
                                          }
                                     }
                                }
                      }
                      else // go to short position
                         {
                          
// check for trailing stop
                         if(TrailingStop>0)
                                {
                                if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                                    {
                                      if((OrderStopLoss()>(Ask+Point*TrailingStop))||(OrderStopLoss()==0))
                                           {
                                             OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
                                             OrderTakeProfit(),0,Red);
                                             return(0);
                                           }
                                     }
                                 }
                           }
                       }
                  }
return(0);

Ich bekomme hier dauernd den Fehlercode: OrderModify Error 130 d.h. invalid stops "ungültiger Stop" ??

 

Ich kann damit nichts anfangen, für eure Hilfe im Voraus besten Dank !

Edited by whipsaw
whipsaw
Link to comment
Share on other sites

Ja, aber wie soll das dann helfen, NormalizeDouble(Bid-Point*TrailingStop,Digits) ?

z.B. so:

OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Green)

Du mußt bei OrderModify immer die richtige Anzahl von Digits eingeben, bei manchen Brokern 4, bei manchen 5. Über das Schlüsselwort "Digit" erkennt das dein Programm automatisch.

 

Wenn den Code zwischen die Code-Steuerzeichen einfügst, dann sieht das auch noch schön aus. :keyboard:

was meinst du damit ?

Du schreibst vor deinen Code in eckigen Klammern das Wort code und dahinter wieder in Eckigen Klammern /code, dann wird der Code, den du hier im Forum postest formatiert und man kann ihn richtig lesen :twiddle:

Link to comment
Share on other sites

Ich habe gelesen, wenn ein Ticksignal kommt, dann wird die Start-Funktion aufgerufen, oder ?

Das ist korrekt und widerspricht auch nicht meiner Aussage. Die start()-Funktion wird mit jedem Tick aufgerufen, allerdings nur, wenn sich dein EA nicht gerade darin (oder in Unterfunktionen) befindet. Das heißt: kommen viele Ticks schnell hintereinander und dein EA ist "noch nicht fertig" wenn der nächste Tick eintrifft, dann wird start() nicht nochmals aufgerufen! Eigentlich kommt dies eher selten vor, außer dein EA ist langsam (weil du vielleicht viele Indikatoren im Programmcode auf unterschiedlichsten Zeitebenen berechnen lässt - o.ä.).

Link to comment
Share on other sites

Ich habe gelesen, wenn ein Ticksignal kommt, dann wird die Start-Funktion aufgerufen, oder ?

Das ist richtig, läuft allerdings die Start-Funktion noch während bereits ein neuer Tick reinkommt, dann wird dieser neue Tick ignoriert, unterbricht also nicht Start()!

 

Edit: Bin einfach zu langsam auf meine alten Tage :keyboard:

Link to comment
Share on other sites

NormalizeDouble(Bid-Point*TrailingStop,Digits)

...also wenn ich das jetzt richtig verstanden habe, dann kann ich die Variante einsetzen...

OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Green)

...und die mit PointX aussetzen...

double PointX()
 {
  if (Digits==5 || Digits ==3)

  return(Point*10); else return(Point);
 }
//---------------------------
if(OrderType()==OP_BUY)
 {
  OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-PointX()*Stopp,OrderOpenPrice()+PointX()*Profit,0,Blue);
 }

oder interpretiere ich das falsch?!

 

lg NC

 

PS: Nochmal kurz am Rande:

Kann es sein, dass die PointX-Funktion irgendwie falsch ist. Denn egal ob 3 oder 5 Digits, der Wert wird immer x10(mal zehn)genommen... :keyboard:

Link to comment
Share on other sites

oder interpretiere ich das falsch?!

 

Nein, siehst du genau richtig :keyboard:

 

Kann es sein, dass die PointX-Funktion irgendwie falsch ist. Denn egal ob 3 oder 5 Digits, der Wert wird immer x10(mal zehn)genommen... :twiddle:

Ich kenne zwar keinen 3-Digit Broker, aber ich hab diese Implementierung schon an verschiedenen Stellen gesehen. Scheint also richtig zu sein.

Link to comment
Share on other sites

Kann es sein, dass die PointX-Funktion irgendwie falsch ist. Denn egal ob 3 oder 5 Digits, der Wert wird immer x10(mal zehn)genommen... :keyboard:

Bitte korrigiert mich, wenn ich falsch liege, aber kann das x10 nicht mit CFDs zusammenhängen?

 

Bei einem CFD auf den DE30 beträgt Point (je nach Broker) den Wert 0,1. Wenn ich nun 10 Indexpunkte entfernt meinen TP setzen möchte, dann muss ich 100xPoint rechnen. Zwischen 6490 und 6500 liegen also 10x10xPoint. Was für Werte enthält denn die Variable Profit?

Link to comment
Share on other sites

Bitte korrigiert mich, wenn ich falsch liege, aber kann das x10 nicht mit CFDs zusammenhängen?

Das x10 bezieht sich auf das 5. bzw. 3. Digit bei EURJPY, wie Quickbeam2k1 richtig sagt.

Bei Indikatoren/EAs wird es häufig so gemacht, dass die Parameter, die man einstellt, sich auf einen 4 Digit-Broker beziehen. Setzt man bei EURUSD einen SL von 50 Punkten, so sind das bei einem 5-Digit Broker (z.B. MBT) 500. Um nicht ständig umrechnen zu müßen, kann man den EA/Indikator automatisch diesen Korrekturfaktor abhängig vom Digit-Wert berücksichtigen lassen.

Link to comment
Share on other sites

Wie kann man eigentlich einen TRade aufmachen, ohne S/L und T/P. WEnn ich die Variablen mit Werten versehe, dann macht er die Trades.

 

Aber, wenn ich die WErte mit "0" setze, dann macht er keinen einzigen Trade. Warum ?

 

Lieben Gruss

Hast Du in deiner OrderSend() die Null mit "" oder ohne "" geschrieben?

Bei mir funktioniert es...

 

OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,0,0,"long",MagicNumber,0,White)

 

lg NC

Link to comment
Share on other sites

Ich habe da mal noch ne andere Frage, ich öffne buy-Order mit dem "Ask"-Preis und öffne short-Order mit dem "Bid"-Preis.

 

Meine Order für long: ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"My EA",12345,0,Green);

 

Meine Order für short: ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"My EA",12345,0,Red);

 

 

Kann ich auch buy-Orders und short-Orders nur mit dem "Bid"-Preis öffnen, sozusagen zu dem Kurswert, den man auf dem Chart sieht ? :nictation:

Link to comment
Share on other sites

  • 4 months later...

Habe da mal folgenden Code aufgebaut, scheint aber nicht zu funktionieren. Kennt sich da jemand mit aus ?

 

Wäre sehr dankbar für eure Hilfe.

 

 

 int total=OrdersTotal();
     for(int cnt=0;cnt<total;cnt++)
           {
             OrderSelect(cnt,SELECT_BY_TICKET,MODE_TRADES);
              
                  
                   if(OrderType()==OP_BUY) // long position is opened
                      {
                      Print("Hallole BUY");
                      checkBUY=TRUE;
                      checkSELL=FALSE;
                      }
                      else // go to short position
                         {
                         Print(" Hallole SELL");
                         checkBUY=FALSE;
                         checkSELL=TRUE;
                         }
                
           } 

 

 

Im voraus schon mal besten Dank !

Link to comment
Share on other sites

int total=OrdersTotal();
     for(int cnt=0;cnt<total;cnt++)
           {
              if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) == false)
                continue;              
              
                  
                   if(OrderType()==OP_BUY) // long position is opened
                      {
                      Print("Hallole BUY");
                      checkBUY=TRUE;
                      checkSELL=FALSE;
                      }
                      else // go to short position
                         {
                         Print(" Hallole SELL");
                         checkBUY=FALSE;
                         checkSELL=TRUE;
                         }
                
           } 

 

Hi Sil,

 

so müßte es laufen.

Edited by Mythos
quote in code geändert
  • Upvote 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...