Автор |
Сообщение |
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Поработал с выше указанным методом, вопервых, почемуто не предусмотренно разжатие, теряется привязка к массвиву времени, вобщем 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
Откуда: от "Верблюда"
|
Олег, ну помоги пожалуста, где я в коде накосячил. а то я найти ошибку не могу. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Настроение совсем нерабочее (не знаю почему). Поздно вечером сегодня обязательно гляну. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот.
Код: |
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
Откуда: от "Верблюда"
|
Код: |
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
Откуда: от "Верблюда"
|
Данный пост, не отменяет выше перечисленные вопросы
Попробывал, жестко задавать в начале цикла 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
|
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
|
Да, вот еще что. Обязательно добавь в начало SetBarsRequired(100000, 0); чтобы квик АФЛ отключить. Иначе начало расчета всегда будет плавать и результат меняться. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Ты пропусти мой пост, опять похоже в одно время постили.
все разобрался, нужно не старые кода 10 раз переписывать а новые писать и косяков не будет |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
С индексацией, 100% рабочий
Код: |
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
Откуда: от "Верблюда"
|
Олег чета я туплю, вобщем как вытащить только последнее значение цикла чтоб использовать в формуле любой, принемая во внимание что цикл это псевдо бар, понятно что цикл от цикла отличается 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
|
Возможно я не правильно понял, ну отвечу как понял.
Или прямо в цикле сделать отдельный блок типа
Код: |
if(i == BarCount - 1) {
Бла-бла-бла;
}
|
В котором присвоить нужное значение переменной,
либо можно взять LastValue() от нужного расчитанного массива |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
000 писал(а): |
Возможно я не правильно понял, ну отвечу как понял.
Или прямо в цикле сделать отдельный блок типа
Код: |
if(i == BarCount - 1) {
Бла-бла-бла;
}
|
В котором присвоить нужное значение переменной,
либо можно взять LastValue() от нужного расчитанного массива |
LastValue() не подойдет, т.к. он даст значение на всех барах (тиках), а мне нужно чтоб код расчитывался для псевдо бара как для обычного . а у обычного бара есть всего 4 массива HOLC, у нас массивов для 1 псевдо бара куча. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Тогда придется сделать еще один массив, смена бара или образование нового бара... В момент образования нового бара пусть он будет равен 1. Потом через ValueWhen() все легко решается.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
000 писал(а): |
Тогда придется сделать еще один массив, смена бара или образование нового бара... В момент образования нового бара пусть он будет равен 1. Потом через ValueWhen() все легко решается.... |
Не совсем понял, что надо сделать. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|