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

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

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

Непрочитанное сообщение evge » 22 ноя 2020, 08:18

Приветствую

ip851874 писал(а):Подскажите пожалуйста как добавить параметр Q для Delta price и для PL свой?


например так:

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

/**Стратегия торговли по сетке содержит три простых правила:
Правило 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("QC", 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 + QC;
          }           
        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(Math.Min(QC, pos));
         xPrice =  Input1.Close[0];
         Order = true;
     }
}


Нужно учитывать, что если кол-во продажи (QC) меньше чем докупки (Q), тогда уровни для продажи могут пересекаться с уровнями продаж предыдущих докупок.
Уже не будет "равномерности" расстановки уровней, т.к. добавляться будут несколько (ранее один) новых уровней после докупки при падении цены. После падения и нескольких докупок и дальнейшего роста, продажи будут проходить на одних уровнях подряд по барам.

пример, где Q = 50, QC = 10, максимальная позиция Long 1000

InvestGrid-QC-01.png
InvestGrid-QC-01.png (32.84 КБ) 1194 просмотра


т.е. каждый раз когда мы докупили при падении 50 шт, мы нарисовали от цены докупки 5 уровней вверх с расстоянием DeltaPrice для продаж по 10 шт.
никогда такого не было и вот опять

ip851874
Сообщения: 3
Зарегистрирован: 21 ноя 2020, 22:56

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

Непрочитанное сообщение ip851874 » 14 дек 2020, 21:41

Спасибо! А значение PL не в процентах получается задано?

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

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

Непрочитанное сообщение evge » 15 дек 2020, 00:59

Да, здесь не в процентах
никогда такого не было и вот опять

E_V_N
Сообщения: 16
Зарегистрирован: 18 сен 2020, 23:35
Поблагодарили: 1 раз

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

Непрочитанное сообщение E_V_N » 15 дек 2020, 20:21

Евгений, Здравствуйте.
А можно тут как то добавить, запуск с начальной позицией по роботу и учетной ценой этой позиции. Если начальная позиция меньше StartQ, происходит докупка до StartQ. Что бы можно было внутри работы робота изменять его позицию (увеличивать), и робот добавляет уровни от учетной цены добавления позиции.
Заранее благодарен.

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

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

Непрочитанное сообщение evge » 15 дек 2020, 22:49

Приветствую.

Непонятно с учетной и что нужно сделать, т.к. уровни формируются от текущей цены. Учетная цена может быть гораздо выше или ниже текущей цены. Если начать рисовать уровни от такой учетной цены, то будет при старте активная распродажа или одна докупка затем при росте продажа и сразу опять докупка, т.к. цена будет ниже или выше минимального сформированного уровня.

Поэтому:

Ниже пример с учетом первого старта с скорректированной позицией робота и докупкой до StartQ.
Но уровни создаются от текущей цены с момента докупки.

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

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

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

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

   AddParameter("StartQ", 100, "Стартовое Кол-во", 1);
   AddParameter("Q", 10, "Кол-во докупки");
   AddParameter("QC", 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);
   AddGlobalVariable("Wait", Types.Boolean, true);
}

function OnUpdate()
{

double pos = CurrentPosition();

// Ожидаем 1 бар если первый старт, а позиция не нулевая, т.е. задана перед стартом у робота.
// На следующем баре будет произведена докупка до StartQ, если позиция меньше StartQ
if ( xPrice == 10000000000.0 && pos != 0 && Wait)
{
Wait = false;
return;
}

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

E_V_N
Сообщения: 16
Зарегистрирован: 18 сен 2020, 23:35
Поблагодарили: 1 раз

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

Непрочитанное сообщение E_V_N » 15 дек 2020, 23:25

При изменении позиции Робота в начале работы или в процессе работы Робота, в форме, задается 2 параметра, объем и учетная цена.
Учетную цену в форме мы можем задать произвольную, и Робот должен построить уровни от этой цены вверх на Дельту.
Идея в следующем, иметь возможность распродать имеющуюся позицию при помощи данного робота.
Если будут докупки вниз ничего страшного, так как это решается какую учетную цену вы поставите относительно текущей.

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

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

Непрочитанное сообщение evge » 16 дек 2020, 06:49

//Правило 3. Если цена выше цены из начала списка, то продаем и удаляем 0-й элемент списка

если уровни построены будут ниже чем текущая цена, то они (многие или все) будут сразу подпадать под это правило и на каждом баре после старта будет происходить продажа и удаление минимального уровня, пока не перестанет выполняться условие:

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

Input1.Close[0] >= MinPrice + PL


т.е. если текущая цена больше или равна минимальному уровню + шаг изменения цены для фиксации прибыли
никогда такого не было и вот опять


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

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

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