Автор |
Сообщение |
roma095
Зарегистрирован: 02.02.2012
Сообщения: 170
|
Есть необходимость исключить гэп свечу для рассчета индикатора. Но индикаторы рассчитываются исходя из периода. как это обойти? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Mechanic
![](images/avatars/993547606487ca378ccf3e.jpg)
Зарегистрирован: 10.06.2008
Сообщения: 359
|
А что за индикатор и по каким ценам считаете? Мувингу по ценам закрытия без разницы, гэп там или не гэп... |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
![](images/spacer.gif) |
roma095
Зарегистрирован: 02.02.2012
Сообщения: 170
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Mechanic
![](images/avatars/993547606487ca378ccf3e.jpg)
Зарегистрирован: 10.06.2008
Сообщения: 359
|
Тогда поясните, какую что именно вы хотите исключить. В расчёте RSI используется разница между сегодняшним закрытием и вчерашним, а цены закрытия от гэпа никак не искажаются.
Код: |
function BuiltInRSIEquivalent(period)
{
P = N = 0;
result = Null;
for(i = 1; i < BarCount; i++)
{
diff = C[i] - C[i - 1];
W = S = 0;
if(diff > 0)
W = diff;
if(diff < 0)
S = -diff;
P = ((period - 1) * P + W) / period;
N = ((period - 1) * N + S) / period;
if(i >= period)
result[i] = 100 * P / (P + N);
}
return result;
} |
|
Последний раз редактировалось: Mechanic (Вс Окт 28, 2012 4:55 pm), всего редактировалось 2 раз(а) |
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
![](images/spacer.gif) |
roma095
Зарегистрирован: 02.02.2012
Сообщения: 170
|
Вы хотите сказать что там идет рассчет именно по открытию-закрытию дня? Если я буду использовать ТФ 15 минут,он мне должен вычислить по 15 минуткам значение RSI |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Mechanic
![](images/avatars/993547606487ca378ccf3e.jpg)
Зарегистрирован: 10.06.2008
Сообщения: 359
|
Да нет, "вчерашнее-сегодняшнее" - это я условно, имея в виду текущий и предыдущий бары. Конечно, считается на том таймфрейме, на который кидаете индикатор. Я просто к тому, что цены открытия баров в расчёте RSI не используются, а при гэпе только они оказываются "не там". Цены закрытия гэп не искажает. Вот мне и непонятно, что именно вы хотите исключить и зачем. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
![](images/spacer.gif) |
rupiter
Зарегистрирован: 16.09.2013
Сообщения: 75
|
(Наверное, в этой ветке это будет к месту)
Написал небольшой код, который избавляет данные от междневного гэпа. Реконструкция ценового ряда происходит в обратном порядке (от новых данных к старым), чтобы более поздние данные подвергались минимальной корректировке. Итак, код:
Код: |
SetBarsRequired(sbrAll, sbrAll);
invClose = 0;
delta = 0;
DateOfBar = DateNum();
for( i = 0; i < BarCount ; i++ )
{
if( i > 0 )
{
if( DateOfBar[BarCount-i-1] != DateOfBar[BarCount-i] )
delta[BarCount-i-1] += Close[BarCount-i] - Close[BarCount-i-1] + delta[BarCount-i];
else
delta[BarCount-i-1] = delta[BarCount-i];
}
invClose[BarCount-i-1] = Close[BarCount-i-1] + delta[BarCount-i-1];
}
Plot(invClose, "invClose", colorRed); |
Проблема состоит в следующем. Такая корректировка должна быть выполнена на 1-минутных данных. То есть Close вчерашнего дня должен быть изменен к Close первой минуты сегодняшнего дня. На 1-минутном графике все так и происходит. Но стоит мне изменить таймфрейм отображаемого графика, например, на часовой - вчерашний Close изменяется до Close первого часа сегодняшнего дня...
Попытался использовать инструкции поддержки разных таймфреймов:
Код: |
TimeFrameSet( in1Minute);
// здеськод из предыдущего примера, без инструкции plot()
TimeFrameRestore();
Plot(invClose, "invClose", colorRed);
|
Эффекта никакого ![Confused](images/smiles/icon_confused.gif) |
Последний раз редактировалось: rupiter (Вт Мар 15, 2016 12:25 pm), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
rupiter
Зарегистрирован: 16.09.2013
Сообщения: 75
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Скорее всего дело в следующем
Функция TimeFrameSet() преобразует ТОЛЬКО массивы цен OHLCV. Соответственно на твой массив invClose она ника не влияет.
Тебе надо расчитать твой скорректированный массив invClose. Потом подменить им цены закрытия (Close = invClose) и только потом применять TimeFrameSet. При этом имей ввду, что грфик должен быть не часовой а минутный ибо на часовом графике AFL минуток не видит вообще не смотря на то, что они есть в базе.
И еще. Когда используешь функцию TimeFrameRestore() ты восстанавливаешь массивы цен к исходным. Т.е. выполненная ранее замена Close = invClose отменяется. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
rupiter
Зарегистрирован: 16.09.2013
Сообщения: 75
|
000 писал(а): |
Функция TimeFrameSet() преобразует ТОЛЬКО массивы цен OHLCV. Соответственно на твой массив invClose она ника не влияет.
Тебе надо расчитать твой скорректированный массив invClose. Потом подменить им цены закрытия (Close = invClose) и только потом применять TimeFrameSet. |
Допустим, мой текущий таймфрейм графика - часовки. Если я до объявления TimeFrameSet( in1Minute) стану это делать, то мой массив invClose будет создан на часовках. Потом я его в минутный массив не смогу преобразовать!
000 писал(а): |
При этом имей ввду, что грфик должен быть не часовой а минутный ибо на часовом графике AFL минуток не видит вообще не смотря на то, что они есть в базе. |
В том то и дело, что моя программа корректирует (то есть, должна корректировать) цену закрытия предыдущего дня к цене закрытия первой минуты текущего дня. То есть, по идее, я всего лишь изменяю цену закрытия прошлого дня (она же - цена закрытия последнего часа прошлого дня, как и последней минуты прошлого дня).
На словах логика такая. У меня открыт часовой таймфрейм минутных данных. Инструкцией TimeFrameSet( in1Minute) я преобразую часовой массив в минутный (база же минутная, должна это позволить), корректирую цену закрытия каждого дня, затем возвращаю масштаб графика на часовой. И, кстати, почему ты говоришь , что прочие массивы, кроме OHLCV не регулируются инструкцией TimeFrameSet, когда даже в мануале показан пример создания массива скользящей средней на одном таймфрейме, а потом выложенной на другом? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Нет. Я написал, что если у тебя фрейм графика часовой, то к минуткам ты никак не можешь обратиться. Нельзя на часовом графике написать TimeFrameSet( in1Minute) |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
rupiter
Зарегистрирован: 16.09.2013
Сообщения: 75
|
000 писал(а): |
Нет. Я написал, что если у тебя фрейм графика часовой, то к минуткам ты никак не можешь обратиться. Нельзя на часовом графике написать TimeFrameSet( in1Minute) |
Хорошо. А можешь подсказать какую-нибудь другую идею (чисто концептуально), как можно это сделать? То есть, приравнять цену закрытия дня к цене закрытия первой минуты следующего дня. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Взять минутки, изменить цену закрытия последней свечки. При помощи фунции AddToComposite() создать новый символ без гэпа. Или дальше работать с этим символом меняя при необходимости фрейм в большую сторону функциями TimeFrameSet(). Только надо не забывать, что функция TimeFrameRestore() возвращает оригинальные цены закрытия. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
rupiter
Зарегистрирован: 16.09.2013
Сообщения: 75
|
000 писал(а): |
Взять минутки, изменить цену закрытия последней свечки. При помощи фунции AddToComposite() создать новый символ без гэпа. Или дальше работать с этим символом меняя при необходимости фрейм в большую сторону функциями TimeFrameSet(). Только надо не забывать, что функция TimeFrameRestore() возвращает оригинальные цены закрытия. |
То есть, получается, нужно менять котировки за пределами Амиброкера, а потом импортировать их? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Зачем за пределами? Ами сам прекрасно может создать новый символ. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
|