Форум » Консультации по программированию » Я новичок. » Ответить

Я новичок.

Anatoliy: Пишу пользовательский индикатор на основе пересечение уровни 20 и 80. Если главная линия Stochastic пересекла уровень 80 (сверху - вниз), то выводит стрелка Sell на ценовых графиках, а если главная линия Stochastic пересекла уровень 20 (снизу - верх), то стрелка Buy на ценовых графиках. #property strict #property indicator_chart_window #property indicator_buffers 2 //--- plot Buy #property indicator_type1 DRAW_ARROW #property indicator_color1 clrGreen #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot Sell #property indicator_type2 DRAW_ARROW #property indicator_color2 clrRed #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- input parameters //--- indicator buffers double BuyBuffer[]; double SellBuffer[]; //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж //+------------------------------------------------------------------+ //| Функция инициализации пользовательского индикатора | //+------------------------------------------------------------------+ int init() { //--- SetIndexBuffer(0,BuyBuffer); SetIndexArrow(0,233); SetIndexStyle(0,DRAW_ARROW); //--- SetIndexBuffer(1,SellBuffer); SetIndexArrow(1,234); SetIndexStyle(1,DRAW_ARROW); //--- SetIndexEmptyValue(0,80.0); SetIndexEmptyValue(1,20.0); //--- return(0); } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж //+------------------------------------------------------------------+ //| Функция пользовательского индикатора итерации | //+------------------------------------------------------------------+ int start() { //--- int i, Counted_bars; double mainStoc_1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,1); // бар 1 double mainStoc_2 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,2); // бар 2 Counted_bars=IndicatorCounted(); // Количество просчитанных баров i=Bars-Counted_bars-1; for(i=0;i>=0;i--) { if (mainStoc_2 > 80.0 && mainStoc_1 < 80.0) SellBuffer = Low-5*Point; else SellBuffer = 0.0; if (mainStoc_2 < 20.0 && mainStoc_1 > 20.0) BuyBuffer = High+5*Point; else BuyBuffer = 0.0; } //--- return(0); } И в результатах индикатор вообще не работает. Как его исправит?

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 All

Scriptong: Balbesik пишет: Под периодическими я принимаю «идеальную» синусоиду (ЗигЗаг) – одна амплитуда и один период. Под непериодическими я принимаю – пропорционально растет (уменьшается) амплитуда и аналогично пропорционально растет (уменьшается) период. Это все условно (давным-давно тебе я рисунки скидывал). Теперь понятно. Balbesik пишет: Основная задача при построении ЗигЗага определить, по некоторому алгоритму, будет ли продолжение движения (заданной или расчетной величины) или нет. С одной стороны - интересная задача, но с другой стороны, это эквивалентно задаче, решающей, будет ли продолжение движения цены или тренд уже выдохся. То есть задача неимоверно сложная. По-моему, ее никто еще не решил на уровне технического анализа (на уровне фундамента - решили инсайдеры ). Balbesik пишет: Для качественного сравнения и не более, чуть изменил штатный OBV (выбор связан с отсутствием периода у OBV). Изменение минимально - в зависимости от цены Открытия просто количество тиков (на равновысоком баре) вверх это «+», вниз это «-» и на их разности построение графика OBV. Также понятно. Тогда более правильный вариант индикатора будет такой - OBV_edit. По виду индикатор остается тот же, что и стандартный. Отличие - в значениях линии индикатора. Balbesik пишет: Только видимо получается не равнообъёмный, а что-то типа равно кратный по обьему. Т.е. бар привязан (соответствует) к бару по цене, задана величина кол-во тиков , различие будет по цене закрытия бара. Например бар по цене 100 пунктов и в нем 40 или 60 или 120 тиков по «обьему». Задаем 50 тиков по «обьему». Если 40 на баре – цена открытия равна цене закрытия и эти 40 тиков «перенеслись» на следующий бар на котором как только добавится 10 тиков появиться «первая условная цена закрытия». Если 60 на баре – цена закрытия равно цене, когда набралось 50 тиков и 10 тиков переносится на следующий бар Если 120 на баре – цена закрытия равно цене, когда набралось 100 тиков («первая условная цена закрытия» - пропускается) т.е. цена закрытия на 2-х заданных 50 тиков. А вот этот механизм не могу понять. Нужно будет копнуть глубже.

Balbesik: Scriptong пишет: Также понятно. Тогда более правильный вариант индикатора будет такой - OBV_edit. По виду индикатор остается тот же, что и стандартный. Отличие - в значениях линии индикатора. Ну вот я «приехал»? Твой вариант (OBV_edit ) зелененькая линия - график, мой вариант голубенькая линия - график. Алгоритм, на первый взгляд тот же. Завтра буду разбираться. Ну не нравится мне, когда есть рассогласование. Scriptong пишет: С одной стороны - интересная задача, но с другой стороны, это эквивалентно задаче, решающей, будет ли продолжение движения цены или тренд уже выдохся. То есть задача неимоверно сложная. По-моему, ее никто еще не решил на уровне технического анализа (на уровне фундамента - решили инсайдеры ). Ага, особенно, когда отсутствуют корректные исходные данные! Как, в прочем, и в любом другом вопросе. Scriptong пишет: А вот этот механизм не могу понять. Нужно будет копнуть глубже. Да сам не знаю, но чисто интуитивно, мне кажется, должно быть интересно. Вроде все просто (хотя в программировании ничего не понимаю и могу ошибаться). Время на эту схему я бы потратил, если бы был уверен, что смогу сделать сам.

Scriptong: Balbesik пишет: Ну вот я «приехал»? Твой вариант (OBV_edit ) зелененькая линия - график, мой вариант голубенькая линия - график. Алгоритм, на первый взгляд тот же. Завтра буду разбираться. Не видя твоего кода, точно сказать не могу. Но есть подозрение, что значения переменных DeltaOH1 и DeltaOL1 у тебя переходят из одной итерации цикла в другую, без обнуления. Отсюда и видимое нами расхождение. Если обнуление не нужно (требуется накопление данных), то эти переменные лучше сделать отдельными индикаторными буферами.


Balbesik: Привет, Игорь! По возможности (время , да и сайт или мои комп перестали "збоить", кстати на "Глобальной авантюре" такая же ерунда) посмотрел. Вопрос, конечно, интересный. Значимость объявления переменных выходит на "первое" место? Не думал, считал разница только в расчете на баре или тике. Чисто имперически (ручками) нет пока выводов, но интересно. Потом напишу. Сейчас вопрос - "Узлы высоких и низких объемов (HVN и LVN) "- почитал, т.к. понятие объем на форексе мне не понятен и все, что я видел это некие графики, но полностью "самостоятельные" (висят в воздухе) - некоим образом не связанные с ценой. Если считать, что "объем" это характеристика некой АКТИВНОСТИ, то есть ли индикаторы связывающие тики с ценой - уйти от "воздуха". Наиболее близко тут волатильность (это по логике). Я конечно на ОBV попробую (зто в рамках моего пожелания связать равнообъемные с равновысокими), но вдруг что-то есть подобное?

Scriptong: Balbesik пишет: Значимость объявления переменных выходит на "первое" место? Дело в том, что в программировании практически все на первом месте, мелочей нет. В итоге малюсенькая ошибка в логике вылазит такими багами, на поиск которые иногда приходится по полжизни тратить . Balbesik пишет: Я конечно на ОBV попробую (зто в рамках моего пожелания связать равнообъемные с равновысокими), Пока, по моим представлениям, это такие характеристики, которые практически невозможно связать воедино (как не спаривай петуха с уткой - яиц от них все равно не получишь). Хотя могу и ошибаться...

Balbesik: Scriptong пишет: Пока, по моим представлениям, это такие характеристики, которые практически невозможно связать воедино (как не спаривай петуха с уткой - яиц от них все равно не получишь). Хотя могу и ошибаться... Игорь! Прекрасно понимаю. На первом этапе по OBV (уже), по аналогии с фондовой, "убрали" адресные (встречные) сделки. А если "в осях" получиться, то представляю каково тебе фактически сделать кластерный анализ на баре (по тикам). Думаю это "головняк". Но пока об этом речь не идет, буду пробовать, посмотрим. P.S. Кстати, раз я к OBV обращаюсь через Икустом, подозреваю, что в этом случае "не видны" (все) равновысокие бары. В общем тут вопросов масса, но игнорировать всю доступную информацию видимо не верно. Т.е. цену, в данном случае, я рассматриваю как производная активности и хотелось бы разобраться.

Scriptong: Чтобы я смог хоть как-то помочь в этом процессе, необходима минимальная зацепка - в каком направлении копать. Пока одной лишь идеи - совместить равновысокие с эквиобъемными - мало, нужна какая-то "технология".

Balbesik: Scriptong пишет: Чтобы я смог хоть как-то помочь в этом процессе, необходима минимальная зацепка - в каком направлении копать. Пока одной лишь идеи - совместить равновысокие с эквиобъемными - мало, нужна какая-то "технология". Добрый вечер, Игорь! Пока коротко. Я с самого начала обратил внимание, что не уверен в правильности подхода и надо проверять. Ну как и планировал, что-то «в осях» попробовал, что-то пока ясности нет. Видимо время надо или твоя помощь. Рис – Бар_41 ZZ_ Н_410 и Бар_41 ZZ_ Н_1100 – просто изменение размаха ZZ – ну это было, это я к тому, что надо быть осторожным к принятию результатов. Зацепка тут простая – «нормирование» графика, по аналогии с равновысокими (ну тут опять сложно, т.к. объяснить, что я подразумеваю не хватает образования). За основу взял твой индикатор ZZ, который мы принимали за базовый в работе и добавил через iCustom – OBV. Исходил (по аналогии с равновысокими), что на форексе 1 пункт равен 1 «объёма» - активности и рассматриваю, как дополнительный фильтр. Рис – EURUSDM1 Соответственно, если равновысокие позволяют, с определенными допущениями, использовать значения по осям Х и У в одной размерности, то и в случае оценки активности правомерно связать (для равновысоких) ее с ценой. Расхождение в ходе цены (волатильности) и расчетном ходе цены по активности. Картинки – Бар = 41 пункт. Рис – Бар_41 ZZ_ Н_410 штатн OBV_Дивер – штатный OBV и дивергенция. Рис – Бар_41 ZZ_ Н_410 нормир OBV_Дивер – OBV «нормирование» через расчетную цену и дивергенция. Контрольный без OBV – выше (Бар_41 ZZ_ Н_410). Бар = 89 пункт. Рис – Бар_89 ZZ_ Н_890 штатн OBV_Дивер – штатный OBV и дивергенция. Рис – Бар_89 ZZ_ Н_890 нормир OBV_Дивер – OBV «нормирование» через расчетную цену и дивергенция. Рис – Бар_89 ZZ_ Н_890 без OBV – контрольный без OBV. Т.е. делал условно при «прочих равных». Прилагаю «OBV_равновысоких» – там по формуле просто (кстати получилось без разнице, где объявлять переменные – Рис – EURUSDM1) , а вот с точки зрения тикового графика в связке с равновысокими барами я сделать не смогу, а было бы интересно делать расчет – расчетной разности на каждом заданном шаге (количестве тиков).

Scriptong: Balbesik пишет: Исходил (по аналогии с равновысокими), что на форексе 1 пункт равен 1 «объёма» - Зачем же делать такие вот допущения, когда инструмент измерения объемов у нас практически под рукой: тиковые объемы? Да, это, конечно же, не реальные объемы, но предположение о том, что тик - это единица объема гораздо ближе к истине, чем измерение объема пунктами. Balbesik пишет: (кстати получилось без разнице, где объявлять переменные – Рис – EURUSDM1) Разница есть - она накопится при длительной работе индикатора в онлайн. И все равно оба подхода к объявлению переменных неверны. Либо эти переменные должны очищаться перед расчетами на очередном баре, либо их значения должны адекватно подхватываться при каждом входе в start. Это достаточно сложная процедура. В таких случаях, чтобы не морочиться, делаю так: 1. Делаю нужные переменные статическими. 2. Сохраняю их значения для бара с индексом 1. 3. Если индикатор обновил данные для большего количество баров, чем 1 (nLimit > 1), то происходит обнуление статических переменных и полный перерасчет значений индикатора для всех баров. 4. Если индикатор обновил данные только для одного или двух баров (nLimit == 0 или nLimit == 1), то значения статических переменных как раз и подхватываются.

