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

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

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-ти минутном графике, то он исчезает т.е не рисуется???!!!

Scriptong: tench72 пишет: Я подставил индекс в код стохастика: В этом коде Вы получили только два правильных значения: low и high. Все остальные - неправильные. Так, при расчете значения переменной Fast Вы использовали таймсерию, обращающуюся к текущему таймфрейму: Close. При работе с другим таймфреймом/графиком необходимо использовать функцию iClose. Ну и со значением буфера StoBuffer Вы вновь допускаете ошибку - оперируете индексом текущего таймфрейма при расчете значения. Хотя сохранять значение, конечно же, нужно по индексу текущего таймфрейма. Разберитесь с тем, в каких местах нужно использовать индекс текущего таймфрейма, а в каких - другого. Так, при расчетах всегда нужно использовать индекс бара другого ТФ, а при визуализации значения (сохранении результата в буфер индикатора) используется индекс бара текущего ТФ.

tench72: Scriptong пишет: Ну и со значением буфера StoBuffer Вы вновь допускаете ошибку - оперируете индексом текущего таймфрейма при расчете значения. Хотя сохранять значение, конечно же, нужно по индексу текущего таймфрейма. Разберитесь с тем, в каких местах нужно использовать индекс текущего таймфрейма, а в каких - другого. я изменил код: while(i>=0) { 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=(iClose(NULL,tf,in)-low)/(high-low)*100; //расчёт первичной быстрой линии %К StoBuffer[in]=StoBuffer[in+1]+(Fast-StoBuffer[in+1])/SlowK; все равно ни чего не изменилось на другом таймфрейме индикатор и исчезает

Scriptong: tench72 пишет: все равно ни чего не изменилось на другом таймфрейме индикатор и исчезает Странно. У меня не исчезает. Просто показывает неправильные значения. Ну да ладно, с этим разберемся потом, когда код доведем до нужной кондиции. Итак, Вы уже сделали определенные успехи - использовали функцию iClose, т. к. необходимо было получить цену закрытия бара другого таймфрейма. Но при этом почему-то забыли, что при расчете минимума и максимума тоже нужно оперировать данными другого таймфрейма. Low и High - это массивы таймсерии, при помощи которых можно получить минимум и максимум указанного бара, но на текущем таймфрейме. Если же необходимо получить максимум и минимум бара другого таймфрейма, то следует использовать функции iLow и iHigh. Когда исправите эту ошибку, получите следующий вид индикатора на М5 при использовании данных М15: Правда, и этот вариант не является полностью правильным. Попробуйте по виду показаний определить, как проявляется следующая ошибка. Путь ее устранения я подскажу.

tench72: а как же функции iLowest(NULL,tf,MODE_LOW,FastK,in) и iHighest(NULL,tf,MODE_HIGH,FastK,in) они вообще не нужны???? Ни чего не пойму... как использовать функции iLow и iHigh, совместно с ними???!!!!

Scriptong: tench72 пишет: а как же функции iLowest(NULL,tf,MODE_LOW,FastK,in) и iHighest(NULL,tf,MODE_HIGH,FastK,in) они вообще не нужны???? Нужны. Функция iLowest определяет индекс минимального бара на заданном интервале. Нам же требуется получить значение минимума бара. Для текущего таймфрейма это делается при помощи обращения к массиву-таймсерии Low, а для таймфрейма, отличного от текущего, при помощи функции iLow. Аналогично с iHighest, High и iHigh. Для лучшего понимания прочтите документацию по этим функциям. По таймсериям документация здесь.

tench72: Добрый вечер Scriptong. Спасибо за консультации, но честное слово, я не иогу понять что делать... В принципе я получил три стохастика Ди Наполи по разным тайм фреймам, я воспользовался функцией iCustom() ввел функции iLowest и iHighest, их значения ввел в функцию iCustom() с соответствующим таймфреймом. Вроде как получилось, правда ступенчатые они какие то но деваться не куда, что получилось то получилось. Еще раз спасибо!

Scriptong: tench72 пишет: Спасибо за консультации, но честное слово, я не иогу понять что делать... Ну как что - разбираться, если хочется создавать программы лично Здесь можете задавать любые глупые вопросы по теме MQL4/MQL5. Никто их тут тролить не будет. tench72 пишет: В принципе я получил три стохастика Ди Наполи по разным тайм фреймам, я воспользовался функцией iCustom() ввел функции iLowest и iHighest При чем тут функция iCustom? tench72 пишет: Вроде как получилось, правда ступенчатые они какие то На графике М5 показания с М15 обязательно будут ступеньками, т. к. каждый бар М15 - это 3 бара М5. То есть три подряд бара М5 будут отображать одинаковые показания. Покажите тот код, который у Вас получился. Скорее всего, там еще есть несколько неучтенных моментов. Я то уже сделал для проверки "правильный вариант", в котором все подводные камни обнаружены.

tench72: Код получился таким: int start() { int i,limit,y=0; limit= ColBar-1; for(i=0,y=0;i<limit;i++) { y=iBarShift(NULL, TimeFrame, Time); ExtMapBuffer=iCustom(NULL,TimeFrame,"StochasticDN",FastK,0,y) ; { я позаимствовал его у индикатора MTF RSI в параметрах самого стохастика я убрал сигнальную линию и уровни чтобы не усложнять функцию iCustom().

Scriptong: tench72 пишет: Код получился таким: Вас занесло не в ту степь Использование функции iCustom в данном случае не нужно. Это какой-то другой индикатор, который мы с Вами не обсуждали. Предлагаю вернуться к прошлому обсуждению. Итак, у Вас должно было получиться что-то типа такого: while (index >= 0) { int in = iBarShift(NULL, tf, Time[index]); low = iLow(NULL, tf, iLowest(NULL, tf, MODE_LOW, FastK, in)); //минимум high = iHigh(NULL, tf, iHighest(NULL, tf, MODE_HIGH, FastK, in)); //максимум double diff = (high - low) * 100; if (diff != 0 && SlowK != 0 && SlowD != 0) { double Fast = (iClose(NULL, tf, in) - low) / (high - low) * 100; //расчёт первичной быстрой линии %К StoBuffer[index] = StoBuffer[index + 1] + (Fast - StoBuffer[index + 1]) / SlowK; //расчёт стохастической линии SigBuffer[index] = SigBuffer[index + 1] + (StoBuffer[index] - SigBuffer[index + 1]) / SlowD; //расчёт сигнальной линии } index--; } Но это еще не совсем правильный код, хотя и рабочий.

tench72: Здравствуйте Сэнсэй! А почему не совсем правильный вроде как гладкий и похож на тот который установлен на своем таймфрейме!

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

tench72: Ну вот те на.... А я так обрадовался Ноя сравнивал значения перегибов стохастиков мультитаймфрейного наМ15 установленного на М5, и обыкновенного на М15, они вроде как совпадают

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

tench72: Здравствуйте Scriptong, я бы с удовольствием подумал в направлении в котором Вы указали... Но увы я не программист, и даже не подозреваю в каком направлении думать, мой опыт программирования ограничен начальными курсоми Бейсика и Си в даааалеком 1995 году, когда я заканчивал универ. В учебнике MQL4 очень скудно описано про функции, да и мОзги уже не те что раньше

Scriptong: tench72 пишет: Но увы я не программист, и даже не подозреваю в каком направлении думать, мой опыт программирования ограничен начальными курсоми Бейсика и Си в даааалеком 1995 году, когда я заканчивал универ. В учебнике MQL4 очень скудно описано про функции, да и мОзги уже не те что раньше Вы же вроде изъявили желание учить MQL4. Из этих соображений я и даю вводные. Если же намерений учить язык нет, то, конечно, все эти наши разговоры не имеют никакой перспективы. Итак, продолжаю, исходя из предположения, что учиться Вы, все-таки, намерены. Простой пример, для которого не нужно быть программистом. Достаточно знать математику на уровне 5-ого класса средней школы. Есть линия. При текущем масштабе эта линия кажется монотонно восходящей. Но стоит лишь увеличить масштаб, как мы увидим, что линия состоит из ступенек. Так и в рассматриваемом индикаторе. Мы берем данные с таймфрейма М15. Это "текущий масштаб линии". Отображаем мы эти данные на таймфрейме М5 - это "увеличенный масштаб". Вопрос: что мы должны увидеть на графике М5?

tench72: Это понятно что ступеньки, полка ступеньки будет 3 свечи на пятиминутном графике. И как их получить?

Scriptong: tench72 пишет: И как их получить? По-моему, ответ очевиден: для всех свечей М5, которые относятся к одной и той же свече М15, повторять одно и то же вычисленное значение. То есть для каждой свечи М5 нужно проверить, было ли уже вычислено значение стохастика для свечи М15, которой соответствует текущая свеча М5. Если значение уже вычислено, то нужно лишь отобразить его, и перейти к следующей свече М5. В текущем же коде получается так, что на всех трех свечах М5 значения стохастика разные. Причем каждые две последние свечи отображают неправильные значения, т. к. они заново рассчитываются. Алгоритм получается такой: 1. Определили индекс свечи М15, которому соответствует текущая свеча М5. Это, кстати, уже есть в коде. Определите где. 2. После этого сравниваем индекс полученной свечи с индексом свечи, полученным на предыдущей итерации цикла. Для этого нужно завести еще одну переменную, которая хранит индекс последней свечи М15, которой соответствует рассчитанное значение стохастика. 3. Если индексы равны, то отображаем данные с предыдущей свечи и уходим на следующую итерацию. 4. Если индексы не равны, то производим вычисления. Это тоже уже есть. 5. Запоминаем индекс свечи М15, для которой только что были рассчитаны значения. Попробуйте воплотить в код. Это действительно просто: один оператор if и несколько операторов присваивания. Для перехода к следующей итерации цикла используйте оператор continue. Перед ним не забудьте уменьшить счетчик итераций цикла на 1 (index--).

tench72: Добрый день Scriptong, сколько пользуюсь стохастиком Ди Наполи именно тем код которого мы тут потрошим, я ни разу не замечал того что этот индикатор перерисовывается, при смене таймфрейма или просто если вызвать окно его параметров и в значении периода FastK или любого другого значения поставить ТЕ ЖЕ САМЫЕ, то при нажатии кнопки ОК стохастик видоизменяется а это не есть хорошо!!!!! Блин и вот где там собака зарыта, почему так???!!!

Scriptong: Что-то я не понял мысли. Здесь Вы пишете <не перерисовывается>: tench72 пишет: сколько пользуюсь стохастиком Ди Наполи именно тем код которого мы тут потрошим, я ни разу не замечал того что этот индикатор перерисовывается а здесь <перерисовывается>: tench72 пишет: при смене таймфрейма или просто если вызвать окно его параметров и в значении периода FastK или любого другого значения поставить ТЕ ЖЕ САМЫЕ, то при нажатии кнопки ОК стохастик видоизменяется а это не есть хорошо!!!!! Блин и вот где там собака зарыта, почему так???!!! Что же Вы хотели сказать? Насчет перерисовки именно этим индикатором: он не перерисовывает, это точно.

tench72: Добрый вечер Scriptong, я сделал скрины вот посмотрите Скрин1 Скрин2 Скрин3 где то 6 или 7 свечей в конце индикатора линия видоизменяется!

Scriptong: tench72 пишет: Добрый вечер Scriptong, я сделал скрины вот посмотрите Скрин1 Скрин2 Скрин3 где то 6 или 7 свечей в конце индикатора линия видоизменяется! Добрый день. Напоминаю, мы с Вами в данной теме пока ведем речь об индикаторе StochasticDiNapoli_edit. Этот индикатор имеет следующий список настроечных параметров: На скринах, приведенных Вами, видно только два настроечных параметра, да и индикатор называется StochDN_MTF. То есть я говорю об одном индикаторе, а Вы - о другом. Если Вы хотите обсудить этот, другой, индикатор, то приведите его код. Но это будет как-то странно, ведь контекст темы остается в стороне.

tench72: Да это тот же индикатор просто я его так обозвал!!! код тот же !!!

Scriptong: tench72 пишет: код тот же !!! Почему тогда количество настроечных параметров не совпадает?



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