Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 736

 

Boa tarde!

Você pode me dizer se a compilação do código pode ser definida no próprio código? Obrigado.

 

Eu estou exibindo os parâmetros do mouse e a etiqueta de preço de 4 dígitos nos comentários quando a roda é clicada.

Enquanto a roda é pressionada, o marcador corre atrás do cursor, mas não posso fazer a mesma coisa quando a roda é solta antes que o mouse seja pressionado no LK.

Ajude-me a descobrir isso.


//+------------------------------------------------------------------+ 
//| 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:

Eu estou exibindo os parâmetros do mouse e a etiqueta de preço de 4 dígitos nos comentários quando a roda é clicada.

Enquanto a roda for pressionada, o marcador corre atrás do cursor, mas eu não posso fazer a mesma coisa quando a roda é solta antes que o mouse seja pressionado sobre o LK.

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

 
Taras Slobodyanik:

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


Então o marcador está na tela o tempo todo, enquanto você quer que ele apareça somente quando você pressiona a roda.



PS

Sua resposta me deu a idéia certa, obrigado :-)

 
psyman:

Eu estou exibindo os parâmetros do mouse e a etiqueta de preço de 4 dígitos nos comentários quando a roda é clicada.

Enquanto a roda é pressionada, o marcador corre atrás do cursor, mas não posso fazer a mesma coisa quando a roda é solta antes que o mouse seja pressionado no LK.

Ajude-me a descobrir isso.


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

é do tipo bool

 
Ilya Prozumentov:

é do tipo bool

Posso movê-lo antes de criar a etiqueta?


Agora tenho outra pergunta: quero colocar uma etiqueta no lado direito da tela, isto é calculado na OnCalculate

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

ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width); 

Print(width);

De alguma forma, ele acaba ficando na posição extrema esquerda, enquanto o mesmo cálculo no OnChartEvent para outro marcador dá um resultado correto.

Por que isso causa inversão de contagem regressiva?

 
psyman:

A mudança pode ser feita antes da criação do marcador?


Agora tenho outra pergunta: quero mover um marcador para o lado direito da tela, isto é calculado em OnCalculate

Mas o mesmo cálculo em OnChartEvent para outro marcador dá o resultado correto.

Por que acontece a inversão da contagem regressiva?

A etiqueta é inicialmente definida como falsa, portanto, o fragmento de código com marcador móvel não será executado. Mas mesmo que seja executado antes que a etiqueta seja criada nada acontecerá, o programa continuará a ser executado e a etiqueta que for criada mais tarde não será afetada.

Observe o ponto de ancoragem, diferentes pontos de ancoragem causarão resultados diferentes. Você pode imediatamente tentar escrever 0 em vez de largura e se ele se comportar como deveria, significa que foi uma questão de pontos de ancoragem.

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

A etiqueta é inicialmente definida como falsa, portanto, o pedaço de código para mover a etiqueta não será executado. Mas mesmo que seja executado antes da etiqueta ser criada, nada acontecerá, o programa continuará a ser executado e a etiqueta que for criada depois não será afetada.

Observe o ponto de ancoragem, diferentes pontos de ancoragem causarão resultados diferentes. Você pode imediatamente tentar escrever 0 em vez de largura e se ele se comportar como esperado, isso significa que o problema foi com os pontos de ancoragem.

Não tenho pontos de ancoragem, só me movo verticalmente, e estabeleço o horizonte uma vez, através da largura da tela. Não é um problema contar do outro lado, mas é surpreendente que a mesma ação seja realizada de forma diferente em funções diferentes.


E mais uma pergunta - se Bid é exibido como o texto do rótulo, qual função devo usar para fazê-lo de forma ideal -OnChartEvent ouOnCalculate?

 
novichok2018:

Boa tarde!

Você pode me dizer se a compilação do código pode ser definida no próprio código? Obrigado.

Esta pode ser uma pergunta tola já que ninguém está respondendo, mas como lidar com a parada e retomada da EA após a compilação?

A plataforma dá a mensagem:matriz fora do alcance (284,17).

linha 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); aposição 17 abre um colchete com o NomNews, que é iniciado globalmente por 0.

Mudei de 0 para 1 sem nenhum resultado.
Mudei alinha se (NomNews==300)quebrar; 300 a 360000, sem sucesso.

Eu o compenso - funciona bem por alguns minutos. E o que fazer?

 
novichok2018:

Esta pode ser uma pergunta tola, já que ninguém está respondendo, mas de que outra forma posso lidar com a parada e retomada da EA após a compilação?

A plataforma dá a mensagem:matriz fora do alcance (284,17).

Linha 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); aposição 17 abre um colchete com o NomNews, que é iniciado globalmente por 0.

Mudei de 0 para 1 sem nenhum resultado.
Mudei alinha se (NomNews==300)quebrar; 300 a 360000, sem sucesso.

Eu o compenso - funciona bem por alguns minutos. E o que fazer?

Qual é a dimensionalidade da matriz NewsArr na segunda dimensão?
Razão: