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

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

Стратегия Invest_Grid

Непрочитанное сообщение Simonov » 25 сен 2017, 10:05

Добрый день! В нашем терминале появилась новая стратегия Invest_Grid. Как по мне, очень интересная идея для запуска робота на ней, за что отдельная благодарность разработчикам Альфа-Директ, но в стоковом варианте она заточена под работу в Лонг. Сама стратегия имеет лишь открытый код и допилить её в конструкторе не представляется возможным. Поковырялся в коде, но так и не смог перестроить стратегию для работы в Шорт. Помогите, пожалуйста, перестроить данный алгоритм!

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

/**Стратегия торговли по сетке содержит три простых правила:
Правило 1. При первом запуске покупаем стартовый объем (StartQ штук) и запоминаем уровень  «покупки».
Правило 2. При снижении цены ниже минимальной покупки на DeltaPrice покупаем еще Q штук, если не набрали допустимую позицию. Добавляем уровень покупки в список.
Правило 3. При росте цены выше минимальной покупки на PL продаем Q штук, если еще не продали все. Удаляем данный уровень покупки из списка.
Примечание: На вкладке отчета "переменные" можно посмотреть список уровней покупки.
Уровни прописываются на следующем баре. Для первой покупки сформируются несколько уровеней смещенных на DeltaPrice вверх.

Developed by Alfadirect;
Algorithm = ИНВЕСТИЦИИ;**/

function Initialize()
{
   StrategyName = "Invest_Grid";
   AddInput("Input1", Inputs.Candle, 5, true, "GAZP=МБ ЦК");

   AddParameter("StartQ", 100, "Стартовое Кол-во", 1);
   AddParameter("Q", 10, "Кол-во докупки");
   AddParameter("DeltaPrice", 1, "Изм. цены для докупки");
   AddParameter("PL", 1, "Изм. цены для фиксации прибыли ");
         
   AddGlobalVariable("xPrice", Types.Double, 10000000000.0);
   AddGlobalVariable("xPosition", Types.Double, 0.0);
   AddGlobalVariable("LastPrice", Types.DoubleList);
   AddGlobalVariable("Last", Types.Double, 0);
   AddGlobalVariable("Order", Types.Boolean, false);

}

function OnUpdate()
{

double pos = CurrentPosition();
// Правило 1. если первый запуск, покупаем  StartQ
   if ( xPrice == 10000000000.0 )
   {
       if ( Q < LotSize() || StartQ < LotSize() )
       {
          ShowMessage("StartQ или Q меньше лота. Робот остановлен !");
          Stop();
       }
       // Покупка StartQ        
      EnterLong(StartQ);
      Order = true;
       xPrice = Input1.Close[0];
    }
   
// Модуль проверки изменение позиции
   // если позиция выросла, добавляем уровень в список
   if ( pos > xPosition )   
   {     
        double a = xPrice;
        double b = xPosition;
              
         while (pos - b > 0)
         {
            LastPrice.Add(a);
                a = a + DeltaPrice;
                b = b + Q;
          }           
        Last = xPrice;
        xPosition = pos;             
        Order = false;
        LastPrice.Sort();
   }
   // если позиция снизилась, убираем уровень из списка
   else if ( pos < xPosition && LastPrice.Count >= 1 )
   {
       LastPrice.Sort();
      LastPrice.RemoveAt(0);
      Last = xPrice;
      xPosition = pos;             
      Order = false;
   }    

   double MinPrice = 0;
   if ( LastPrice.Count <= 0 )
       MinPrice = Last;
    else
       MinPrice = LastPrice.Min();
                       
//Правило 2. Если цена упала и кол-во меньше допустимого,
//           то покупаем и добавляем цену покупки в начало списка
   if ( Input1.Close[0] < MinPrice - DeltaPrice && pos + Q <= LongLimit && Order == false)
   {
      EnterLong(Q);
        xPrice =  Input1.Close[0];
        Order = true;
     }
//Правило 3. Если цена выше цены из начала списка, то продаем и удаляем 0-й элемент списка
   if ( Input1.Close[0] >= MinPrice + PL && pos > 0 && Order == false )
    {
       CloseLong(Q);
         xPrice =  Input1.Close[0];
         Order = true;
     }
}

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

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

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

Набросал код. Надеюсь без ошибок. Пробуйте.

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

/**
Algorithm = ИНВЕСТИЦИИ ПЕССИМИСТА;**/

function Initialize()
{
   StrategyName = "Invest_Grid_Short";
   AddInput("Input1", Inputs.Candle, 5, true, "GAZP=МБ ЦК");

   AddParameter("StartQ", 100, "Стартовое Кол-во", 1);
   AddParameter("Q", 10, "Кол-во докупки");
   AddParameter("DeltaPrice", 1, "Изм. цены для докупки");
   AddParameter("PL", 1, "Изм. цены для фиксации прибыли ");
         
   AddGlobalVariable("xPrice", Types.Double, 10000000000.0);
   AddGlobalVariable("xPosition", Types.Double, 0.0);
   AddGlobalVariable("LastPrice", Types.DoubleList);
   AddGlobalVariable("Last", Types.Double, 0);
   AddGlobalVariable("Order", Types.Boolean, false);

}

function OnUpdate()
{

double pos = CurrentPosition();
// Правило 1. если первый запуск, продаем StartQ
   if ( xPrice == 10000000000.0 )
   {
       if ( Q < LotSize() || StartQ < LotSize() )
       {
          ShowMessage("StartQ или Q меньше лота. Робот остановлен !");
          Stop();
       }
       // Покупка StartQ       
      EnterShort(StartQ);
      Order = true;
      xPrice = Input1.Close[0];
    }
   
// Модуль проверки изменение позиции
   // если позиция выросла (для short это уменьшился pos), добавляем уровень в список
   if ( pos < xPosition )   
   {     
        double a = xPrice;
        double b = xPosition;
               
         while (pos - b < 0)
         {
            LastPrice.Add(a);
                a = a - DeltaPrice;
                b = b - Q;
          }           
        Last = xPrice;
        xPosition = pos;             
        Order = false;
        LastPrice.Sort();
        LastPrice.Reverse();
   }
   // если позиция снизилась (увеличился pos), убираем уровень из списка
   else if ( pos > xPosition && LastPrice.Count >= 1 )
   {
      LastPrice.Sort();
      LastPrice.Reverse();
      LastPrice.RemoveAt(0);
      Last = xPrice;
      xPosition = pos;             
      Order = false;
   }   

   double MaxPrice = 0;
   if ( LastPrice.Count == 0 )
       MaxPrice = Last;
    else
       MaxPrice = LastPrice.Max();
                       
//Правило 2. Если цена выросла и кол-во меньше допустимого,
//           то продаем и добавляем цену продажи в начало списка
   if ( Input1.Close[0] > MaxPrice + DeltaPrice && pos - Q > ShortLimit && Order == false)
   {
      EnterShort(Q);
      xPrice =  Input1.Close[0];
      Order = true;
     }
//Правило 3. Если цена ниже цены из начала списка, то продаем и удаляем 0-й элемент списка
   if ( Input1.Close[0] <= MaxPrice - PL && pos < 0 && Order == false )
    {
       CloseShort(Q);
       xPrice =  Input1.Close[0];
       Order = true;
     }
}
никогда такого не было и вот опять

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

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

Непрочитанное сообщение Simonov » 25 сен 2017, 11:59

evge писал(а):Набросал код. Надеюсь без ошибок. Пробуйте.


Да, работает! Вы как всегда на высоте, Евгений!

Чувствую, что слишком часто начал просить о помощи, но кроме Вас и обратиться особо не к кому. Есть ещё такой момент, который хотелось бы улучшить в данной стратегии. Рассмотрим пример на стоковом варианте, работающем в Лонг. Так вот, после покупки определённого количества лотов и движении цены вверх, робот начинает распродавать позицию по одному лоту, фиксируя прибыль на размер PL при каждом следующем росте цены. В конце концов мы полностью выходим из позиции и всё. А мне бы хотелось, чтобы робот снова входил в позицию с теми же самыми параметрами, сразу после распродажи последнего лота. Т.е., робот требуется пустить по кругу (двусмысленно как-то написал :) ), перезапустить в точке полной распродажи имевшейся позиции, немедленно. Как-то так.
Последний раз редактировалось Simonov 26 сен 2017, 22:11, всего редактировалось 3 раза.

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

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

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

Попробуйте так

после вот этого куска кода

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

      // если позиция снизилась, убираем уровень из списка
   else if ( pos < xPosition && LastPrice.Count >= 1 )
   {
       LastPrice.Sort();
      LastPrice.RemoveAt(0);
      Last = xPrice;
      xPosition = pos;             
      Order = false;
   }


добавить вот это

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

      if (pos == 0 && Input1.Close[0] > Last + DeltaPrice) Last = Input1.Close[0];


для Short стратегии там же, но чуть иначе условие

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

      if (pos == 0 && Input1.Close[0] < Last - DeltaPrice) Last = Input1.Close[0];


учите, что это равноценно повторному запуску, т.е. как только распродано до 0 позиция открывается новая позиция с лотом = StartQ
никогда такого не было и вот опять

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

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

Непрочитанное сообщение nikkrav » 25 сен 2017, 15:03

Спасибо! Simonov и evge. Прям сняли с языка тему.
Еще хотелось бы модернизировать стратегию таким образом:
Добавить стартовый уровень или индюк который будет запускать сетку.
и глобальный стоплосс не помешал бы.

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

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

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

1. Стартовый уровень можно задать конечно, убрав стартовую позицию StartQ. Это возможно и не сложно сделать.

2. Так нужно описать этот стоп-лосс.
Оно работает, т.к. "пересиживает" просадку.
Если появится стоп-лосс, то эффективность упадет в разы :)
никогда такого не было и вот опять

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

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

Непрочитанное сообщение nikkrav » 25 сен 2017, 15:29

Так Сбербанк ждут и 220 и 160 Такое тяжело пересиживать, особенно шорт. :D

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

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

Непрочитанное сообщение Simonov » 26 сен 2017, 22:46

evge писал(а):Попробуйте так
...
добавить вот это
...
учите, что это равноценно повторному запуску, т.е. как только распродано до 0 позиция открывается новая позиция с лотом = StartQ


Я Вас приветствую, Евгений Алексеевич! Докладываю. Не совсем понял логику Вашего варианта реализации моей задумки, поэтому решил поковыряться сам и сделал следующее. Я добавил в конце алгоритма новое (четвёртое по счёту) правило. Вот правило, которое я добавил. Вроде работает как надо.

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

if ( (CurrentPosition() == 0) )
     {
       // Покупка StartQ        
      EnterLong(StartQ);
      Order = true;
      xPrice = Input1.Close[0];
     }


Теперь вот ещё что. Появилась одна интересная задумка и я начал размышлять над её реализацией. Но не хватает знаний в программировании, чтобы воплотить в жизнь. Суть в следующем. Хотелось бы создать робота, который по сигналу индикатора (любого, например пересечении двух SMA) открывает позицию в Лонг, используя стратегию Invest_Grid, и работает по ней до момента поступления разворотного сигнала от того же самого индикатора. После получения сигнала на разворот, робот должен закрыть все открытые ранее позиции и запустить "шортовый" вариант стратегии Invest_Grid (тот, что Вы помогли допилить мне в самом начале темы). И так по кругу. Вот. Такое можно реализовать? Поможете?

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

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

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

Simonov писал(а):Такое можно реализовать? Поможете?


Возможно. Такое делал во время тестов. Но что-то не увидел в этом пользы и результат сомнительный был.
Попозже выложу код.
никогда такого не было и вот опять

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

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

Непрочитанное сообщение Владимир Валерьевич » 27 сен 2017, 12:01

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

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


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

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

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