Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 736

 

Guten Tag!

Können Sie mir bitte sagen, ob die Codekompilierung im Code selbst eingestellt werden kann? Ich danke Ihnen.

 

Ich zeige die Mausparameter und das 4-stellige Preisschild in den Kommentaren an, wenn das Rad angeklickt wird.

Während das Rad gedrückt wird, läuft der Marker hinter dem Cursor, aber ich kann nicht erreichen, dass dasselbe passiert, wenn das Rad losgelassen wird, bevor die Maus auf dem LK gedrückt wird.

Helfen Sie mir, das zu verstehen.


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

Ich zeige die Mausparameter und das 4-stellige Preisschild in den Kommentaren an, wenn das Rad angeklickt wird.

Solange das Rad gedrückt ist, läuft der Marker hinter dem Cursor, aber ich kann das Gleiche nicht erreichen, wenn das Rad losgelassen wird, bevor die Maus auf dem LK gedrückt wird.

entfernen (auskommentiert)
// if(sparam =="16")

 
Taras Slobodyanik:

entfernen (auskommentiert)
// if(sparam =="16")


Dann ist die Markierung die ganze Zeit auf dem Bildschirm zu sehen, während sie nur erscheinen soll, wenn Sie das Rad drücken.



PS

Ihre Antwort hat mich auf die richtige Idee gebracht, danke :-)

 
psyman:

Ich zeige die Mausparameter und das 4-stellige Preisschild in den Kommentaren an, wenn das Rad angeklickt wird.

Solange das Rad gedrückt ist, läuft der Marker hinter dem Cursor, aber ich kann das Gleiche nicht erreichen, wenn das Rad losgelassen wird, bevor die Maus auf dem LK gedrückt wird.

Helfen Sie mir, das zu verstehen.


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

label ist vom Typ bool

 
Ilya Prozumentov:

label ist vom Typ bool

Kann ich sie verschieben, bevor ich das Etikett erstelle?


Jetzt habe ich eine weitere Frage: Ich möchte eine Beschriftung auf der rechten Seite des Bildschirms platzieren, diese wird in OnCalculate berechnet

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

ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width); 

Print(width);

Irgendwie stellt sich heraus, dass er sich an der äußersten linken Position befindet, während die gleiche Berechnung in OnChartEvent für eine andere Markierung ein korrektes Ergebnis liefert.

Warum kommt es zu einer Inversion des Countdowns?

 
psyman:

Kann der Umzug durchgeführt werden, bevor die Markierung erstellt wird?


Nun habe ich eine weitere Frage: Ich möchte eine Markierung auf die rechte Seite des Bildschirms verschieben, dies wird in OnCalculate berechnet

Aber die gleiche Berechnung in OnChartEvent für einen anderen Marker ergibt ein korrektes Ergebnis.

Warum erfolgt die Umkehrung des Countdowns?

Das Label ist zunächst auf false gesetzt, daher wird das Codefragment mit der sich bewegenden Markierung nicht ausgeführt. Aber auch wenn es ausgeführt wird, bevor das Etikett erstellt wird, passiert nichts, das Programm läuft weiter und das später erstellte Etikett wird nicht beeinflusst.

Achten Sie auf den Ankerpunkt, unterschiedliche Ankerpunkte führen zu unterschiedlichen Ergebnissen. Sie können sofort versuchen, 0 anstelle von width zu schreiben, und wenn es sich so verhält, wie es sollte, bedeutet das, dass es eine Frage der Ankerpunkte war.

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

label wird zunächst auf false gesetzt, so dass der Code zum Verschieben des Labels nicht ausgeführt wird. Aber auch wenn es ausgeführt wird, bevor das Etikett erstellt wird, passiert nichts, das Programm läuft weiter und das Etikett, das danach erstellt wird, wird nicht beeinflusst.

Achten Sie auf den Ankerpunkt, unterschiedliche Ankerpunkte führen zu unterschiedlichen Ergebnissen. Sie können sofort versuchen, 0 anstelle von width zu schreiben, und wenn es sich wie erwartet verhält, bedeutet das, dass das Problem bei den Ankerpunkten lag.

Ich habe keine Ankerpunkte, ich bewege mich nur vertikal, und ich setze den Horizont einmal über die gesamte Breite des Bildschirms. Es ist kein Problem, von der anderen Seite aus zu zählen, aber es ist überraschend, dass dieselbe Handlung in verschiedenen Funktionen unterschiedlich ausgeführt wird.


Und eine weitere Frage - wenn Bid als Beschriftungstext angezeigt wird, welche Funktion sollte ich verwenden, um es optimal zu tun -OnChartEvent oderOnCalculate?

 
novichok2018:

Guten Tag!

Können Sie mir bitte sagen, ob die Codekompilierung im Code selbst eingestellt werden kann? Ich danke Ihnen.

Dies kann eine dumme Frage sein, da niemand antwortet, aber wie sonst gehe ich mit dem EA stoppen und Wiederaufnahme nach der Kompilierung?

Die Plattform gibt die Meldung aus:array out of range (284,17).

Zeile 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);Position 17 öffnet eine eckige Klammer mit NomNews, die global durch 0 eingeleitet wird.

Ich habe 0 in 1 geändert, ohne Ergebnis.
Ich habe dieZeile if(NomNews==300)break; 300 in 360000 geändert, aber ohne Erfolg.

Ich kompiliere es und es funktioniert ein paar Minuten lang gut. Und was ist zu tun?

 
novichok2018:

Dies kann eine dumme Frage sein, da niemand antwortet, aber wie sonst gehe ich mit dem EA stoppen und Wiederaufnahme nach der Kompilierung?

Die Plattform gibt die Meldung aus:array out of range (284,17).

Zeile 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);Position 17 öffnet eine eckige Klammer mit NomNews, die global durch 0 eingeleitet wird.

Ich habe 0 in 1 geändert, ohne Ergebnis.
Ich habe dieZeile if(NomNews==300)break; 300 in 360000 geändert, aber ohne Erfolg.

Ich kompiliere es und es funktioniert ein paar Minuten lang gut. Und was ist zu tun?

Wie groß ist die Dimensionalität des Arrays NewsArr in der zweiten Dimension?
Grund der Beschwerde: