Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 518

 
Sergey Gritsay:

Hier ist eine weitere Option, die die Klasse

Testergebnis

Vielen Dank, Sergei! Wenn ich das richtig verstehe:
Im ersten Fall wird ein Array statischer Variablen erstellt, jede für ihr eigenes Symbol mit einem festen Zeitrahmen, d. h. für dieses Symbol kann kein anderer Zeitrahmen verwendet werden;
Im zweiten Fall eine Klasse für jede Kombination von Symbol und Zeitrahmen.
 
MikeZv:
Vielen Dank, Sergei! Wenn ich das richtig verstehe:
Im ersten Fall wird ein Array statischer Variablen erstellt, jede für ihr eigenes Symbol mit einem festen Zeitrahmen, d. h. für dieses Symbol kann kein anderer Zeitrahmen verwendet werden;
Im zweiten Fall eine Klasse für jede Kombination aus Symbol und Zeitrahmen.
Ja, richtig, aber wenn Sie ein wenig nachdenken, können Sie das eindimensionale Array durch ein zweidimensionales in der Array-Variante ersetzen.
 
Eine solche Frage. Hat jemand irgendwo einen Vorlagencode für das Öffnen, Prüfen und Schließen von Aufträgen gesehen, ohne eine Öffnungs- und Schließbedingung? Ich werde versuchen, selbst eine Bedingung zu schreiben, aber ich erhalte eine Fehlermeldung nach der anderen, wenn ich einen Abschlussauftrag schreibe... Vor allem bin ich schlecht darin, Aufträge zu finden und zu überprüfen, um sie abzuschließen.
 
Vitaliy Medvedev:
Hier ist eine Frage. Hat irgendjemand irgendwo anders den Vorlagencode für das Öffnen, Prüfen und Schließen von Aufträgen ohne Bedingungen für das Öffnen und Schließen gesehen? Ich habe versucht, eine Bedingung selbst zu schreiben, aber wenn ich beginne, einen Abschlussauftrag Fehler auf Fehler zu schreiben... Vor allem bin ich schlecht darin, Aufträge zu finden und zu überprüfen, um sie abzuschließen.

Es ist nicht verwunderlich, dass dies nicht gut funktioniert. Denn wenn es keine Abschlussbedingungen gibt, dann sollte das Auffinden und Prüfen solcher Aufträge nach dem Motto erfolgen: Finde das, ich weiß nicht was, und schließe es ab.

Legen Sie zunächst die Bedingungen für die Auswahl des abzuschließenden Auftrags fest, dann ist es viel einfacher, ihn zu analysieren. Schließlich müssen wir im Falle eines Missverständnisses nur prüfen, ob die bekannten Bedingungen erfüllt sind.

 
Yury Reshetov:

Es ist nicht verwunderlich, dass dies nicht gut funktioniert. Wenn wir keine Abschlussbedingungen haben, dann sollte die Suche und Prüfung solcher Aufträge in folgendem Sinne erfolgen: etwas finden und abschließen.

Legen Sie zunächst die Bedingungen für die Auswahl der Aufträge für den Abschluss fest, dann wird es einfacher sein, sie zu sortieren. Wenn es ein Missverständnis gibt, müssen wir einfach prüfen, ob die uns bekannten Bedingungen richtig sind.

Das ist alles klar, ich habe die Bedingungen definiert, aber die Öffnung der Aufträge nach den Bedingungen (Öffnung ist immer noch ein Müll, ich kann kaum verwalten, um sie zu öffnen ...),

Und erst recht der korrekteAbschluss von Aufträgen ... Was für eine Sauerei!

 
Vitaliy Medvedev:

Es ist alles klar, ich habe die Bedingungen ausgearbeitet, aber die Eröffnung von Aufträgen nach den Bedingungen, (die Eröffnung ist immer noch ein Unsinn, die Eröffnung, mit ein wenig Kampf...),

Und erst recht der korrekteAbschluss von Aufträgen ... Was für eine Sauerei!

Wenn Sie wissen, welchen Auftrag Sie abschließen wollen, schließen Sie ihn anhand seiner Ticketnummer ab.
 
Vitaliy Medvedev:

Es ist alles klar, ich habe die Bedingungen ausgearbeitet, aber die Eröffnung von Aufträgen nach den Bedingungen, (die Eröffnung ist immer noch ein Unsinn, die Eröffnung, mit ein wenig Kampf...),

Und erst recht der korrekteAbschluss von Aufträgen ... Was für eine Sauerei!

Hier ist, wie es mir aus dem Herzen gerissen wurde...

int Total_orders(int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderType()!=type)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      n++;
     }
   return(n);
  }
//+------------------------------------------------------------------+
void OrderOpen(int type,double sl)
  {
   double price=0.0;
   double lot;

   if(error>1)return;
   if(type==WRONG_VALUE) return;

   if(Risk!=0.0)lot=LotNormalize(LotVolume(Risk,sl));
   else lot=LotNormalize(Lot);

   do
     {
      if(type==OP_BUY)
        {
         RefreshRates();
         price=NormalizeDouble(Ask,_Digits);
         if(AccountFreeMarginCheck(_Symbol,type,lot)<=0)return;
        }
      if(type==OP_SELL)
        {
         RefreshRates();
         price=NormalizeDouble(Bid,_Digits);
         if(AccountFreeMarginCheck(_Symbol,type,lot)<=0)return;
        }

      int Ticket=OrderSend(_Symbol,type,lot,price,10000,0,0,CommentOrder,Magic);
      if(Ticket>0)
        {
         error=Fun_Error(_Symbol,GetLastError());
         Alert(__FUNCTION__,": open order ",StrToType(type)," ",_Symbol," :",Ticket);
        }
      else error=Fun_Error(_Symbol,GetLastError());
     }
   while(error==1 && !IsStopped());

  }
//+------------------------------------------------------------------+
void Order_Close(int type)
  {
   double price=0.0;
   int total=OrdersTotal();
   if(error>1)return;

   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderType()!=type)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      do
        {
         if(OrderType()==OP_BUY)
           {
            RefreshRates();
            price=NormalizeDouble(Bid,_Digits);
           }
         if(OrderType()==OP_SELL)
           {
            RefreshRates();
            price=NormalizeDouble(Ask,_Digits);
           }
         int res=OrderClose(OrderTicket(),OrderLots(),price,10000);
         if(res)
           {
            Alert(__FUNCTION__,": close order ",StrToType(OrderType())," ",OrderSymbol()," :",OrderTicket());
            error=Fun_Error(_Symbol,GetLastError());
           }
         else error=Fun_Error(_Symbol,GetLastError());
        }
      while(error==1 && !IsStopped());
     }
  }
//+------------------------------------------------------------------+
void ModifySL(int Stop_Loss)
  {
   if(Stop_Loss<=0)return;
   double sl=0.0;
   bool res;

   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderStopLoss()!=0)continue;
      if(OrderType()==OP_BUY)  sl=NormalizeDouble(OrderOpenPrice()-(New_Stop(Stop_Loss)*_Point),_Digits);
      if(OrderType()==OP_SELL) sl=NormalizeDouble(OrderOpenPrice()+(New_Stop(Stop_Loss)*_Point),_Digits);
      res=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
      if(!res)Print(__FUNCTION__,": Error modifying StopLoss order ",StrToType(OrderType())," № - ",GetLastError()," ",OrderSymbol()," ",OrderTicket());
     }
  }
//+------------------------------------------------------------------+
void ModifyTP(int Take_Profit)
  {
   if(Take_Profit<=0)return;
   double tp=0.0;
   bool res;

   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderTakeProfit()!=0)continue;
      if(OrderType()==OP_BUY) tp=NormalizeDouble(OrderOpenPrice()+(New_Stop(Take_Profit)*_Point),_Digits);
      if(OrderType()==OP_SELL) tp=NormalizeDouble(OrderOpenPrice() -(New_Stop(Take_Profit)*_Point),_Digits);
      res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0);
      if(!res)Print(__FUNCTION__,": Error modifying TakeProfit order ",StrToType(OrderType())," № - ",GetLastError()," ",OrderSymbol()," ",OrderTicket());
     }
  }
//+------------------------------------------------------------------+
double LotVolume(double procent,double sl)
  {
   double lot=0.0;
   double tv=MarketInfo(_Symbol,MODE_TICKVALUE);
   double minlot=MarketInfo(_Symbol,MODE_MINLOT);
   double maxlot=MarketInfo(_Symbol,MODE_MAXLOT);

   if(sl!=0 && tv!=0) lot=(AccountFreeMargin()*procent)/(sl*tv*100.0);

   if(lot < minlot)lot = minlot;
   if(lot > maxlot)lot = maxlot;
   return(lot);
  }
//+------------------------------------------------------------------+
double LotNormalize(double lot)
  {
   double minlot=MarketInfo(_Symbol,MODE_MINLOT);
   double maxlot=MarketInfo(_Symbol,MODE_MAXLOT);

   if(lot < minlot)lot = minlot;
   if(lot > maxlot)lot = maxlot;

   if(minlot==0.001) return(NormalizeDouble(lot,3));
   if(minlot==0.01)  return(NormalizeDouble(lot,2));
   if(minlot==0.1)   return(NormalizeDouble(lot,1));

   return(NormalizeDouble(lot,0));
  }
//+------------------------------------------------------------------+
string StrToType(int type)
  {
   if(type==OP_BUY)return("Buy");
   if(type==OP_SELL)return("Sell");
   return(NULL);
  }
//+------------------------------------------------------------------+
int New_Stop(int Parametr)
  {
   int Min_Dist=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
   if(Parametr<Min_Dist)
     {
      Parametr=Min_Dist*2+(int)MarketInfo(_Symbol,MODE_SPREAD);
      Alert(_Symbol," Увеличина дистанция стоп-приказа.");
     }
   return(Parametr);
  }
//+------------------------------------------------------------------+
int Fun_Error(string symbol,int Error)
  {
   switch(Error)
     {
      case 0:return(0);
      case 1:Alert(symbol," ",Error,":No error returned, but the result is unknown");return(2);
      case 2:Alert(symbol," ",Error,":Common error");return(2);
      case 3:Alert(symbol," ",Error,":Invalid trade parameters");return(2);
      case 4:Alert(symbol," ",Error,":Trade server is busy");Sleep(3000);return(1);
      case 5:Alert(symbol," ",Error,":Old version of the client terminal");return(2);
      case 6:Alert(symbol," ",Error,":No connection with trade server");Sleep(3000);return(1);
      case 7:Alert(symbol," ",Error,":Not enough rights");return(2);
      case 8:Alert(symbol," ",Error,":Too frequent requests");return(2);
      case 9:Alert(symbol," ",Error,":Malfunctional trade operation");return(2);
      case 64:Alert(symbol," ",Error,":Account disabled");return(2);
      case 65:Alert(symbol," ",Error,":Invalid account");return(2);
      case 128:Alert(symbol," ",Error,":Trade timeout");return(1);
      case 129:Alert(symbol," ",Error,":Invalid price");return(2);
      case 130:Alert(symbol," ",Error,":Invalid stops");return(2);
      case 131:Alert(symbol," ",Error,":Invalid trade volume");return(2);
      case 132:Alert(symbol," ",Error,":Market is closed");Sleep(10000);return(1);
      case 133:Alert(symbol," ",Error,":Trade is disabled");return(2);
      case 134:Alert(symbol," ",Error,":Not enough money");return(2);
      case 135:Alert(symbol," ",Error,":Price changed");return(1);
      case 136:Alert(symbol," ",Error,":Off quotes");Sleep(3000);return(1);
      case 137:Alert(symbol," ",Error,":Broker is busy");Sleep(3000);return(1);
      case 138:Alert(symbol," ",Error,":Requote");return(1);
      case 139:Alert(symbol," ",Error,":Order is locked");Sleep(10000);return(1);
      case 140:Alert(symbol," ",Error,":Buy orders only allowed");return(2);
      case 141:Alert(symbol," ",Error,":Too many requests");return(2);
      case 145:Alert(symbol," ",Error,":Modification denied because order is too close to market");Sleep(10000);return(1);
      case 146:Alert(symbol," ",Error,":Trade context is busy");Sleep(3000);return(1);
      case 147:Alert(symbol," ",Error,":Expirations are denied by broker");return(2);
      case 148:Alert(symbol," ",Error,":The amount of open and pending orders has reached the limit set by the broker");return(2);
      case 149:Alert(symbol," ",Error,":An attempt to open an order opposite to the existing one when hedging is disabled");return(2);
      case 150:Alert(symbol," ",Error,":An attempt to close an order contravening the FIFO rule");return(2);
      default:Alert(symbol,":Error - № ",Error);return(2);
     }
   return(0);
  }
 
Sergey Gritsay:

So bekomme ich es aus meinem Herzen.

Oh... Ach was! Ich habe das nicht oft gemacht...! Ja, nun... Jetzt weiß ich, warum die Dinge nicht so funktionieren, wie sie sollten.

Vielen Dank, menschlich.


 
Sergey Gritsay:

Halte es, als käme es von meinem Herzen.

Darf ich fragen, warum Sie das tun?

int total=OrdersTotal();

 
Vasyl Nosal:

Darf ich fragen, warum das so ist?

int total=OrdersTotal();

Denn während die Schleife ausgeführt wird, könnte sich der Wert vonOrdersTotal(); ändern und Sie könnten eine Bestellung übersehen oder der Schleifenkörper könnte ausfallen
Grund der Beschwerde: