Стратегии и роботы > Стратегия Invest_Grid

Обсуждение, описание стратегий и роботов, идеи для стратегий
Аватара пользователя
Simonov
Сообщения: 89
Зарегистрирован: 20 сен 2017, 11:36
Благодарил (а): 83 раза
Поблагодарили: 20 раз

Re: Стратегия Invest_Grid

Непрочитанное сообщение Simonov » 27 сен 2017, 13:06

Владимир Валерьевич писал(а):Доброго времени суток!
Simonov писал(а): по сигналу индикатора (любого, например пересечении двух SMA) открывает позицию в Лонг, используя стратегию Invest_Grid,

Я бы сюда Индекс торгового канала прикрутил:
если ниже -100 -> начинаем покупать при закрытиии< предыдущего
Если пересекаем -100 вверх -> начинаем продавать на закрытии > предыдущего


Добрый день! Да, интересный вариант. Главное шаблон взаимодействия индикаторов и стратегии сейчас изготовить, а потом туда можно что угодно подсовывать для получения сигналов. ;)

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

Re: Стратегия Invest_Grid

Непрочитанное сообщение evge » 28 сен 2017, 10:24

Эксперименты привели к тому что стратегию Invest_Grid работающую как в лонг так и в шорт с горяча удалил :), заменив код её с нуля написанным простым алгоритмом, который и выкладываю.

Тут всё просто и понятно. Работает как в лонг так и в шорт, для примера взяты 2 SMA быстрая и медленная.
Всё как обычно, в лонг заходим и набираем позицию на откатах указанных в параметре D
Закрывать позицию и переворачиваться начинает когда MA пересекутся в другую сторону, сначала на откатах будет закрываться ранее открытая позиция, затем начнет набирать позицию в другую сторону.

iGrid1-01.png
iGrid1-01.png (31.15 КБ) 5489 просмотров

iGrid1-02.png
iGrid1-02.png (35.19 КБ) 5489 просмотров


В итоге простой и понятный код:

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

/**Developed by evge;**/

function Initialize()
{
   StrategyName = "iGrid1";
   AddInput("I", Inputs.Candle, 5, true, "SBER=МБ ЦК");

   AddParameter("Lot", 100, "Кол-во докупки");
   AddParameter("D", 0.3, "Изм. цены для докупки");
   AddParameter("f", 20, "fast", 1);
   AddParameter("s", 180, "slow", 1);
 
   LongLimit = 5000;
   ShortLimit = -5000;
                 
   AddGlobalVariable("Last", Types.Double, 0.0);
   
   AddGlobalVariable("isLong", Types.Boolean, false);
}

function OnUpdate()
{

var IC = I.Close;
var CP = CurrentPosition();

// + Опередляем общее направление торговли
var S1 = SMA(I.Close, f);
var S2 = SMA(I.Close, s);

if (S1[0] > S2[0])
isLong = true;
else
isLong = false;
// -

if (Last == 0) Last = IC;

if (isLong && IC < Last - D)
{
   if (CP >= 0)
      EnterLong(Lot);
   else
      CloseShort(Lot);
}
else if (!isLong && IC > Last + D)
{
   if (CP <= 0)
      EnterShort(Lot);
   else
      CloseLong(Lot);
}

if (IC > Last + D) Last = IC;
if (IC < Last - D) Last = IC;

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

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

Re: Стратегия Invest_Grid

Непрочитанное сообщение evge » 28 сен 2017, 10:26

Нужно тестировать \ оптимизировать и пробовать, MA в коде даны для примера, можно заменить другими индикаторами или условиями определяющими направление торговли. Остальной код будет набирать и закрывать позицию по лоту и переворачиваться по необходимости :)
никогда такого не было и вот опять

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

Re: Стратегия Invest_Grid

Непрочитанное сообщение evge » 28 сен 2017, 10:39

На длительном периоде ничего хорошего на этих параметрах по SBER, тут повторюсь, как пример, последний период работает на пересечении двух MA, завтра может перестать (что скорее всего и будет) :)

Теперь осталась очень простая задача :) подставить в начале кода правильное определение тренда для переменной isLong :)

isLong = true - если были в SHORT постепенно закрываем позицию и набираем LONG
isLong = false - если были в LONG постепенно закрываем позицию и набираем SHORT
никогда такого не было и вот опять

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

Re: Стратегия Invest_Grid

Непрочитанное сообщение evge » 28 сен 2017, 10:47

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

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

   if (CP >= 0)


меняем на

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

   if (CP >= 0 || true)


и

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

   if (CP <= 0)


меняем на

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

   if (CP <= 0 || true)


ну или красивее перенести этот true в числовой параметр и проверять здесь же в условиях например на != 0
никогда такого не было и вот опять

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

Re: Стратегия Invest_Grid

Непрочитанное сообщение evge » 28 сен 2017, 11:04

если надо чтобы позиция частично закрывалась по тренду, то немного поменять в конце кода условия.
Закрываться будет при изменении цены на D от Last.

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

/**Developed by evge;**/

function Initialize()
{
   StrategyName = "iGrid1";
   AddInput("I", Inputs.Candle, 5, true, "SBER=МБ ЦК");

   AddParameter("Lot", 100, "Кол-во докупки");
   AddParameter("D", 0.3, "Изм. цены для докупки");
   AddParameter("f", 20, "MA fast", 1);
   AddParameter("s", 180, "MA slow", 1);

   LongLimit = 5000;
   ShortLimit = -5000;
                 
   AddGlobalVariable("Last", Types.Double, 0.0);
   
   AddGlobalVariable("isLong", Types.Boolean, false);
}

function OnUpdate()
{

var IC = I.Close;
var CP = CurrentPosition();

// + Опередляем общее направление торговли
var S1 = SMA(I.Close, f);
var S2 = SMA(I.Close, s);

if (S1[0] > S2[0])
isLong = true;
else
isLong = false;
// -

if (Last == 0) Last = IC;

if (isLong && IC < Last - D)
{
   if (CP >= 0)
      EnterLong(Lot);
   else
      CloseShort(Lot);
}
else if (!isLong && IC > Last + D)
{
   if (CP <= 0)
      EnterShort(Lot);
   else
      CloseLong(Lot);
}

if (IC > Last + D)
{
   if (CP > 0) CloseLong(Lot);
   Last = IC;
}
if (IC < Last - D)
{
   if (CP < 0) CloseShort(Lot);
   Last = IC;
}

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

Аватара пользователя
Simonov
Сообщения: 89
Зарегистрирован: 20 сен 2017, 11:36
Благодарил (а): 83 раза
Поблагодарили: 20 раз

Re: Стратегия Invest_Grid

Непрочитанное сообщение Simonov » 28 сен 2017, 15:44

Евгений! Огромное спасибо за старания! Буду потихоньку разбираться с представленными примерами и допиливать, ибо для хороших результатов надо учитывать массу нюансов. Пока тяжеловато даётся всё. Прям лес густой покрытый мраком. 8-)

Аватара пользователя
Simonov
Сообщения: 89
Зарегистрирован: 20 сен 2017, 11:36
Благодарил (а): 83 раза
Поблагодарили: 20 раз

Re: Стратегия Invest_Grid

Непрочитанное сообщение Simonov » 13 окт 2017, 10:04

Блин, напутал условия в описании новой "хотелки". Прошу прощения. Пока удаляю текст.


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

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

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