[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 1084

 
khorosh:

Точнее будет так:



Вот так ещё правильней будет и теперь работает:

//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------

 
И, кстати, почему выделяю код как код при написании комментария, а он одного цвета? Или надо выделять как что. чтобы он выглядел как настоящий код по цвету?
 
kolyango:

Пробую на М1 и после формирования следующего бара сообщение не выходит. Значит что, не работает?


А оно и не будет работать - Вы программу не верно написали. А всё потому, что понятия не имеете, как будет работать Ваш собственный код. Давайте разберём. Тело советника:

int start(){ // Спец. функция start
  if(Fun_New_Bar()){ //проверка наличия нового бара
    Alert("Сформировался новый бар"); // Вывод на экран
  }
  return(0); // Выход из start()
}

Приходит новый тик и вызывается функция Fun_New_Bar(). Если она возвращает в основную программу истину, то выскочит Алерт. В противном случае советник завершает свою работу ретурном и ждёт нового тика. На новом тике всё повторяется.

Говорите не работает код? Давайте теперь посмотри что у Вас в подпрограмме.

bool Fun_New_Bar(){ // Ф-ия обнаружения нового бара
  static datetime New_Time=0; // Время текущего бара
  bool New_Bar=false; // Нового бара нет
  if(New_Time!=Time[0]){ // Сравниваем время
    New_Time=Time[0]; // Теперь время такое
    New_Bar=true; // Поймался новый бар
  }
}

Объявлена булевая функция. Поскольку это функция, а не процедура, то она должна что-то возвращать в основную программу, из которой она вызвана. Поскольку функция булева, то и возвращать она должна булевое значение. Где у Вас строка, возвращающая хоть что-то в основную программу? Нету! Это значит, что в старте программы, поскольку из функции ни чего не возвращается, в скобках выражения if(Fun_New_Bar()) будет всегда ложь и алерт значит, ни когда не выскочит.

Идём далее. Почему Вы объявили datetime New_Time=0; именно статиком? Из каких соображений? Вы объявили переменную и тут же проинициализировали её нулём. На следующем тике произойдёт то же самое - переменная снова объявится и снова будет проинициализирована нулём. Смотрим ниже if(New_Time!=Time[0]){ В этой строке идёт проверка значения переменной на неравенство текущему времени. Ну да, в переменной ноль, а текущее время не ноль. Условие выполнено, значение текущего времени внесено в переменную, параметр New_Bar становится true. всё, функция завершила работу ни чего не вернув в основную программу. На следующем тике опять New_Time будет не равно Time[0], опять успешно выполнится проверка на неравенство и снова две последующие операции будут выполнены. Короче, при проверке условия if(New_Time!=Time[0]) выражение в скобках будет истинным на каждом тике. ВСЕГДА. Спрашивается, если оно всегда истинно, то накой чёрт тут нужна эта проверка? Мож её просто убрать? Зачем присваивать New_Time=Time[0] и New_Bar=true, если обе эти переменные ни где не используются. На кой чёрт нужны эти два присвоения? Поиграться хочется? Или думать лень?

 

Как сделать глобальную переменную доступной эксперту, работающему на втором запущенном терминале МТ4?

 
DhP:

Как сделать глобальную переменную доступной эксперту, работающему на втором запущенном терминале МТ4?


Через апи, или через текстовый документ.
 
drknn:

Через апи, или через текстовый документ.

Как?
 
DhP:

Как?

Через апи не знаю как - читал что возможно. Через текстовый документ - нужно писать dll-ку на языке, отличном от MQL4. Например, на Delphi, C++. Длл-ка должна уметь обращаться к файлу, расположенному за пределами терминала. Это вполне реально осуществить. Далее всё прозрачно - советник вносит новое значение глобальной переменной в текстовый документ, а другой советник его оттуда считывает. Обоим советникам ДЛЛ-ка даёт доступ к этому текстовому документу. Задавались тут уже такие вопросы. Народ спрашивал что-то типа как наладить взаимную работу советников в двух разных термналах...
 
kolyango:

Вот так ещё правильней будет и теперь работает:

Нет не работает - Ваш Алерт пиликать сообщения Вам будет на каждом тике, а не 1 раз на первом тике новой свечи.
 
kolyango:



Вот так ещё правильней будет и теперь работает:

//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------


Функция не моя - подобрал в интернете, но не использовал. Сейчас посмотрел внимательно на неё - там пропущен оператор.

Правильно будет так:

int start() // Спец. функция start
{
 if(Fun_New_Bar())//проверка наличия нового бара
   {
    Alert("Сформировался новый бар"); // Вывод на экран
   }
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{                  // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}
 
drknn:

Через апи не знаю как - читал что возможно. Через текстовый документ - нужно писать dll-ку на языке, отличном от MQL4. Например, на Delphi, C++. Длл-ка должна уметь обращаться к файлу, расположенному за пределами терминала. Это вполне реально осуществить. Далее всё прозрачно - советник вносит новое значение глобальной переменной в текстовый документ, а другой советник его оттуда считывает. Обоим советникам ДЛЛ-ка даёт доступ к этому текстовому документу. Задавались тут уже такие вопросы. Народ спрашивал что-то типа как наладить взаимную работу советников в двух разных термналах...

Спасибо, поищу...
Причина обращения: