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





СообщениеДобавлено: Чт Окт 23, 2008 4:17 pm Ответить с цитатой Вернуться к началу

_SECTION_BEGIN("_IIR");
MaxGraph=32;
function IIR2( input, f0, f1, f2, n_bars)
{
IIR[ 0 ] = input[ 0 ];
IIR[ 1 ] = input[ 1 ];
for( i = 2; i < n_bars; i++ )
{
IIR[ i ] = f0 * input[ i ] + f1 * IIR[ i - 1 ] + f2 * IIR[ i - 2 ];
}
return IIR;
}

k1=Param("k1", 0.3, 0.1, 0.7, 0.1);
k2=Param("k2", 0.3, 0.1, 0.7, 0.1);

//1-й IIR Фильтр с бесконечной импульсной характеристикой
y1=IIR2( Close, 0.3, 1.2+k1, -0.5-k1,BarCount);

// B. Convexity definition
Convex1 = (y1 - Ref(y1, -1)) >= (y1-Ref(y1, -2))/2;
Concave1 = NOT(Convex1);
Up1 = y1>=Ref(y1, -1);
Down1= NOT(Up1);

// Trend phases
Bullstart1 = Convex1 AND Up1; // from A to B
Bullend1 = Concave1 AND Up1; // from B to C
Bearstart1 = Concave1 AND Down1; // from C to D
Bearend1 = Convex1 AND Down1; // from D to E

ColorIIR1 = IIf(Bullstart1,colorGreen , IIf(Bullend1, colorLightOrange, IIf(Bearstart1,colorViolet,colorLightOrange)));
// Конец расчета 1-го фильтра IIR

//2-й IIR Фильтр с бесконечной импульсной характеристикой на большем ТФ

TFrame2=24*3600*5;

TimeFrameSet(TFrame2);
y2=IIR2( Close, 0.3, 1.2+k2, -0.5-k2, BarCount);

// B. Convexity definition
Convex2 = (y2 - Ref(y2, -1)) >= (y2-Ref(y2, -2))/2;
Concave2 = NOT(Convex2);
Up2 = y2>=Ref(y2, -1);
Down2= NOT(Up2);

// Trend phases
Bullstart2 = Convex2 AND Up2; // from A to B
Bullend2 = Concave2 AND Up2; // from B to C
Bearstart2 = Concave2 AND Down2; // from C to D
Bearend2 = Convex2 AND Down2; // from D to E

ColorIIR2 = IIf(Bullstart2,colorGreen,IIf(Bullend2,colorLightOrange, IIf(Bearstart2,colorViolet,colorLightOrange)));
// Конец расчета 2-го фильтра IIR

TimeFrameRestore();

y2_real=TimeFrameExpand(y2,TFrame2,expandFirst);
ColorIIR2_real = TimeFrameExpand(ColorIIR2,TFrame2,expandFirst);

// Отображение IIR

Plot(y1,"IIR1", colorIIR1, styleThick);

if(Interval()==3600*24){ // только на дневном
Plot(y2_real,"IIR2", colorIIR2_real, styleThick);
}
_SECTION_END();


Замысел: отобразить график импульсной функции, построенной на разных тайфреймах.
Проблема: не считается функция на измененном таймфрейме (y2. Результат=EMPTY).

Думаю, что BarCount при смене фрейма НЕ МЕНЯЕТСЯ, а соответствует количеству баров на основном фрейме. Соответсвенно получаем индекс больший, чем размерность массива Close.
Тогда как определить размерность массива, полученного при переходе на другой тайфрейм? Есть такая функция, которая вернет КОНСТАНТУ, соответствующую размерности массива?
С уважением, Андрей.
000
Site Admin


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

СообщениеДобавлено: Чт Окт 23, 2008 9:25 pm Ответить с цитатой Вернуться к началу

Хм. Действительно. Похоже на косяк.
Вот этот код не работает так как по моему должен.
Код:

SetBarsRequired(10000000, 10000000);

x = LastValue(BarCount);

TimeFrameSet(432001);
   xx = BarCount;
   xx = LastValue(xx);
TimeFrameRestore();
xx = TimeFrameExpand(xx, 432001, expandFirst);

Plot(x, "x", colorBlue);
Plot(xx, "xx", colorRed);

Однако код с IIR2 на разных фреймах похоже работает нормально (нет переполнения цикла)
Код:

MaxGraph=32;
 
function IIR2( input, f0, f1, f2)
{
   IIR[ 0 ] = input[ 0 ];
   IIR[ 1 ] = input[ 1 ];
   for( i = 2; i < BarCount; i++ )
   {
      result[ i ] = f0 * input[ i ] + f1 * IIR[ i - 1 ] + f2 * IIR[ i - 2 ];
   }
return result;
}

k1 = Param("k1", 0.3, 0.1, 0.7, 0.1);
k2 = Param("k2", 0.3, 0.1, 0.7, 0.1);

//1-й IIR Фильтр с бесконечной импульсной характеристикой
y1 = IIR2( Close, 0.3, 1.2+k1, -0.5-k1);

//2-й IIR Фильтр с бесконечной импульсной характеристикой на большем ТФ
TimeFrameSet(inWeekly);

y2 = IIR2( Close, 0.3, 1.2+k2, -0.5-k2);
TimeFrameRestore();

y2_real=TimeFrameExpand(y2, inWeekly);


// Отображение IIR

Plot(y1,"IIR1", colorRed);

Plot(y2_real,"IIR2", colorBlue);

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





СообщениеДобавлено: Пт Окт 24, 2008 7:36 am Ответить с цитатой Вернуться к началу

Функция
Код:
function IIR2( input, f0, f1, f2)
{
   IIR[ 0 ] = input[ 0 ];
   IIR[ 1 ] = input[ 1 ];
   for( i = 2; i < BarCount; i++ )
   {
      result[ i ] = f0 * input[ i ] + f1 * IIR[ i - 1 ] + f2 * IIR[ i - 2 ];
   }
return result;
}


считает совсем не то, что исходная.

Код:

function IIR2( input, f0, f1, f2, n_bars)
{
IIR[ 0 ] = input[ 0 ];
IIR[ 1 ] = input[ 1 ];
for( i = 2; i < n_bars; i++ )
{
IIR[ i ] = f0 * input[ i ] + f1 * IIR[ i - 1 ] + f2 * IIR[ i - 2 ];
}
return IIR;
}


Зачем появился массив result вместо IIR? Поэтому, возможно, и работает.
Хотя то, что "неправильная" функция работает, опровергает мое предположение, что "правильная" не считает из-за превышения индекса. Видимо, причина в ином. Только в чем?

И все-таки, можно определить размерность массива в АМИ? Есть такая функция, которая вернет КОНСТАНТУ, соответствующую размерности массива?
000
Site Admin


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

СообщениеДобавлено: Пт Окт 24, 2008 8:12 am Ответить с цитатой Вернуться к началу

Цитата:

считает совсем не то, что исходная.

Как так? Я просто заменил переменную IIR на result и n_bars на BarCount... Sad
По идее должно считать тоже самое...
Цитата:

Есть такая функция, которая вернет КОНСТАНТУ

LastValue()
Цитата:

соответствующую размерности массива?

Пока у меня не получилось...

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


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

СообщениеДобавлено: Пт Окт 24, 2008 8:19 am Ответить с цитатой Вернуться к началу

Скорее всего будем писать Томашу...

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





СообщениеДобавлено: Пт Окт 24, 2008 9:40 am Ответить с цитатой Вернуться к началу

Цитата:
Как так? Я просто заменил переменную IIR на result и n_bars на BarCount...

Если бы )))))
Как насчет двойного использования IIR в этой строке?
Код:
result[ i ] = f0 * input[ i ] + f1 * IIR[ i - 1 ] + f2 * IIR[ i - 2 ];

Да и на первых двух барах инициализируется IIR, а не result.

Цитата:
Скорее всего будем писать Томашу...
Хорошо бы. А то я с англицким совсем никак.
ANDSIB
Гость





СообщениеДобавлено: Пт Окт 24, 2008 8:33 pm Ответить с цитатой Вернуться к началу

А есть возможность получить от разработчиков информацию, что вообще такое BarCount? Счетчик чего? Почему простейшие две строки:
Код:
for (i=0;i<int(BarCount/2);i++)YY[i]=C[i];
Plot(YY,"YY", colorYellow, styleThick);

не делят данные на две равные части, а дают линию перехода от Close в 0, положение которой далеко не середина и ЗАВИСИТ от сдвижки графика вправо-влево по оси времени? Я сперва считал, что BarCount - это количество баров на расчитываемом временном интервале. Когда не сработали функции TimeFrameSet, сделал допущение, что это или количество баров на основном фрейме, или номер крайнего правого бара, который отображается на графике. Но эта пара строк наводит на мысль, что BarCount - это нечто иное. Но что?
При этом, если сделать так:
Код:
for (i=0;i<int(BarCount/2);i++)YY[i]=C[i];
for (i=BarCount-10;i<BarCount;i++)YY[i]=C[i];
Plot(YY,"YY", colorYellow, styleThick);

то именно последние 10 баров копируются.
Так чтоже такое этот BarCount?

Кстати, версия АМИ 4.70.5, впрочем не думаю, что это глюк версии. Скорей здесь какая-то логика в работе интерпретатора. только знать бы, какая.
000
Site Admin


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

СообщениеДобавлено: Пт Окт 24, 2008 8:46 pm Ответить с цитатой Вернуться к началу

ANDSIB писал(а):
Цитата:
Как так? Я просто заменил переменную IIR на result и n_bars на BarCount...

Если бы )))))
Как насчет двойного использования IIR в этой строке?
Код:
result[ i ] = f0 * input[ i ] + f1 * IIR[ i - 1 ] + f2 * IIR[ i - 2 ];

Да и на первых двух барах инициализируется IIR, а не result.

Цитата:
Скорее всего будем писать Томашу...
Хорошо бы. А то я с англицким совсем никак.

Этоя маху дал... Smile Действительно не работает.

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


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

СообщениеДобавлено: Пт Окт 24, 2008 8:57 pm Ответить с цитатой Вернуться к началу

ANDSIB писал(а):
А есть возможность получить от разработчиков информацию, что вообще такое BarCount? Счетчик чего? Почему простейшие две строки:
Код:
for (i=0;i<int(BarCount/2);i++)YY[i]=C[i];
Plot(YY,"YY", colorYellow, styleThick);

не делят данные на две равные части, а дают линию перехода от Close в 0, положение которой далеко не середина и ЗАВИСИТ от сдвижки графика вправо-влево по оси времени? Я сперва считал, что BarCount - это количество баров на расчитываемом временном интервале. Когда не сработали функции TimeFrameSet, сделал допущение, что это или количество баров на основном фрейме, или номер крайнего правого бара, который отображается на графике. Но эта пара строк наводит на мысль, что BarCount - это нечто иное. Но что?
При этом, если сделать так:
Код:
for (i=0;i<int(BarCount/2);i++)YY[i]=C[i];
for (i=BarCount-10;i<BarCount;i++)YY[i]=C[i];
Plot(YY,"YY", colorYellow, styleThick);

то именно последние 10 баров копируются.
Так чтоже такое этот BarCount?

Кстати, версия АМИ 4.70.5, впрочем не думаю, что это глюк версии. Скорей здесь какая-то логика в работе интерпретатора. только знать бы, какая.

В хелпере написано
BarCount is a numeric variable that holds just one number (the count of elements in array).
BarCount - числовая переменная, которая показывает число элементов в массиве.
Цитата:
не делят данные на две равные части, а дают линию перехода от Close в 0, положение которой далеко не середина и ЗАВИСИТ от сдвижки графика вправо-влево по оси времени?

Это происходит из-за использования QuickAFL. По умолчанию AFL использует для расчета не все бары доступные в истории а только видимые + некоторое кол-во невидимых, находящихся за левой границей экрана. Это некоторое кол-во вроде расчитывается каждый раз для конкретного кода...
Правда это можно регулировать при помощи функции SetBarsRequired()

Надеюсь ответил.

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





СообщениеДобавлено: Сб Окт 25, 2008 10:59 am Ответить с цитатой Вернуться к началу

Да. Про QuickAFL понятно.
Понятно также, что будет нелишним "помучить" SetBarsRequired().
Спасибо.
Ну а вопрос, как заставить функцию считать на другом фрейме, пока остается открытым.
000
Site Admin


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

СообщениеДобавлено: Сб Окт 25, 2008 7:38 pm Ответить с цитатой Вернуться к началу

ANDSIB писал(а):
Да. Про QuickAFL понятно.
Понятно также, что будет нелишним "помучить" SetBarsRequired().
Спасибо.
Ну а вопрос, как заставить функцию считать на другом фрейме, пока остается открытым.

Похоже надо ждать исправления в программе... (

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





СообщениеДобавлено: Пн Ноя 10, 2008 2:04 pm Ответить с цитатой Вернуться к началу

ANDSIB писал(а):
_SECTION_BEGIN("_IIR");
MaxGraph=32;
function IIR2( input, f0, f1, f2, n_bars)
{
IIR[ 0 ] = input[ 0 ];
IIR[ 1 ] = input[ 1 ];
for( i = 2; i < n_bars; i++ )
{
IIR[ i ] = f0 * input[ i ] + f1 * IIR[ i - 1 ] + f2 * IIR[ i - 2 ];
}
return IIR;
}

k1=Param("k1", 0.3, 0.1, 0.7, 0.1);


//1-й IIR Фильтр с бесконечной импульсной характеристикой
y1=IIR2( Close, 0.3, 1.2+k1, -0.5-k1,BarCount);
а можно эту часть "перевести" на русский язык? я честно говоря, не могу понять что за что отвечает и какой в итоге алгоритм. и какой собственно алгоритм у этого фтльтра в чистом виде без привязки к AFL? просвятите пожалуйста или ссылочку скиньте если есть.
000
Site Admin


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

СообщениеДобавлено: Пн Ноя 10, 2008 3:39 pm Ответить с цитатой Вернуться к началу

yanus писал(а):
ANDSIB писал(а):
_SECTION_BEGIN("_IIR");
MaxGraph=32;
function IIR2( input, f0, f1, f2, n_bars)
{
IIR[ 0 ] = input[ 0 ];
IIR[ 1 ] = input[ 1 ];
for( i = 2; i < n_bars; i++ )
{
IIR[ i ] = f0 * input[ i ] + f1 * IIR[ i - 1 ] + f2 * IIR[ i - 2 ];
}
return IIR;
}

k1=Param("k1", 0.3, 0.1, 0.7, 0.1);


//1-й IIR Фильтр с бесконечной импульсной характеристикой
y1=IIR2( Close, 0.3, 1.2+k1, -0.5-k1,BarCount);
а можно эту часть "перевести" на русский язык? я честно говоря, не могу понять что за что отвечает и какой в итоге алгоритм. и какой собственно алгоритм у этого фтльтра в чистом виде без привязки к AFL? просвятите пожалуйста или ссылочку скиньте если есть.

Это фильтр наподобие мувинга который учитывает текущее значение фильтруемого массива и 2 предыдущих значения самого фильтра.

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



Зарегистрирован: 08.04.2008
Сообщения: 24
Откуда: Астрахань

СообщениеДобавлено: Пн Ноя 10, 2008 4:30 pm Ответить с цитатой Вернуться к началу

привет всем!
есть вопрос, сорри если не в тему:
значит есть такой код:
Код:

up=C>ref(C,-1);
up=IIf(up,1,0);
up=sum(up,1000);



наскока я понимаю сей код посчитает сколько раз С был выше закрытия предыдущего бара внутри истории протяженностью в тыщу баров. В динамике торгов эта история двигается- каждый новый бар "вытесняет " предыдущий. Вопрос - как сделать так чтоб начало истории было постоянным, т.е. какбы заморозилось, а каждый новый бар добавлялся к расчету?
пробовал Cum() из хелпера:
Код:

startdate = Year()==2008 AND Month()==10 AND Day()==10 AND Hour()==10; // дата взята "от балды", типа от нее начинаем считать
up=C>ref(C,-1) AND startdate ;
up=IIf(up,1,0);
up=cum(up);


правильно ли я написал код во втором варианте?

заранее спасибо всем участникам..
Посмотреть профиль Отправить личное сообщение ICQ Number
yanus
Гость





СообщениеДобавлено: Пн Ноя 10, 2008 4:47 pm Ответить с цитатой Вернуться к началу

Цитата:
_SECTION_BEGIN("_IIR");
MaxGraph=32;
function IIR2( input, f0, f1, f2, n_bars)
{
IIR[ 0 ] = input[ 0 ];
IIR[ 1 ] = input[ 1 ];
for( i = 2; i < n_bars; i++ )
{
IIR[ i ] = f0 * input[ i ] + f1 * IIR[ i - 1 ] + f2 * IIR[ i - 2 ];
}
return IIR;
}

k1=Param("k1", 0.3, 0.1, 0.7, 0.1);


те
Цитата:
function IIR2( input, f0, f1, f2, n_bars)
запуск функци расчета самого фильтра.

Цитата:
IIR[ 0 ] = input[ 0 ];
IIR[ 1 ] = input[ 1 ];
это первых два значения для запуска расчета фильтра.

Цитата:
for( i = 2; i < n_bars; i++ )
это запуск цикла расчета с 3-го бара до предпоследнего

Цитата:
IIR[ i ] = f0 * input[ i ] + f1 * IIR[ i - 1 ] + f2 * IIR[ i - 2 ];
это расчет самого фильтра по текущему значению бара и двум предыдущим значениям фильтра.

Цитата:
y1=IIR2( Close, 0.3, 1.2+k1, -0.5-k1,BarCount);
собственно цена сглаженная фильтром.
если я не прав поправьте меня.
если хоть в часи прав - возникают вопросы :
Цитата:
function IIR2( input, f0, f1, f2, n_bars)
что за значения input, f0, f1, f2, n_bars, что они означают и откуда берутся?
Цитата:
y1=IIR2( Close, 0.3, 1.2+k1, -0.5-k1,BarCount);
в этом выражении те же вопросы.
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen