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

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

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


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


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

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

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