Стратегии и роботы > Парсинг данных с графика
Парсинг данных с графика
Добрый день
Подскажите, как используя индикатор HeikenAshi, сделать следующее условие:
Открыть, либо закрыть позицию при появление некоторого n количества баров синего цвета
Подскажите, как используя индикатор HeikenAshi, сделать следующее условие:
Открыть, либо закрыть позицию при появление некоторого n количества баров синего цвета
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Парсинг данных с графика
Если требуется в конструкторе, то мы тут ограничены и можем задать жестко кол-во баров на повышении или понижении.
Пример:
Пример:
никогда такого не было и вот опять
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Парсинг данных с графика
Но лучше конечно через код, т.к. будет больше гибкости.
Например, можно будет задать кол-во баров на повышение и\или понижении.
Пример с возможностью задать кол-во баров повышения \ понижения по индикатору HeikenAshi:
Например, можно будет задать кол-во баров на повышение и\или понижении.
Пример с возможностью задать кол-во баров повышения \ понижения по индикатору 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();
}
}
никогда такого не было и вот опять
Re: Парсинг данных с графика
О можно пояснить, почему берется цена открытия по HeikenAshi > цены закрытия по индикатору HeikenAshi
Можно где-то почитать по принцип построения стратегий по индикаторов в конструкторе?
Можно где-то почитать по принцип построения стратегий по индикаторов в конструкторе?
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Парсинг данных с графика
Данный пользовательский индикатор возвращает 4 ряда
Open, High, Low, Close
Проверка простая, если цена открытия "Open" меньше "Close" значит бар растущий (синий цвет).
И наоборот "Close" меньше "Open" цена падает (пурпурный цвет)
Задав смещение каждой из проверок мы смотрим на текущий (смещение 0), предыдущий (смещение 1) и 2 бара назад (смещение 2).
Проводятся вебинары по роботам и есть документация и видео обучение на оф. сайте http://alfadirect.ru в разделе "Обучение"
+ записи вебинаров здесь на форуме. Ищите там вебинары "Быстрый старт" и "Создай своего робота".
Open, High, Low, Close
Проверка простая, если цена открытия "Open" меньше "Close" значит бар растущий (синий цвет).
И наоборот "Close" меньше "Open" цена падает (пурпурный цвет)
Задав смещение каждой из проверок мы смотрим на текущий (смещение 0), предыдущий (смещение 1) и 2 бара назад (смещение 2).
Проводятся вебинары по роботам и есть документация и видео обучение на оф. сайте http://alfadirect.ru в разделе "Обучение"
+ записи вебинаров здесь на форуме. Ищите там вебинары "Быстрый старт" и "Создай своего робота".
никогда такого не было и вот опять
Re: Парсинг данных с графика
Код: Выделить всё
/**
**/
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
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Парсинг данных с графика
Что-то не работает?
Если говорить о стопе, то тут всё ок.
После открытия позиции ставим стоп.
Т.е. сначала уйдёт лимитная заявка на открытие лонг или шорт, как (если) она исполнится выставится стоп заявка.
Порядок правильный.
Если говорить о стопе, то тут всё ок.
После открытия позиции ставим стоп.
Т.е. сначала уйдёт лимитная заявка на открытие лонг или шорт, как (если) она исполнится выставится стоп заявка.
Порядок правильный.
никогда такого не было и вот опять
Re: Парсинг данных с графика
А не надо ли его отменять, если он не сработал? Он пропадёт, когда откроется другпя заявка и новый стоп?
CanselStoploss() не нужно использовать?
CanselStoploss() не нужно использовать?
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Парсинг данных с графика
Не надо.
При открытии новой позиции стоп отменится. Если позиция увеличится, то прежний стоп останется и его надо при необходимости перевыставить. Если же позиция будет закрыта частично, то стоп снимается весь и надо выставлять новый. Есть и баги в этом плане в АД4, если позицию закрыли частично лимитной заявкой CloseLongLimit(), CloseShortLimit() то стоп почему-то не снимается и будет висеть на ранее выставленную позицию, и в этом случае можно стопом получить переворот в другую сторону - это баг. Последнее утверждение я не проверял на последних версиях, но пару версий назад точно такое было. Надо проверять.
Если необходимо будет переставить стоп или вообще отменить, тогда надо делать CancelStopLoss() перед StopLoss().
из документации:
CancelStopLoss() – отменить (снять) стоп¬ заявку, выставленную для защиты текущей позиции робота. Функция используется для отмены или редактирования положения текущего стопа. Повторный вызов функции выставления стопа не снимает старый и не выставляет новый стоп. Поэтому необходимо использовать данную функцию для отмены ранее выставленной заявки.
Особенности использования стопов:
1) Стоп выставляется один раз к открытой позиции, повторный вызов функции установки стопа без изменения позиции не приводит к его изменению.
2) Для изменения параметра стопа необходимо предварительно использовать функцию CancelStopLoss()
3) Срок хранения стоп заявок 30 дней
При открытии новой позиции стоп отменится. Если позиция увеличится, то прежний стоп останется и его надо при необходимости перевыставить. Если же позиция будет закрыта частично, то стоп снимается весь и надо выставлять новый. Есть и баги в этом плане в АД4, если позицию закрыли частично лимитной заявкой CloseLongLimit(), CloseShortLimit() то стоп почему-то не снимается и будет висеть на ранее выставленную позицию, и в этом случае можно стопом получить переворот в другую сторону - это баг. Последнее утверждение я не проверял на последних версиях, но пару версий назад точно такое было. Надо проверять.
Если необходимо будет переставить стоп или вообще отменить, тогда надо делать CancelStopLoss() перед StopLoss().
из документации:
CancelStopLoss() – отменить (снять) стоп¬ заявку, выставленную для защиты текущей позиции робота. Функция используется для отмены или редактирования положения текущего стопа. Повторный вызов функции выставления стопа не снимает старый и не выставляет новый стоп. Поэтому необходимо использовать данную функцию для отмены ранее выставленной заявки.
Особенности использования стопов:
1) Стоп выставляется один раз к открытой позиции, повторный вызов функции установки стопа без изменения позиции не приводит к его изменению.
2) Для изменения параметра стопа необходимо предварительно использовать функцию CancelStopLoss()
3) Срок хранения стоп заявок 30 дней
никогда такого не было и вот опять
Вернуться в «Стратегии и роботы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей