Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 построение Range bars Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
commenced
Советник


Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"

СообщениеДобавлено: Вс Мар 01, 2009 2:01 pm Ответить с цитатой Вернуться к началу

Поработал с выше указанным методом, вопервых, почемуто не предусмотренно разжатие, теряется привязка к массвиву времени, вобщем TimeFrameMode( ); недоработан.


Господа предлогаю следующее решение, первое график обязательно тик. Пишем через цикл. d=c, c1 = c, первый тик o1=d[i], h1=d[i], l1=d[i], далее iif(d[i]>d[i-1],o1=o1[i-1],o1=o1[i-1]) (вобщем О принемает значение первого С цикла и равно ему пока соблюдается условие окончание цикла), iif(d[i-1]>d[i],l1 =d[i-1],l1=l1[i-1]), iif(d[i-1]<d[i],h1 =d[i],h1=h[i-1]), цикл продолжается пока h1[i]-l1[i]>k (k-размер наших свечек). После чего OLH опять присваивется значение равное d и цикл повторяется снова. Это была первая часть кода вторая часть должна делать следующее, присваивать значение O1, макH1 минL1 окончат или тек C1 всему массиву пока цикл не переключен при этом мы получим 4 массива которые, будут иметь привязку по времени и будут какбы растянутым баром. Можно ли сжать растянутый бар до нормального незнаю, у нас будут иметься точки где будет происходить изменение О, можно наверное в этих точках определять значение hlc присвоив им значение мак h мин L и оконч или тек С после чего прировнять полученное значение к времени т.е. обозначить время начала бара и конца, начало это начало цикла, конец это последний тик перед переключением можно так сделать или нет незнаю.


Вот результат попытки реализовать первую часть задумки, почему то работает не как полагается. О прыгает. соответственно и остальные видут себя не так.

Код:
x = Optimize("p1",1,0.1,2,0.1);

k = round((Ref(C,-1)*x)/100/5)*5;
d = C;
 O1 = d;
 L1 = d;
 h1 = d;
for(i = 2; i < BarCount; i ++)
{
   if(i == 2) trend[1] = 1;

      O1[i] = C[i];

   if(trend[i-1] == 1)
   {
      d[i] = C[i];
   

      if(O1[i] > O1[i-1])
      {
         O1[i] = O1[i-1];
      }
      else
      {
         O1[i] = O1[i-1];
}

      if(d[i] > l1[i-1])
      {
         l1[i] = l1[i-1];
      }
      else
      {
         l1[i] = d[i];
}

    if(d[i] > h1[i-1])
      {
         h1[i] = d[i];
      }
      else
      {
         h1[i] = H1[i-1];

      }


 

      if(h1[i]-L1[i] > k)   
      {
         trend[i] = 0; 
      }
      else trend[i] = 1;
   }
   if(trend[i-1] == 0)
    {
      d[i] = C[i];
    l1[i] = C[i];
     h1[i] = C[i];
     O1[i] = C[i];

     
     
      if(d[i] > O1[i-1])
      {
         O1[i] = O1[i-1];
      }
      else
      {
         O1[i] = O1[i-1];

}
      if(d[i] > l1[i-1])
      {
         l1[i] = l1[i-1];
      }
      else
      {
         l1[i] = d[i];
}
     if(d[i] > h1[i-1])
      {
         h1[i] = d[i];
      }
      else
      {
         h1[i] = H1[i-1];

      }



      if (h1[i]-L1[i] > k)   
      {
         trend[i] = 1;
         
      }
      else trend[i] = 0;
   }

}

Plot(O1,"o", 4,1);
Plot(L1,"l", 6,1);
Plot(H1,"h", 3,1);
Plot(d,"c", 1,1);   

_________________
Юра
Посмотреть профиль Отправить личное сообщение Отправить e-mail
commenced
Советник


Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"

СообщениеДобавлено: Вт Мар 03, 2009 7:01 am Ответить с цитатой Вернуться к началу

Олег, ну помоги пожалуста, где я в коде накосячил. а то я найти ошибку не могу.

_________________
Юра
Посмотреть профиль Отправить личное сообщение Отправить e-mail
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Мар 03, 2009 2:18 pm Ответить с цитатой Вернуться к началу

Настроение совсем нерабочее (не знаю почему). Поздно вечером сегодня обязательно гляну.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Мар 04, 2009 12:54 am Ответить с цитатой Вернуться к началу

Вот.
Код:

x = Optimize("p1",1,0.1,2,0.1);

k = round((Ref(C,-1)*x)/100/5)*5;
d = C;
 O1 = d;
 L1 = d;
 h1 = d;
for(i = 2; i < BarCount; i ++)
{
   if(i == 2) trend[1] = 1;

      O1[i] = C[i]; // эта строка не относится к предыдущему if
// и будет выполнятся каждый раз. Вроде это неправильно.

   if(trend[i-1] == 1)
   {
      d[i] = C[i];
   

      if(O1[i] > O1[i-1]) // этот блок не нужен потому,
// что и в том и в другом случае O1[i] = O1[i-1];
      {
         O1[i] = O1[i-1];
      }
      else
      {
         O1[i] = O1[i-1];
       }

      if(d[i] > l1[i-1])
      {
         l1[i] = l1[i-1];
      }
      else
      {
         l1[i] = d[i];
       }

    if(d[i] > h1[i-1])
      {
         h1[i] = d[i];
      }
      else
      {
         h1[i] = H1[i-1];
      }


      if(h1[i]-L1[i] > k)  // это условие реверса
// по моему неправильно задавать реверс по H-L, а вдруг оно вверх сильно выросло?
// по моему надо оценивать разницу между открытием синтезируемого бара
// и текущим его закрытием. Если ранж превысило в направлении текущего тренда,
// то начинаем новый бар без реверса, а если в противоположном, то реверс

// дальше коментировать не буду, вроде все должно быть понятно.

Если опять не получится - спрашивай.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
commenced
Советник


Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"

СообщениеДобавлено: Ср Мар 04, 2009 7:17 am Ответить с цитатой Вернуться к началу

Код:

   if(trend[i-1] == 1)
   {
      d[i] = C[i];
   

      if(O1[i] > O1[i-1]) // этот блок не нужен потому,
// что и в том и в другом случае O1[i] = O1[i-1];

Невсегда, на первом баре o = c[i]; потом o=o[i-1] как это записать?



Код:

      if(h1[i]-L1[i] > k)  // это условие реверса
// по моему неправильно задавать реверс по H-L, а вдруг оно вверх сильно выросло?


Так нам нужны равные бары, а тренд мы не определяем на самом деле

Код:
// по моему надо оценивать разницу между открытием синтезируемого бара и текущим его закрытием. Если ранж превысило в направлении текущего тренда то начинаем новый бар без реверса, а если в противоположном, то реверс


Мне кажется это не соответствует поставленной задаче, а задача получить массив значений баров имеющих примерно равную величину, чтоб получить замену TimeFrameMode( 3 ); при этом не в рублях, а в процентах.

Сразу новый вопрос, как можно обозначить массивы по признаку в точке где О не равно ref(o,-1)/ т.е. как брать H1O1L1C1 в точке где уже сформирован псевдо бар (для тестирования), при этом O1 берем равное O1 равное o1 в точке, L1 равное Min(l1) на сформированном псевдо баре, H1 равный max(H1), и C1 равное последней цене псевдо бара. на текущем псевдо баре эти величины должны браться с последнего тика.

_________________
Юра
Посмотреть профиль Отправить личное сообщение Отправить e-mail
commenced
Советник


Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"

СообщениеДобавлено: Ср Мар 04, 2009 8:32 am Ответить с цитатой Вернуться к началу

Данный пост, не отменяет выше перечисленные вопросы Smile

Попробывал, жестко задавать в начале цикла HOLC равные С, т.е. так как и произходит с баром, потом O остается неизменным, пока не произайдет переключение, остальные велечины меняются как и положенно. Опять греданное О прыгает хотя размах бара не преодален.

Код:
x = Optimize("p1",1,0.1,2,0.1);

k = round((Ref(C,-1)*x)/100/5)*5;
d = C;
 


Plot(O1,"o", 4,1);
Plot(L1,"l", 6,1);
Plot(H1,"h", 3,1);
Plot(d,"c", 1,1);

_________________
Юра

Последний раз редактировалось: commenced (Ср Мар 04, 2009 6:55 pm), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение Отправить e-mail
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Мар 04, 2009 8:44 am Ответить с цитатой Вернуться к началу

commenced писал(а):
Код:

   if(trend[i-1] == 1)
   {
      d[i] = C[i];
   

      if(O1[i] > O1[i-1]) // этот блок не нужен потому,
// что и в том и в другом случае O1[i] = O1[i-1];

Невсегда, на первом баре o = c[i]; потом o=o[i-1] как это записать?

Все время приравниваем O1[i] = O1[i-1];
И только в момент перехода на новый бар O1[i] = C[i];
commenced писал(а):

Так нам нужны равные бары, а тренд мы не определяем на самом деле

Мне кажется имеет значение когда цена отойдет на ранж от открытия синтезируемого бара. Т.е. анализировать надо только тело, хотя я не настаиваю.
Цитата:

Сразу новый вопрос, как можно обозначить массивы по признаку в точке где О не равно ref(o,-1)/ т.е. как брать H1O1L1C1 в точке где уже сформирован псевдо бар (для тестирования), при этом O1 берем равное O1 равное o1 в точке, L1 равное Min(l1) на сформированном псевдо баре, H1 равный max(H1), и C1 равное последней цене псевдо бара. на текущем псевдо баре эти величины должны браться с последнего тика.

Только вести еще один массив с типа индексом баров. При начале нового бара менять индекс.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Мар 04, 2009 8:50 am Ответить с цитатой Вернуться к началу

Да, вот еще что. Обязательно добавь в начало SetBarsRequired(100000, 0); чтобы квик АФЛ отключить. Иначе начало расчета всегда будет плавать и результат меняться.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
commenced
Советник


Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"

СообщениеДобавлено: Ср Мар 04, 2009 9:03 am Ответить с цитатой Вернуться к началу

Ты пропусти мой пост, опять похоже в одно время постили. Smile

все разобрался, нужно не старые кода 10 раз переписывать а новые писать и косяков не будет Sad

_________________
Юра
Посмотреть профиль Отправить личное сообщение Отправить e-mail
commenced
Советник


Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"

СообщениеДобавлено: Ср Мар 04, 2009 6:53 pm Ответить с цитатой Вернуться к началу

С индексацией, 100% рабочий Smile

Код:
SetBarsRequired( 100000, 0 );
d = C;
C1 = C;
O1 = C;
H1 = C;
L1 = C;
n = 1;


for(i = 2; i < BarCount; i ++)
{
   if(i == 2) trend[1] = 1;

   if(trend[i-1] == 1)
 
   {
   
   n[i] = n[i-1];
   O1[i] = O1[i-1];

   C1[i] = d[i];

   if(C1[i] > L1[i-1])

   {

   L1[i] = L1[i-1];

   }

   else

   {

   L1[i] = C1[i];

   }

   if(C1[i] > h1[i-1])

   {

   H1[i] = C1[i];

   }

   else

   {

   H1[i] = H1[i-1];

   

   }

   if(h1[i]-L1[i] > 2500) 
 
   {

   trend[i] = 0; 

   O1[i] = d[i];
   H1[i] = d[i];
   L1[i] = d[i];
   n[i] = n[i]+1;

   }

   else

   {

   trend[i] = 1;

   }
   }
   if(trend[i-1] == 0)

  {

   
   n[i] = n[i-1];
   O1[i] = O1[i-1];

   C1[i] = d[i];

   if(C1[i] > L1[i-1])

   {

   L1[i] = L1[i-1];

   }

   else

   {

   L1[i] = C1[i];

   }

   if(C1[i] > h1[i-1])

   {

   H1[i] = C1[i];

   }

   else

   {

   H1[i] = H1[i-1];

   }

   

   if (h1[i]-L1[i] > 2500)   

   {

   trend[i] = 1;

   O1[i] = d[i];
   H1[i] = d[i];
   L1[i] = d[i];
   n[i] = n[i]+1;

   }

   else

   {

   trend[i] = 0;

   }

   }

   }


O2 = IIf(trend, O1, O1);
L2 = IIf(trend, L1, L1);
H2 = IIf(trend, H1, H1);


Plot(O2,"o", 4,1);
Plot(L2,"l", 6,1);
Plot(H2,"h", 3,1);
Plot(C1,"c", 1,1);

d1 = H2-L2;


Title = Name() + StrFormat("{{INTERVAL}}") + Date()+"\n\n" +

"хай :" +H2+"\n"+
"Лоу :" +L2+"\n"+
"Открытие :" +O2+"\n"+
"Закрытие :" +C1+"\n"+
"номер бара :" +n+"\n"+
"Размер :" +d1+"\n";


Возможно ООО стоит вытащить все посты на тему. и назвать типа получение ранджбара. А то к волотильности он не имеет значения.

_________________
Юра
Посмотреть профиль Отправить личное сообщение Отправить e-mail
commenced
Советник


Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"

СообщениеДобавлено: Пн Мар 09, 2009 12:41 pm Ответить с цитатой Вернуться к началу

Олег чета я туплю, вобщем как вытащить только последнее значение цикла чтоб использовать в формуле любой, принемая во внимание что цикл это псевдо бар, понятно что цикл от цикла отличается n и если n==n[i-1], цикл является текущим, так вот как сделать так чтоб подставлялось последнее значение цикла, например в твою формулу вместо соответствующих массивов:

Код:
k = 2 ;
per = 2;
filt = ATR(per)*k ;

Lo = 0;
Hi = H + 2*filt; //Задаю заведомо большое значение

for(i = 2; i < BarCount; i ++)
{
   if(i == 2) trend[1] = 1;


   if(trend[i-1] == 1)
   {
      LoN = C[i] - filt[i];
      if(LoN > Lo[i-1])
      {
         Lo[i] = LoN;
      }
      else
      {
         Lo[i] = Lo[i-1];
      }
      if(C[i] < Lo[i])   
      {
         trend[i] = 0;
         Hi[i] = C[i] + filt[i];
      }
      else trend[i] = 1;
   }
   if(trend[i-1] == 0)
   {
      HiN = C[i] + filt[i];
      if(HiN < Hi[i-1])
      {
         Hi[i] = HiN;
      }
      else
      {
         Hi[i] = Hi[i-1];
      }
      if(C[i] > Hi[i])
      {
         trend[i] = 1;
         Lo[i] = C[i] - filt[i];
      }
      else trend[i] = 0;
   }
}

Hi = IIf(!trend, Hi, Null);
Lo = IIf(trend, Lo, Null);


Plot(Hi, "Hi", colorRed, styleStaircase);
Plot(Lo, "Lo", colorGreen, styleStaircase);
Plot(C, "", colorBlack, styleCandle);



Или в такую

Код:
Top = Ref(EMA(HHV(H,2*p),p),-1);
Bot = Ref(EMA(LLV(L,2*p1),p),-1);

_________________
Юра
Посмотреть профиль Отправить личное сообщение Отправить e-mail
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Мар 09, 2009 1:25 pm Ответить с цитатой Вернуться к началу

Возможно я не правильно понял, ну отвечу как понял.
Или прямо в цикле сделать отдельный блок типа
Код:

if(i == BarCount - 1) {
Бла-бла-бла;
}

В котором присвоить нужное значение переменной,
либо можно взять LastValue() от нужного расчитанного массива

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
commenced
Советник


Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"

СообщениеДобавлено: Пн Мар 09, 2009 1:35 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Возможно я не правильно понял, ну отвечу как понял.
Или прямо в цикле сделать отдельный блок типа
Код:

if(i == BarCount - 1) {
Бла-бла-бла;
}

В котором присвоить нужное значение переменной,
либо можно взять LastValue() от нужного расчитанного массива


LastValue() не подойдет, т.к. он даст значение на всех барах (тиках), а мне нужно чтоб код расчитывался для псевдо бара как для обычного . а у обычного бара есть всего 4 массива HOLC, у нас массивов для 1 псевдо бара куча.

_________________
Юра
Посмотреть профиль Отправить личное сообщение Отправить e-mail
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Мар 09, 2009 9:47 pm Ответить с цитатой Вернуться к началу

Тогда придется сделать еще один массив, смена бара или образование нового бара... В момент образования нового бара пусть он будет равен 1. Потом через ValueWhen() все легко решается....

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
commenced
Советник


Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"

СообщениеДобавлено: Пн Мар 09, 2009 10:03 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Тогда придется сделать еще один массив, смена бара или образование нового бара... В момент образования нового бара пусть он будет равен 1. Потом через ValueWhen() все легко решается....


Не совсем понял, что надо сделать.

_________________
Юра
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen