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

 
khorosh:

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

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


Опять не правильно! Советник снова будет пиликать на каждом тике, так как Fun_New_Bar() будет всегда возвращать истину. Тогда спрашивается, на кой чёрт нужна функция Fun_New_Bar(), если она постояно возвращает истину?
 
drknn:


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

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

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

Объявлена булевая функция. Поскольку это функция, а не процедура, то она должна что-то возвращать в основную программу, из которой она вызвана. Поскольку функция булева, то и возвращать она должна булевое значение. Где у Вас строка, возвращающая хоть что-то в основную программу? Нету! Это значит, что в старте программы, поскольку из функции ни чего не возвращается, в скобках выражения 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, если обе эти переменные ни где не используются. На кой чёрт нужны эти два присвоения? Поиграться хочется? Или думать лень?


Тк попробуйте этот код. Он вроде работает, только вот посмотрите правильно или нет. Если что-то не правильно, то исправьте:

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


Тк попробуйте этот код. Он вроде работает, только вот посмотрите правильно или нет:

Нет не правильно - я этот код Вам по-буквочкам разобрал. Неужели Вы ни чего не поняли?
 

kolyango: покажу я Вам правильный код. Смотрите.

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

int MyChandle;// количество свеч на графике
//+------------------------------------------------------------------+
//|                  Блок инициализации                                |
//+------------------------------------------------------------------+
int init(){
  MyChandle=0;// ну или можно вот так : MyChandle=Bars;

  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                              |
//+------------------------------------------------------------------+
int deinit(){
  if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                            |
//+------------------------------------------------------------------+
int start(){
  if(MyChandle<Bars){
   Alert("Было свеч = ",MyChandle," Стало свеч = ",Bars);

   MyChandle=Bars;
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                       |
//+------------------------------------------------------------------+
 
drknn:
Нет не правильно - я этот код Вам по-буквочкам разобрал. Неужели Вы ни чего не поняли?


А так гляньте, вроде правильно работает! Проверил на М1 таймфрейме:

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);
}

 
kolyango:


А так гляньте, вроде правильно работает! Проверил на М1 таймфрейме:



Слуш, ну умеешь ты читать, или нет - говорил же выше - не верный код - сигналить он будет на каждом тике, а не 1 раз на новой свечке. Смотри выще - я дал тебе верный код. Чего тебе ещё не хватает для полного састья? Знать почему код твой не верный? Я уже объяснил, он неверен потому, что постоянно подпрограмма возвращает истину и одну только истину. Алерт будет выскакивать на каждом тике! Программирование - это не игра в угадайки - тут думать надо.
 
drknn:

Опять не правильно! Советник снова будет пиликать на каждом тике, так как Fun_New_Bar() будет всегда возвращать истину. Тогда спрашивается, на кой чёрт нужна функция Fun_New_Bar(), если она постояно возвращает истину?
Работает правильно- проверил на графике. Когда
New_Time=Time[0]

функция Fun_New_Bar() не будет возвращать истину
 
drknn:

kolyango: покажу я Вам правильный код. Смотрите.

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

drknn:
 ... Программирование - это не игра в угадайки - тут думать надо...

 

   

    ... ну, хотяб, хоть иногда...    :-)))

 
khorosh:
А вариант с использованием Bars менее предпочтительный, так как величина Bars может меняться не только в связи с появлением нового бара.


Ну дык просветите меня - число свеч на графике может ещё меняться в связи ещё с чем, кроме факта появления нового бара??? :)))))

Ах, ну да, точно - подгрузка истории. :) Всё равно его функция будет пиликать на каждом тике - он не верно запоминает время.

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