Страница 1 из 2

Есть ли решение?

Добавлено: 06 сен 2016, 18:15
Gemin
Добрый день!
Была мысль отображения индикатора RSI с 2 часовым таймфреймом на 1 часовом графике инструмента (т.е. вышестоящий таймфрейм на нижестоящем).
Поддержка сколько смогла помогла.
Спасибо и на этом, но есть существенный недостаток - прорисовывается индикатор только в начале первого часа 2-х часового таймфрейма...
Естественно, сам перепробовал многое, может быть и нет решения, а может и КПД не хватает.
Заранее спасибо!!!

Код: Выделить всё

function Initialize()
{

// Область определения параметров индикатора
// Обязательные параметры:
    IndicatorName = "RSI_12"; // Создаем индикатор с именем Power
    PriceStudy = false;   // Рисовать в отдельном окне (ниже графика цены)
    AddInput("Input", Inputs.Price);   // Input - входной ряд цена закрытия бара
    AddParameter("Period", 14, 2);
    AddSeries("RSI2", DrawAs.Line, Color.Red);   
    AddGlobalVariable("oldPos", Types.Double, 0.0);
    AddGlobalVariable("oldNeg", Types.Double, 0.0);
    AddGlobalVariable("oldPrice", Types.Double, 0.0);
    AddLevel(30, Color.Gray, "RSI2");
    AddLevel(70, Color.Gray, "RSI2");
}

function Evaluate()

{
// AlfaDirect. 2014.
// RSI (Relative Strength Index) - индекс относительной силы
// Автор - Уэллс Уайлдер (Welles Wilder).

if (CurrentIndex < 1)

{
        RSI2 = 0.0;
        oldPos = 0.0;
        oldNeg = 0.0;
        oldPrice = Input[0];
}
else
{
var t = BarTime();
// Для Акций – начало бара 11 конец в 12 – начало бара 13 конец в 14

if (t == AsTime(11,0,0) || t == AsTime(13,0,0) || t == AsTime(15,0,0) || t == AsTime(17,0,0) 
|| t == AsTime(18,0,0))

{
    var rel = Input[0] - oldPrice;
    oldPrice = Input[0]; 
    var sump = 0.0;
    var sumn = 0.0;

    if (rel > 0)
        sump = rel;
    else
        sumn =-rel;

    var positive = (oldPos*(Period - 1.0) + sump)/Period;
    var negative = (oldNeg*(Period - 1.0) + sumn)/Period;
    oldPos = positive;
    oldNeg = negative;
 
    if (negative == 0.0)
        RSI2 = 0.0;
    else
        RSI2 = 100.0 - 100.0 / (1.0 + positive/negative);
}
}
}

Re: Есть ли решение?

Добавлено: 06 сен 2016, 22:08
evge
примерно так

Код: Выделить всё

function Initialize()
{
 IndicatorName = "RSI_H2";   
 PriceStudy = false;   
 AddInput("Input", Inputs.Price);   
 AddParameter("Period", 14, 32);   
 
 AddSeries("RSI", DrawAs.Line, Color.LightBlue);   
 AddSeries("PosBuffer", DrawAs.Line, Color.Red, false);
 AddSeries("NegBuffer", DrawAs.Line, Color.Red, false);
 AddLevel(30, Color.Gray, "RSI");
 AddLevel(70, Color.Gray, "RSI");
 AddGlobalVariable("IO", Types.Double, 0);
}

function Evaluate()
{
// evge 06.09.2016 http://alfadirect4.ru
// RSI 2 часового ТФ на M15 или выше таймфрейме. На ТФ ниже возможен некорректный расчет.
//
// RSI (Relative Strength Index) - индекс относительной силы
// Автор - Уэллс Уайлдер (Welles Wilder).

var t0 = BarTime(0).Hours;
var t1 = BarTime(1).Hours;

if (CurrentIndex < 1)
{
   RSI = 0.0;
   PosBuffer = 0.0;
   NegBuffer = 0.0;      
   IO = Input[0];
}
else
if (t0 % 2 == 0 && (t0 % 2 != t1 % 2 || t0 < t1))
{
    var sump = 0.0;
    var sumn = 0.0;
    var rel = Input[1]-IO;
    if (rel > 0)
        sump = rel;
    else
        sumn =-rel;
   
    var positive = (PosBuffer[1]*(Period - 1.0) + sump)/Period;
    var negative = (NegBuffer[1]*(Period - 1.0) + sumn)/Period;

    PosBuffer = positive;
    NegBuffer = negative;

    if (negative == 0.0)
        RSI = 0.0;
    else
        RSI = 100.0 - 100.0 / (1.0 + positive/negative);

   IO = Input[1];

  } else { RSI = RSI[1]; PosBuffer = PosBuffer[1]; NegBuffer = NegBuffer[1]; }

}

Re: Есть ли решение?

Добавлено: 07 сен 2016, 09:07
Gemin
Добрый день, уважаемый Evge!
Много просматривал страниц на официальном сайте АД4 и на Вашем и где-то видел удивлённо-восхищенный отзыв о вашей работе.
Целиком и полностью поддерживаю справедливые слова в Ваш адрес, поскольку не понимаю в какой разведшколе или жизненном университете такому учили!!!
Смею предположить, что в миру людском мы тезки и я при знакомстве в хорошей компании (девушек) иногда представляюсь - Евгений, но для вас можно просто Гений...
Думаю, что для Вас ник "Просто Гений" очень подошел бы!!!)
За скрипт огромное СПАСИБО, но есть небольшие расхождения...
Если будет возможность посмотреть, буду очень признателен.
Спасибо!
GAZP.PNG

Re: Есть ли решение?

Добавлено: 07 сен 2016, 09:25
evge
Да, была ошибка в условии одном. Поправил выше код, замените.
Ошибка была в том, что выпадало из расчетов время 10:00,

условие

Код: Выделить всё

if (t0 % 2 == 0 && t0 % 2 != t1 % 2)

заменил на

Код: Выделить всё

if (t0 % 2 == 0 && (t0 % 2 != t1 % 2 || t0 < t1))


RSI_H2-01.png

Re: Есть ли решение?

Добавлено: 07 сен 2016, 10:19
Gemin
Извиняюсь за настойчивость, но так понимаю, что прорисовывает онлайн с опозданием -1 (см дополнительно скан выше)...
И очень странно, что RSI на моем 2 часовом не бьется с Вашим, хотя периоды перепроверил.
Спасибо!
GAZP1.PNG

Re: Есть ли решение?

Добавлено: 07 сен 2016, 10:29
Gemin
Дополнительно...
GAZP2.PNG

Re: Есть ли решение?

Добавлено: 07 сен 2016, 10:51
evge
Это запаздывание.

Отрисовка идёт на текущем баре по расчетам предыдущих баров. Т.е. что там было в 18:00 мы увидим в 10:00 т.е. на след баре 2х часовом.
От этого можно избавится только если рисовать задним числом. Мы же рисуем в текущем баре.

т.е. в 10:00 мы наконец-то узнали чем закончилось дело в 18:00 :)

RSI_H2-02.png

Re: Есть ли решение?

Добавлено: 07 сен 2016, 12:08
Gemin
Запаздывание ли…
GAZP3.PNG

Первоначально выставленный индикатор показывает всё четко, но первый час или после закрытия торгов…
Даже 3 часовой (т.е. в условии задаешь время бара 10, 12, 15, 18) и т.д.
Проблема в том, что как только наступает время бара которого нет в условии, то не хочет индикатор брать данные предыдущего бара (Input[0]) или их «помнить», а может не хочет считать, поскольку наступившего времени бара нет в условии. Пробовал в условии прописывать время этих баров (если время бара 10, 12, 14, 16, 18, то Old меняется, если 11, 13, 15, 17, то Old = Old[-1]), но результат получается некорректный.
По сути вроде как просто – с 10 до 11 берется (Input[0]) начала 10 часового бара, с 11 до 12 не меняет (Input[0]), т.е. запомнить на два часа (Input[0]) начала 10 часового бара, а затем его поменять и снова на данные начала только уже 12 часового бара и т.д…
Спасибо.

Re: Есть ли решение?

Добавлено: 07 сен 2016, 12:17
evge
Пока проблемы не вижу.
Конкретно если взять любую точку RSI на H2 и посмотреть на H1 в RSI_H2 она просто будет сдвинута вправо, т.е. запаздывание отрисовки на 1 шаг.

Re: Есть ли решение?

Добавлено: 07 сен 2016, 13:06
Gemin
Ошибочка вышла в моем предыдущем сообщении…
Бары 2-х часового таймфрейма формируются в 11, 13, 15, 17 и 18 часов.
if (t == AsTime(11,0,0) || t == AsTime(13,0,0) || t == AsTime(15,0,0) || t == AsTime(17,0,0)
|| t == AsTime(18,0,0))
Может в Вашем скрипте, если поправить время, то получится счастье, поскольку сейчас считает +2 с 10?
На данный момент сложно сказать, что индикатор на 1 графике идентичен индикаторам на 2 и 3 графике и просто сдвинут на 1 или 2 бара, а вот на 2 и 3 графике наблюдается практически полное соответствие…
GAZP4.PNG

Спасибо!
P.s. извиняюсь за назойливость.