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

 
Vitaly Muzichenko:

Me podéis decir cómo seleccionar un objeto cuando se crea, para que no pierda la selección y no se seleccione cuando el usuario lo deseleccione. Fue fácil en el cuarto, pero no funciona en el quinto.

Solía serlo, y funcionaba bien:

void SetHLine(...,double p,bool sel) {
  if(ObjectFind(chart_ID,nm)!=0) {
    ObjectCreate(chart_ID,nm,OBJ_HLINE,0,0,0);
    ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
    ...
  }
   ObjectSetDouble(chart_ID,nm,OBJPROP_PRICE,p);
}

Como puedes ver, al crear, podemos seleccionar o no seleccionar el objeto que se está creando a la vez y ya no cambiará y no habrá referencia a él, pero no funciona en la quinta, la crea sin selección.

Cómo hacer mql5 para que el objeto pueda ser seleccionado en la creación y luego gestionado manualmente cuando sea necesario - para seleccionar / no seleccionar

OBJPROP_SELECTABLE
 

Bueno, lo es, pero el icono no destaca

void SetArrow(string nm,string tooltxt="",datetime t=0,double p=0,color col=clrRed,long type=0) {
if(ObjectFind(0,nm)!=0) {
    ObjectCreate(0,nm,type==0?OBJ_ARROW_BUY:OBJ_ARROW_SELL,0,0,0);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,true);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetString(0,nm,OBJPROP_TOOLTIP,tooltxt);
   }
    ObjectSetDouble(0,nm,OBJPROP_PRICE,p);
    ObjectSetInteger(0,nm,OBJPROP_TIME,t);
}
 
Vitaly Muzichenko:

Pues sí, pero el icono no está resaltado

void SetArrow(string nm,string tooltxt="",datetime t=0,double p=0,color col=clrRed,long type=0) {
if(ObjectFind(0,nm)!=0) {
    ObjectCreate(0,nm,type==0?OBJ_ARROW_BUY:OBJ_ARROW_SELL,0,0,0);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,true);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetString(0,nm,OBJPROP_TOOLTIP,tooltxt);
   }
    ObjectSetDouble(0,nm,OBJPROP_PRICE,p);
    ObjectSetInteger(0,nm,OBJPROP_TIME,t);
}

Todo está resaltado:

Destacando

Archivos adjuntos:
OBJ_ARROW.mq5  22 kb
 
Vladimir Karputov:

Todo destaca:

Mierda, he descartado una función y he comprobado otra, todo funciona. Gracias. Me voy a la cama)
 

Me he dado cuenta de una característica extraña, si lo configuras así, las líneas no se resaltan al crear

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);

Pero si se hace lo contrario, entonces no hay problema de selección:

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

Por alguna razón, la sustitución de los sumandos cambia la suma?

 
Vitaly Muzichenko:

Me he dado cuenta de una característica extraña, si lo configuras así, las líneas no se resaltan al crear

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);

Pero si es al revés, no hay problema de selección:

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

Por alguna razón, la sustitución de los sumandos cambia la suma?

Aparentemente, cuando

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

último comando, el gráfico se actualiza

 
Vitaly Muzichenko:

Me he dado cuenta de una característica extraña, si lo configuras así, las líneas no se resaltan al crear

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);

Pero si se hace lo contrario, entonces no hay problema de selección:

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

Por alguna razón, la sustitución de los sumandos cambia la suma?

Inicialmente, cuando se crea un objeto, probablemente se establece su propiedad por defecto como no seleccionable.

Entonces lo seleccionas (pero el objeto no es seleccionable), en consecuencia no se selecciona nada

Entonces, lo pones como seleccionable. Pero es "demasiado tarde para beber el borjomi" ...
 

Así que aquí está el código completo:

void SetVLine(long chart_ID=0,string nm="nm",datetime tm=0,int wd=1,int st=0,color cl=clrRed,
                                             string tooltxt="",bool sel=false,bool back=false) {
if(ObjectFind(chart_ID,nm)<0) {
    ObjectCreate(chart_ID,nm,OBJ_VLINE,0,tm,0);
    ObjectSetInteger(chart_ID,nm,OBJPROP_TIME,tm);
    ObjectSetInteger(chart_ID,nm,OBJPROP_BACK,back);
    ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
  // ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
    ObjectSetString(chart_ID,nm,OBJPROP_TOOLTIP,tooltxt);
    ObjectSetInteger(chart_ID,nm,OBJPROP_COLOR,cl);
    ObjectSetInteger(chart_ID,nm,OBJPROP_WIDTH,wd);
    ObjectSetInteger(chart_ID,nm,OBJPROP_STYLE,st);
   }
}

Sí, lo he comprobado dos veces en todos los tipos de objetos, y hay que poner primero"SELECTABLE" y luego"SELECTED"

¡Gracias por su participación y ayuda para resolverlo!

 
En MetaTrader5 es posible generar un EA en 3 bloques. 1 bloque da señales de un indicador o de varios indicadores. 2 barras de arrastre en bloque. 3 riesgos en bloque.

Puedo sugerir 1. ¿Puedo añadir indicadores personalizados en 1 bloque? En caso afirmativo, ¿cómo debo hacerlo?

2. ¿es posible corregir el código para que las operaciones se abran en ambas direcciones (ahora, por ejemplo, si se abre una operación de compra, la de venta no se abre hasta que se cierra la de compra)?
 
Los comentarios no relacionados con este tema han sido trasladados a "Preguntas de los principiantes de MQL4 MT4 MetaTrader 4".
Razón de la queja: