Форум » Идеи для статей » Объемы и свечи » Ответить

Объемы и свечи

Petr: Добрый день, форумчане! Появилась в голове мысль о использовании индикатора BearBullBalance_OpenZero в поисках объемов на тенях свечей. Стратегия, основанная на движении цены от крупных объемов уже описана на нашем форуме, но я хочу предложить использовать в качестве инструмента BearBullBalance_OpenZero. Индикатор хорошо показывает объемы на тенях, но только в определенных случаях: 1) свеча идет вверх, видим объем на нижней тени. 2) свеча идет вниз, видим объем на верхней тени. Если, например, взять свечу вверх, то отдельно объем на верхней тени в данном случае не определить, тк индикатор отсчитывает тики от цены открытия свечи, и верхнее значение индикатора - это объем тела+объем верхней тени. А между тем, большой объем на верхней тени свечи - это неплохой признак скорого движения вниз. Я изменил в индикаторе точку отсчета тиков- с open на close. На уже загруженной истории индикатор показывает объемы на тенях. Комбинируя эти сигналы с оригинальным BearBullBalance_OpenZero, можно попробовать понять логику движения цены. Но есть одно но))) Измененный индикатор не показывает корректно данные он-лайн, приходится каждый раз обновлять график в начале новой свечи., для того, чтобы видеть результат по сформировавшейся свече. И это понятно, такова логика работы индикатора. А хотелось бы видеть без обновлений)))) Я думаю, может сделать так, чтобы при появлении тика новой свечи индикатор обновлял данные по уже сформированным свечам? Уважаемые гуру, помогите)

Ответов - 11

Scriptong: Petr пишет: Добрый день, форумчане! Появилась в голове мысль о использовании индикатора BearBullBalance_OpenZero в поисках объемов на тенях свечей. Стратегия, основанная на движении цены от крупных объемов уже описана на нашем форуме, но я хочу предложить использовать в качестве инструмента BearBullBalance_OpenZero. Индикатор хорошо показывает объемы на тенях, но только в определенных случаях: 1) свеча идет вверх, видим объем на нижней тени. 2) свеча идет вниз, видим объем на верхней тени. Если, например, взять свечу вверх, то отдельно объем на верхней тени в данном случае не определить, тк индикатор отсчитывает тики от цены открытия свечи, и верхнее значение индикатора - это объем тела+объем верхней тени. А между тем, большой объем на верхней тени свечи - это неплохой признак скорого движения вниз. Я изменил в индикаторе точку отсчета тиков- с open на close. На уже загруженной истории индикатор показывает объемы на тенях. Комбинируя эти сигналы с оригинальным BearBullBalance_OpenZero, можно попробовать понять логику движения цены. Но есть одно но))) Измененный индикатор не показывает корректно данные он-лайн, приходится каждый раз обновлять график в начале новой свечи., для того, чтобы видеть результат по сформировавшейся свече. И это понятно, такова логика работы индикатора. А хотелось бы видеть без обновлений)))) Я думаю, может сделать так, чтобы при появлении тика новой свечи индикатор обновлял данные по уже сформированным свечам? Уважаемые гуру, помогите) По-моему, этот разговор у нас с Вами уже здесь ведется. Не буду клонировать темы.

Petr: Да, задвоил тему, сорри.

Evgeny: Привет! Использую эту ветку для описания идеи, которая появилась в разговоре со знакомым, просто как шутка наподобие: "вы не знаете куда бежать? Я вам таки отвечу! Бегайте вперёд, потом назад, пока не узнаете". Суть такова: объем и свечи ) 1. Считаем средний объем свечи (например м15) за последние 5 рабочих дней (например Va) 2. Считаем коэффициент объема свечи (например Кv) к среднему объему Va. Смысл ясен, если Kv больше 1 значит объем выше среднего за последние 5 дней. Значит происходит какая то движуха и последует реакция цены на объем. 3. Большие объемы проходят, если упрощённо, в двух случаях: маленькая свеча с большим объемом и длинная большая свеча с большим объемом. Большая свеча не очень то и полезна, т.к. уже идёт распределение, движение и волатильность высокая, что не даёт возможности открыть сделку с коротеньким стопом... 4. Значит. Нам нужны маленькие свечки. Ищем их по "спреду": максимум минус минимум свечи. А затем берём объем этой свечи и делим на ее "высоту" в пунктах (по 4 знаку). Например: объем свечи 400, высота свечи 20 пунктов по 4 знаку, плотность тиков в свече получается 20. 5. Чтобы избежать ситуаций когда свечка очень маленькая и объем невелик, но если поделить, плотность окажется высокой, нужно их "взвесить". "Взвесить" найденные маленькие свечки с высокой плотностью при помощи коэффициента Kv. Помножим плотность свечи на Kv. Получим "взвешенную" плотность Например, 20 *0.6 или те же 20*1.3. Так выпадут все мелкие свечки которых например полно в ночном флете. 6. Ну и для красоты, можно это хозяйство "нормализовать" для индикатора. Поделим "взвешенную" плотность на средний объем свечей Va и пусть это все будет умножено на 100. Получим индикатор, который будет показывать процентное отношение взвешенной плотности свечей к среднему объему рынка. 7. Ну а дальше куда бежать?)) Туда же куда пойдёт цена после появления свечи с повышенной взвешенной плотностью. За максимумом и минимумом этой свечи плюс торговый спред будут располагаться отложенные ордера. А стопы по ним будут по другую сторону свечи. Стопы будут короткие, в сравнении с другими участками рынка. Логика здесь в том, что после появления повышенного объёма, цена отреагирует движением вверх, если сработал крупный лимтиник на покупку, либо падением, если на продажу. 8. Минус как обычно в том, что ордер может выбить по стопу из за волатильности и потому что стоп короткий. Расчет однако и на то, что по идее должна бы начаться движуха, и флета уже не будет, так что движение не заставит себя долго ждать и даст нам хотя бы минимальный ход, который позволит совершить фиксацию части прибыли для покрытия стопа. 9. Управление ордерами. Варианты развития: - ордер срабатывает, цена проходит расстояние равное стопу, закрывается половина позиции. Если цена дальше не пойдет и развернется, стоп будет покрыт. - цена проходит расстояние стопа и идёт дальше в плюс. Не существует какой-то оптимальной методики закрытия прибыльных позиций. Если ордер пойдет в хороший плюс, значит мы попали в движение, в фазу распределения, когда цена идёт на значительное расстояние без обьемов. Вероятно нужно закрывать позицию, когда взвешенная плотность снизится до минимальной. Это значит, что активность на рынке закончилась и будет вялый флет. - срабатывает стоп. 10. Агрессивная тактика торговли. Можно предусмотреть включение/отключение агрессивного режима торговли. Когда при срабатывании стопа, т.е. третьего варианта в п. 9 открывается ордер в другую сторону, либо с тем же лотом, либо с удвоенным. Также можно предусмотреть ограничение цикла переворотов, когда после нескольких попыток цена болтается на месте. Если, включается режим агрессивной торговли, и открываются ордеры с удвоенным лотом, то управление позицией несколько изменится. При прохождении цены на расстояние стопа, половина закроется и покроет потери. Но вторая половина должна быть переведена в безубыток в отличие от выше описанного варианта. Иначе смысл переворотов теряется.


Scriptong: По пунктам 1 - 6 получилась следующая формула для расчета значений индикатора: где: V1 - объем свечи, Н1 - высота свечи в пунктах, Va - средний объем свечей за указанный период. Индикатор получился такой:

Evgeny: Scriptong доброго времени!! Ого... Спасибо, что обратили внимание. Обязательно проверю со своими расчетами. Позднее отпишусь и попрошу показать значения индикатора на конкретном дне. Единственная просьба, можно ли гистограммой и она должна быть в процентах по шкале от 0 до 100. Если что, более подробно дам описание и приведу пример. Спасибо

Scriptong: Evgeny пишет: Позднее отпишусь и попрошу показать значения индикатора на конкретном дне. Проверить можете лично. Ведь я дал ссылку на индикатор. Evgeny пишет: Единственная просьба, можно ли гистограммой и она должна быть в процентах по шкале от 0 до 100. Если что, более подробно дам описание и приведу пример. Максимум/минимум всегда можно установить. Доступно для любого индикатора, отображающегося в отдельном окне, в его свойствах (вкладка "Общие").

Balbesik: "Новые (или хорошо забытые старые) идеи, которые хотелось бы проверить" Что получается и что нет. С начало "посыл" - индикатор Атамана, по нему Атаман с высокой достоверностью определял движение свечи следующего дня (сам алгоритм он не выкладывал, но картинку индикатора опубликовал) - попытка такая же, определение движения на каждой новой свечи. Назову так: "Индикатор теней". Индикаторы i_Teni_5 и i_Teni_Bar_5. i_Teni_Bar_5 - кол-во позиций (задается советником) на баре, до закрытия и открытие на следующем баре. i_Teni_5 - кол-во позиций (задается советником, убрал ограничение работы на баре) на баре, до закрытия и сразу открытие следующей позиции. Открытие позиции (не нужных) внутри бара на каждом тике исключает советник (в индикаторе не предусмотрено). Позиции задаются в % от депозита (получаем экспоненту, МО "не работает") Первоначальная проверка - на 5-значных данных оптимизация и форвард участок (2 к 1) и с теми же параметрами, без оптимизации, на других 4-значных данных проверка. 5-значные данные - 4-значные данные - Продолжу далее.

Scriptong: Balbesik пишет: достоверностью определял движение свечи следующего дня Да, я тоже уже исследовал это в июне 2011-го. Добавить к этой идее уже ничего не могу.

Balbesik: Задаваемые параметры индикаторов: extern int BeginDateCalc = 21; // Количество баров расчета (выборка до "0" бара) extern double Delt_sl = 100.0; // Стоплосс в пунктах extern double Delt_tp = 400.0; // Тейкпрофит в пунктах extern double i_indBarsCount = 1000.0; // Количество баров отображения extern int Vkl_sl = 1; // 0 - СЛ по Delt_sl, 1 - автомат Параметр Vkl_sl добавил позднее, при "0" Стоплосс задается параметром Delt_sl, при "1" Стоплосс определяется автоматически. Все выше выложенные картинки - Стоплосс определяется автоматически. Далее на 4-х знаках. Картинка для примера (индикатор i_Teni_Bar_5) по СЛ - тот же участок с индикатором i_Teni_5 с авто. СЛ для сравнения с i_Teni_Bar_5 и ручная настройка с i_Teni_Bar_5 для проверки тестера - "Картинка 1" - Продолжу далее.

Balbesik: Когда-то Игорь, ты отправлял мне свой индикатор JustZigZag_Evg и я спрашивал, тоже давно, можно ли выкладывать его в открытый доступ (глупый вопрос), ты промолчал. Этот индикатор, в дальнейшем я взял за основу. Поэтому в архив прикрепляю ex4 индикаторов, а сами алгоритмы: i_Teni_Bar_5 bool isUp; // buy bool isDown; // sell int b=0; int bh=0; int bl=0; int bb=0; int h=0; int l=0; int s=0; int t=0; string comm=""; for (int i = limit; i >= 0; i--) // - 2 { //+--------------------------------------------------------------------------------+ if (i > limit - BeginDateCalc) for (int ii=BeginDateCalc; ii>=0; ii--) { if (bb==0) bb=ii; s+=(iHigh(NULL,PERIOD_CURRENT,ii + 1) - iLow(NULL,PERIOD_CURRENT,ii + 1))/Point; t+=MathAbs(iOpen(NULL,PERIOD_CURRENT,ii + 1)-iClose(NULL,PERIOD_CURRENT,ii + 1))/Point; if (iOpen(NULL,PERIOD_CURRENT,ii + 1) > iClose(NULL,PERIOD_CURRENT,ii + 1) && iHigh(NULL,PERIOD_CURRENT,ii + 1) != iOpen(NULL,PERIOD_CURRENT,ii + 1)) { h+=(iHigh(NULL,PERIOD_CURRENT,ii + 1) - iOpen(NULL,PERIOD_CURRENT,ii + 1))/Point; bh++; } if (iOpen(NULL,PERIOD_CURRENT,ii + 1) < iClose(NULL,PERIOD_CURRENT,ii + 1) && iOpen(NULL,PERIOD_CURRENT,ii + 1) != iLow(NULL,PERIOD_CURRENT,ii + 1)) { l+=(iOpen(NULL,PERIOD_CURRENT,ii + 1) - iLow(NULL,PERIOD_CURRENT,ii + 1))/Point; bl++; } b++; } if (b==0) b=1; if (bh==0) bh=1; if (bl==0) bl=1; N_H=NormalizeDouble((double)(h/b) ,Digits); N_L=NormalizeDouble((double)(l/b) ,Digits); N_HH=NormalizeDouble((double)(h/bh) ,Digits); N_LL=NormalizeDouble((double)(l/bl) ,Digits); N_s=NormalizeDouble((double)(s/b) ,Digits); N_t=NormalizeDouble((double)(t/b) ,Digits); /**/ comm = "Начало: " + TimeToStr(Time[bb], TIME_DATE|TIME_MINUTES) + "\n"; comm = comm + "Конец: " + TimeToStr(Time[bb-b+1], TIME_DATE|TIME_MINUTES) + "\n"; comm = comm + "Средняя волатильность: " + s/b + " п.\n"; comm = comm + "Среднеарифмет верхней тени: " + h/b + " п.\n"; comm = comm + "Среднеарифмет нижней тени: " + l/b + " п.\n"; comm = comm + "Средний размер верхней тени: " + h/bh + " п.\n"; comm = comm + "Средний размер нижней тени: " + l/bl + " п."; Comment(comm); //+--------------------------------------------------------------------------------+ if(g_tp == EMPTY_VALUE) g_tp = g_tp[i + 1]; if(g_sl == EMPTY_VALUE) g_sl = g_sl[i + 1]; //+--------------------------------------------------------------------------------+ // buy isUp = ( (iClose(NULL,PERIOD_CURRENT,i) > (iOpen(NULL,PERIOD_CURRENT,i) + (N_HH * Point))) && N_LL > N_HH ); // sell isDown = ( (iClose(NULL,PERIOD_CURRENT,i) < (iOpen(NULL,PERIOD_CURRENT,i) + (N_LL * Point))) && N_HH > N_LL ); //+--------------------------------------------------------------------------------+ if(Vkl_sl == 1) Delt_sl = NormalizeDouble(MathAbs(N_s - N_t) + 1 ,Digits); //+--------------------------------------------------------------------------------+ if (isUp) // isUp buy { g_buy = iClose(NULL,PERIOD_CURRENT,i) - iATR(NULL, 0, 14, i); // + 1 - buy g_tp = iClose(NULL,PERIOD_CURRENT,i + 1) + (double)(Delt_tp * Point); // g_sl = iClose(NULL,PERIOD_CURRENT,i + 1) - (double)(Delt_sl * Point) - Point; // - Point } if (isDown) // isDown sell { g_sell = iClose(NULL,PERIOD_CURRENT,i) + iATR(NULL, 0, 14, i); // + 1 + sell g_tp = iClose(NULL,PERIOD_CURRENT,i + 1) - (double)(Delt_tp * Point) + (MarketInfo(Symbol(), MODE_SPREAD) * Point); g_sl = iClose(NULL,PERIOD_CURRENT,i + 1) + (double)(Delt_sl * Point) + ((1 + MarketInfo(Symbol(), MODE_SPREAD)) * Point); } //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ } i_Teni_5 bool isUp; // buy bool isDown; // sell int b=0; int bh=0; int bl=0; int bb=0; int h=0; int l=0; int s=0; int t=0; int Flag_b=0; int Flag_s=0; double Nev_b=0.0; double Nev_s=0.0; double Nev_tp_b=0.0; double Nev_tp_s=0.0; static double i_tp; string comm=""; for (int i = limit; i >= 0; i--) // - 2 { //+--------------------------------------------------------------------------------+ if (i > limit - BeginDateCalc) for (int ii=BeginDateCalc; ii>=0; ii--) { if (bb==0) bb=ii; s+=(iHigh(NULL,PERIOD_CURRENT,ii + 1) - iLow(NULL,PERIOD_CURRENT,ii + 1))/Point; t+=MathAbs(iOpen(NULL,PERIOD_CURRENT,ii + 1)-iClose(NULL,PERIOD_CURRENT,ii + 1))/Point; if (iOpen(NULL,PERIOD_CURRENT,ii + 1) > iClose(NULL,PERIOD_CURRENT,ii + 1) && iHigh(NULL,PERIOD_CURRENT,ii + 1) != iOpen(NULL,PERIOD_CURRENT,ii + 1)) { h+=(iHigh(NULL,PERIOD_CURRENT,ii + 1) - iOpen(NULL,PERIOD_CURRENT,ii + 1))/Point; bh++; } if (iOpen(NULL,PERIOD_CURRENT,ii + 1) < iClose(NULL,PERIOD_CURRENT,ii + 1) && iOpen(NULL,PERIOD_CURRENT,ii + 1) != iLow(NULL,PERIOD_CURRENT,ii + 1)) { l+=(iOpen(NULL,PERIOD_CURRENT,ii + 1) - iLow(NULL,PERIOD_CURRENT,ii + 1))/Point; bl++; } b++; } //+--------------------------------------------------------------------------------+ if (b==0) b=1; if (bh==0) bh=1; if (bl==0) bl=1; N_H=NormalizeDouble((double)(h/b) ,Digits); N_L=NormalizeDouble((double)(l/b) ,Digits); N_HH=NormalizeDouble((double)(h/bh) ,Digits); // N_LL=NormalizeDouble((double)(l/bl) ,Digits); N_s=NormalizeDouble((double)(s/b) ,Digits); N_t=NormalizeDouble((double)(t/b) ,Digits); /**/ comm = "Начало: " + TimeToStr(Time[bb], TIME_DATE|TIME_MINUTES) + "\n"; comm = comm + "Конец: " + TimeToStr(Time[bb-b+1], TIME_DATE|TIME_MINUTES) + "\n"; comm = comm + "Средняя волатильность: " + s/b + " п.\n"; comm = comm + "Средний размер тела: " + t/b + " п.\n"; comm = comm + "Среднеарифмет верхней тени: " + h/b + " п.\n"; comm = comm + "Среднеарифмет нижней тени: " + l/b + " п.\n"; comm = comm + "Средний размер верхней тени: " + h/bh + " п.\n"; comm = comm + "Средний размер нижней тени: " + l/bl + " п."; Comment(comm); //+--------------------------------------------------------------------------------+ if(g_tp == EMPTY_VALUE) g_tp = g_tp[i + 1]; if(g_sl == EMPTY_VALUE) g_sl = g_sl[i + 1]; //+--------------------------------------------------------------------------------+ if (Nev_b != (iOpen(NULL,PERIOD_CURRENT,i) + NormalizeDouble( N_H * Point,Digits))) { Nev_b = (iOpen(NULL,PERIOD_CURRENT,i) + NormalizeDouble( N_H * Point,Digits)); Flag_b=1; } if (iClose(NULL,PERIOD_CURRENT,i) < (iOpen(NULL,PERIOD_CURRENT,i) + NormalizeDouble( N_H * Point,Digits))) Flag_b=0; if (Nev_tp_b != i_tp) { Nev_tp_b = i_tp; Flag_b=1; } if (iClose(NULL,PERIOD_CURRENT,i) < i_tp) Flag_b=0; if (Nev_s != (iOpen(NULL,PERIOD_CURRENT,i) - NormalizeDouble( N_L * Point,Digits))) { Nev_s = (iOpen(NULL,PERIOD_CURRENT,i) - NormalizeDouble( N_L * Point,Digits)); Flag_s=1; } if (iClose(NULL,PERIOD_CURRENT,i) > (iOpen(NULL,PERIOD_CURRENT,i) - NormalizeDouble( N_L * Point,Digits))) Flag_s=0; if (Nev_tp_s != i_tp) { Nev_tp_s = i_tp; Flag_s=1; } if (iClose(NULL,PERIOD_CURRENT,i) > i_tp) Flag_s=0; // buy isUp = ( iClose(NULL,PERIOD_CURRENT,i) > (iOpen(NULL,PERIOD_CURRENT,i) + NormalizeDouble( N_H * Point,Digits)) // + && Flag_b==1 ); // sell isDown = ( iClose(NULL,PERIOD_CURRENT,i) < (iOpen(NULL,PERIOD_CURRENT,i) - NormalizeDouble( N_L * Point,Digits)) // - && Flag_s==1 ); //+--------------------------------------------------------------------------------+ if(Vkl_sl == 1) Delt_sl = NormalizeDouble(MathAbs(N_s - N_t) + 1 ,Digits); //+--------------------------------------------------------------------------------+ if (isUp) // isUp buy { g_buy = iClose(NULL,PERIOD_CURRENT,i) - iATR(NULL, 0, 14, i); g_tp = iClose(NULL,PERIOD_CURRENT,i) + (double)(Delt_tp * Point); g_sl = iClose(NULL,PERIOD_CURRENT,i) - (double)(Delt_sl * Point) - Point; i_tp = g_tp; Flag_b=0; } if (isDown) // isDown sell { g_sell = iClose(NULL,PERIOD_CURRENT,i) + iATR(NULL, 0, 14, i); // + 1 + sell g_tp = iClose(NULL,PERIOD_CURRENT,i) - (double)(Delt_tp * Point) + (MarketInfo(Symbol(), MODE_SPREAD) * Point); g_sl = iClose(NULL,PERIOD_CURRENT,i) + (double)(Delt_sl * Point) + ((1 + MarketInfo(Symbol(), MODE_SPREAD)) * Point); i_tp = g_tp; Flag_s=0; } //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ } Архив: архив Продолжу далее самое сложное.

Balbesik: Что получилось? Общая тенденция (а-ля "сетка") на тестере сохраняется. На разных данных (4 и 5 знаки) работоспособность на тестере сохраняется. "Картинка 1" (индикатор i_Teni_Bar_5) этого не может быть, т.к. берется для расчета "тень" только 1 бара, Стоплосс = 1 п.п. в реале ни один инструмент так не работает. Кроме этого на истории (по картинке ниже) индикатор i_Teni_Bar_5 не работает (точнее работает только в движении), я сделать не смог и следовательно не понятно, с какой достоверностью он работает. В правом верхнем углу этой картинки стрелочками показано, что есть что. Другими словами - Среднеарифметическая ...... тени - берутся все бары ряда. Средний размер ...... тени - берутся только бары с тенями. Но и этого, на мой взгляд, не достаточно. Если например ряд небольшой (как получается) и берем выборку = 4 бара, то тени допустим 5,5,5 и 17 среднеарифметическое = 8, а по вероятности 5 > 50%, что так же надо реализовывать. Мне кажется это может быть интересно в виде простейшего советника или индикатора. Я сделать не смогу. P.S. Стрелочки (цвет) перепутал местами, допустим левые надо поменять по цвету (красная внизу).



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