Страница 3 из 5

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

Добавлено: 22 ноя 2020, 08:18
evge
Приветствую

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 КБ) 29421 просмотр


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

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

Добавлено: 14 дек 2020, 21:41
ip851874
Спасибо! А значение PL не в процентах получается задано?

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

Добавлено: 15 дек 2020, 00:59
evge
Да, здесь не в процентах

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

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

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

Добавлено: 15 дек 2020, 22:49
evge
Приветствую.

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

Поэтому:

Ниже пример с учетом первого старта с скорректированной позицией робота и докупкой до 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;
     }
}

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

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

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

Добавлено: 16 дек 2020, 06:49
evge
//Правило 3. Если цена выше цены из начала списка, то продаем и удаляем 0-й элемент списка

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

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

Input1.Close[0] >= MinPrice + PL


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

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

Добавлено: 27 янв 2021, 19:32
ip851874
:D

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

Добавлено: 30 янв 2021, 23:17
ip851874
Разобрался, спасибо!

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

Добавлено: 29 мар 2021, 23:46
Bardachek
Интересно
я вот пытаюсь тестировать эту стратегию и у меня он выдает 0 операций. те ничего нет ...Изображение