Welches Design ist richtig? - Seite 3

 
Techno:
PapaYozh, diese beiden Optionen sind nur für die Schließung, aber was ist mit der Änderung? Ist es besser,2 Ticks für die vollständige Verarbeitung zu habenals 2 verschiedene Schleifen für das Schließen und Ändern?


Wenn etwas geschlossen werden muss und etwas geändert werden muss, dann ist die Konstruktion for (i=0; i<OrderTotals(); i++) erst recht falsch.

Wir müssen von OrdersTotal()-1 auf 0 gehen.

for ( i=OrderTotals()-1; i>=0; i-- )
{ 




 

d.h. ist dies der richtige Entwurf?

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total; i >=1; i--)                                                        
  {                                                                                          
    if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
    {
      switch(OrderType())
      {
        case OP_BUY : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
        case OP_SELL: OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
        default     : break;
      }        
    }
  }  
}
 

Allerdings verstehe ich die Normalisierung immer noch nicht.

Es ist eine Sache, wenn ich den Preis berechne, dann ist es klar, dass er auf die Ziffern des Terminals gebracht werden muss.

Aber in diesem Fall schließen wir zu dem aktuellen Preis, der sich aus dem Fluss ergibt, und der kann natürlich nicht länger als Digits sein.

 
valenok2003:

Aber auch hier schließt er mit dem aktuellen Preis, der sich aus dem Fluss ergibt, der natürlich nicht länger als Digits sein kann.

Dies ist für einen Prüfer mit nicht normalisierten Kursen.
 
valenok2003:

Allerdings verstehe ich die Normalisierung immer noch nicht.

Es ist eine Sache, wenn ich den Preis berechne, dann ist es klar, dass er auf die Ziffern des Terminals gebracht werden muss.

Aber in diesem Fall schließen wir zu dem aktuellen Preis, der sich aus dem Fluss ergibt, und der kann natürlich nicht länger als Digits sein.

Manchmal kann das Gebot bei Digits=4 gleich 1,32343545654 sein. Nicht oft, aber es kommt vor.
 
Techno:
Manchmal, wenn Digits=4 Bid kann 1.32343545654 sein, dies geschieht. Nicht oft, aber es kommt vor.


Man lernt nie aus. Ich danke Ihnen.
 
valenok2003:

d.h. wäre dieser Entwurf korrekt?


Nicht wirklich: Es gibt keine Kontrolle für das "Symbol" des Instruments. Wenn die Aufträge für mehr als ein Instrument offen sind, besteht die Gefahr, dass Sie die Aufträge für ein Instrument zu den Preisen des anderen schließen. Wenn Sie die Order des Symbols schließen müssen, auf dessen Chart der Expert Advisor verschoben wurde, müssen Sie das "Symbol" des Charts verwenden. Wenn Sie alle Orders schließen müssen, unabhängig davon, auf welchen Chart der EA verschoben wurde, müssen Sie das "Symbol" der Order lesen und verlangen, dass die Ask und Bids des entsprechenden "Symbols" verwendet werden. Außerdem gibt es unnötige Aktionen im Code.

Viel Glück!

 
valenok2003:

d.h. ist dies der richtige Entwurf?

void CloseThisSymbolAll() {
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol()) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         while (!IsTradeAllowed()) Sleep(1000);
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), slip, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), slip, Red);
            Print ("close ALL orders Type : order :  Bid  "+OrderType()+" :  "+OrderOpenPrice()+"  :  "+Bid);            
         }
      }
   }
}
Gehen Sie folgendermaßen vor.
 
VladislavVG:


Ja, und es gibt zusätzliche Aktionen im Code.

Wenn Sie dies meinen
int Total = OrdersTotal();

dann gibt es hier eine zusätzliche Variable für die Transparenz des Codes.

Oder sprechen Sie vielleicht von etwas anderem?

 
Techno:
Manchmal kann das Gebot bei Digits=4 gleich 1,32343545654 sein. Nicht oft, aber es kommt vor.

Im Beispiel des Skripts close .mq4(in der MT4-Standardlieferung) gibt es jedoch keine Normalisierung.

   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {
      cmd=OrderType();
      //---- first order is buy or sell
      if(cmd==OP_BUY || cmd==OP_SELL)
        {
         while(true)
           {
            if(cmd==OP_BUY) price=Bid;
            else            price=Ask;
            result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
            if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
            else error=0;
            if(error==135) RefreshRates();
            else break;
           }
        }
     }
Grund der Beschwerde: