Стратегии и роботы > Парсинг данных с графика

Обсуждение, описание стратегий и роботов, идеи для стратегий
ilya0610
Сообщения: 16
Зарегистрирован: 03 май 2018, 21:20

Парсинг данных с графика

Непрочитанное сообщение ilya0610 » 03 май 2018, 21:34

Добрый день

Подскажите, как используя индикатор HeikenAshi, сделать следующее условие:

Открыть, либо закрыть позицию при появление некоторого n количества баров синего цвета

123.png

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

Re: Парсинг данных с графика

Непрочитанное сообщение evge » 04 май 2018, 07:10

Если требуется в конструкторе, то мы тут ограничены и можем задать жестко кол-во баров на повышении или понижении.

Пример:

HA-01.png
3 бара синих - Long
HA-01.png (26.18 КБ) 7298 просмотров

HA-02.png
3 бара пурпурных - Short
HA-02.png (35.08 КБ) 7298 просмотров

HA-03.png
Результат
HA-03.png (37.19 КБ) 7298 просмотров
никогда такого не было и вот опять

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

Re: Парсинг данных с графика

Непрочитанное сообщение evge » 04 май 2018, 07:21

Но лучше конечно через код, т.к. будет больше гибкости.
Например, можно будет задать кол-во баров на повышение и\или понижении.

Пример с возможностью задать кол-во баров повышения \ понижения по индикатору HeikenAshi:

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

/**

**/
function Initialize()
{
   StrategyName = "HA";
   AddParameter("Bars", 5, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 5;
   ShortLimit = -5;
   AddChartIndicator("MY.HeikenAshi", new Dictionary <string, double>{});
}

function OnUpdate()
{

   var H = MY.HeikenAshi(Input1);
   var HO = H["Open"];
   var HC = H["Close"];

   bool isLong = true, isShort = true;
   
   for (int x = 0; x <= Bars; x++)
   {
      if (HO[x] > HC[x]) isLong = false;
      if (HO[x] < HC[x]) isShort = false;
      if (!isLong && !isShort) break;
   }
   
   if ( isLong )
   {
      EnterLong();
   }

   if ( isShort )
   {
      EnterShort();
   }
}


HA-04.png
HA-04.png (37.42 КБ) 7296 просмотров
никогда такого не было и вот опять

ilya0610
Сообщения: 16
Зарегистрирован: 03 май 2018, 21:20

Re: Парсинг данных с графика

Непрочитанное сообщение ilya0610 » 07 май 2018, 20:49

О можно пояснить, почему берется цена открытия по HeikenAshi > цены закрытия по индикатору HeikenAshi
Можно где-то почитать по принцип построения стратегий по индикаторов в конструкторе?

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

Re: Парсинг данных с графика

Непрочитанное сообщение evge » 07 май 2018, 21:03

Данный пользовательский индикатор возвращает 4 ряда

Open, High, Low, Close

Проверка простая, если цена открытия "Open" меньше "Close" значит бар растущий (синий цвет).

И наоборот "Close" меньше "Open" цена падает (пурпурный цвет)

Задав смещение каждой из проверок мы смотрим на текущий (смещение 0), предыдущий (смещение 1) и 2 бара назад (смещение 2).

Проводятся вебинары по роботам и есть документация и видео обучение на оф. сайте http://alfadirect.ru в разделе "Обучение"

+ записи вебинаров здесь на форуме. Ищите там вебинары "Быстрый старт" и "Создай своего робота".
никогда такого не было и вот опять

ilya0610
Сообщения: 16
Зарегистрирован: 03 май 2018, 21:20

Re: Парсинг данных с графика

Непрочитанное сообщение ilya0610 » 17 май 2018, 20:03

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

/**

**/

function Initialize()
{
   StrategyName = "HeikenAshi";
   AddParameter("Bars_Blue", 3, "", 1);
   AddParameter("Bars_Magenta", 2, "", 1);
   AddParameter("delta_short", 2, "", 1);
   AddParameter("delta_long", 2, "", 1);

   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 5;
   ShortLimit = -5;
   AddChartIndicator("MY.HeikenAshi", new Dictionary <string, double>{});
}

function OnUpdate()
{

   var H = MY.HeikenAshi(Input1);
   var HO = H["Open"];
   var HC = H["Close"];
   int x = 0, y = 0;
   bool isLong = true, isShort = true;
   
   while( x != Bars_Blue)
   {
      if (HO[x] > HC[x]) isLong = false;
      if (!isLong) break;
      x++; 
   }
    while( y != Bars_Magenta)
   {
      if (HO[y] < HC[y]) isShort = false;
      if (!isShort) break;
      y++; 
   }
   if ( isLong )
   {
      EnterLong();
     StopLoss(delta_long, SignalPriceType.DeltaInPercentFromAveragePrice);
   }

   if ( isShort )
   {
      EnterShort();
     StopLoss(delta_short, SignalPriceType.DeltaInPercentFromAveragePrice);
   }

}


Просьба пояснить, как правильно поставить стоп-лосс, когда откроется позиция шорт, и соответственно наоборот.
По коду видно куда я их расставил, правильно ли я то сделал и что еще не хватает

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

Re: Парсинг данных с графика

Непрочитанное сообщение evge » 17 май 2018, 21:32

Что-то не работает?

Если говорить о стопе, то тут всё ок.

После открытия позиции ставим стоп.

Т.е. сначала уйдёт лимитная заявка на открытие лонг или шорт, как (если) она исполнится выставится стоп заявка.

Порядок правильный.
никогда такого не было и вот опять

ilya0610
Сообщения: 16
Зарегистрирован: 03 май 2018, 21:20

Re: Парсинг данных с графика

Непрочитанное сообщение ilya0610 » 20 май 2018, 10:51

А не надо ли его отменять, если он не сработал? Он пропадёт, когда откроется другпя заявка и новый стоп?
CanselStoploss() не нужно использовать?

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

Re: Парсинг данных с графика

Непрочитанное сообщение evge » 21 май 2018, 07:56

Не надо.
При открытии новой позиции стоп отменится. Если позиция увеличится, то прежний стоп останется и его надо при необходимости перевыставить. Если же позиция будет закрыта частично, то стоп снимается весь и надо выставлять новый. Есть и баги в этом плане в АД4, если позицию закрыли частично лимитной заявкой CloseLongLimit(), CloseShortLimit() то стоп почему-то не снимается и будет висеть на ранее выставленную позицию, и в этом случае можно стопом получить переворот в другую сторону - это баг. Последнее утверждение я не проверял на последних версиях, но пару версий назад точно такое было. Надо проверять.

Если необходимо будет переставить стоп или вообще отменить, тогда надо делать CancelStopLoss() перед StopLoss().

из документации:

CancelStopLoss() – отменить (снять) стоп¬ заявку, выставленную для защиты текущей позиции робота. Функция используется для отмены или редактирования положения текущего стопа. Повторный вызов функции выставления стопа не снимает старый и не выставляет новый стоп. Поэтому необходимо использовать данную функцию для отмены ранее выставленной заявки.

Особенности использования стопов:
1) Стоп выставляется один раз к открытой позиции, повторный вызов функции установки стопа без изменения позиции не приводит к его изменению.
2) Для изменения параметра стопа необходимо предварительно использовать функцию CancelStopLoss()
3) Срок хранения стоп заявок 30 дней
никогда такого не было и вот опять


Вернуться в «Стратегии и роботы»

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

Сейчас этот форум просматривают: Bing [Bot] и 7 гостей