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

 

Тарас, а можно такую нормализацию графика сделать для смены фрейма нажатием мыши?

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

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

 
psyman:

Тарас, а можно такую нормализацию графика сделать для смены фрейма нажатием мыши?

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

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

То есть чтобы мышью щелкать по неким "тап-зонам" на чарте?
Можно, нужно отслеживать координаты курсора и клик по кнопкам мыши.

CHARTEVENT_MOUSE_MOVE

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Taras Slobodyanik, 2018.10.04 09:37

То есть чтобы мышью щелкать по неким "тап-зонам" на чарте?
Можно, нужно отслеживать координаты курсора и клик по кнопкам мыши.



В том то и дело что это клик на чарте, а не по кнопке из системного меню. Как обработать такое событие я не знаю.
 
psyman:

В том то и дело что это клик на чарте, а не по кнопке из системного меню. Как обработать такое событие я не знаю.

запоминаем текущий символ-период, а при "CHARTEVENT_CHART_CHANGE" проверяем изменения и делаем что нужно

 
Ок, еще раз спасибо.
 

Скажите пожалуйста почему одна и та же функция из тела советника OnTick() не работает (вернее, работает, но со сбоями не на всех графиках корректно)

, а из процедуры OnInit() прекрасно работает и из обычного скрипта тоже. Советник установлен сразу на 80 графиках (20 валют у каждой 4 окна W1 D1 H4 H1) может просто комп не справляется ? Подскажите пожалуйста. Задача робота - выдавать сообщения MessageBox на экран, если обнаружен сигнал на одном из графиков. Может комп тормозит в момент запуска этих сообщений ?
 

У меня почему-то не получается запоминать период перед обработкой события, в каком месте это нужно делать?

Решил отслеживать по сообщениям, оказалось что CHARTEVENT_CHART_CHANGE обрабатывается 2 раза за один клик, переменная ctime обнуляется.


#property strict

#property indicator_chart_window

int ctime;


void OnInit()

   {

     

     Print("  OnInit------------1  ", ChartPeriod(0));

     Print("OnInit ctime = ", ctime);

   //  ctime=ChartPeriod(0);   

     

   }


int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

   ctime=ChartPeriod(0);         

   

   return(rates_total);

   

  }

  

void OnChartEvent(const int id,

                  const long &lparam,

                  const double &dparam,

                  const string &sparam)


{


   

   if(id==CHARTEVENT_CHART_CHANGE)

      {

      

      Print("CHARTEVENT_CHART_CHANGE     is started  ctime=", ctime);

      if(ctime!=ChartPeriod(0))

      {

      Print(ChartPeriod(0), "  CHANGED!!!!!!!!!!!!!!!   ", ctime);

      }

      

      } 

    

}



Добавление индикатора на часовике, затем переключение на дневку

2018.10.05 01:04:45.171 _t1 CADJPY,Daily: CHARTEVENT_CHART_CHANGE     is started  ctime=1440

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: 1440  CHANGED!!!!!!!!!!!!!!!   0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: CHARTEVENT_CHART_CHANGE     is started  ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: initialized

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: OnInit ctime = 0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily:   OnInit------------1  1440

2018.10.05 01:04:45.156 _t1 CADJPY,H1: uninit reason 3

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHANGE     is started  ctime=60

2018.10.05 01:02:02.000 _t1 CADJPY,H1: 60  CHANGED!!!!!!!!!!!!!!!   0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHANGE     is started  ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: initialized

2018.10.05 01:02:02.000 _t1 CADJPY,H1: OnInit ctime = 0

2018.10.05 01:02:02.000 _t1 CADJPY,H1:   OnInit------------1  60

2018.10.05 01:02:01.078 Custom indicator _t1 CADJPY,H1: loaded successfully





 
psyman:

У меня почему-то не получается запоминать период перед обработкой события, в каком месте это нужно делать?

Решил отслеживать по сообщениям, оказалось что CHARTEVENT_CHART_CHANGE обрабатывается 2 раза за один клик, переменная ctime обнуляется.

Вставляйте правильно код в сообщение! Очень сложно читать в таком виде. Надо вот так.

#property strict
#property indicator_chart_window
int ctime;
void OnInit()
   {
     Print("  OnInit------------1  ", ChartPeriod(0));
     Print("OnInit ctime = ", ctime);
   //  ctime=ChartPeriod(0);   
   }
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   ctime=ChartPeriod(0);         
   return(rates_total);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id==CHARTEVENT_CHART_CHANGE)
      {
      Print("CHARTEVENT_CHART_CHANGE     is started  ctime=", ctime);
      if(ctime!=ChartPeriod(0))
      {
      Print(ChartPeriod(0), "  CHANGED!!!!!!!!!!!!!!!   ", ctime);
      }
      } 
}

Индикатор при изменении параметров чарта принудительно перезагружается почитайте доку на предмет причины деинициализации и её переменная reason.

Для сохранения необходимых параметров можно использовать глобальные переменные терминала. 

 
Vitaly Gorbunov:

Вставляйте правильно код в сообщение! Очень сложно читать в таком виде. Надо вот так.

Индикатор при изменении параметров чарта принудительно перезагружается почитайте доку на предмет причины деинициализации и её переменная reason.

Для сохранения необходимых параметров можно использовать глобальные переменные терминала. 

Да, нужно сохранять значения в GlobalVariable, и потом, при старте проверять их существование.

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

пс. еще можно хранить информацию в объектах на графике - пока чарт существует - существуют объекты

 

Я думал все будет гораздо проще :-)

Тогда совсем детский вопрос - у меня код не подразумевает ни торговлю, ни графику, какой тип программ лучше использовать?

Скрипты одноразовые, но мб их можно в цикле запускать? Я объявил пользовательский индикатор чисто по инерции, тк советниками никогда не пользовался. Но тут выяснилось что он самостоятельно перезагружается, это нужно учитывать, что мне совсем ни к чему. В общем посоветуйте.

пс

Объекты могут быть нулевого размера, чтобы визуально не мешались?

Причина обращения: