Общие вопросы по разработке > Простой алгоритм

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
State
Сообщения: 35
Зарегистрирован: 08 окт 2018, 12:43
Поблагодарили: 1 раз

Простой алгоритм

Непрочитанное сообщение State » 27 июн 2020, 22:59

Доброго времени суток.
Я не программист от слова "совсем" всетаки.
Появился такой вопрос: как, не основываясь на индикаторе, создать робота, который просто будет выставлять лимитную заявку на покупку по цене Bid и после исполнения заявки выставит аналогичную по размеру заявку на продажу по цене Ask. И таким образом зациклить робота на покупку/продажу, т.е. купил-продал-еще купил-продал...
Спасибо.

П.С. Пробовал делать основываясь на цене low и high свечи, но получается, что надо ставить середину свечи как цену пробития для продажи. В общем не работает)

nikkrav
Сообщения: 41
Зарегистрирован: 19 май 2016, 15:20
Благодарил (а): 67 раз
Поблагодарили: 1 раз

Re: Простой алгоритм

Непрочитанное сообщение nikkrav » 28 июн 2020, 18:03

Было что-то такое в первых вебинарах по роботам.

Аватара пользователя
Den
Сообщения: 363
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 16 раз
Поблагодарили: 4 раза

Re: Простой алгоритм

Непрочитанное сообщение Den » 28 июн 2020, 20:16

Грааля на будет, однозначно будет сливать.

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

Re: Простой алгоритм

Непрочитанное сообщение evge » 29 июн 2020, 10:03

Добрый день!

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

function Initialize()
{
   StrategyName = "SimpleRobot";
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{

   if (CurrentPosition() == 0)
   {
   EnterLongLimit(GetBid());
   CloseLongLimit(GetAsk());
   }

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

State
Сообщения: 35
Зарегистрирован: 08 окт 2018, 12:43
Поблагодарили: 1 раз

Re: Простой алгоритм

Непрочитанное сообщение State » 29 июн 2020, 10:41

Большое спасибо!

П.С. Конечно он будет сливать на долгой дистанции. Вопрос во времени работы, количестве лотов и тд и тп. В конце концов надо за ним тоже следить. Да и дополнительное условие надо будет делать. Работать и работать. Но начало есть) Я просто не могу сообразить много чего в алгоритме, т.е. как написать.

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

Re: Простой алгоритм

Непрочитанное сообщение evge » 29 июн 2020, 10:46

Первый вариант кода не сработает вторая команда CloseLongLimit();

Поэтмоу

Правильнее так:

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

function Initialize()
{
   StrategyName = "SimpleRobot";
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{

   if (CurrentPosition() == 0)
   {
   EnterLongLimit(GetBid());
   }
   
   if (CurrentPosition() > 0)
   {
   CloseLongLimit(GetAsk());
   }
   

}


т.к. две команды за один Update не примет и позиция останется открытой без заявки на закрытие.

во втором варианте кода позиция будет открыта на одной свече.

а на следующей если проверка будет пройдена и позиция уже открыта то выставится CloseLongLimit.
никогда такого не было и вот опять

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

Re: Простой алгоритм

Непрочитанное сообщение evge » 29 июн 2020, 10:51

нужно учитывать один момент в коде выше. CloseLongLimit установит ордер на цену Ask при появлении нового бара, а это не обязательно цена Ask, которая была больше чем Bid при открытии позиции.

Поэтому усложним задачу и запомним цену Ask в момент открытия, чтобы по данной цене устанавливать CloseLongLimit на следующем баре после открытия позиции, при условии что позиция уже открыта, т.е. CurrentPosition() > 0.

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

/**

**/

function Initialize()
{
   StrategyName = "SimpleRobot";
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
   AddGlobalVariable("Ask", Types.Double, 0);
}

function OnUpdate()
{

   if (CurrentPosition() == 0)
   {
   EnterLongLimit(GetBid());
   Ask = GetAsk();
   }
   
   if (CurrentPosition() > 0)
   {
   CloseLongLimit(Ask);
   }
   
}


чем меньше будет таймфрейм, тем точнее будет срабатывание Ask.
никогда такого не было и вот опять

State
Сообщения: 35
Зарегистрирован: 08 окт 2018, 12:43
Поблагодарили: 1 раз

Re: Простой алгоритм

Непрочитанное сообщение State » 29 июн 2020, 12:37

На сколько понимаю, на одном баре открыть последовательно обе позиции не получится? Если да, то это несколько меняет частоту работы робота....ну ладно, подумаю.
В любом случае спасибо.

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

Re: Простой алгоритм

Непрочитанное сообщение evge » 29 июн 2020, 12:51

на одном баре не исполнятся EnterLongLimit() и CloseLongLimit()

Нужно дождаться выполнения EnterLongLimit() и затем уже отправлять ордер на закрытие позиции
никогда такого не было и вот опять

State
Сообщения: 35
Зарегистрирован: 08 окт 2018, 12:43
Поблагодарили: 1 раз

Re: Простой алгоритм

Непрочитанное сообщение State » 29 июн 2020, 12:58

Возникла идея добавить к данной стратегии индикатор EMA (можно и просто МА), в качестве индикатора тренда. Соответсвенно запускать робота только в случае растущего тренда. При смене тренда закрывать позицию (если открыта) по текущей цене.


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

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

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