Страница 1 из 2

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

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

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

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

Добавлено: 28 июн 2020, 18:03
nikkrav
Было что-то такое в первых вебинарах по роботам.

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

Добавлено: 28 июн 2020, 20:16
Den
Грааля на будет, однозначно будет сливать.

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

Добавлено: 29 июн 2020, 10:03
evge
Добрый день!

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

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

function OnUpdate()
{

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

}

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

Добавлено: 29 июн 2020, 10:41
State
Большое спасибо!

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

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

Добавлено: 29 июн 2020, 10:46
evge
Первый вариант кода не сработает вторая команда 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.

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

Добавлено: 29 июн 2020, 10:51
evge
нужно учитывать один момент в коде выше. 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.

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

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

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

Добавлено: 29 июн 2020, 12:51
evge
на одном баре не исполнятся EnterLongLimit() и CloseLongLimit()

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

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

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