Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 518

 
Sergey Gritsay:

Esta es otra opción utilizando la clase

Resultado de la prueba

Muchas gracias, Sergei. Si lo he entendido bien:
En el primer caso, se crea una matriz de variables estáticas, cada una para su propio símbolo con un marco temporal fijo, es decir, no se puede utilizar ningún otro marco temporal para ese símbolo;
En el segundo caso, una clase para cada combinación de símbolo + plazo.
 
MikeZv:
Muchas gracias, Sergei. Si lo he entendido bien:
En el primer caso, se crea una matriz de variables estáticas, cada una para su propio símbolo con un marco temporal fijo, es decir, no se puede utilizar ningún otro marco temporal para ese símbolo;
En el segundo caso, una clase para cada combinación de símbolo+fotograma.
Sí, claro, pero si piensas un poco, puedes sustituir el array unidimensional por uno bidimensional en la variante del array.
 
Una pregunta así. ¿Alguien ha visto en algún sitio un código de plantilla para abrir, comprobar y cerrar órdenes, sin una condición de apertura y cierre? Voy a intentar escribir una condición yo mismo, pero error tras error cuando empiezo a escribir una orden de cierre... Especialmente, soy malo en la búsqueda y comprobación de las órdenes para cerrar.
 
Vitaliy Medvedev:
He aquí una pregunta. ¿Alguien más ha visto el código de la plantilla para la apertura, comprobación y cierre de las órdenes sin ninguna condición para la apertura y el cierre? Intenté escribir una condición yo mismo, pero cuando empiezo a escribir un error de orden de cierre... Especialmente, soy malo para encontrar y revisar las órdenes para cerrarlas.

No es de extrañar que no funcione bien. Al fin y al cabo, si no hay condiciones de cierre, la búsqueda y comprobación de dichas órdenes debería ser en plan: encuentra esto, no sé qué, y ciérralo.

Primero debe definir las condiciones para elegir la orden que se va a cerrar, y luego será mucho más fácil analizarla. Al fin y al cabo, si hay algún malentendido, sólo tendremos que comprobar que se cumplen las condiciones conocidas.

 
Yury Reshetov:

No es de extrañar que no funcione bien. Si no tenemos condiciones de cierre, entonces la búsqueda y comprobación de dichas órdenes debería tener el siguiente espíritu: encontrar algo y cerrarlo.

En primer lugar, decida las condiciones de selección de pedidos para el cierre, y luego será más fácil resolverlo. Si hay algún malentendido, sólo tendremos que comprobar si las condiciones que conocemos con seguridad son correctas.

Todo esto está claro, he definido las condiciones, pero la apertura de las órdenes según las condiciones (la apertura sigue siendo una porquería, apenas consigo abrirlas...),

Y más aún, elcierre correctode los pedidos ... ¡Qué lío!

 
Vitaliy Medvedev:

Está todo claro, he resuelto las condiciones, pero la apertura de las órdenes según las condiciones, (la apertura sigue siendo un sinsentido, la apertura, con dificultad...),

Y más aún, elcierre correctode los pedidos ... ¡Qué lío!

Si sabe qué orden ha elegido para cerrar, entonces ciérrela por su número de ticket.
 
Vitaliy Medvedev:

Está todo claro, he resuelto las condiciones, pero la apertura de las órdenes según las condiciones, (la apertura sigue siendo un despropósito, la apertura, con un poco de lucha...),

Y más aún, elcierre correctode los pedidos ... ¡Qué lío!

Así es como se arranca de mi corazón...

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:

Esto es lo que me sale del corazón.

Oh... ¡No me digas! ¡No he hecho esto mucho...! Sí, bueno... Ahora sé por qué las cosas no funcionan como deberían.

Muchas gracias, humanamente.


 
Sergey Gritsay:

Sosténgalo como si fuera de mi corazón.

¿Puedo preguntar por qué lo hace?

int total=Total de pedidos();

 
Vasyl Nosal:

¿Puedo preguntar por qué se hace esto?

int total=Total de pedidos();

Porque mientras se ejecuta el bucle, el valor deOrdersTotal(); podría cambiar y podría perderse un pedido o el cuerpo del bucle podría fallar