Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 736

 

Добрый день!

Подскажите, пожалуйста, можно ли компиляцию кода задать в самом коде? Спасибо.

 

Вывожу в комменты параметры мыши и метку с ценой 4 знака при нажатии на колесо.

Пока колесо нажато, метка бегает за курсором, но не получается сделать так чтобы то же самое происходило при отпущеном колесе до нажатия на ЛК мыши.

Помогите разобраться.


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

Вывожу в комменты параметры мыши и метку с ценой 4 знака при нажатии на колесо.

Пока колесо нажато, метка бегает за курсором, но не получается сделать так чтобы то же самое происходило при отпущеном колесе до нажатия на ЛК мыши.

убрать (закомментировать)
// if(sparam =="16")

 
Taras Slobodyanik:

убрать (закомментировать)
// if(sparam =="16")


Тогда метка все время на экране находится, а нужно чтобы она появлалась только после нажатия колеса.



ПС 

Ваш ответ навел меня на верную мысль спасибо :-)

 
psyman:

Вывожу в комменты параметры мыши и метку с ценой 4 знака при нажатии на колесо.

Пока колесо нажато, метка бегает за курсором, но не получается сделать так чтобы то же самое происходило при отпущеном колесе до нажатия на ЛК мыши.

Помогите разобраться.


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

label типа bool

 
Ilya Prozumentov:

label типа bool

Перемещение можно делать до создания метки?


Теперь возник другой вопрос: хочу привязать метку к правой стороне экрана, вычисляется это в  OnCalculate

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

ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width); 

Print(width);

Она оказывается почему-то в крайней левой позиции, при том что такое же вычисление в OnChartEvent для другой метки дает правильный результат.

Почему включается инверсия отсчета?

 
psyman:

Перемещение можно делать до создания метки?


Теперь возник другой вопрос: хочу привязать метку к правой стороне экрана, вычисляется это в  OnCalculate

Она оказывается почему-то в крайней левой позиции, при том что такое же вычисление в OnChartEvent для другой метки дает правильный результат.

Почему включается инверсия отсчета?

label изначально поставить в false, поэтому кусок кода с перемещением метки выполнятся не будет. Но даже если его выполнить до создания метки, то ничего не случится, программа продолжит работать и на метку которая затем создастся это не повлияет.

Смотри точку привязки, из-за разных точек и результат разный. Можешь сразу попробовать вместо width написать 0 и если станет вести себя, как нужно - значит дело было в точках привязки.

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

label изначально поставить в false, поэтому кусок кода с перемещением метки выполнятся не будет. Но даже если его выполнить до создания метки, то ничего не случится, программа продолжит работать и на метку которая затем создастся это не повлияет.

Смотри точку привязки, из-за разных точек и результат разный. Можешь сразу попробовать вместо width написать 0 и если станет вести себя, как нужно - значит дело было в точках привязки.

У меня нет точек привязки, есть только вертикальное перемещение, горизонталь один раз задаю через ширину экрана. Вести отсчет с другой стороны не проблема, однако вызывает удивление что одно и то же действие в разных функциях выполняется по-разному.


И еще есть вопрос - если в качестве текста метки выводится Bid, то в какой функции это делать более оптимально OnChartEvent или OnCalculate?

 
novichok2018:

Добрый день!

Подскажите, пожалуйста, можно ли компиляцию кода задать в самом коде? Спасибо.

Возможно, вопрос глупый, раз никто не отвечает, но как ещё бороться с остановкой работы советника и возобновлением после компиляции?

Платформа выдает сообщение: array out of range (284,17). 

строка 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); позиция 17 открывает квадр.скобку с NomNews, кот. глобально инициирована 0. 

Менял 0 на 1, безрезультатно.
Менял в строке if(NomNews==300)break; 300 на 360000, безрезультатно.    

Скомпилирую - несколько минут работает нормально. И что делать?

 
novichok2018:

Возможно, вопрос глупый, раз никто не отвечает, но как ещё бороться с остановкой работы советника и возобновлением после компиляции?

Платформа выдает сообщение: array out of range (284,17). 

строка 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); позиция 17 открывает квадр.скобку с NomNews, кот. глобально инициирована 0. 

Менял 0 на 1, безрезультатно.
Менял в строке if(NomNews==300)break; 300 на 360000, безрезультатно.    

Скомпилирую - несколько минут работает нормально. И что делать?

Какая размерность массива NewsArr во втором измерении?
Причина обращения: