Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 518

 
Sergey Gritsay:

Ecco un'altra opzione che usa la classe

Risultato del test

Grazie mille, Sergei! Se ho capito bene:
Nel primo caso, viene creato un array di variabili statiche, ognuna per il proprio simbolo con un timeframe fisso, cioè nessun altro timeframe può essere usato per quel simbolo;
Nel secondo caso, una classe per ogni combinazione di simbolo + timeframe.
 
MikeZv:
Grazie mille, Sergei! Se ho capito bene:
Nel primo caso, viene creato un array di variabili statiche, ognuna per il proprio simbolo con un timeframe fisso, cioè nessun altro timeframe può essere usato per quel simbolo;
Nel secondo caso, una classe per ogni combinazione di un simbolo + timeframe.
Sì, giusto, ma se ci pensate un po', potete sostituire l'array unidimensionale con uno bidimensionale nella variante dell'array.
 
Una tale domanda. Qualcuno ha visto da qualche parte un codice modello per aprire, controllare e chiudere gli ordini, senza una condizione di apertura e chiusura? Proverò a scrivere io stesso una condizione, ma errore su errore quando inizio a scrivere un ordine di chiusura... Soprattutto, non sono bravo a trovare e controllare gli ordini da chiudere.
 
Vitaliy Medvedev:
Ecco una domanda. Qualcuno ha visto da qualche parte il codice del template per l'apertura, il controllo e la chiusura degli ordini senza condizioni di apertura e chiusura? Ho provato a scrivere io stesso una condizione, ma quando inizio a scrivere un errore di chiusura su errore... Soprattutto, non sono bravo a trovare e controllare gli ordini per chiuderli.

Non è sorprendente che non funzioni bene. Dopo tutto, se non ci sono condizioni di chiusura, allora trovare e controllare tali ordini dovrebbe essere nello spirito di: trova questo, non so cosa, e chiudilo.

Dovresti prima definire le condizioni per scegliere l'ordine da chiudere, e poi sarà molto più facile analizzarlo. Dopo tutto, se c'è qualche malinteso, dovremo solo controllare la conformità con le condizioni conosciute.

 
Yury Reshetov:

Non è sorprendente che non funzioni bene. Se non abbiamo condizioni di chiusura, allora la ricerca e il controllo di tali ordini dovrebbe essere nel seguente spirito: trovare qualcosa e chiuderlo.

Per prima cosa, decidete le condizioni di selezione dell'ordine per la chiusura, e poi sarà più facile da sistemare. Se c'è qualche malinteso, dovremo solo controllare se le condizioni che conosciamo con certezza sono corrette.

Questo è tutto chiaro, ho definito le condizioni, ma l'apertura degli ordini secondo le condizioni (apertura è ancora una schifezza, riesco a malapena ad aprirli...),

E tanto più, lachiusura correttadegli ordini ... Che pasticcio!

 
Vitaliy Medvedev:

È tutto chiaro, ho elaborato le condizioni, ma l'apertura degli ordini secondo le condizioni, (l'apertura è ancora una sciocchezza, l'apertura, con un po' di fatica...),

E tanto più, lachiusura correttadegli ordini ... Che pasticcio!

Se sai quale ordine hai scelto di chiudere, allora chiudilo in base al suo numero di biglietto.
 
Vitaliy Medvedev:

È tutto chiaro, ho elaborato le condizioni, ma l'apertura degli ordini secondo le condizioni, (l'apertura è ancora una sciocchezza, l'apertura, con un po' di fatica...),

E tanto più, lachiusura correttadegli ordini ... Che pasticcio!

Ecco come è strappato dal mio cuore...

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:

Tienilo come se venisse dal mio cuore.

Oh... Ma non mi dire! Non l'ho fatto molto...! Sì, beh... Ora so perché le cose non funzionano come dovrebbero.

Grazie mille, umanamente.


 
Sergey Gritsay:

Tienilo come se venisse dal mio cuore.

Posso chiedervi perché lo fate?

int total=OrdersTotal();

 
Vasyl Nosal:

Posso chiedere perché si fa questo?

int total=OrdersTotal();

Perché mentre il ciclo viene eseguito, il valore diOrdersTotal(); potrebbe cambiare e potreste perdere un ordine o il corpo del ciclo potrebbe andare in tilt
Motivazione: