Стратегии и роботы > Усреднение!
- 
				Orange2000
- Сообщения: 47
- Зарегистрирован: 13 мар 2019, 00:45
- Благодарил (а): 37 раз
- Поблагодарили: 1 раз
Усреднение!
Добрый день!  Подскажите, есть ли возможность реализовать следующую стратегию.
Берем Си фьючерс. и среднюю цену (примерно) это 66000.
Так вот, если цена ушла на 500 пп вверх продаем 1 лот. Если пошла еще выше на 500 пп (до 67000) , то продаем еще один лот. При движении вниз лоты закрываются так же с интервалом в 500пп. Т.е. первый откупится по 66000 , второй по 66500.
Для лонгов (когда цена ушла ниже 66000) такие же условия.
Спасибо!
			
									
						Берем Си фьючерс. и среднюю цену (примерно) это 66000.
Так вот, если цена ушла на 500 пп вверх продаем 1 лот. Если пошла еще выше на 500 пп (до 67000) , то продаем еще один лот. При движении вниз лоты закрываются так же с интервалом в 500пп. Т.е. первый откупится по 66000 , второй по 66500.
Для лонгов (когда цена ушла ниже 66000) такие же условия.
Спасибо!
- evge
- Администратор
- Сообщения: 1817
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 375 раз
- Контактная информация:
- 
				Orange2000
- Сообщения: 47
- Зарегистрирован: 13 мар 2019, 00:45
- Благодарил (а): 37 раз
- Поблагодарили: 1 раз
Re: Усреднение!
Благодарю)
А еще поздно ночью уже нашел в док папке описание готовой стратегии step by step. Вроде как раз то что нужно) Правда еще не смотрел.
- evge
- Администратор
- Сообщения: 1817
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 375 раз
- Контактная информация:
Re: Усреднение!
В списке она отсутствовала, по вашему запросу похоже в АД4 поправили.
Теперь она есть в группе "Инвестиции". Добавлена \ обновлена сегодня.
			
									
						Теперь она есть в группе "Инвестиции". Добавлена \ обновлена сегодня.
Код: Выделить всё
/**
Инвестиционная стратегия торговли по уровням содержит три простых правила:
Правило 1. При первом запуске покупаем стартовый объем (StartQ штук) и запоминаем уровень  «покупки».
Правило 2. При снижении цены ниже минимальной покупки на DeltaPercent % покупаем еще Q штук, если не набрали допустимую позицию. Добавляем уровень покупки в список.
Правило 3. При росте цены выше минимальной покупки на DeltaPercent % продаем Q штук, если еще не продали все. Удаляем данный уровень покупки из списка.
Примечание: На вкладке отчета "переменные" можно посмотреть список уровней покупки. 
Уровни прописываются на следующем баре. Для первой покупки сформируются несколько уровеней смещенных на DeltaPercent вверх.
Developed by Alfadirect;
Algorithm = ИНВЕСТИЦИИ;**/
function Initialize()
{
   StrategyName = "StepByStep";
   AddInput("Input1", Inputs.Candle, 5, true, "GAZP=МБ ЦК");
   AddParameter("StartQ", 100, "Стартовое кол-во", 0);
   AddParameter("Q", 10, "Кол-во докупки", 0);
   AddParameter("DeltaPercent", 1, "% изменения цены для докупки и продажи", 0);
            
   AddGlobalVariable("xPrice", Types.Double, 10000000000.0);
   AddGlobalVariable("xPosition", Types.Double, 0.0);
   AddGlobalVariable("LastPrice", Types.DoubleList);
   AddGlobalVariable("Last", Types.Double, 0);
   AddGlobalVariable("MinPrice", Types.Double, 0);
   AddGlobalVariable("Type", Types.Double, 1);
   
   AddChartIndicator("MY.str_Invest_Grid", new Dictionary <string, string>{{"Price", "MinPrice"},{"PL", "DeltaPercent"},{"Delta", "DeltaPercent"}, {"Type", "Type"}});
}
function OnUpdate()
{
double pos = CurrentPosition();
// Правило 1. если первый запуск, покупаем  StartQ
   if ( xPrice == 10000000000.0 )
   {
       if ( (Q%LotSize() != 0) || (StartQ%LotSize() != 0) )
       {
          ShowMessage("StartQ или Q не кратно лоту. Робот остановлен !");
          Stop();
       }
       // Покупка StartQ
       if (StartQ > 0)        
       {
         EnterLongLimit(Input1.Close[0]*(1.0 + 0.01*DeltaPercent), StartQ); 
       }
         xPrice = Input1.Close[0];
    }
   
// Модуль проверки изменение позиции
   // если позиция выросла, добавляем уровень в список
   if ( pos > xPosition )   
   {      
        double a = xPrice; 
        double b = xPosition; 
               
         while (pos - b > 0)
         {
            LastPrice.Add(a);
                a = a*(1.0 + 0.01*DeltaPercent); 
                b = b + Q; 
          }            
        Last = xPrice;
        xPosition = pos;             
        LastPrice.Sort();
   }
   // если позиция снизилась, убираем уровень из списка
   else if ( pos < xPosition && LastPrice.Count >= 1 )
   {
       LastPrice.Sort();
      LastPrice.RemoveAt(0);
      Last = xPrice;
      xPosition = pos;             
   }    
   if ( LastPrice.Count <= 0 )
       MinPrice = Last;
    else
       MinPrice = LastPrice.Min();
                        
//Правило 2. Если цена упала и кол-во меньше допустимого, 
//           то покупаем и добавляем цену покупки в начало списка
   if ( Input1.Close[0] < MinPrice*(1.0 - 0.01*DeltaPercent) && pos + Q <= LongLimit )
   {
      EnterLongLimit(Input1.Close[0]*(1.0 + 0.5*0.01*DeltaPercent), Q);
        xPrice =  Input1.Close[0];
     }
//Правило 3. Если цена выше цены из начала списка, то продаем и удаляем 0-й элемент списка 
   if ( Input1.Close[0] >= MinPrice*(1.0 + 0.01*DeltaPercent) && pos > 0 )
    {
       CloseLongLimit(Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercent), Q);
         xPrice =  Input1.Close[0];
     }
}никогда такого не было и вот опять
						- 
				Orange2000
- Сообщения: 47
- Зарегистрирован: 13 мар 2019, 00:45
- Благодарил (а): 37 раз
- Поблагодарили: 1 раз
Re: Усреднение!
Всем привет.
Step by Step и стратегия инвест-позитив примерно похожи. И там и там мы отталкиваемся от того что есть лонг и мы его распродаем при росте, покупая на проливах.
Просто stepbystep мне более понятна.
Есть ли возможность прикрутить возможность открывать шорт при продаже всего пакета, если цена пошла еще выше. И так же что бы фиксировался шорт ступеньками при возврате цены.
			
									
						Step by Step и стратегия инвест-позитив примерно похожи. И там и там мы отталкиваемся от того что есть лонг и мы его распродаем при росте, покупая на проливах.
Просто stepbystep мне более понятна.
Есть ли возможность прикрутить возможность открывать шорт при продаже всего пакета, если цена пошла еще выше. И так же что бы фиксировался шорт ступеньками при возврате цены.
- evge
- Администратор
- Сообщения: 1817
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 375 раз
- Контактная информация:
Re: Усреднение!
Приветствую, Orange2000!
Могу продемонстрировать вариант, когда распродано и стратегия переворачивается в другую сторну и начинает делать всё тоже самое, но в Short.
Как только в Short закроется полностью позиция, опять переворачивается в торговлю в Long. И так пока не сольётся депозит до победного!
Демонстрация на GAZP, M5, 15000 баров
Если интересно, пишите, добавлю код.
Может идея в другом и неправильно понял?
			
									
						Могу продемонстрировать вариант, когда распродано и стратегия переворачивается в другую сторну и начинает делать всё тоже самое, но в Short.
Как только в Short закроется полностью позиция, опять переворачивается в торговлю в Long. И так пока не сольётся депозит до победного!

Демонстрация на GAZP, M5, 15000 баров
Если интересно, пишите, добавлю код.
Может идея в другом и неправильно понял?
никогда такого не было и вот опять
						- 
				Orange2000
- Сообщения: 47
- Зарегистрирован: 13 мар 2019, 00:45
- Благодарил (а): 37 раз
- Поблагодарили: 1 раз
Re: Усреднение!
Приветствую Евгений! Спасибо!
По графику все как надо. Важно, что бы задавать ту самую дельту самому) Например 0.5% .
По отчету в общем настоящий грааль)))
			
									
						По графику все как надо. Важно, что бы задавать ту самую дельту самому) Например 0.5% .
По отчету в общем настоящий грааль)))
- evge
- Администратор
- Сообщения: 1817
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 375 раз
- Контактная информация:
Re: Усреднение!
Тогда вот код Грааля 
Код с параметрами по умолчанию как на графиках по GAZP выше, в тестировании не забывайте установить предельную позицию Long и Short больше стартовой (например, 5000 в обе стороны)
Этот код стартует всегда с Long.
Можно конечно доработать и сделать возможность старта в нужную сторону.
			
									
						
Код: Выделить всё
/**
**/
function Initialize()
{
   StrategyName = "UpAndDown";
   AddInput("Input1", Inputs.Candle, 5, true, "GAZP=МБ ЦК");
   AddParameter("StartQ", 3000, "Стартовое кол-во", 0);
   AddParameter("Q", 300, "Кол-во докупки", 0);
   AddParameter("DeltaPercent", 0.4, "% изменения цены для докупки и продажи", 0);
            
   AddGlobalVariable("xPrice", Types.Double, 10000000000.0);
   AddGlobalVariable("xPosition", Types.Double, 0.0);
   AddGlobalVariable("LastPrice", Types.DoubleList);
   AddGlobalVariable("Last", Types.Double, 0);
   AddGlobalVariable("MinPrice", Types.Double, 0);
   AddGlobalVariable("MaxPrice", Types.Double, 99999999);   
   AddGlobalVariable("Type", Types.Double, 1);
   
   AddGlobalVariable("N", Types.Int, 1); //направление "1" - Long, "-1" - Short
}
function OnUpdate()
{
// evge 13.04.2019 https://alfadirect4.ru
// модификация стратегии StepByStep от AlfaDirect
// Переворот стратегии Long/Short
if (xPosition !=0 && CurrentPosition() == 0) 
{
   N =- N; 
   xPrice = 10000000000.0;
   LastPrice.Clear();
   xPosition = 0;
   MaxPrice = Double.MaxValue;
   MinPrice = 0;
}
double pos = CurrentPosition();
// Правило 1. если первый запуск, покупаем  StartQ
   if ( xPrice == 10000000000.0 && N > 0)
   {
       if ( (Q%LotSize() != 0) || (StartQ%LotSize() != 0) )
       {
          ShowMessage("StartQ или Q не кратно лоту. Робот остановлен !");
          Stop();
       }
       // Покупка StartQ
       if (StartQ > 0)        
       {
         EnterLongLimit(Input1.Close[0]*(1.0 + 0.01*DeltaPercent), StartQ); 
       }
         xPrice = Input1.Close[0];
    }
// Правило 1.1 старт для Short, продаем StartQ
   if ( xPrice == 10000000000.0 && N < 0)
   {
       if ( (Q%LotSize() != 0) || (StartQ%LotSize() != 0) )
       {
          ShowMessage("StartQ или Q не кратно лоту. Робот остановлен !");
          Stop();
       }
       // Продажа StartQ
       if (StartQ > 0)        
       {
         EnterShortLimit(Input1.Close[0]*(1.0 - 0.01*DeltaPercent), StartQ); 
       }
         xPrice = Input1.Close[0];
    }
   
// Модуль проверки изменение позиции UP
   // если позиция выросла, добавляем уровень в список
   if (N > 0)
   {
      if ( pos > xPosition )   
      {      
           double a = xPrice; 
           double b = xPosition; 
                  
            while (pos - b > 0)
            {
               LastPrice.Add(a);
               a = a*(1.0 + 0.01*DeltaPercent); 
               b = b + Q; 
             }            
           Last = xPrice;
           xPosition = pos;             
           LastPrice.Sort();
      }
      // если позиция снизилась, убираем уровень из списка
      else if ( pos < xPosition && LastPrice.Count >= 1 )
      {
         LastPrice.Sort();
         LastPrice.RemoveAt(0);
         Last = xPrice;
         xPosition = pos;             
      }    
   
      if ( LastPrice.Count <= 0 )
          MinPrice = Last;
       else
          MinPrice = LastPrice.Min();
   }
   
// Модуль проверки изменение позиции DOWN
   // если позиция снизилась, добавляем уровень в список
   if (N < 0)
   {
      if ( pos < xPosition )   
      {      
           double a = xPrice; 
           double b = xPosition; 
                  
            while (pos - b < 0)
            {
               LastPrice.Add(a);
               a = a*(1.0 - 0.01*DeltaPercent); 
               b = b - Q; 
             }            
           Last = xPrice;
           xPosition = pos;             
           LastPrice.Sort();
           LastPrice.Reverse();
      }
      // если позиция выросла, убираем уровень из списка
      else if ( pos > xPosition && LastPrice.Count >= 1 )
      {
         LastPrice.Sort();
         LastPrice.Reverse();
         LastPrice.RemoveAt(0);
         Last = xPrice;
         xPosition = pos;             
      }    
   
      if ( LastPrice.Count <= 0 )
          MaxPrice = Last;
       else
          MaxPrice = LastPrice.Max();
   }
   
                        
//Правило 2. Если цена упала и кол-во меньше допустимого, 
//           то покупаем и добавляем цену покупки в начало списка
   if ( N > 0 && Input1.Close[0] < MinPrice*(1.0 - 0.01*DeltaPercent) && pos + Q <= LongLimit )
   {
      EnterLongLimit(Input1.Close[0]*(1.0 + 0.5*0.01*DeltaPercent), Q);
        xPrice =  Input1.Close[0];
     }
//Правило 2.1. Если цена выросла и кол-во больше допустимого, 
//           то продаем и добавляем цену продажи в начало списка
   if ( N < 0 && Input1.Close[0] > MaxPrice*(1.0 + 0.01*DeltaPercent) && pos - Q >= ShortLimit )
   {
      EnterShortLimit(Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercent), Q);
        xPrice =  Input1.Close[0];
     }     
