Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 736

 

Buon pomeriggio!

Potete dirmi se la compilazione del codice può essere impostata nel codice stesso? Grazie.

 

Sto visualizzando i parametri del mouse e il cartellino del prezzo a 4 cifre nei commenti quando la ruota viene cliccata.

Mentre la rotella è premuta, il marcatore scorre dietro il cursore, ma non riesco a far accadere la stessa cosa quando la rotella viene rilasciata prima che il mouse sia premuto sulla LK.

Aiutami a capire questo.


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

Sto visualizzando i parametri del mouse e il cartellino del prezzo a 4 cifre nei commenti quando la ruota viene cliccata.

Finché la rotella è premuta, il marcatore scorre dietro il cursore, ma non riesco a far accadere la stessa cosa quando la rotella viene rilasciata prima che il mouse sia premuto sulla LK.

rimuovere (commentato)
// se(sparam =="16")

 
Taras Slobodyanik:

rimuovere (commentato)
// se(sparam =="16")


Allora l'indicatore è sullo schermo per tutto il tempo, mentre tu vuoi che appaia solo quando premi la ruota.



PS

La tua risposta mi ha dato l'idea giusta grazie :-)

 
psyman:

Sto visualizzando i parametri del mouse e il cartellino del prezzo a 4 cifre nei commenti quando la ruota viene cliccata.

Finché la rotella è premuta, il marcatore scorre dietro il cursore, ma non riesco a fare lo stesso quando la rotella viene rilasciata prima che il mouse sia premuto sulla LK.

Aiutami a capire questo.


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

l'etichetta è di tipo bool

 
Ilya Prozumentov:

l'etichetta è di tipo bool

Posso spostarlo prima di creare l'etichetta?


Ora ho un'altra domanda: voglio mettere un'etichetta sul lato destro dello schermo, questo è calcolato in OnCalculate

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

ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width); 

Print(width);

In qualche modo risulta essere all'estrema sinistra, mentre lo stesso calcolo in OnChartEvent per un altro marcatore dà un risultato corretto.

Perché causa l'inversione del conto alla rovescia?

 
psyman:

Lo spostamento può essere fatto prima della creazione del marcatore?


Ora ho un'altra domanda: voglio spostare un marcatore sul lato destro dello schermo, questo è calcolato in OnCalculate

Sembra essere nella posizione più a sinistra per qualche motivo, ma lo stesso calcolo in OnChartEvent per un altro marcatore dà il risultato corretto.

Perché avviene l'inversione del conto alla rovescia?

L'etichetta è inizialmente impostata su false, quindi il frammento di codice con il marcatore in movimento non sarà eseguito. Ma anche se viene eseguito prima della creazione dell'etichetta non succederà nulla, il programma continuerà a funzionare e l'etichetta creata in seguito non sarà influenzata.

Guarda il punto di ancoraggio, punti di ancoraggio diversi causeranno risultati diversi. Potete subito provare a scrivere 0 al posto della larghezza e se si comporta come dovrebbe, significa che era una questione di punti di ancoraggio.

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

è inizialmente impostato su false, quindi il pezzo di codice per spostare l'etichetta non sarà eseguito. Ma anche se viene eseguito prima della creazione dell'etichetta, non succederà nulla, il programma continuerà a funzionare e l'etichetta che viene creata dopo non sarà influenzata.

Guarda il punto di ancoraggio, punti di ancoraggio diversi causeranno risultati diversi. Potete subito provare a scrivere 0 al posto della larghezza e se si comporta come previsto, significa che il problema era con i punti di ancoraggio.

Non ho punti di ancoraggio, mi muovo solo verticalmente, e imposto l'orizzonte una volta sola, per tutta la larghezza dello schermo. Non è un problema contare dall'altra parte, ma è sorprendente che la stessa azione sia eseguita in modo diverso nelle diverse funzioni.


E un'altra domanda - se Bid viene visualizzato come testo dell'etichetta, quale funzione dovrei usare per farlo in modo ottimale -OnChartEvent oOnCalculate?

 
novichok2018:

Buon pomeriggio!

Potete dirmi se la compilazione del codice può essere impostata nel codice stesso? Grazie.

Questa potrebbe essere una domanda stupida visto che nessuno sta rispondendo, ma come posso gestire l'arresto e la ripresa dell'EA dopo la compilazione?

La piattaforma dà il messaggio:array out of range (284,17).

linea 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); laposizione 17 apre una parentesi quadra con NomNews, che è iniziata globalmente da 0.

Ho cambiato 0 con 1 senza risultato.
Ho cambiato lalinea if(NomNews==300)break; 300 a 360000, senza risultato.

Lo compilo - funziona bene per qualche minuto. E cosa fare?

 
novichok2018:

Questa potrebbe essere una domanda stupida, visto che nessuno risponde, ma come posso gestire l'arresto e la ripresa dell'EA dopo la compilazione?

La piattaforma dà il messaggio:array out of range (284,17).

Linea 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); laposizione 17 apre una parentesi quadra con NomNews, che è iniziata globalmente da 0.

Ho cambiato 0 con 1 senza risultato.
Ho cambiato lalinea if(NomNews==300)break; 300 a 360000, senza risultato.

Lo compilo - funziona bene per qualche minuto. E cosa fare?

Qual è la dimensionalità dell'array NewsArr nella seconda dimensione?