Balbesik: P.S. Индикатор «OBV_равновысоких» http://dropmefiles.com/AaL1M

Balbesik: P.S. Индикатор «OBV_равновысоких» OBV_равновысоких

Balbesik: Добрый день! Вот, что еще посмотрел. Сразу вопрос – А как сравнивать (оценивать) разные подходы? Изменения сделал исходя, что цена на баре делает три движения – Опен – Хинг – Лоу или Опен – Лоу – Хинг , соответственно отсюда и изменения для учета активности. Как-то так – for(i=nLimit; i>=0; i--) { // H1 = 41 - высота равновысокого бара в пунктах if (iClose(NULL,PERIOD_CURRENT,i) == iHigh(NULL,PERIOD_CURRENT,i)) barHeight = ((iOpen(NULL,PERIOD_CURRENT,i) - iLow(NULL,PERIOD_CURRENT,i)) * 2) + (iHigh(NULL,PERIOD_CURRENT,i) - iOpen(NULL,PERIOD_CURRENT,i)); if(iClose(NULL,PERIOD_CURRENT,i) == iLow(NULL,PERIOD_CURRENT,i)) barHeight = (iOpen(NULL,PERIOD_CURRENT,i) - iLow(NULL,PERIOD_CURRENT,i)) + ((iHigh(NULL,PERIOD_CURRENT,i) - iOpen(NULL,PERIOD_CURRENT,i)) * 2); if(barHeight != 0) { ProcClosOH = NormalizeDouble(MathAbs(iHigh(NULL,PERIOD_CURRENT,i) - iOpen(NULL,PERIOD_CURRENT,i)) / barHeight, 5); ProcClosOL = NormalizeDouble(MathAbs(iLow(NULL,PERIOD_CURRENT,i) - iOpen(NULL,PERIOD_CURRENT,i)) / barHeight, 5); } if (iClose(NULL,PERIOD_CURRENT,i) == iHigh(NULL,PERIOD_CURRENT,i)) { DeltaVol_H = (iVolume(NULL,PERIOD_CURRENT,i) * ProcClosOH); DeltaVol_L = iVolume(NULL,PERIOD_CURRENT,i) - DeltaVol_H; } if(iClose(NULL,PERIOD_CURRENT,i) == iLow(NULL,PERIOD_CURRENT,i)) { DeltaVol_L = (iVolume(NULL,PERIOD_CURRENT,i) * ProcClosOL); DeltaVol_H = iVolume(NULL,PERIOD_CURRENT,i) - DeltaVol_L; } RasVol_H = MathAbs( iClose(NULL,PERIOD_CURRENT,i) - iOpen(NULL,PERIOD_CURRENT,i) ) * 100000; RasVol_L = MathAbs( iClose(NULL,PERIOD_CURRENT,i) - iOpen(NULL,PERIOD_CURRENT,i) ) * 100000; DeltaV_H = NormalizeDouble( MathAbs(DeltaVol_H - RasVol_H) ,5); DeltaV_L = NormalizeDouble( MathAbs(DeltaVol_L - RasVol_L) ,5); if(i == iBars(NULL,PERIOD_CURRENT) - 1) ExtOBVBuffer = NormalizeDouble( (DeltaV_H + DeltaV_L)/2 ,0); else { if (iClose(NULL,PERIOD_CURRENT,i) == iOpen(NULL,PERIOD_CURRENT,i) || iVolume(NULL,PERIOD_CURRENT,i) == 0) ExtOBVBuffer = ExtOBVBuffer[i+1]; else { // i < i+1 if(iClose(NULL,PERIOD_CURRENT,i) < iOpen(NULL,PERIOD_CURRENT,i)) ExtOBVBuffer = ExtOBVBuffer[i+1] - MathAbs(DeltaV_L); else ExtOBVBuffer = ExtOBVBuffer[i+1] + MathAbs(DeltaV_H); } } Рис – Штатн_оптим_13_1 – оптимизация со штатным OBV Рис – Нормир_оптим_13_1– оптимизация с корректированном OBV Рис – Штатн__форвар_1_8 – форвард-участок со штатным OBV Рис – Нормир __форвар_1_8 – форвард-участок со корректированном OBV Рис – Штатн_оптим_1_8 – оптимизация форвард-участока со штатным OBV Рис – Нормир_оптим_1_8 – оптимизация форвард-участока с корректированном OBV Рис – Штатн__форвар_8_15 – следующий форвард-участок со штатным OBV Рис – Нормир __форвар_8_15 – следующий форвард-участок со корректированном OBV Выводы – - нет корректного сравнения (критерий сравнения не ясен). - не доделан алгоритм (время). - нет инструмента для работы (индикатора по тикам - для «нормирования»).

Scriptong: Balbesik пишет: Сразу вопрос – А как сравнивать (оценивать) разные подходы? Универсального способа нет. Поэтому нужно рассматривать каждый конкретный случай. К примеру, в данном случае я пока не понял, о каких именно подходах идет речь. Balbesik пишет: Выводы – - нет инструмента для работы (индикатора по тикам - для «нормирования»). Тиковые данные есть здесь. На их основе строится тиковый график (TicksCollector с отключенной функцией сбора тиков и формированием эквиобъемного графика единичного объема).

Balbesik: Привет, Игорь! «…Универсального способа нет. Поэтому нужно рассматривать каждый конкретный случай. К примеру, в данном случае я пока не понял, о каких именно подходах идет речь…» Речь, согласно алгоритма, не о подходах, а о существующем алгоритме (штатном). Да ты прав, сложно сравнить. Пошел путем сравнения по параметрам оптимизации – Порядка на 3 «шире» диапазон значений оптимизации при «коррекции» в отличии от «штатного» . А в рамках «советника» (приложение, как ФИЛЬТР) тем более – но надо время. «Тиковые данные есть здесь. На их основе строится тиковый график (TicksCollector с отключенной функцией сбора тиков и формированием эквиобъемного графика единичного объема).» Вопрос не в этом (мы с тобой, на мой взгляд, первые начали обсуждать эту разработку, т.е. я знаю о чем речь), естественно с этой разработкой я знаком (но она мне ничего не дает) - она не связана (разорвана, как единая система - те же гуси со свиньями). Но, как база, вполне вещь. «Чтобы я смог хоть как-то помочь в этом процессе, необходима минимальная зацепка - в каком направлении копать. Пока одной лишь идеи - совместить равновысокие с эквиобъемными - мало, нужна какая-то "технология".» Возможно, я перепишу твою «базу» под свою задачу, но не уверен, что смогу это сделать ПРАВИЛЬНО. Пока вопрос открытый, на первый взгляд изменения не значимы, но в рамках «приложения к «готовой» системе», ой как значимо. А требовалось всего лишь к заданному равновысокому бару привязать равнообьемный по кратности, с фиксацией цены (создается впечатление, что иногда «под настроение» ты читаешь между строк, хотя в принципе, как и я).

Scriptong: Balbesik пишет: Возможно, я перепишу твою «базу» под свою задачу, но не уверен, что смогу это сделать ПРАВИЛЬНО. Предлагаю следующее. Опиши необходимые изменения как можно подробнее. Так, чтобы я смог понять, что нужно (или я сам задам наводящие вопросы в процессе). После этого вполне возможно, что я сам внесу необходимые изменения. Тема тиковых объемов давно не развивалась, продолжение просится.



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