Пользовательские индикаторы > ROC от WMA

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Stanislav
Сообщения: 5
Зарегистрирован: 16 янв 2021, 18:00

ROC от WMA

Непрочитанное сообщение Stanislav » 16 янв 2021, 18:14

добрый день
пытаюсь написать стратегию ROC от WMA, но ROC все равно показывает значения от основного графика инструмента а не от WMA
скрипт:

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

function Initialize()
{
   StrategyName = "AAA_ROC_3";
   AddParameter("P1", 0, "period WMA", 1);
   AddParameter("P2", 0, "period ROC", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "SiH1=ФОРТС");
   LongLimit = 0;
   ShortLimit = 0;
   AddChartIndicator("WMA", new Dictionary <string, string>{{"Period", "P1"}});
   AddChartIndicator("ROC", new Dictionary <string, string>{{"Period", "P2"}});
}

function OnUpdate()
{
   var a = WMA(Input1, P1);
   var b = ROC(a, P2)[0];
   
   /// ПРАВИЛО 1
   if ( b >= 0 )
   {
      EnterLong();
   }

   /// ПРАВИЛО 2
   if ( b <= 0 )
   {
      EnterShort();
   }

}


идея в том чтобы на периоде 1 уйти от частокола ROC который он выдает при привязке к основному графику
но что то не так
и график тоже прорисовывает от основного графика а не от WMA
буду признателен за совет

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

Re: ROC от WMA

Непрочитанное сообщение evge » 17 янв 2021, 00:17

В отображение индикаторов на графике для робота через

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

AddChartIndicator("ROC", new Dictionary <string, string>{{"Period", "P2"}});


нельзя задать входящую серию, он берет Input1 на вход для ROC, поэтому и рисует не от WMA, а от цены.

Но судя по коду самой стратегии сигналы должны быть правильные.

Если нужно на график выводить ROC от WMA, то создайте свой индикатор (например, под названием ROC_WMA) и задайте его в

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

AddChartIndicator("MY.ROC_WMA", new Dictionary <string, double>{{"PeriodWMA", "P1"},{"PeriodROC", "P2"}});


Передавая на вход 2 параметра, PeriodWMA и PeriodROC, по которым и посчитайте свой индикатор.

индикатор:

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

function Initialize()
{
IndicatorName = "ROC_WMA";
PriceStudy = false;
AddInput("Input", Inputs.Price);
AddSeries("ROC_WMA", DrawAs.Line, Color.Blue);
AddParameter("PeriodWMA", 10, 1);
AddParameter("PeriodROC", 20, 1);
}

function Evaluate()
{
var W = WMA(Input, PeriodWMA);
var R = ROC(W, PeriodROC);

ROC_WMA = R[0];
}
никогда такого не было и вот опять

Stanislav
Сообщения: 5
Зарегистрирован: 16 янв 2021, 18:00

Re: ROC от WMA

Непрочитанное сообщение Stanislav » 17 янв 2021, 12:53

Спасибо evge!
На основании ROC_WMA сделал стратегию: WMA убирает шумы при движении цены, ROC показывает силу изменений, Уровни должны отсекать ложные мелкие колебания, которые в основном и ведут к убыткам.
Но при компиляции пишет: "Имя ROC_WMA отсутствует в текущем контексте at 23" - это 23 строка:
var b = ROC_WMA (a, P2) [0];
Стратегия:

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

function Initialize()
{
   StrategyName = "AAA_ROC_4";
   AddParameter("P1", 0, "period WMA", 1);
   AddParameter("P2", 0, "period ROC_WMA", 1);
   AddParameter("P3", 0, "UpperLevel ROC_WMA", 1);
   AddParameter("P4", 0, "LowerLevel ROC_WMA", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "SiH1=ФОРТС");
   LongLimit = 0;
   ShortLimit = 0;
   AddChartIndicator("WMA", new Dictionary <string, string>{{"Period", "P1"}});
   AddChartIndicator("ROC_WMA", new Dictionary <string, string>{{"Period", "P2"}});
}

function OnUpdate()
{
   var a = WMA(Input1, P1);
   var b = ROC_WMA(a, P2)[0];
      
   /// ПРАВИЛО 1
   if ( b >= P3 )    
   {
      EnterLong();
   }

   /// ПРАВИЛО 2
   if ( b <= P4 )
   {
      EnterShort();
   }
   
   /// ПРАВИЛО 3
   if ( b < P3 )   
   {
       CloseLong();
   }
   
   /// ПРАВИЛО 4
   if ( b > P4 )    
   {
       CloseShort();
   }

}


Вроде ничего не менял, только уровни для ROC_WMA добавил, но работать не хочет
И хотелось бы чтобы уровни прорисовывались - это удобно для визуализации. Но в скриптах пользователя не вижу такой команды DrawLevel
Буду признателен за помощь. Спасибо!

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

Re: ROC от WMA

Непрочитанное сообщение evge » 17 янв 2021, 15:32

Stanislav писал(а):Но при компиляции пишет: "Имя ROC_WMA отсутствует в текущем контексте at 23" - это 23 строка:
AddChartIndicator("ROC_WMA", new Dictionary <string, string>{{"Period", "P2"}});
...Вроде ничего не менял, только уровни для ROC_WMA добавил, но работать не хочет
И хотелось бы чтобы уровни прорисовывались - это удобно для визуализации. Но в скриптах пользователя не вижу такой команды DrawLevel
Буду признателен за помощь. Спасибо!


Если брали мой вариант ROC_WMA, то:

1. Там 2 параметра на вход PeriodWMA и PeriodROC;
2. Тогда заменить:

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

   AddChartIndicator("ROC_WMA", new Dictionary <string, string>{{"Period", "P2"}});


на

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

   AddChartIndicator("MY.ROC_WMA", new Dictionary <string, double>{{"PeriodWMA", "P1"},{"PeriodROC", "P2"}});


Выше я ошибся не указав MY. (уже поправил сообщение), это необходимо для пользовательских индикаторов.

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

   var b = ROC_WMA(a, P2)[0];


заменить на

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

   var b = MY.ROC_WMA(a, P1, P2)[0];


По поводу уровней в индикаторах.

Ищите в документации это есть:

В Initialize():

AddLevel(Value, Color, SeriesName)
AddLevel(Value, Color, LineStyle, LineWidth, SeriesName)
– создание уровня. Может быть несколько уровней.
Параметры:
• Value – значение по умолчанию
• Color – цвет уровня (значения стандартные для MicroSoft)
• LineStyle – стиль линии
• LineWidth – толщина линии
• SeriesName – имя ряда, к которому привязана линия (требуется для определения области, где будет размещена линия)

Пример. Создание уровня в индикаторе. ( в Initialize() {...} )

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

  AddLevel(0, Color.Red, "Last");  // Создание уровня со значением 0 в области ряда Last
  AddLevel(70, Color.Red, LineStyles.Dot, 1, "Last"); // задание типа и толщины линии


Пример. Изменение значения и цвета уровня с индексом 0.

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

function Evaluate()
{
//Далее в области вычисления можно изменять значение и цвет уровня
Levels[0].Level = 12.0;
Levels[0].Color = Color.Red;


Это для первого из ранее добавленных AddLevel() уровней. Для последующих индекс меняем на другой

Levels[1] - второй, Levels[2] - третий и т.д.
никогда такого не было и вот опять


Вернуться в «Пользовательские индикаторы»

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

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