Автор |
Сообщение |
tlt-vlad
Зарегистрирован: 19.01.2008
Сообщения: 162
Откуда: ... теперь Москва
|
Написал небольшой код - выводит на дисплей побарно так называемый Тотал райс . Но в АФЛ пока не очень и хотелось бы подправить код , а то слишком коряво .
Код: |
_SECTION_BEGIN("Total_Rise 1 2");
SetBarsRequired(500000, 500000);
res = 0;
start_point = 0;
for( i=1;i<BarCount; i++)
{
res[i] = (C[i] -O[i])/O[i]*100;
if((res[i-1]<0 & res[i]>0) | (res[i-1]>0 & res[i]<0))
{
start_point[i] = O[i];
res[i] = (C[i] - start_point[i])/start_point[i]*100;
}
if((res[i-1]>0 & res[i]>0)|(res[i-1]<0 & res[i]<0))
{
start_point[i] = start_point[i-1];
res[i] = (C[i]- start_point[i])/start_point[i]*100;
}
if((C[i]==O[i]) & (C[i]>C[i-1])|(C[i]==O[i]) & (C[i]<C[i-1]))
{
start_point[i] = start_point[i-1];
res[i] = (C[i]- start_point[i])/start_point[i]*100;
}
if((O[i]>C[i-1] & C[i]>=int(C[i-1]) & res[i-1]>0)|(O[i]<C[i-1] & C[i]<=int(C[i-1]) & res[i-1]<0))
{
start_point[i] = start_point[i-1];
res[i] = (C[i]- start_point[i])/start_point[i]*100;
}
if(res[i]>0)
Color[i] = colorLime;
else
Color[i] = colorRed;
}
Plot(res,"Total_Rise %.",Color,styleHistogram|styleThick);
Title ="<< TOTAL_RISE >> Total_Rise : " + Prec(res,2) + "% , START_POINT : " + start_point ;
_SECTION_END(); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Тогда напиши алгоритм. Потому, что ковырять чужой код чтобы понять идею и потом реализовывать по новому занятие не из приятных.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
tlt-vlad
Зарегистрирован: 19.01.2008
Сообщения: 162
Откуда: ... теперь Москва
|
Да-да извиняюсь , что сразу не описал идею.
В общем идея следующая.
Произвести подсчёт абсолютного приращения цены с начала её роста .
За абсолютный прирост считаем Close - Open , при этом если драйв продолжается и на следующий день, то за точку отсчёта берём Open первого дня роста и так далее . И некоторые подробности в коде - например , если открытие и закрытие сегодня больше чем закрытие вчерашнего дня ( гэп ) , то счиатем Close сегодня - Open первого дня .
Вот вроде всё . |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А как определяем начало драйва и его конец?
Черная свеча или закрытие выше вчерашнего или еще как? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
tlt-vlad
Зарегистрирован: 19.01.2008
Сообщения: 162
Откуда: ... теперь Москва
|
Начало драйва - первая белая свеча ( т.е. где (С-О)>0 ).
Окончание - свеча с чёрным телом ((С-О)<0 ) , а так же закрытие новой чёрной свечи должно быть ниже закрытия предыдущей белой ( вариант когда закрытия равны считаю продолжением роста ) .
Конечно с многим можно поспорить - но думаю без таких приближений не обойтись. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Один из вариантов (с циклом). Твой совсем не смотрел.
Код: |
Begin = C > O;
end = C < O AND C < Ref(C, -1);
ras = 0;
Total_Rise = 0;
for( i = 2; i < BarCount; i++)
{
if(Begin[i] AND ras[i-1] == 0) // начало роста при том, что на предыдущем баре роста не было
{
rasBegin = O[i]; // запоминаем значение открытия в момент начала роста
ras[i] = 1; // рост
Total_Rise[i] = C[i] - rasBegin;
}
else if(Ras[i-1] == 1 AND end[i] == 0 ) // рост и его окончание не наступило
{
Total_Rise[i] = C[i] - rasBegin;
ras[i] = 1; // рост
}
}
Plot(Total_Rise, "", colorRed);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вариант без цикла
Код: |
Begin = C > O;
end = C < O AND C < Ref(C, -1);
Begin = ExRem(Begin, end); // фильтр лишних начал
end = ExRem(end, Begin); // фильтр лишних окончаний
ras = Flip(Begin, end); // рост
rasBegin = ValueWhen(Begin, O); // значение Опен в начале роста
Total_Rise = IIf(ras, C - rasBegin, 0); // если рост, то Total_Rise = закрытие - открытие в начале роста
Plot(Total_Rise, "", colorBlue);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
tlt-vlad
Зарегистрирован: 19.01.2008
Сообщения: 162
Откуда: ... теперь Москва
|
Вечерком посмотрю и сравню с своим , как оно выглядит .
Олег , у тебя как всегда - всё кратко и лаконично в коде , а главное в точку .
Спасибо . |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|