Нужна помощь разработчиков MT4 и программистов - страница 3

 
Зацикленный эксперт - это моветон.
 
Integer:

2. На пол пути к новой фиче. Раньше окно свойств у зацикленного эксперта не открывалось. Темперь вот открывается, хорошо бы теперь еще, чтобы была реакция на изменение параметров. Или же пусть не открывается окно свойств, да бы не смущать пользователя. 

Вот именно! Я же об этом и пытаюсь сказать, но никто не слышит.

В "сервисдеске" отказали, по-моему вообще не вникая в ситуацию и не понимая её. Вот выдержка из сообщения заявки:

Зачем же указывать программисту, что ему можно делать, а что - нельзя? Трансляция прошла без ошибок. Исполнение идёт без ошибок. Пользователь видит во вкладке входных параметров "A=5", а советнику система даёт "A=1". Использовать цикл start() или while() - это дело вкуса. Цикл отнюдь не бесконечный, как вы утверждаете. Если вы внимательно смотрели текст советника, там не while(true), а while(!IsStopped()&&IsConnected()&&IsExpertEnabled()). В предыдущих MT4-сборках пользователь не мог изменить значения входных параметров во время выполнения функции Sleep(). В новой сборке уже нет такого препятствия. Значит или верните запрет на изменение входных параметров в этой ситуации, или ДЕЙСТВИТЕЛЬНО ОБЕСПЕЧЬТЕ ИХ ИЗМЕНЕНИЕ НЕ ТОЛЬКО НА ВКЛАДКЕ "INPUTS", НО И В СОВЕТНИКЕ. Всё.


Integer:

1. При инсталляции терминала MetaTrader4 в окне инсталляции есть приглашение на форум, именно на этот форум, а не на другой. 

Приношу извинения. Но я обратил внимание, что грань между MT4 и MT5 постепенно стирается. И именно из своего профиля на "www.mql5.com" я обратился в "сервисдеск" (надеюсь в первый и в последний раз). Там заполняется форма, в которой чётко видна возможность выбора версии терминала - я выбрал "MT4".

Вот ешё одна выдержка из уже закрытой заявки (не знаю, читают ли они заявки после того, как сами же спешно закрывают?)   (смешно конечно, но мне приходит в голову только поговорка о ловле блох).

Почему же в таком случае пользователь чётко видит их новые значения? В то время, как советник может функционировать со всей полнотой, эти новые значения - фикция, и советнику они не доступны. Функция RefreshRates() позволяет советнику получить актуальные котировки в ЛЮБОМ ЦИКЛЕ. Почему бы не обеспечить аналогичную функцию для получения обновлённых значений входных параметров или добавить эту возможность в существующую функцию RefreshRates()?

Нажатие кнопки "AutoTrading" дважды (выключить и включить советники) действительно прерывает цикл, после чего новые значения становятся доступными, но только после тика (новой котировки) по СИМВОЛУ ГРАФИКА. Когда она придёт - неизвестно, а советнику ведь не запрещено обрабатывать и ДРУГИЕ СИМВОЛЫ, и эта потеря времени пользователю не нужна. То есть получается что-то типа "назад в будущее". Выпустили новый MT4. Он более современный, более быстрый. Смотрите, мол как хорошо он тормозит на экране в ожидании котировки ОДНОГО СИМВОЛА, когда по ДРУГИМ СИМВОЛАМ масса котировок идёт полным ходом. То есть сейчас я так и говорю клиентам: поменяйте параметры, дважды нажмите кнопку "Советники", чтобы их выключить и включить, и ждите у моря погоды - когда-нибудь да "тикнет".

Я никогда до этого не обращался за помощью и надеюсь, что не буду обращаться впредь. Рано или поздно всё равно найду возможность обходить этот "крючок". Так приходилось действовать всегда, сколько существует MT4 и конечно же его "тестер стратегий", о котором я вообще сейчас лучше промолчу. Но любая неточность режима реального времени - это конечно очень серьёзная вещь, особенно для пользователя, который ставит на кон свои деньги, иногда довольно крупные суммы. Поскольку я не увидел других эффективных методов обхода этого бага, постольку я и обратился в "сервис-деск" и, честно говоря, даже немного сомневался, что там откажутся это устранять. Ладно...

Плохо  конечно, что всего приходится добиваться не "благодаря", а "вопреки".

 
Integer:
Wex, пользуйтесь таймером, сейчас можно обойтись без зацикливания.

Вы правы, конечно, новые советники можно программировать совсем по-другому. Но есть множество уже хорошо запрограммированных советников. И заказчики не понимают, почему вещь, за которую они заплатили деньги, вдруг перестаёт корректно функционировать.

То есть прослеживается какая-то крайне неприятная тенденция принципиальной несовместимости уже разработанного П/О (советников или скриптов, даже индикаторов) с новыми сборками MT4.

Причём я принципиально ничего нестандартного не использовал в процессе программирования. Всё П/О было основано исключительно на ШТАТНЫХ возможностях и функциях MQL4. А меня уже завалили массой индикаторов и советников (преимущественно сложных или т.н."мультивалютных"), которые или вообще не работают на новых сборках MT4, или вроде как бы работают отлично, но возникают такие ситуации, как в приведённом мною примере. (Что касается ошибок трансляции, замечал например переменные с названием "new" - я так понимаю - из-за расширения списка зарезервированных слов.)

 

Одному лень документацию почитать. Остальные показывают что очень умные... Уффф

Лови код :)

Так и не понял в чем у тебя проблема

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright     "Grizzly_v :)"
#property link          "http://www.mql5.com"
//+------------------------------------------------------------------+
extern int      A1=      1;
extern int      A2=      2;
int      C1,C2;
//+------------------------------------------------------------------+
int OnInit(){
   C1=A1;
   C2=A2;
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   Comment("");
}
//+------------------------------------------------------------------+
void OnTick(){
   string   t;

   t=TimeToStr(TimeCurrent(),TIME_MINUTES|TIME_SECONDS);
   Comment(t+"\nA1="+A1+"   A2="+A2+"\nC1="+C1+"   C2="+C2);
}
//+------------------------------------------------------------------+
 
grizzly_v:

Одному лень документацию почитать. Остальные показывают что очень умные... Уффф

Лови код :)

Так и не понял в чем у тебя проблема

Проблема у него в том, что эксперт зациклен, поэтому событие OnTick в нём не наступает и он не видит изменившихся параметров. 
 

Ну тогда так. Тот же цикл только через новые функции.

  extern int      A1=      1;
  extern int      A2=      2;
         int      C1,C2;
//+------------------------------------------------------------------+
int OnInit(){
   C1=A1;
   C2=A2;
   EventSetMillisecondTimer(100);
   return(0);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer(){
   string   t;
   RefreshRates();
   t=TimeToStr(TimeCurrent(),TIME_MINUTES|TIME_SECONDS);
   Comment(t+"\nA1="+A1+"   A2="+A2+"\nC1="+C1+"   C2="+C2);
}
//+------------------------------------------------------------------+
 
stringo:

1. Посмотрите профиль Wex. Это - профессиональный разработчик MQL4. Разыгрывает из себя дурочку. Или троллит. Непонятно зачем.

2. Тут надо подумать. Нельзя насильно прерывать цикл по приходу новых параметров. Что-то типа функции IsNewParameter, которую программист должен сам вызывать в бесконечном цикле

1. Тоже заметил странности...

2. Очень было бы неплохо.

 
stringo:

1. Посмотрите профиль Wex. Это - профессиональный разработчик MQL4. Разыгрывает из себя дурочку. Или троллит. Непонятно зачем.

2. Тут надо подумать. Нельзя насильно прерывать цикл по приходу новых параметров. Что-то типа функции IsNewParameter, которую программист должен сам вызывать в бесконечном цикле

Stringo.

Похоже в такой бесконечный цикл переменная просто не попадает. При изменении значений метод init не отрабатывает. А внешние переменные передаются только через init. Сейчас в экспертах можно применять функции OnTick, OnTimer,

OnChartEvent. Функция start в эксперте, на сколько я помню, срабатывала при наступлении нового тика.

Выдержка из документации:

Программа получает события только от графика, на котором она запущена. Все события обрабатываются одно за другим в порядке поступления. Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql4-программы не ставится. Аналогично, если в очереди mql4-программы уже находится событие ChartEvent или такое событие обрабатывается, то новое событие такого типа не ставится в очередь. Обработка событий таймера производится по такой же схеме – если в очереди находится или уже обрабатывается событие Timer, то новое событие таймера не ставится в очередь.

Получется, раз у нас функция start крутится бесконечно, то при наступлении нового события функция не запустится и переменные внутри неё не обновятся.

Выход один, использовать новые возможности языка и не заморачиваться со старыми функциями.

События клиентского терминала - Документация на MQL4
  • docs.mql4.com
События клиентского терминала - Документация на MQL4
 
artmedia70:

1. Тоже заметил странности...

А в чужом глазу оно же всегда видно даже соломинку. И чем больше брёвен в своих глазах, тем более мелкую соломинку можно разглядеть.

В любом деле важен результат, а не процесс. Результат таков: чёрное подаётся как белое - в буквальном смысле - не в переносном - исполнительная система вместо одного значения показывает пользователю другое. ГДЕ это делается - внутри какой-то там функции, или вне её - не важно. Многозадачная система реального времени способна обрабатывать несколько процессов одновременно. В том процессе большую часть времени "выполняется" функция Sleep(), которая вообще никаких системных ресурсов не потребляет. Это классическая вещь, которая используется по сути для приостановки процесса. Все остальные процессы могут выполняться беспрепятственно.

- Товарищи, план выполнить на 102% могем?

- ... Могем.