Перечитал учебник, перечитал статьи: "MQL для чайников", чтобы не просить помощи, но похоже все же придется, потому что, что в учебнике, что в статьях описано, что такое массивы и... все. Ни как с ними работать, ни как их толком обьявить-ничего нет. Пишу индикатор в котором нужно использовать массив. Раньше всегда задавал массив, например так (над стартом) double massive1[1000]; или использовать буфер, который
закрышивал потом черным цветом. Но это как-то совершенно примитивно, наверное. Потому что смотришь чужие коды, там так все правильно... да ладно бы с ним с правильно-просто ничего не работает сейчас, в связи с чем вопросы (возможно, сможете отослать туда, где о этом можно прочесть-буду примного благодарен):
1. Как и где обьявлять массив в индикаторе?
2. Обязательно ли писать массив, например так: double val[1000]; потому что у других он записан как-то так double val[]; и все работает ?
3. Сколько массивов допустимо в индикаторе?
4. Если можно то короткое резюме как работать и как задать массив в индикаторе, потому НИГДЕ этого нет :(
если буфер нужен только для расчетов, мона написать SetIndexStyle(индекс,DRAW_NONE);
1. Просто массив в любом месте. Буферный массив обьявляется на глобальном уровне вне функций (над стартом:))
2. обязательно:
если буферный массив double val[]; в init() - SetIndexBuffer(индекс,val);
Если обычный double val[1000];
или если размер заранее не известен, то double val[]; далее ArrayResize(val,РазмерМассива);
3. буферных 8.
остальных многа. вроде есть ограничение на 2 гига)
4. Непонятно, что непонятно. Есть конечно нюансы :)
Спрашивайте, попытаюсь ответить)
здесь можно статьи Роша по MQL почитать.
если буфер нужен только для расчетов, мона написать SetIndexStyle(индекс,DRAW_NONE);
1. Просто массив в любом месте. Буферный массив обьявляется на глобальном уровне вне функций (над стартом:))
2. обязательно:
если буферный массив double val[]; в init() - SetIndexBuffer(индекс,val);
Если обычный double val[1000];
или если размер заранее не известен, то double val[]; далее ArrayResize(val,РазмерМассива);
3. буферных 8.
остальных многа. вроде есть ограничение на 2 гига)
4. Непонятно, что непонятно. Есть конечно нюансы :)
Спрашивайте, попытаюсь ответить)
здесь можно статьи Роша по MQL почитать.
Спасибо большое! Тогда можно на примере спрошу. Вроде все сделал как нужно (ну точно что не так, как нужно, просто, чтобы проверить как работают эти массивы, но мне то кажется, что как нужно)
А почему тогда кажет совсем-совсем не то :( Где там ошибка не подскажете? Почему не показывает просто обычные цены клоз, а погоду какую-то рисует?
#property copyright "Copyright © 2008, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_buffers 1 #property indicator_color1 Lime #property indicator_width1 1 #property indicator_separate_window double Buffer[]; int init() { SetIndexBuffer(0, Buffer); SetIndexStyle(0, DRAW_LINE); return(0); } int deinit() { } int start() { double value1[1000]; for (int k=1000; k>=0;k--) { value1[k]=Close [k]; Buffer[k]= iMAOnArray(value1,0,1,0,MODE_SMA,k); } //**--------------- return(0); }
А почему тогда кажет совсем-совсем не то :( Где там ошибка не подскажете? Почему не показывает просто обычные цены клоз, а погоду какую-то рисует?
Написать надо было вот так:
1) инициализировать буфер value1 до расчетов
2) выставить ему признак, чтобы индексация в массиве стала наоборот :-)
int start() { double value1[1000]; ArraySetAsSeries(value1,true); for (int k=1000; k>=0;k--) { value1[k]=Close [k]; } for ( k=1000; k>=0;k--) { Buffer[k]= iMAOnArray(value1,0,1,0,MODE_SMA,k); } return(0); }
Написать надо было вот так:
1) инициализировать буфер value1 до расчетов
2) выставить ему признак, чтобы индексация в массиве стала наоборот :-)
точно.
только хз почему))
можно и в один цикл
int start() { double value1[1000];//индекс первого значения 0, последнего 1000-1 ArraySetAsSeries(value1,true);//для последующих вычислений iMAOnArray и т.п. задаецо направление индексирования как у буферов for (int k=1000-1; k>=0;k--) { value1[k]=Close [k]; Buffer[k]= iMAOnArray(value1,0,1,0,MODE_SMA,k); } return(0); }
Если цикл правильный от (1000-1) к 0, то можно, а если от 0 до (1000-1), то нельзя.
Я лучше проинициализирую лишний раз.
мона)
int start() { double value1[1000]; ArraySetAsSeries(value1,true); for (int k=0; k<1000;k++) { value1[k]=Close [k]; Buffer[k]= iMAOnArray(value1,0,1,0,MODE_SMA,k); } return(0); }
но это частный случай.
не, ма простая :)
#property indicator_buffers 1 #property indicator_color1 Red #property indicator_chart_window extern int MA_Period=10; double Buffer[]; int init() { SetIndexBuffer(0, Buffer); SetIndexStyle(0, DRAW_LINE); return(0); } int start() { double value1[1000]; ArraySetAsSeries(value1,true); for (int k=0; k<1000; k++) { value1[k]=Close [k]; Buffer[k-MA_Period]=iMAOnArray(value1,0,MA_Period,0,MODE_SMA,k-MA_Period); } return(0); }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Перечитал учебник, перечитал статьи: "MQL для чайников", чтобы не просить помощи, но похоже все же придется, потому что, что в учебнике, что в статьях описано, что такое массивы и... все. Ни как с ними работать, ни как их толком обьявить-ничего нет. Пишу индикатор в котором нужно использовать массив. Раньше всегда задавал массив, например так (над стартом) double massive1[1000]; или использовать буфер, который
закрышивал потом черным цветом. Но это как-то совершенно примитивно, наверное. Потому что смотришь чужие коды, там так все правильно... да ладно бы с ним с правильно-просто ничего не работает сейчас, в связи с чем вопросы (возможно, сможете отослать туда, где о этом можно прочесть-буду примного благодарен):
1. Как и где обьявлять массив в индикаторе?
2. Обязательно ли писать массив, например так: double val[1000]; потому что у других он записан как-то так double val[]; и все работает ?
3. Сколько массивов допустимо в индикаторе?
4. Если можно то короткое резюме как работать и как задать массив в индикаторе, потому НИГДЕ этого нет :(