Во-вторых, процесс регистрации (т.е. внутренней инициализации в терминале) индикаторных буферов, насколько я заметил, асинхронный. Инициализация буфера непосредственно после регистрации при загрузке индикатора не работает. При переинициализации без перезагрузки - работает.
Перенесите инициализацию в start(), должна сработать по первому же тику.
Давно я не писал индикаторы, потому может чего забыл, но простейшая конструкция не работает:
//+------------------------------------------------------------------+ //| test_indicator.mq4 | //| Павел Смирнов | //| www.autoforex.ru | //+------------------------------------------------------------------+ #property copyright "Павел Смирнов" #property link "www.autoforex.ru" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Red //---- buffers double ExtMapBuffer1[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); for(int i=0; i<Bars; i++) { ExtMapBuffer1[i]=5; } //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { //---- //---- return(0); } //+------------------------------------------------------------------+Подскажите почему?
//+------------------------------------------------------------------+ //| test_indicator.mq4 | //| Павел Смирнов | //| www.autoforex.ru | //+------------------------------------------------------------------+ #property copyright "Павел Смирнов" #property link "www.autoforex.ru" #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 6 #property indicator_buffers 1 #property indicator_color1 Red //---- buffers double ExtMapBuffer1[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorBuffers(1); //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); IndicatorShortName("Мега индикатор!"); //---- return(0); } int start() { //---- for(int i=0; i<Bars; i++) { ExtMapBuffer1[i]=5; } //---- return(0); } //+------------------------------------------------------------------+
Вот так, все работает!
Во-первых, отсутствует вызов IndicatorBuffers
Перенесите инициализацию в start(), должна сработать по первому же тику.
Зачем здесь использовать IndicatorBuffers ???
Вот выдержка из инструкции:
Сразу же после присоединения к графику программа начинает работу с функции init(). Функция init() присоединенного к графику советника или пользовательского индикатора запускается также сразу после старта клиентского терминала и подгрузки (это касается только советников и не касается индикаторов) исторических данных, после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счёта
Т.е. в момент перекомпилляции должна бы запустится функция init() индикатора, но этого не происходит. Или же есть какие-то нюансы.
Неужели нельзя из фунуции init() построить индикатор?
Насколько я понял функция start() все-же вызывается после перекомпилляции индикатора. Почему-то об этом нигде не сказано (может не нашел просто)?
Вот такая конструкция:
//+------------------------------------------------------------------+ //| test_indicator.mq4 | //| Павел Смирнов | //| www.autoforex.ru | //+------------------------------------------------------------------+ #property copyright "Павел Смирнов" #property link "www.autoforex.ru" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Red extern int N=5; double ExtMapBuffer1[]; int init() { SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); return(0); } int deinit() { return(0); } int start() { for(int i=0; i<Bars; i++) { ExtMapBuffer1[i]=N; } return(0); }
в офлайн режиме, работает, только если при нанесении индикатора на график указать минимальное и максимальное значение индикатора.
или же использовать в программе строки:
#property indicator_minimum 0 #property indicator_maximum 10
а такая конструкция не работает вообще:
//+------------------------------------------------------------------+ //| test_indicator.mq4 | //| Павел Смирнов | //| www.autoforex.ru | //+------------------------------------------------------------------+ #property copyright "Павел Смирнов" #property link "www.autoforex.ru" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Red extern int N=5; double ExtMapBuffer1[]; int init() { SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); for(int i=0; i<Bars; i++) { ExtMapBuffer1[i]=N; } return(0); } int deinit() { return(0); } int start() { return(0); }Спасибо
Ну все, кажись дошло. Глюк это или так и должно быть (по-мне дак это глюк, который требуется исправить или внести изменения в описание).
Вот такая вот конструкция работает так, как и должна работать:
//+------------------------------------------------------------------+ //| test_indicator.mq4 | //| Павел Смирнов | //| www.autoforex.ru | //+------------------------------------------------------------------+ #property copyright "Павел Смирнов" #property link "www.autoforex.ru" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Red extern int N=5; double ExtMapBuffer1[]; int init() { SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); for(int i=0; i<Bars; i++) { ExtMapBuffer1[i]=N; } return(0); } int deinit() { return(0); } int start() { ExtMapBuffer1[0]=8; return(0); }
Т.е. различие с неработающей версией лишь в наличии одной строчки
ExtMapBuffer1[0]=8;
в функции start(). Уберите ее и начнутся глюки.
Хотя щас заметил еще один глюк - при нанесении этого индикатора на график (не указывая максимальное и минимальное значения для индикатора) ничего не выводится в окне индикатора, но стоит только перекомпилировать его , как все замечательно работает.
Спасибо.
При выполнении init() не гарантируются значения предопределённых переменных. Реально по моим наблюдениям они иногда определены, иногда нет, зависит от предыстории действий в терминале. В данном случае делается попытка использовать в init() Bars и дело именно в этом.
Нет не в этом.
Поставьте вместо Bars значение, например 10, то все увидете. Возьмите тестовый эксперт дан ниже, откомпилируйте его, наложите его на график и ничего не увидете, теперь заново откомпилируйте не снимая его с графика и все заработает.
тестовый эксперт:
//+------------------------------------------------------------------+ //| test_indicator.mq4 | //| Павел Смирнов | //| www.autoforex.ru | //+------------------------------------------------------------------+ #property copyright "Павел Смирнов" #property link "www.autoforex.ru" #property indicator_separate_window #property indicator_buffers 1 #property indicator_minimum 0 #property indicator_maximum 10 #property indicator_color1 Red extern int N=5; double ExtMapBuffer1[]; int init() { SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); for(int i=0; i<10; i++) { ExtMapBuffer1[i]=N; } return(0); } int deinit() { return(0); } int start() { ExtMapBuffer1[0]=8; return(0); }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Давно я не писал индикаторы, потому может чего забыл, но простейшая конструкция не работает:
Подскажите почему?