Форум » Индикаторы » Индикатор стохастик Ди Наполи » Ответить

Индикатор стохастик Ди Наполи

tench72: Здравствуйте, Scriptong. Помогите пожалуйста сделать стохастик Ди Наполи мультитаймфреймным, я всю голову поломал уже не могу ни как сделать код индюка прилагаю: Стохастик Ди Наполи Заранее благодарен!!!!

Ответов - 38, стр: 1 2 3 All

Scriptong: tench72 пишет: код индюка прилагаю: Стохастик Ди Наполи Странно. Несколько раз пробовал скачать, а результат один и тот же - файл нулевого размера. Попробуйте закачать файл еще раз.

tench72: Закачал на Яндекс диск вот ссылочка: _https://yadi.sk/d/wXbLBMehWcMLD

Scriptong: tench72 пишет: Закачал на Яндекс диск вот ссылочка: _https://yadi.sk/d/wXbLBMehWcMLD Получилось. Теперь к вопросу. Если я правильно понял, нужно, чтобы индикатор отображал данные только того таймфрейма, который указан пользователем. По коду не видно попыток движения в эту сторону. И еще - имеется грубая ошибка: double Fast=(Close-low)/(high-low)*100; //расчёт первичной быстрой линии %К StoBuffer=StoBuffer[i+1]+(Fast-StoBuffer[i+1])/SlowK; //расчёт стохастической линии SigBuffer=SigBuffer[i+1]+(StoBuffer-SigBuffer[i+1])/SlowD; //расчёт сигнальной линии Во всех приведенных строках используется операция деления. Причем ни в одном из случаев корректность знаменателя перед делением не проверяется. Это приводит к частым появлениям фатальной ошибки - деления на 0. По крайней мере, у меня при первом запуске именно так и произошло. Эту ошибку легко исправить: if (diff != 0 && SlowK != 0 && SlowD != 0) { double Fast = (Close - low) / diff; //расчёт первичной быстрой линии %К StoBuffer = StoBuffer[i + 1] + (Fast - StoBuffer[i + 1]) / SlowK; //расчёт стохастической линии SigBuffer = SigBuffer[i + 1] + (StoBuffer - SigBuffer[i + 1]) / SlowD; //расчёт сигнальной линии }


tench72: Здравствуйте Scriptong. Я не представил свои наработки, так как они все равно не работают, и приложил код индикатора как он есть в интернете то есть оригинал. Ошибку учту, спасибо! Да Вы правы индикатор должен отображать данные только того таймфрейма, который указан пользователем, например если значение 0, то отображаются данные того таймфрейма на котором установлен индикатор а если значение 15 например, а сам индикатор стоит на 5-ти минутном графике, то индикатор показывает значения 15-ти минутного графика, в подвале окна 5-ти минутного.

Scriptong: tench72 пишет: Я не представил свои наработки, так как они все равно не работают, и приложил код индикатора как он есть в интернете то есть оригинал. Покажите их и я помогу разобрать ошибки. Дело в том, что если я просто дам готовый вариант, то это никому в плане обучения не поможет. А вот при разборе ошибок процесс обучения идет намного эффективнее.

tench72: В программе индикатора я ввел дополнительную внешнюю переменную, которая отвечает за выбор таймфрейма, далее я в программе вычисления максимума и минимума значения цены за определенное количество баров, ввел эту переменную в функцию индекса наибольшего найденного значения. Так вот если TimeFrame=0 то есть по умолчанию текущий таймфрейм, то индикатор показывается как обычно в отдельном окне, но стоит выставить например на пятиминутном графике значение TimeFrame=15, чтобы индикатор отображал данные с 15-ти минутного графика, как он сразу же исчезает! Окно есть, но оно пустое без индикатора вот в чем проблема я не знаю! extern int TimeFrame=0; //по умолчанию текущий таймфрейм ......................................................................................... low=Low[Lowest(NULL,TimeFrame,MODE_LOW,FastK,i)]; //минимум high=High[Highest(NULL,TimeFrame,MODE_HIGH,FastK,i)]; //максимум Вот все на что я был способен

Scriptong: tench72 пишет: low=Low[Lowest(NULL,TimeFrame,MODE_LOW,FastK,i)]; //минимум high=High[Highest(NULL,TimeFrame,MODE_HIGH,FastK,i)]; //максимум Вот все на что я был способен Ну вот, теперь хотя бы понятно, с чего нужно начинать пояснения. Итак, при разработке мультитаймфреймного индикатора необходимо учитывать тот факт, что нумерация баров на различных таймфреймах разная. Так, один бар М15 состоит из трех баров М5. Это значит, что на графике М5 мы имеем бары с индексами 0, 1 и 2, а для графика М15 это, вполне возможно, только бар с индексом 0. Поэтому первое, что нужно делать в мультитаймфреймном индикаторе, это находить соответствия между индексами баров. В указанном участке кода переменная цикла i указывает индексы баров текущего таймфрейма. Для того чтобы получить данные с ТФ М15, нужно сначала найти бар, которому соответствует бар №i на ТФ М15. Делается это при помощи функции iBarShift. Ей передается время открытия бара, для которого необходимо найти соответствующий бар указанного таймфрейма: int indexM15 = iBarShift(NULL, PERIOD_M15, Time); Код отображается немного неправильно. После слова "Time" следует открывающая квадратная скобка, затем символ "i", а после - закрывающая квадратная скобка. Движок форума воспринимает такую комбинацию за BB-код, указывающий на шрифт в виде курсива. И вот этот найденный индекс уже можно использовать при нахождении минимума/максимума цены. Это только начало. Дальше попробуйте сами. Скорее всего, еще столкнетесь с трудностями, их и опишите. Будем разбираться дальше.

tench72: Прошу прощения, но я ни чего не понял в какую часть кода вставлять этот индекс из меня программист как из черепахи спринтер!

Scriptong: tench72 пишет: Прошу прощения, но я ни чего не понял в какую часть кода вставлять этот индекс из меня программист как из черепахи спринтер! К сожалению, на этом ресурсе я не выполняю заказы на создание или модификацию программ. Помочь, подсказать, направить, указать на ошибку - могу. Если есть желание, давайте начнем с азов. Я с этим тоже могу помочь. Но писать все будете Вы лично с полным пониманием того, что Вы делаете.

tench72: Желание есть. Но как и с чего начнем?

Scriptong: tench72 пишет: Желание есть. Но как и с чего начнем? Давайте начнем. Начнем с того, что попробуйте осмыслить хотя бы что-то из того, что я описал в посте 16.07.14. Как только запнетесь, задавайте вопрос применительно к тому предложению, которое Вы не поняли.

tench72: Все равно мне не понятно что возвращает функция iBarShift(NULL, PERIOD_M15, Time) ?

Scriptong: tench72 пишет: Все равно мне не понятно что возвращает функция iBarShift(NULL, PERIOD_M15, Time) ? Индекс i в цикле указывает на индекс обрабатываемого бара текущего таймфрейма. На другом таймфрейме этому бару соответствует бар с другим индексом. Как нам определить соответствие между этими барами? Ответ: по времени открытия баров - один бар по времени будет вложен в другой. К примеру, бар М5 со временем открытия 18:25 вложен в бар М15 со временем открытия 18:15. Оперируя этими данными, можно найти индекс бара на указанном таймфрейме, в который вложен бар с указанным временем открытия. Это и делает функция iBarShift - возвращает индекс бара, которому принадлежит время time на таймфрейме tf. Мы ей передаем время открытия текущего обрабатываемого бара (Time[ i ]) и указываем, на каком таймфрейме нужно найти индекс бара (PERIOD_M15).

tench72: получается что если мы на пятиминутном таймфрейме, то функция iBarShift с параметрами iBarShift(NULL, 15, Time) будет возвращать индекс равный нулю пока на пятиминутке не отрисуется три бара?

tench72: Я подставил индекс в код стохастика: int in= iBarShift(NULL, tf, Time); low=Low[iLowest(NULL,tf,MODE_LOW,FastK,in)]; //минимум high=High[iHighest(NULL,tf,MODE_HIGH,FastK,in)]; //максимум double Fast=(Close[in]-low)/(high-low)*100; //расчёт первичной быстрой линии %К StoBuffer=StoBuffer[i+1]+(Fast-StoBuffer[i+1])/SlowK; //расчёт стохастической линии и опять та же картина если параметр таймфрейма tf=0 индикатор рисуется в окне, а если изменить например на tf=15 а индикатор на 5-ти минутном графике, то он исчезает т.е не рисуется???!!!



полная версия страницы