Gegenüberliegende Bestellung öffnen - Seite 2

 

Sie können dies nicht tun, um Slippage für 4/5-stellige Broker anzupassen, es macht einfach keinen Sinn.

Slippage MUSS ein int sein, also eine ganze Zahl, für einen 4-stelligen Broker ist Slippage in Pips, also bedeutet Slippage = 3 3 Pips, für einen 5-stelligen Broker ist Slippage in Punkten, also bedeutet Slippage = 3 3 Punkte oder 0.Um dies zu kompensieren, muss bei einem 5-stelligen Broker die Slippage-Zahl mit zehn multipliziert werden, was 30 ... 30 Punkte = 3 Pips ergibt.

Dieser Code ist also falsch...

int init()
   {
   if (Digits ==3 || Digits ==5) pt = 10 * Point;
   else pt = Point;
   Slippage = Slippage * pt;    
   }
 

Probieren Sie diese geänderte Version derFunktion OpenOppositeOrder() aus.

void OpenOppositeOrder() 
   {
   int Op;  
 
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  // only continue if the OrderSelect() worked
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice())
               {      
               Ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && Ask > OrderOpenPrice())
               {      
               Ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError() );
                  }   
               }
            }
         }
      }
   }
 
RaptorUK:

Probieren Sie diese geänderte Version der Funktion OpenOppositeOrder() aus.


Hallo RaptorUk,

Vor allem danke ich Ihnen für die Hilfe, die Sie bisher geleistet haben. Jetzt beginnt der EA zu arbeiten. Ich habe andere Modifikationen getan, wie alle zu schließen, wenn eine Bestellung haben Gewinn und das ist ok, aber wie Sie bereits gesehen und voraussagen, für diese Strategie arbeiten ist notwendig, dass die Bestellung, die Gewinn erreicht haben die Losgröße erhöht, um für frühere Aufträge zu kompensieren. mit dem im Verstand habe ich Code eingeführt, um das zu tun. Also ich bin mit einer Verwirrung hier zu tun. Ich muss bestätigen, ob die letzte Order einen Gewinn erzielt hat oder nicht, und ich möchte OrderProfit() so verwenden, dass die Losgröße der nächsten Order angepasst wird, aber muss ich nicht die vorherige Order schließen, um diese Information zu erhalten?

Hier ist der Code, um eine entgegengesetzte Bestellung zu öffnen, die gut funktioniert (dank Ihnen), wo ich den zusätzlichen Code einführe, um herauszufinden, ob die vorherige Bestellung, die offen ist, einen Gewinn hat. Bin ich auf dem richtigen Weg, um diese Information zu erhalten?

Vielen Dank!

Luis

 void OpenOppositeOrder() 
 {
// LastOrder Loss Compensation 
   int Orders;
   Orders= OrdersTotal();
   if (Orders>0)
   {  
    for(i=0;i<Orders;i++)
   {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()== MagicNumber)
   {
    lastprofit = OrderProfit();
    lastlot = OrderLots();
   }
  }
 }
  mlots=0;
  if (lastprofit<0)mlots=NormalizeDouble(lastlot*Multiplier,Digits);
  else mlots=LotSize;
 
//+------------------------------------------------------------------+ 
//Open Opposite Order 
   int Op;  
 
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice())
               {  
               if(Martingale)ilots=mlots;else ilots=LotSize; 
               Ticket = OrderSend(Symbol(), OP_SELL, ilots, Bid, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && Ask > OrderOpenPrice())
               { 
               if(Martingale)ilots=mlots;else ilots=LotSize;
               Ticket = OrderSend(Symbol(), OP_BUY, ilots, Ask, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError() );
                  }   
               }
            }
         }
      }
   }
 
luisneves:


Hallo RaptorUk,

Vor allem danke ich Ihnen für die Hilfe, die Sie bisher geleistet haben. Jetzt Die EA beginnt zu arbeiten. Ich habe andere Modifikationen auf, wie alle zu schließen, wenn eine Bestellung haben Gewinn und das ist ok, aber wie Sie bereits sah und vorhersagen, für diese Strategie Arbeit ist notwendig, dass die Reihenfolge, die Gewinn erreicht haben die Losgröße erhöht, um für frühere Aufträge zu kompensieren. mit diesem im Verstand habe ich Code eingeführt, um das zu tun. Also ich bin mit einer Verwirrung hier zu tun. Ich muss bestätigen, ob die letzte Order einen Gewinn erzielt hat oder nicht, und ich möchte OrderProfit() so verwenden, dass die Losgröße der nächsten Order angepasst wird, aber muss ich nicht die vorherige Order schließen, um diese Information zu erhalten?

Hier ist der Code, um eine entgegengesetzte Bestellung zu öffnen, die gut funktioniert (dank Ihnen), wo ich den zusätzlichen Code einführe, um herauszufinden, ob die vorherige Bestellung, die offen ist, einen Gewinn hat. Bin ich auf dem richtigen Weg, um diese Information zu erhalten?

Ich vermute, dass dies zu Problemen führen wird...

mlots = NormalizeDouble(lastlot * Multiplier, Digits);

Wenn das Ergebnis z.B. 1,12316734 Lots war, wird Ihr NormalizeDouble() bei einem 5-stelligen Nennwert es in1,12316 ändern, und das entspricht nicht der Anforderung des Lot Step . ... Sie müssen etwas Mathematik anwenden, um Ihre geänderte Losgröße zu einem Vielfachen von Lot Step zu machen MarketInfo(Symbol(),MODE_LOTSTEP)

 
RaptorUK:

Ich vermute, dass dies zu Problemen führen wird...

Wenn das Ergebnis z.B. 1.12316734 Lots war, wird Ihr NormalizeDouble() bei einem 5-stelligen Nennwert das Ergebnis in1.12316 ändern, und das entspricht nicht den Anforderungen für Lot Step. ... Sie müssen etwas Mathematik anwenden, um Ihre geänderte Losgröße zu einem Vielfachen von Lot Step zu machen MarketInfo(Symbol(),MODE_LOTSTEP)


Hallo RaptorUK,

Bezüglich Ihres Ratschlags, meine Losgröße als Vielfaches von Lot Step beizubehalten, bin ich gerade dabei, mich selbst zu diesem Thema zu dokumentieren.

Jetzt habe ich ein anderes Problem (mehr...)

Um die Aufträge über und unter dem aktuellen Preis zu öffnen, möchte ich eine Linie verwenden, wo, sobald die Ea zu laufen beginnt, ich den Preis mit der Linie vergleiche, die noch ist.

Ein erstes Problem kommt; wie kann ich die Linie mit einer Differenz im Preis vergleichen?

Hier ist der Code, den ich bis jetzt habe. Hier, wie kann ich den Namen geben, um zu vergleichen, weil, wenn ich aus iHigh in nach priceline es einfach nicht funktioniert.

Vielen Dank im Voraus für alle Hinweise in diesen Fragen.

Luis

priceline=iHigh(Symbol(),0,0);
 ObjectCreate("highline",OBJ_HLINE,0,0,Bid); 
 ObjectSet("highline",OBJPROP_COLOR,LimeGreen);
 ObjectSet("highline",OBJPROP_WIDTH,1);
 WindowRedraw();

Das scheint einfach nicht zu funktionieren (...)

if(Bid > priceline+Distance*pt)                      
                {       
// Open buy order

                            while(IsTradeContextBusy()) Sleep(10);
                                 RefreshRates();        
                       
             Ticket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
             if(Ticket>0)AddLimitsBuy();
            }

Ich habe hier das Objekt delete eingefügt, weil ich brauche, dass die Zeile mit dem Abschluss aller Aufträge gelöscht wird. ist das richtig?

void CloseAll()
      {
         int i,Op,Error;
         int Total=OrdersTotal();
     
         if(Total>0)
         {
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         else
         {
         ObjectDelete("highline");
         }
        }
       }
      }
 
luisneves:

Das scheint einfach nicht zu funktionieren (...)

Ich habe hier das Objekt delete eingefügt, weil ich brauche, dass die Zeile mit dem Abschluss aller Aufträge gelöscht wird. ist das richtig?

OK, ich glaube, ich verstehe, was Sie tun wollen, Sie wollen prüfen, wo Bid im Vergleich zu Ihrer Linie steht, dazu müssen Sie die Position der Linie ermitteln ... verwenden Sie ObjectGet() mit dem Objektnamen und dem Objekt-EigenschaftsindexOBJPROP_TIME1, dies gibt den Preis zurück, an dem die Linie steht.

Ihr ObjectDelete()-Aufruf scheint mir in Ordnung zu sein. Ich mag die Verwendung von ObjectsDeleteAll() nicht besonders, da ich sie für faul und gefährlich halte ... oder zumindest für andere unpraktisch.

 
RaptorUK:

OK, ich glaube, ich verstehe, was Sie tun wollen, Sie wollen prüfen, wo Bid im Vergleich zu Ihrer Linie steht, dazu müssen Sie die Position der Linie ermitteln ... verwenden Sie ObjectGet() mit dem Objektnamen und dem ObjekteigenschaftsindexOBJPROP_TIME1, dies wird den Preis zurückgeben, an dem die Linie platziert ist.

Ihr ObjectDelete()-Aufruf scheint mir in Ordnung zu sein.


Hallo RaptorUK,

Ich versuche, alle Aufträge zu schließen, wenn einer mit Gewinn schließt, aber wenn das passiert, ist ein schwebender Auftrag immer noch offen, obwohl die Anweisung zum Schließen in der Funktion CloseAll() enthalten ist. Gibt es irgendwelche Hinweise zu diesem Problem?

Vielen Dank im Voraus für jede Hilfe, die Sie anbieten.

Luis

int GoToClose()
 {
  int pos;  
 {
  for(int Profit=OrdersTotal()-1;pos>=0;pos--)
  if(OrderSelect(Profit,SELECT_BY_POS)
  && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()
  && OrderProfit()+OrderSwap()+OrderCommission()>0||OrdersTotal()> MaxOrders)CloseAll();  
 }
}
//+---------------------------------------------------------------------------+  
      void CloseAll()
      {
         int Op,Error;
                    
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if(Op==OP_SELLSTOP||OP_BUYSTOP||OP_SELLLIMIT||OP_BUYLIMIT)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print("Error opening BUY Stop Order : ",GetLastError());         
         }
        }             
 
luisneves:


Hallo RaptorUK,

Ich versuche, alle Aufträge zu schließen, wenn einer mit Gewinn schließt, aber wenn das passiert, ist ein schwebender Auftrag immer noch offen, obwohl die Anweisung zum Schließen in der Funktion CloseAll() enthalten ist. Haben Sie irgendwelche Hinweise zu diesem Problem?

Sie müssen verstehen, wie Ausdrücke funktionieren ... das geht nicht.

if(Op == OP_SELLSTOP || OP_BUYSTOP || OP_SELLLIMIT || OP_BUYLIMIT)

es ist eine ähnliche Situation wie diese, aber nicht genau die gleiche:https://www.mql5.com/en/forum/141790


Was ist das Ergebnis von ...

WhatValue = (5  || 4  ||  3  ||  2 );

|| ist ein Boolean-Operator, funktioniert also nur bei Bools ...


Das Ergebnis ist ein boolscher Wert . . .

( Op == OP_SELLSTOP )

. . . wenn Sie einen bitweisen Operator auf Ihre Werte anwenden wollen, können Sie dies verwenden ... .

int WhatValue = (5  | 4  |  3  |  2 );

. . . aber das ist nicht das, was Sie versuchen zu tun.

 
RaptorUK:

Sie müssen verstehen, wie Ausdrücke funktionieren ... das geht nicht.

es ist eine ähnliche Situation wie diese, aber nicht genau die gleiche:https://www.mql5.com/en/forum/141790


Was ist das Ergebnis von . . .

|| ist ein Boolescher Operator und funktioniert nur bei bools ...


das ergibt einen boolschen Ergebniswert . . .

. . . wenn Sie einen bitweisen Operator auf Ihre Werte anwenden wollen, können Sie dies verwenden ... .

. ... aber das ist nicht das, was Sie versuchen zu tun.


Hallo RaptorUK,

Ich verstehe, aber jetzt mit dem im Verstand habe ich den Code ändern und die ausstehende Bestellung noch da...

void CloseAll()
      {
         int Op,Error;
                    
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if(Op==OP_SELLSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         if(Op==OP_BUYSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print("Error opening BUY Stop Order : ",GetLastError());         
         }
        }        
 
luisneves:


Hallo RaptorUK,

Ich sehe, aber jetzt mit, dass im Hinterkopf habe ich den Code ändern und die ausstehende Bestellung immer noch da...

Es kann sein, dass die Funktion eine andere MagicNumber hat als dieMagicNumber oder dass sie für ein anderes Symbol ist als das, auf dem der EA läuft, oder wenn es ein OP_SELLLIMIT oder OP_BUYLIMIT ist. . außerdem müssen Sie die Rückgabewerte Ihrer OrderDelete() und OrderClose() Aufrufe überprüfen.

Warum müssen Sie RefreshRates() aufrufen? Ich meine nicht, dass Sie sie loswerden sollen, aber können Sie erklären, warum Sie RefreshRates() an dieser Stelle aufrufen?


Was sind die Rückgabewerte der Funktion? Wie kann ich sie verwenden?

Grund der Beschwerde: