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

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

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

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

в 1 графике в RSI_H2 значение индикатора повторяется для тех свечек, что не входят в условие т.е. внутренние свечки таймфрейма H2.

в H1 это:

10=11, 12=13, 14=15 и т.д.

а в 2 графике имеются только точки на значениях вышестоящего ТФ, т.е:

10, 12, 14 и т.д. и они просто соединены линиями, т.е. визуально это очень похоже будет на оригинал H2, но на самом деле точек по времени 11, 13, 15 в индикаторе не будет вообще. Индикатор не будет "нормально" работать, например, как индикатор для стратегии, т.к. в этих точках нет значения индикатора.
никогда такого не было и вот опять

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

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

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

Добрый вечер, Evge.
Ваша мысль была правильной!
Немного дополнил и в принципе счастье...
Сам график практически идеален, а получаемые цифровые данные не полностью соответствуют. Так понимаю, что вопрос в периодах, поскольку на 2 часовом RSI рассчитывается 1 раз, а на 1 часовом 2 раза.


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

function Initialize()
{
 IndicatorName = "RSI_H2pr";   
 PriceStudy = false;   
 AddInput("Input", Inputs.Price);   
 AddParameter("Period", 28, 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 t = BarTime(0).Hours;

if (CurrentIndex < 1)
{
   RSI = 0.0;
   PosBuffer = 0.0;
   NegBuffer = 0.0;     
   IO = Input[0];
}
else
if (t % 2 == 0 && t != 18)
{
    var sump = 0.0;
    var sumn = 0.0;
    var rel = Input[0]-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);


  } else {     

    var sump = 0.0;
    var sumn = 0.0;
    var rel = Input[0]-IO;
    IO = Input[0];
   
    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);
}

}





Хотел еще по одному вопросу побеспокоить...
Сам не знаю, как подступиться.
Направление тоже (на часовом графике данные с 2 часового), только с индикатором LinReg.

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

function Initialize()
{
  IndicatorName = "LinReg_1";      
  PriceStudy = false;   
  AddInput("Input", Inputs.Price);      
  AddSeries("LinReg", DrawAs.Line, Color.Red);      
  AddParameter("Period", 20);
  AddParameter("Extr", 10);
  AddGlobalVariable("ZN", Types.Double, 0.0);
  AddGlobalVariable("t2", Types.Double, 0.0);
  AddGlobalVariable("t4", Types.Double, 0.0);
}

function Evaluate()
{
// AlfaDirect. 2015. OX
// LinReg (Linear Regression) - Линейная регрессия 
  if (CurrentIndex == 0 )
  {
    // Расчет неизменных коэффициентов по времени
    for (int i = 0; i < Period; i++)
    {
      t2 = t2 + i;
      t4 = t4 + i * i;
    }
    ZN = ((double)Period * t4 - t2 * t2);
  }

  if (CurrentIndex < Period + Extr )
     LinReg = Input[0];
  else
  {
    // Вариант t = [0...N-1]
    double a1 = 0.0;
    double a3 = 0.0;
    for (int i = 0; i < Period; i++)
    {
      a1 = a1 + i * Input[-(int)Period + 1 + i];
      a3 = a3 + Input[-i];
    }
    var alfa = (Period * a1 - t2 * a3) / ZN;
    var beta = (a3 - alfa * t2) / Period;
    LinReg = alfa * ((double)Period-1.0 + Extr) + beta ;
  }
}

Заранее спасибо!


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

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

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