Общие вопросы по разработке > Есть ли решение?

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Gemin
Сообщения: 23
Зарегистрирован: 06 сен 2016, 18:02

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

Непрочитанное сообщение Gemin » 06 сен 2016, 18:15

Добрый день!
Была мысль отображения индикатора 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);
}
}
}

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

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

Непрочитанное сообщение evge » 06 сен 2016, 22:08

примерно так

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

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]; }

}
никогда такого не было и вот опять

Gemin
Сообщения: 23
Зарегистрирован: 06 сен 2016, 18:02

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

Непрочитанное сообщение Gemin » 07 сен 2016, 09:07

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

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

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

Непрочитанное сообщение evge » 07 сен 2016, 09:25

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

условие

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

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

заменил на

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

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


RSI_H2-01.png
никогда такого не было и вот опять

Gemin
Сообщения: 23
Зарегистрирован: 06 сен 2016, 18:02

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

Непрочитанное сообщение Gemin » 07 сен 2016, 10:19

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

Gemin
Сообщения: 23
Зарегистрирован: 06 сен 2016, 18:02

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

Непрочитанное сообщение Gemin » 07 сен 2016, 10:29

Дополнительно...
GAZP2.PNG

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

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

Непрочитанное сообщение evge » 07 сен 2016, 10:51

Это запаздывание.

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

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

RSI_H2-02.png
никогда такого не было и вот опять

Gemin
Сообщения: 23
Зарегистрирован: 06 сен 2016, 18:02

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

Непрочитанное сообщение Gemin » 07 сен 2016, 12:08

Запаздывание ли…
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 часового бара и т.д…
Спасибо.

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

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

Непрочитанное сообщение evge » 07 сен 2016, 12:17

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

Gemin
Сообщения: 23
Зарегистрирован: 06 сен 2016, 18:02

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

Непрочитанное сообщение Gemin » 07 сен 2016, 13:06

Ошибочка вышла в моем предыдущем сообщении…
Бары 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. извиняюсь за назойливость.


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей