| / | Форум |
|
dmitriy
03.11.2006 16:01
Написал адаптивную скользящую среднюю по Кауффману. Рисует
правильно. В окне данных отображаются правильные значения.
Выводил через Print() индикаторные буферы. Всё соответствует истине. Вот код: //+------------------------------------------------------------------+ //| AMAstdev.mq4 | //| Copyright © 2006, D&S Kiriyenko. | //| http://groups.google.com/group/expert-developing | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, D&S Kiriyenko." #property link "http://groups.google.com/group/expert-developing" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 LightGreen #property indicator_width1 1 #property indicator_color2 Red #property indicator_width2 2 #property indicator_color3 Blue #property indicator_width3 2 //+------------------------------------------------------------------+ //| макроопределения | //+------------------------------------------------------------------+ //---- строковые константы #define INDICATOR_SHORT_NAME "AMAstdev" #define MAIN "AMA line" #define UP "UpTrend point" #define DOWN "DownTrend point" //+------------------------------------------------------------------+ //| внешние переменные | //+------------------------------------------------------------------+ //---- периоды extern int periodAMA = 9; //период расчёта к-та эффективности extern double nfast = 2; //период EMA для эффективного рынка extern double nslow = 30; //период EMA для неэффективного рынка //---- расчёт сглаживающей константы extern double Pow = 2.0; //степень эффективности //---- влияние стандартного отклонения extern double dK = 1.0; //коэффициент для фильтра //+------------------------------------------------------------------+ //| глобальные переменные | //+------------------------------------------------------------------+ //---- буферы double kAMAbuffer[]; double kAMAupsig[]; double kAMAdownsig[]; //---- оптимизация кода индикатора int cbars = 0, prevbars = 0, prevtime = 0; //---- сглаживающие коэффициенты double slowSC, fastSC; //---- приращения индикатора double ddAMA[]; //+------------------------------------------------------------------+ //| Вставка значения в массив приращений | //+------------------------------------------------------------------+ bool InsertDif(double a) { //---- проверка, заполнен ли массив for (int i = 0; i < periodAMA; i++) //для всех элементов массива if (ddAMA[i] == 0) //если элемент равен нулю { ddAMA[i] = a; //сохраняем значение в этот элемент return (true); //и удачно завершаемся } //---- массив уже заполнен, нужно вставлять элемент с конца for (i = 0; i < periodAMA-1;i++) //все элементы массива, кроме последнего ddAMA[i] = ddAMA[i+1]; //сдвигаем влево на одну позицию ddAMA[periodAMA-1] = a; //и записываем значение в самую правую позицию return (true); //после чего удачно завершаемся } //+------------------------------------------------------------------+ //| Инициализация | //+------------------------------------------------------------------+ int init() { //---- индикаторы //---- главная линия SetIndexBuffer(0,kAMAbuffer); SetIndexStyle(0,DRAW_LINE,0,2); SetIndexLabel(0,MAIN); //---- подтверждение восходящего тренда SetIndexBuffer(1,kAMAupsig); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,159); SetIndexLabel(1,UP); //---- подтверждение нисходящего тренда SetIndexBuffer(2,kAMAdownsig); SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2,159); SetIndexLabel(2,DOWN); //---- настройки индикатора IndicatorDigits(4); string name = StringConcatenate(INDICATOR_SHORT_NAME, " (",periodAMA,"/",nfast,"/",nslow,")"); IndicatorShortName(name); //---- расчёт к-тов slowSC = (2.0 /(nslow+1)); //медленный к-т сглаживания fastSC = (2.0 /(nfast+1)); //быстрый к-т сглаживания //---- подготовка массива ArrayResize(ddAMA,periodAMA); ArrayInitialize(ddAMA,0.); //---- готово return(0); } //+------------------------------------------------------------------+ //| Деинициализация | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| Итерационная функция | //+------------------------------------------------------------------+ int start() { //---- оптимизация производительности if (prevbars == Bars) return(0); //если индикатор уже посчитан, выходим cbars = IndicatorCounted(); //к-во посчитанных баров if (Bars <= (periodAMA+2)) return(0); // если баров на графике if (cbars < 0) return(-1); //выходим при некорректном значении переменных if (cbars > 0) cbars--; //последний посчитанный бар будет пересчитан //---- подготовка переменных int pos = Bars-cbars-periodAMA-2; //счётчик в начало периода double AMA0; //предыдущее AMA if (cbars == 0) AMA0 = Close[pos+1]; //предыдущее AMA не расчитывалось //---- расчёт индикатора while (pos>=0) { //---- расчёт сигнала double signal = MathAbs(Close[pos]-Close[pos+periodAMA]); //трендовая составляющая //---- расчёт шума double noise = 0.000000001; for (int i = 0;i<periodAMA;i++) { noise = noise + MathAbs(Close[pos+i]-Close[pos+i+1]); //шумовая составляющая } //---- расчёт коэффициента сглаживания double ER = signal/noise; //коэффициент эффективности double SSC = ER*(fastSC-slowSC) + slowSC; //коэффициент сглаживания //---- расчёт главной линии double AMA = AMA0 + (MathPow(SSC,Pow)*(Close[pos]-AMA0)); //расчёт kAMAbuffer[pos]=AMA; //вывод //---- расчёт фильтрации тренда double ddK = (AMA - AMA0)/Point; //разность InsertDif(ddK); //накапливаем приращение if (pos < Bars - 2*(periodAMA+2)) //если баров накопилось достаточно { //---- расчёт среднего арифметического double SMAdif = 0; //вначале равно нулю for (i = 0; i < periodAMA; i++) { SMAdif += ddAMA[i]; //последовательно суммируем } SMAdif /= periodAMA; //и делим на количество //---- расчёт стандартного отклонения double StDev = 0; //вначале равно нулю for (i = 0; i < periodAMA; i++) { StDev += MathPow(ddAMA[i]-SMAdif,2); //суммируем квадраты отклонений } StDev = MathSqrt(StDev)/periodAMA; //извлекаем корень и делим на количество //---- расчёт фильтра double Filter = dK*StDev; //---- обработка значений if (ddK > Filter) kAMAupsig[pos] = AMA; //есть восходящий тренд else kAMAupsig[pos] = 0; //нет восходящего тренда if (ddK < -Filter) kAMAdownsig[pos] = AMA; //есть нисходящий тренд else kAMAdownsig[pos] = 0; // нет нисходящего тренда } //---- переход к концу цикла AMA0 = AMA; //сохраняем предыдущее значение AMA pos--; //переходим к сдедующему бару } //---- завершение работы prevbars=Bars; //сохраняем количество баров return(0); //готово }При чтении кода из эксперта через функцию iCustom() наблюдаю странность - содержимое всех трёх индикаторных буферов по мнению iCustom() равно 2147483647 (максимум для типа int). Мало того, при обращении к нескольким следующим буферам (которых не существует), получаю сплошной ряд нулей. И только после определённого номера (не помню, какого), чтение следующего индикаторного буфера возвращает ошибку "Нет такого буфера". Читаю так: double AMA = iCustom(NULL,0,"AMAstdev",0,1); //с параметрами по умолчанию double upsig = iCustom(NULL,0,"AMAstdev",9,2,30,2.0,1.0); //с заданными параметрами Приходится писать отдельную функцию, которая считает этот индикатор, а это очень неудобно и вообще - мои предыдущие самопальные индикаторы, а также скачанные поделки других писателей :) прекрасно читаются обычным способом. В чём дело я уже слабо себе представляю. Помогите! |
|
Интервью с Алексеем Кириенко (Axelforex) Советник должен давать прибыли расти и резать убыток одинаково стабильно и точно. |
|
alexjou
03.11.2006 16:15
Ошибка в числе передаваемых параметров (очень распространенная
у новичков): См. справку по iCustom(...) и поиск по форуму с ключом "АМА" (лат. регистр) - там есть примеры получше. |
|
dmitriy
09.11.2006 12:18
Ошибка в числе передаваемых параметров (очень распространенная
у новичков): Это опечатка. Читал я именно с параметрами mode и shift. Всё равно возвращает 2147... и так далее. поиск по форуму с ключом "АМА" (лат. регистр) - там есть примеры получше. Пример там всё тот же - только без расчёта стандартного отклонения, просто сигналом считается отклонение линии на заданное количество пунктов.Зато обнаружил как минимум ещё одного человека, у которого те же проблемы - причём с кодом, взятым прямо отсюда. Функция iAMA, предложенная KimIV мне не помогла (руки кривые?). Потому как написать индикатор на ней что-то не получилось, а хочется, чтобы и индикатор, и эксперт получали гарантировано одно и то же. Всё же, как получить правильные значения из программы? |
33780 |
Rosh
09.11.2006 12:28
Вот в этом месте
if (ddK > Filter) kAMAupsig[pos] = AMA; //есть восходящий тренд else kAMAupsig[pos] = 0; //нет восходящего тренда if (ddK < -Filter) kAMAdownsig[pos] = AMA; //есть нисходящий тренд else kAMAdownsig[pos] = 0; // нет нисходящего тренда нет записи нулевых значений, почитайте http://www.metatrader4.com/ru/forum/6839/page77 |
|
dmitriy
09.11.2006 15:11
Rosh писал (а): Спасибо, Rosh. Я вставил строки видаВот в этом месте if (ddK > Filter) kAMAupsig[pos] = AMA; //есть восходящий тренд else kAMAupsig[pos] = 0; //нет восходящего тренда if (ddK < -Filter) kAMAdownsig[pos] = AMA; //есть нисходящий тренд else kAMAdownsig[pos] = 0; // нет нисходящего тренда нет записи нулевых значений, почитайте http://www.metatrader4.com/ru/forum/6839/page77 SetIndexEmptyValue(0,0.0);в Init функцию для каждого индикаторного буфера. Теперь, я таки получаю нулевые значения. Всегда и везде. Включая нулевой буфер индикатора, т.е., тот, который содержит значения самой линии (которая не может быть равна нулю). Таким образом, проблема не только в этом. Правильные значения - это не только "не 2147... ". Это те значения, которые показывает индикатор в окне графика и в окне данных. Скажите, проблема в коде или между клавиатурой и креслом? |
33780 |
Rosh
09.11.2006 16:01
Щас
|
33780 |
Rosh
09.11.2006 16:12
Попробуйте этот вариант
//+------------------------------------------------------------------+ //| AMAstdevKiriyenko.mq4 | //| Kiriyenko | //| 'Помогите исправить ошибку в самопальном индикаторе' | //+------------------------------------------------------------------+ #property copyright "Kiriyenko" #property link "'Помогите исправить ошибку в самопальном индикаторе'" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 LightGreen #property indicator_width1 1 #property indicator_color2 Red #property indicator_width2 2 #property indicator_color3 Blue #property indicator_width3 2 //+------------------------------------------------------------------+ //| макроопределения | //+------------------------------------------------------------------+ //---- строковые константы #define INDICATOR_SHORT_NAME "AMAstdev" #define MAIN "AMA line" #define UP "UpTrend point" #define DOWN "DownTrend point" //+------------------------------------------------------------------+ //| внешние переменные | //+------------------------------------------------------------------+ //---- периоды extern int periodAMA = 9; //период расчёта к-та эффективности extern double nfast = 2; //период EMA для эффективного рынка extern double nslow = 30; //период EMA для неэффективного рынка //---- расчёт сглаживающей константы extern double Pow = 2.0; //степень эффективности //---- влияние стандартного отклонения extern double dK = 1.0; //коэффициент для фильтра //+------------------------------------------------------------------+ //| глобальные переменные | //+------------------------------------------------------------------+ //---- буферы double kAMAbuffer[]; double kAMAupsig[]; double kAMAdownsig[]; //---- оптимизация кода индикатора int cbars = 0, prevbars = 0, prevtime = 0; //---- сглаживающие коэффициенты double slowSC, fastSC; //---- приращения индикатора double ddAMA[]; //+------------------------------------------------------------------+ //| Вставка значения в массив приращений | //+------------------------------------------------------------------+ bool InsertDif(double a) { //---- проверка, заполнен ли массив for (int i = 0; i < periodAMA; i++) //для всех элементов массива if (ddAMA[i] == 0) //если элемент равен нулю { ddAMA[i] = a; //сохраняем значение в этот элемент return (true); //и удачно завершаемся } //---- массив уже заполнен, нужно вставлять элемент с конца for (i = 0; i < periodAMA-1;i++) //все элементы массива, кроме последнего ddAMA[i] = ddAMA[i+1]; //сдвигаем влево на одну позицию ddAMA[periodAMA-1] = a; //и записываем значение в самую правую позицию return (true); //после чего удачно завершаемся } //+------------------------------------------------------------------+ //| Инициализация | //+------------------------------------------------------------------+ int init() { //---- индикаторы //---- главная линия SetIndexBuffer(0,kAMAbuffer); SetIndexStyle(0,DRAW_LINE,0,2); SetIndexLabel(0,MAIN); //---- подтверждение восходящего тренда SetIndexBuffer(1,kAMAupsig); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,159); SetIndexLabel(1,UP); //---- подтверждение нисходящего тренда SetIndexBuffer(2,kAMAdownsig); SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2,159); SetIndexLabel(2,DOWN); //---- настройки индикатора IndicatorDigits(4); string name = StringConcatenate(INDICATOR_SHORT_NAME, " (",periodAMA,"/",nfast,"/",nslow,")"); IndicatorShortName(name); //---- расчёт к-тов slowSC = (2.0 /(nslow+1)); //медленный к-т сглаживания fastSC = (2.0 /(nfast+1)); //быстрый к-т сглаживания //---- подготовка массива ArrayResize(ddAMA,periodAMA); ArrayInitialize(ddAMA,0.); //---- готово return(0); } //+------------------------------------------------------------------+ //| Деинициализация | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| Итерационная функция | //+------------------------------------------------------------------+ int start() { //---- оптимизация производительности double var1,var2; if (prevbars == Bars) return(0); //если индикатор уже посчитан, выходим cbars = IndicatorCounted(); //к-во посчитанных баров if (Bars <= (periodAMA+2)) return(0); // если баров на графике if (cbars < 0) return(-1); //выходим при некорректном значении переменных if (cbars > 0) cbars--; //последний посчитанный бар будет пересчитан //---- подготовка переменных int pos = Bars-cbars-periodAMA-2; //счётчик в начало периода double AMA0; //предыдущее AMA if (cbars == 0) AMA0 = Close[pos+1]; //предыдущее AMA не расчитывалось //---- расчёт индикатора while (pos>=0) { //---- расчёт сигнала double signal = MathAbs(Close[pos]-Close[pos+periodAMA]); //трендовая составляющая //---- расчёт шума double noise = 0.000000001; for (int i = 0;i<periodAMA;i++) { noise = noise + MathAbs(Close[pos+i]-Close[pos+i+1]); //шумовая составляющая } //---- расчёт коэффициента сглаживания double ER = signal/noise; //коэффициент эффективности double SSC = ER*(fastSC-slowSC) + slowSC; //коэффициент сглаживания //---- расчёт главной линии double AMA = AMA0 + (MathPow(SSC,Pow)*(Close[pos]-AMA0)); //расчёт kAMAbuffer[pos]=AMA; //вывод //---- расчёт фильтрации тренда double ddK = (AMA - AMA0)/Point; //разность InsertDif(ddK); //накапливаем приращение if (pos < Bars - 2*(periodAMA+2)) //если баров накопилось достаточно { //---- расчёт среднего арифметического double SMAdif = 0; //вначале равно нулю for (i = 0; i < periodAMA; i++) { SMAdif += ddAMA[i]; //последовательно суммируем } SMAdif /= periodAMA; //и делим на количество //---- расчёт стандартного отклонения double StDev = 0; //вначале равно нулю for (i = 0; i < periodAMA; i++) { StDev += MathPow(ddAMA[i]-SMAdif,2); //суммируем квадраты отклонений } StDev = MathSqrt(StDev)/periodAMA; //извлекаем корень и делим на количество //---- расчёт фильтра double Filter = dK*StDev; //---- обработка значений var1=0; var2=0; if (ddK > Filter) var1=AMA; //есть восходящий тренд if (ddK < -Filter) var2=AMA; //есть нисходящий тренд kAMAupsig[pos] = var1; //нет восходящего тренда kAMAdownsig[pos] = var2; // нет нисходящего тренда } //---- переход к концу цикла AMA0 = AMA; //сохраняем предыдущее значение AMA pos--; //переходим к сдедующему бару } //---- завершение работы prevbars=Bars; //сохраняем количество баров return(0); //готово } |
|
dmitriy
13.11.2006 12:47
Большое спасибо, Rosh, за участие. Ничего не поменялось. Я же говорю,
нулю (или миллиардам) равны как upsig и downsig, так и главная линия,
которая считается так:
//---- расчёт главной линии double AMA = AMA0 + (MathPow(SSC,Pow)*(Close[pos]-AMA0)); //расчёт kAMAbuffer[pos]=AMA; //вывод Здесь переменная во-первых, в любом случае проинициализирована, во-вторых, не может быть равна нулю ни при каких обстоятельствах. Высланный в последнем посте код тоже выводит эти самые два миллиарда. Причём, для главной линии тоже. Я понимаю, что SetIndexEmptyValue позволит получать нули. Но требуются не нули. Забавно, что если печатать содержимое индикаторных буферов из кода индикатора: Print(kAMAbuffer[pos]);выводятся нормальные значения. А через iCustom() - ни-ни. Причём, я пробовал просто заносить в буфер произвольные значения: kAMAbuffer[pos] = 12.3;- нифига! В индикаторе всё правильно, а iCustom продолжает дёргать нулевые значения. И так делают все версии этого индикатора, в том числе, с этого сервера взятые :? С уважением. |
33780 |
Rosh
13.11.2006 13:37
Не знаю, что у Вас там не получается, вот такой проверочный скрипт
//+------------------------------------------------------------------+ //| CheckAMAStep.mq4 | //| Rosh | //| 'Помогите исправить ошибку в самопальном индикаторе' | //+------------------------------------------------------------------+ #property copyright "Rosh" #property link "'Помогите исправить ошибку в самопальном индикаторе'" //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { double main,up,down; //---- for (int shift=100;shift>-0;shift--) { main=iCustom(Symbol(),0,"AMAstdevKiriyenko",9,2,30,2.0,1.0,0,shift); up=iCustom(Symbol(),0,"AMAstdevKiriyenko",9,2,30,2.0,1.0,1,shift); down=iCustom(Symbol(),0,"AMAstdevKiriyenko",9,2,30,2.0,1.0,2,shift); Print("i="," main=",main," up=",up," down=",down); } //---- return(0); } //+------------------------------------------------------------------+ выдает на 4х часовке Фунте 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: removed 2006.11.13 13:35:27 AMAstdevKiriyenko GBPUSD,H4: removed 2006.11.13 13:35:27 AMAstdevKiriyenko GBPUSD,H4: deinitialized 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9078 up=1. 9078 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9075 up=1. 9075 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9067 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9067 up=1. 9067 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9064 up=1. 9064 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9057 up=1. 9057 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9044 up=1. 9044 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9043 up=1. 9043 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9038 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9038 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9038 up=0 down=1. 9038 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9038 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9038 up=1. 9038 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9034 up=1. 9034 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.903 up=1. 903 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9027 up=1. 9027 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9018 up=1. 9018 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9007 up=1. 9007 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.899 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8988 up=1. 8988 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8986 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8986 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8985 up=0 down=1. 8985 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8992 up=0 down=1. 8992 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9002 up=0 down=1. 9002 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9019 up=0 down=1. 9019 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9028 up=0 down=1. 9028 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9036 up=0 down=1. 9036 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9042 up=0 down=1. 9042 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9045 up=0 down=1. 9045 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9047 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9047 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9046 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9046 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9045 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9045 up=1. 9045 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9042 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9041 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9041 up=1. 9041 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=1. 9039 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9028 up=1. 9028 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9018 up=1. 9018 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9009 up=1. 9009 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8997 up=1. 8997 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8994 up=1. 8994 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.899 up=1. 899 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8983 up=1. 8983 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8975 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8974 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8974 up=1. 8974 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8973 up=1. 8973 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8972 up=1. 8972 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8969 up=1. 8969 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8963 up=1. 8963 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.895 up=1. 895 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8942 up=1. 8942 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8936 up=1. 8936 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8929 up=1. 8929 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8919 up=1. 8919 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8907 up=1. 8907 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8885 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8886 up=1. 8886 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8872 up=1. 8872 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8853 up=1. 8853 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8839 up=1. 8839 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8804 up=1. 8804 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8781 up=1. 8781 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8755 up=1. 8755 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8751 up=1. 8751 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8742 up=1. 8742 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8735 up=1. 8735 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8733 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8732 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8731 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8731 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8731 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8731 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.873 up=0 down=1. 873 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8735 up=0 down=1. 8735 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8751 up=0 down=1. 8751 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8768 up=0 down=1. 8768 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8781 up=0 down=1. 8781 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8786 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8789 up=0 down=1. 8789 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8798 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8801 up=0 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.88 up=1. 88 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8798 up=1. 8798 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8787 up=1. 8787 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8772 up=1. 8772 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8749 up=1. 8749 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8729 up=1. 8729 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8716 up=1. 8716 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8704 up=1. 8704 down=0 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8695 up=1. 8695 down=0 2006.11.13 13:35:27 AMAstdevKiriyenko GBPUSD,H4: initialized 2006.11.13 13:35:27 AMAstdevKiriyenko GBPUSD,H4: loaded successfully 2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: loaded successfully 2006.11.13 13:35:12 Compiling 'CheckAMAStep' |
|
dmitriy
14.11.2006 14:57
Rosh, спасибо, открыл глаза.
Фишка была в том, что индикатор, наложенный на график, отрисовывался весь, но при поступлении новых баров он этого не делал. Поэтому, при прогоне на истории, он тоже нормально возвращал значение для нулевого бара и все предыдущие, но уже на следующем баре нулевое значение доступно не было. Исправил я так: почти полностью прибил "оптимизацию" кода - удалил всё, связанное с cbars = IndicatorCounted();и дальнейшим использованием переменной cbars. В связи с этим ввёл переменную NumBars - на скольких барах вообще строить индикатор. В связи с этим, вопрос: где был косяк в оригинальном коде? У меня из-за отсутствия индикатора просто работа стоит (стояла), поэтому я ошибку из академического интереса искать не стал, просто исправил таким образом. Но академический интерес остался. Как надо было правильно использовать IndicatorCounted в приведённом индикаторе? Кому интересно и не лень, подскажите. |
|
VladislavVG
14.11.2006 15:17
dmitriy писал (а): Насколько я вижу, Вы забыли "подавить" нулем значение, возвращаемое
по умолчанию как нерисуемое. Rosh, спасибо, открыл глаза. Фишка была в том, что индикатор, наложенный на график, отрисовывался весь, но при поступлении новых баров он этого не делал. Поэтому, при прогоне на истории, он тоже нормально возвращал значение для нулевого бара и все предыдущие, но уже на следующем баре нулевое значение доступно не было. Исправил я так: почти полностью прибил "оптимизацию" кода - удалил всё, связанное с cbars = IndicatorCounted();и дальнейшим использованием переменной cbars. В связи с этим ввёл переменную NumBars - на скольких барах вообще строить индикатор. В связи с этим, вопрос: где был косяк в оригинальном коде? У меня из-за отсутствия индикатора просто работа стоит (стояла), поэтому я ошибку из академического интереса искать не стал, просто исправил таким образом. Но академический интерес остался. Как надо было правильно использовать IndicatorCounted в приведённом индикаторе? Кому интересно и не лень, подскажите. SetIndexEmptyValue(Номер_буффера,0.0); Иначе как нерисуемое взвращается EMPTY_VALUE, которое отлично от нуля. В той ветке, на которую Rosh ссылался это только краем прошло. Успехов. |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий