Welches Design ist richtig? - Seite 5

 
valenok2003:

Das Ergebnis ist dieses Skript

Frage - Warum werden nicht immer alle Aufträge abgeschlossen? Ich eröffne zum Beispiel drei Verkaufsaufträge hintereinander und versuche, sie zu schließen, aber das Skript kann einen, zwei oder alle schließen. Was ist der Grund dafür?

Benötigen Sie ein Skript?

Dann brauchen Sie keine while-Anweisung, Skripte funktionieren ohnehin in Schleifen.

Für das Skript benötigen Sie diese Konstruktion...

Ich erinnere mich nicht an den Link, hier ist das Skript, das alle offenen Aufträge schließt.

//+------------------------------------------------------------------+
//|                                               CloseAllOrders.mq4 |
//|                       Copyright © 2008, PRMQuotes Software Corp. |
//|                                           Jedimedic77@gmail.com  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, PRMQuotes Software Corp."
#property link      ""
//+------------------------------------------------------------------+
//| EX4 imports                                                      |
//+------------------------------------------------------------------+
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| global variables to program:                                     |
//+------------------------------------------------------------------+
double Price[2];
int    giSlippage;
bool   CloseOpenOrders = true;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() {
  int iOrders=OrdersTotal()-1, i;
  
  if(CloseOpenOrders) {
    for(i=iOrders; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() && 
      !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],giSlippage)) Print(OrderError());
    }
  }
}
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError() {
  int iError=GetLastError();
  return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError)));
}
//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo() {
  RefreshRates();
  Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
  Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
  double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
  if(dPoint==0) return(false);
  giSlippage=(Price[0]-Price[1])/dPoint;
  return(Price[0]>0.0 && Price[1]>0.0);
}
//+------------------------------------------------------------------+
 
valenok2003:

Das Ergebnis ist dieses Skript

Frage - Warum werden nicht immer alle Aufträge abgeschlossen? Wenn ich zum Beispiel drei Verkaufsaufträge hintereinander eröffne und dann versuche, sie mit dem Skript zu schließen, kann es sein, dass einer, zwei oder alle geschlossen werden. Was ist der Grund dafür?
Und die Anführungszeichen sind wie viele Ziffern?
 
khorosh:
Und die Anführungszeichen sind wie viele Ziffern?
fünf
 
Martingeil:

Benötigen Sie ein Skript?

Ich danke Ihnen natürlich. Aber es ist leicht, ein Skript von der Stange zu bekommen. Ich möchte herausfinden, was der Grund dafür ist.
 
Martingeil:

Benötigen Sie ein Skript?

dann brauchen Sie die while-Anweisung nicht , Skripte funktionieren ohnehin in Schleifen.


Das Skript funktioniert nur einmal. Dort gibt es keine Selbstschleifen und hat es nie gegeben.

Valenok, benötigen Sie das Skript, um alle Aufträge zu schließen, oder nur dieses Symbol?

 
Martingeil:

Benötigen Sie ein Skript?

Dann brauchen Sie die while-Anweisung nicht , Skripte funktionieren ohnehin in Schleifen.

Für ein Skript benötigen Sie diese Konstruktion...

Ich erinnere mich nicht an den Link, hier ist ein Skript, das alle offenen Aufträge schließt.

Im while-Code , nur um zu verzögern, während der Thread beschäftigt ist.
 
Techno:

das Skript funktioniert nur einmal. Es gibt keinen Selbstauslöser und hat es nie gegeben.

Valenok, möchten Sie, dass das Skript alle Aufträge schließt, oder nur dieses Symbol?

Ja, du hast recht, ich meinte, es hängt nicht von den Zecken ab...
 
Techno:

das Skript funktioniert nur einmal. Es gibt keine Selbstauslöser und hat es nie gegeben.

Valenok, benötigen Sie das Skript, um alle Aufträge zu schließen, oder nur dieses Symbol?



Nur offene Aufträge mit einem Symbol. Die ausstehenden Anträge sind davon nicht betroffen.

Das Lustige daran ist, dass der in kodobase kritisierte Code

int start()
{
//----
  while(OrdersTotal()>0)
  {
    for (int i=0; i < OrdersTotal(); i++)                                                        
    {                                                                                          
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
        OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5);  
      }
    }
  }                                               
//----
   return(0);
}

funktioniert ohne Probleme, aber als ich anfing, es zu verbessern, fing ich an, Probleme zu haben.

zy:

Zum Thema falsche Schnur

for (int i=0; i < OrdersTotal(); i++)

Ich habe es bereits herausgefunden.

 
valenok2003:



Nur offene Aufträge mit einem Symbol. Die anhängigen Verfahren werden von uns nicht berührt.

Lassen Sie es also einfach auf sich beruhen und verschieben Sie es. In allgemeiner Form.

int start()
{
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
    if(OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol())
      switch(OrderType())
         {
         case 0  : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
         case 1  : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
         default : OrderDelete(OrderTicket()); break;
         }
    }
        
}
 
Martingeil:
Sie haben Recht, so habe ich es nicht gemeint, unabhängig von den Ticks...


Dessen bin ich mir bewusst.