пожалуйста, оформляйте исходные тексты с использованием тега pre в квадратнвх скобках.
Извиняюсь, вот форматированный код:
//+------------------------------------------------------------------+ //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- indicator settings #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 Green #property indicator_color2 Red //---- indicator buffers double itelo[]; double ishag[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- 1 additional buffer used for counting. IndicatorBuffers(3); //---- drawing settings SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)); SetIndexDrawBegin(0,0); SetIndexDrawBegin(1,0); //SetIndexDrawBegin(2,3); //---- 3 indicator buffers mapping SetIndexBuffer(0,itelo); SetIndexBuffer(1,ishag); //---- name for DataWindow and indicator subwindow label IndicatorShortName("iТело-iШаг"); SetIndexLabel(0,"iТело"); SetIndexLabel(1,"iШаг"); //---- initialization done return(0); } //+------------------------------------------------------------------+ //| Test | //+------------------------------------------------------------------+ int start() { int limit; int counted_bars=IndicatorCounted(); double telo[],shag[]; //---- check for possible errors if(counted_bars<0) return(-1); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; //---- macd counted in the 1-st additional buffer for(int i=0; i<limit-3; i++) { telo[i] = 0.0; if (Open[i]>Close[i]) telo[i] = Open[i]-Close[i]; if (Open[i]<Close[i]) telo[i] = Close[i]-Open[i]; shag[i] = High[i] - Low[i]; } for(i=0; i<limit-3; i++) { ishag[i] = iMAOnArray(shag,0,3,0,MODE_LWMA,0); itelo[i] = iMAOnArray(telo,0,3,0,MODE_LWMA,0); } //---- done return(0); }
Slawa
Так что, это глюк? Почему не работает?
Так что, это глюк? Почему не работает?
2Виталий
Так что, это глюк? Почему не работает?
В твоем индикаторе всем значениям буферов ishag[i] и itelo[i] будет присвоено одно и то же значение взятое из одного и того же места (последний параметр) iMAOnArray(shag,0,3,0,MODE_LWMA,0). Рекомендую пошагово выводить результаты в лог (или файл) и отследить на каком этапе выводимые результаты не совпадают с ожидаемыми (локализовать ошибку) и затем ее исправлять.
Также твой код:
Так что, это глюк? Почему не работает?
В твоем индикаторе всем значениям буферов ishag[i] и itelo[i] будет присвоено одно и то же значение взятое из одного и того же места (последний параметр) iMAOnArray(shag,0,3,0,MODE_LWMA,0). Рекомендую пошагово выводить результаты в лог (или файл) и отследить на каком этапе выводимые результаты не совпадают с ожидаемыми (локализовать ошибку) и затем ее исправлять.
Также твой код:
telo[i] = 0.0; if (Open[i]>Close[i]) telo[i] = Open[i]-Close[i]; if (Open[i]<Close[i]) telo[i] = Close[i]-Open[i];
Можно заменить следующим:
telo[i] = MathAbs(Open[i]-Close[i]);
В приведенном примере (словарь) обнаруживают "пересечение вверх", если на предыдущем интервале (индекс 1 - последний параметр) значение медленной средней больше, а на текущем (индекс 0) меньше или равно быстрой то выдать сигнал "пересечение вверх".
Profi_R
Пробовал выводить результат в лог пошагово. Не получается:
Пока есть второй цикл:
Пробовал выводить результат в лог пошагово. Не получается:
Пока есть второй цикл:
for(i=0; i<limit-3; i++) { ishag[i] = iMAOnArray(shag,0,3,0,MODE_LWMA,0); itelo[i] = iMAOnArray(telo,0,3,0,MODE_LWMA,0); }
Значения всех элементов массивов telo и shag равны 0.
Вот поэтому я и застопорился- не могу понять в чем ошибка, а ребята из Metaquotes игнорируют мою просьбу о помощи, к сожалению.
Пока есть второй цикл:
for(i=0; i<limit-3; i++) { ishag[i] = iMAOnArray(shag,0,3,0,MODE_LWMA,0); itelo[i] = iMAOnArray(telo,0,3,0,MODE_LWMA,0); }
Значения всех элементов массивов telo и shag равны 0.
ты не обратил внимание на мое первое замечание, значения твоего индикатора на всем промежутке будет равно одному и тому же числу (последний параметр я его жирным выделил в предыдущем посте) скорее всего он должен быть у тебя i или что-то в этом роде(подтверждение тому твой лог, т.е. везде 0), и еще нужно разобраться с остальными параметрами (0,3,0) что они означают? Когда сможешь понять их назначение тогда и разберешься со своим индюком. :)
double telo[],shag[];
может я невнимательно смотрел, но нигде в тексте я не увидел вызова функции ArrayResize применительно к указанным массивам.
Slawa
А при чем тут ArrayResize???
Мне не нужно изменять размер массива.
Profi_R
Поменял, но видимо дело не только в этом - не помогло :(
А при чем тут ArrayResize???
Мне не нужно изменять размер массива.
Profi_R
Поменял, но видимо дело не только в этом - не помогло :(
А при чем тут ArrayResize???
Мне не нужно изменять размер массива.
Мне не нужно изменять размер массива.
как это не нужно?
Вы работаете с массивом нулевой длины. какие данные Вы хотите получить из массива нулевой длины? Вы даже GetLastError() после обращения к массиву не анализируете - а там у Вас "out of range"
Slawa
А при чем тут ArrayResize???
Мне не нужно изменять размер массива.
А при чем тут ArrayResize???
Мне не нужно изменять размер массива.
Не жди готовых ответов старайся ответить на них, во-первых поймешь почему, во-вторых отложится в уме, и затем не будешь допускать подобных ошибок. На форуме тебе будут стараться помочь, но большую часть усилий придется приложить самому. Насчет ArrayResize, вот что написано в описании "Sets new size to the first dimension. If success returns count of all elements contained in the array after resizing, otherwise, returns zero and array is not resized", что означает (если я правильно понял) что данная функция изменяет размер массива (при успешном изменении размерности возвращает новое количество элементов, иначе 0). Наверняка нужно после создания массива его инициализировать, затем менять его размерность, попробуй узнай размерность своего массива в ходе выполнения кода - функция ArraySize( object array[]), если размер не верен, то точно проблема связана с изменением размерности массива. Со временем появятся и уроки и описание может быть на русском (я не владею английским и тоже изучаю методом научного тыка и интуиции) и станет полегче.
Profi_R
Поменял, но видимо дело не только в этом - не помогло :(
Поменял, но видимо дело не только в этом - не помогло :(
А как насчет значений параметров, да и потом Слава гораздо лучше меня знает о предмете разговора, думаю что надо прислушаться и подумать над этим, почему и зачем. И еще когда обращаешься на форуме с подобной просьбой нужно стараться более конктретно говорить о результатах, т.е. на каком шаге у тебя начинает выводить неверные результаты, чему они равны, какие шаги были предприняты тобой чтобы выяснить проблему и их результаты, а так тебе никто не будет разжевывать у всех есть свои задачи.
2Форумяне
Тем кто разобрался с работой с массивами помогите пожалуйста человеку, дайте ему стартовое представление о правильной организации работы с массивами.
PS. и GetLastError() тоже не пренебригай , поможет быстрее определить в чем ошибка, и про логи тоже не забывай, туда тоже ошибки прописываются.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
//| Copyright © 2004, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net/
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
//---- indicator buffers
double itelo[];
double ishag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- 1 additional buffer used for counting.
IndicatorBuffers(3);
//---- drawing settings
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
SetIndexDrawBegin(0,0);
SetIndexDrawBegin(1,0);
//SetIndexDrawBegin(2,3);
//---- 3 indicator buffers mapping
SetIndexBuffer(0,itelo);
SetIndexBuffer(1,ishag);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("iТело-iШаг");
SetIndexLabel(0,"iТело");
SetIndexLabel(1,"iШаг");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Test |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
double telo[],shag[];
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- macd counted in the 1-st additional buffer
for(int i=0; i<limit-3; i++)
{
telo[i] = 0.0;
if (Open[i]>Close[i]) telo[i] = Open[i]-Close[i];
if (Open[i]<Close[i]) telo[i] = Close[i]-Open[i];
shag[i] = High[i] - Low[i];
}
for(i=0; i<limit-3; i++)
{
ishag[i] = iMAOnArray(shag,0,3,0,MODE_LWMA,0);
itelo[i] = iMAOnArray(telo,0,3,0,MODE_LWMA,0);
}
//---- done
return(0);
}
Если запускать как вышенаписано - не работает. В логах ничего нет.
Если без сглаживания средними, то все ОК.
Почему?