//Правило 3. Если цена выше цены из начала списка, то продаем и удаляем 0-й элемент списка 
   if ( N > 0 && Input1.Close[0] >= MinPrice*(1.0 + 0.01*DeltaPercent) && pos > 0 )
    {
       CloseLongLimit(Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercent), Q);
         xPrice =  Input1.Close[0];
     }
//Правило 3.1. Если цена ниже цены из начала списка, то покупаем и удаляем 0-й элемент списка 
   if ( N < 0 && Input1.Close[0] <= MaxPrice*(1.0 - 0.01*DeltaPercent) && pos < 0 )
    {
       CloseShortLimit(Input1.Close[0]*(1.0 + 0.5*0.01*DeltaPercent), Q);
         xPrice =  Input1.Close[0];
     }
}
Код с параметрами по умолчанию как на графиках по GAZP выше, в тестировании не забывайте установить предельную позицию Long и Short больше стартовой (например, 5000 в обе стороны)
Этот код стартует всегда с Long.
Можно конечно доработать и сделать возможность старта в нужную сторону.
никогда такого не было и вот опять
						- 
				Orange2000
- Сообщения: 47
- Зарегистрирован: 13 мар 2019, 00:45
- Благодарил (а): 37 раз
- Поблагодарили: 1 раз
Re: Усреднение!
Евгений, а в чем подвох? Граалей ведь не бывает)))
С Лонга нормально. можно же задать минимум возможный.
			
									
						С Лонга нормально. можно же задать минимум возможный.
- evge
- Администратор
- Сообщения: 1817
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 375 раз
- Контактная информация:
Re: Усреднение!
Подвох, что с GAZP и теми параметрами повезло, а в другой раз может не повезти 
ещё варианты:
- Удачный старт в Long
- Историю побольше протестировать и может не всё так хорошо
			
									
						
ещё варианты:
- Удачный старт в Long
- Историю побольше протестировать и может не всё так хорошо

никогда такого не было и вот опять
						Вернуться в «Стратегии и роботы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 25 гостей
