Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 434

 
WinProject:

Por favor, dígame cómo eliminar un objeto gráfico. Hay líneas verticales cuyos nombres se construyen a partir de los valores de las variables.

string name=="test1"; string Vertline="line_"+name; ObjectCreate(0,VertLine,OBJ_VLINE,0,time,cena); ¿Cómo puedo borrar sólo las líneas verticales con el nombre test1?


Esta función puede resultarle útil:

Elimina todos los objetos del tipo especificado por el prefijo del nombre en la subventana.

intObjetosBorrarTodo(
longchart_id,// ID del gráfico
const stringprefix,// prefijo del nombre del objeto
intsub_window=EMPTY,// índice de la ventana
intobject_type=EMPTY//tipo de objeto a eliminar
);

 
Vladislav Andruschenko:


puede encontrar esta función útil:

Elimina todos los objetos del tipo especificado por el prefijo del nombre en la subventana del gráfico.

intObjectsDeleteAll(
longchart_id,//identificador del gráfico
const stringprefix,// prefijonombre del objeto
intsub_window=EMPTY,// índice de la ventana
intobject_type=EMPTY// tipo de objeto a eliminar
);


Gracias, por lo que entiendo esta función entiende el prefijo como la primera subcadena del nombre del objeto, pero ¿cómo borrar por la segunda subcadena del nombre del objeto? ¿Hay alguna manera de utilizar StringSubstr y StringFind al nombre del objeto para este propósito?

 
WinProject:

Gracias, por lo que he entendido, por el prefijo esta función entiende la primera subcadena del nombre del objeto, pero ¿cómo borrar por la segunda subcadena del nombre del objeto? ¿Hay alguna manera de utilizar StringSubstr y StringFind al nombre del objeto para este propósito?


Espera,

Ha especificado el código:

string Vertline="линия_"+name; 


Donde tiene un prefijo.

Eso es lo que hace todo el mundo.

Por eso te he sugerido la función de borrar objetos por prefijo.


"линия_"

Si necesita eliminar una línea por sufijo, puedeutilizar StringFind para buscar todos los objetos

por ejemplo:

void ObjectsDelete()
  {
string NameEA="суффикс";
   for(int i=ObjectsTotal();i>=0;i--)
     {
      if(StringFind(ObjectName(i),NameEA)!=-1)ObjectDelete(ObjectName(i));
     }
  }
 

Gracias Vladislav, todo funciona, con tal ayuda de los miembros del foro, MQL es mucho más interesante. Interesante página web la suya, ¡gracias!

 

Hola. Por favor, ayúdenme a averiguar por qué deja de rastrear después de que aparezcan las posiciones.

La cuestión es la siguiente: abrir dos posiciones 1, 2. a un precio la primera se cierra por arrastre, la segunda se activa con la condición de que al precio de apertura de la posición, la posición sea una.

Todo funciona bien, la posición 1 se cierra, la posición 2 se arrastra, pero cuando se abren otras dos posiciones 3 y 4 a precios diferentes, la red de arrastre no pasa a la posición 2.

¿Por qué deja de arrastrar?

void Tral_SL_one(int _TrailingStop=0,int _TrailingStep=0)
  {
   if(_TrailingStop<=0)
      return;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)))
         continue;
      if(OrderSymbol()!=Symbol())
         continue;
      if(OrderMagicNumber()!=_MagicNumber)
         continue;
      if(OrderType()==OP_BUY)
        {
         if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)
           {
            if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(_TrailingStop *Point,Digits))
              {
               if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid -(_TrailingStop+_TrailingStep-1)*Point,Digits) || OrderStopLoss()==0)
                 {
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-_TrailingStop*Point,Digits),OrderTakeProfit(),OrderExpiration()));
                   
                 }
              }
           }
        }

      if(OrderType()==OP_SELL)
        {

         if(NumPosByPrice(Symbol(),OP_SELL,OrderOpenPrice(),_MagicNumber)==1)
           {
            if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(_TrailingStop *Point,Digits))
              {
               if(NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(_TrailingStop+_TrailingStep-1)*Point,Digits) || OrderStopLoss()==0)
                 {
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+_TrailingStop*Point,Digits),OrderTakeProfit(),OrderExpiration()));
                    
                 }
              }
           }
        }
     }
  }
//===
int NumPosByPrice(string sy="",int op=-1,double pp=0,int mn=-1) 
  {
   double px,py;
   int    d,i,k=OrdersTotal(),num=0;

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(mn<0 || OrderMagicNumber()==mn) 
                 {
                  d=MarketInfo(OrderSymbol(),MODE_DIGITS);
                  px=NormalizeDouble(pp, d);
                  py=NormalizeDouble(OrderOpenPrice(), d);
                  if(pp<=0 || px==py) num++;
                 }
              }
           }
        }
     }
   return(num);
  }
 
mila.com:

Hola. Por favor, ayúdenme a averiguar por qué deja de rastrear después de que aparezcan las posiciones.

La cuestión es la siguiente: abrir dos posiciones 1, 2. a un precio la primera se cierra por arrastre, la segunda se activa con la condición de que al precio de apertura de la posición, la posición sea una.

Todo funciona bien, la posición 1 se cierra, la posición 2 se arrastra, pero cuando se abren otras dos posiciones 3 y 4 a precios diferentes, la red de arrastre no pasa a la posición 2.

¿Por qué deja de arrastrar?


Sólo señalaría un grave error.

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)))
         continue;
      if(OrderSymbol()!=Symbol())
         continue;
      if(OrderMagicNumber()!=_MagicNumber)
         continue;
      if(OrderType()==OP_BUY)
        {
         if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)


Se recorren las órdenes y luego se ejecuta la función contando el número de posiciones, seleccionando así otra posición en la funciónNumPosByPrice

por lo que la construcción posterior

 if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(_TrailingStop *Point,Digits))


no funcionará correctamente.


hay muchas maneras de resolver esto.

Por ejemplo:

void Tral_SL_one(int _TrailingStop=0,int _TrailingStep=0)
  {
   if(_TrailingStop<=0)
      return;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)))
         continue;
      if(OrderSymbol()!=Symbol())
         continue;
      if(OrderMagicNumber()!=_MagicNumber)
         continue;
      if(OrderType()==OP_BUY)
        {
         if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)
           {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(_TrailingStop *Point,Digits))


Aunque esto es fundamentalmente erróneo, servirá para una rápida comprensión.

después:


if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)

añadir :

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
 
Vladislav Andruschenko:


Me limitaré a señalar el craso error.

Hay muchas maneras de resolver esto.

Gracias, ya veo, arrastre)

 

Me pueden decir como reabrir la ventana de alertas en mt4, antes tenía un script que creaba una señal falsa y abría la ventana de alertas, ahora después de reinstalar el sistema no lo encuentro en internet. ¿Tal vez alguien tenga uno?

 
amenrazp:

Me pueden decir como reabrir la ventana de alertas en mt4, antes tenía un script que creaba una señal falsa y abría la ventana de alertas, ahora después de reinstalar el sistema no lo encuentro en internet. ¿Tal vez alguien tenga uno?

Alert(""); ¿un script de este tipo?
 
Vladislav Andruschenko:
Alert(""); ¿un script de este tipo?

Eso parece. ¿Tiene una forma de adjuntarlo aquí?

Razón de la queja: