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

 

¡Buenas tardes!

¿Pueden decirme si la compilación del código se puede establecer en el propio código? Gracias.

 

Estoy mostrando los parámetros del ratón y la etiqueta de precio de 4 dígitos en los comentarios cuando se hace clic en la rueda.

Mientras la rueda está presionada, el marcador corre detrás del cursor, pero no puedo hacer que ocurra lo mismo cuando se suelta la rueda antes de presionar el ratón en la LK.

Ayúdame a resolver esto.


//+------------------------------------------------------------------+ 
//| Expert initialization function                                   | 
//+------------------------------------------------------------------+ 
void OnInit() 
  { 
//--- включение сообщений о перемещении мыши по окну чарта 
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1); 
//--- принудительное обновление свойств графика гарантирует готовность к обработке событий 
   ChartRedraw(); 
  } 
//+------------------------------------------------------------------+ 
//| MouseState                                                       | 
//+------------------------------------------------------------------+ 

string xlabel="Bid";
input color xcolor = clrCrimson;

string MouseState(uint state) 
  { 
   string res; 
   res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // mouse left 
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // mouse right  
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // mouse middle 
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // mouse first X key 
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // mouse second X key 
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // shift key 
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control key 
   res+="\nBID" + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_BID), _Digits-1);
   return(res); 
  }
   
//+------------------------------------------------------------------+ 
//| ChartEvent function                                              | 
//+------------------------------------------------------------------+ 
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) 
  { 
  
int x=(int)lparam; 
int y=(int)dparam; 
datetime dt    =0; 
double   price =0;
int      window=0;

   if(id==CHARTEVENT_MOUSE_MOVE) 
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam)); 

   if(sparam =="16")
      {
         
      if(!ObjectCreate(0, xlabel, OBJ_LABEL,0, 0, 0));
      //ObjectCreate(0, xlabel, OBJ_LABEL,0, 0, 0);
      ObjectSetInteger(0, xlabel, OBJPROP_XDISTANCE, 100);
           ObjectSetInteger(0, xlabel, OBJPROP_YDISTANCE, dparam+7);
      ChartXYToTimePrice(0,x,y,window,dt,price);
      ObjectSetString(0, xlabel, OBJPROP_TEXT, DoubleToString(price, _Digits-1));
      }
      
      
  /*  while(sparam !="1")
      {
         ObjectMove(0,xlabel,0,lparam,dparam+7);      
      }
  */
  }
  
void OnDeinit(const int reason) 
   { 
      Comment("");
      ObjectDelete(0,xlabel);
   } 
 
psyman:

Estoy mostrando los parámetros del ratón y la etiqueta de precio de 4 dígitos en los comentarios cuando se hace clic en la rueda.

Mientras la rueda está pulsada, el marcador se sitúa detrás del cursor, pero no consigo que ocurra lo mismo cuando se suelta la rueda antes de pulsar el ratón en la LK.

eliminar (comentado)
// if(sparam =="16")

 
Taras Slobodyanik:

eliminar (comentado)
// if(sparam =="16")


Entonces el marcador está en la pantalla todo el tiempo, mientras que usted quiere que aparezca sólo cuando pulse la rueda.



PS

Su respuesta me ha dado la razón gracias :-)

 
psyman:

Estoy mostrando los parámetros del ratón y la etiqueta de precio de 4 dígitos en los comentarios cuando se hace clic en la rueda.

Mientras la rueda esté pulsada, el marcador se sitúa detrás del cursor, pero no consigo que ocurra lo mismo cuando se suelta la rueda antes de pulsar el ratón en la LK.

Ayúdame a resolver esto.


if(label)
{
   //применение изменяющихся параметров(перемещение и прочее)
}
if(sparam =="16")
{
   label = true;
   //создание метки и настройка неизменяющихся параметров метки
}
if(sparam =="1") // или какой там символ у ЛК мыши
{
   label = false;
   //удаление/скрытие метки, если нужно
}

la etiqueta es de tipo bool

 
Ilya Prozumentov:

la etiqueta es de tipo bool

¿Puedo moverlo antes de crear la etiqueta?


Ahora tengo otra pregunta: quiero colocar una etiqueta a la derecha de la pantalla, esto se calcula en OnCalculate

int width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);

ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width); 

Print(width);

De alguna manera resulta estar en la posición más a la izquierda, mientras que el mismo cálculo en OnChartEvent para otro marcador da un resultado correcto.

¿Por qué provoca la inversión de la cuenta atrás?

 
psyman:

¿Se puede hacer el traslado antes de crear el marcador?


Ahora tengo otra pregunta: quiero mover un marcador a la derecha de la pantalla, esto se calcula en OnCalculate

Parece estar en la posición más a la izquierda por alguna razón. Pero el mismo cálculo en OnChartEvent para otro marcador da un resultado correcto.

¿Por qué se produce la inversión de la cuenta atrás?

La etiqueta se establece inicialmente en falso, por lo que el fragmento de código con el marcador en movimiento no se ejecutará. Pero aunque se ejecute antes de crear la etiqueta no pasará nada, el programa seguirá ejecutándose y la etiqueta que se cree después no se verá afectada.

Observe el punto de an claje, diferentes puntos de anclaje causarán diferentes resultados. Inmediatamente puedes probar a escribir 0 en lugar de ancho y si se comporta como debería, significa que era una cuestión de puntos de anclaje.

OBJ_LABEL - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
OBJ_LABEL - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
Следующий скрипт создает и перемещает на графике объект "Текстовая метка". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах. //| Создает текстовую метку                                          |...
 
Ilya Prozumentov:

se establece inicialmente en falso, por lo que el fragmento de código para mover la etiqueta no se ejecutará. Pero aunque se ejecute antes de crear la etiqueta, no pasará nada, el programa seguirá ejecutándose y la etiqueta que se cree después no se verá afectada.

Observe el punto de an claje, diferentes puntos de anclaje causarán diferentes resultados. Inmediatamente puedes probar a escribir 0 en lugar de ancho y si se comporta como se espera, significa que el problema estaba en los puntos de anclaje.

No tengo puntos de anclaje, sólo me muevo verticalmente, y fijo el horizonte una vez, a lo ancho de la pantalla. No es un problema contar desde el otro lado, pero es sorprendente que la misma acción se realice de forma diferente en distintas funciones.


Y una pregunta más - si la oferta se muestra como el texto de la etiqueta, ¿qué función debo utilizar para hacerlo de manera óptima -OnChartEvent oOnCalculate?

 
novichok2018:

¡Buenas tardes!

¿Pueden decirme si la compilación del código puede establecerse en el propio código? Gracias.

Esto puede ser una pregunta tonta ya que nadie está respondiendo, pero ¿cómo puedo lidiar con el EA detener y reanudar después de la compilación?

La plataforma da el mensaje:array fuera de rango (284,17).

línea 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); laposición 17 abre un corchete con NomNews, que se inicia globalmente con 0.

He cambiado el 0 por el 1 sin resultado.
He cambiado lalínea if(NomNews==300)break; 300 a 360000, sin éxito.

Lo compilo y funciona bien durante unos minutos. ¿Y qué hacer?

 
novichok2018:

Esto puede ser una pregunta tonta, ya que nadie está respondiendo, pero ¿cómo puedo lidiar con el EA detener y reanudar después de la compilación?

La plataforma da el mensaje:array fuera de rango (284,17).

Línea 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); laposición 17 abre un corchete con NomNews, que se inicia globalmente con 0.

He cambiado el 0 por el 1 sin resultado.
He cambiado lalínea if(NomNews==300)break; 300 a 360000, sin éxito.

Lo compilo y funciona bien durante unos minutos. ¿Y qué hacer?

¿Cuál es la dimensionalidad de la matriz NewsArr en la segunda dimensión?
Razón de la queja: