Стратегии и роботы > Усреднение!

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

Re: Усреднение!

Непрочитанное сообщение evge » 07 авг 2020, 10:42

так и есть, при откатах он добирает, смотрите сигналы (колонку позиция).
Но так как сейчас появилась зависимость от MA, то чаще откаты превращаются не в добор позиции, а в переворот. Поэтому доборы позиции есть, но не так часто как это было ранее. Так как идет сейчас по MA чаще, то стало чаще закрывать открытую позицию частями.
никогда такого не было и вот опять

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

Re: Усреднение!

Непрочитанное сообщение evge » 07 авг 2020, 11:06

Konstantin писал(а):А ещё лучше объеденить оба варианта. Нужно ввести переменную DeltaPercent_Доливка. Она будет ориентировачно в два раза меньше нашей DeltaPercent_Частичное_закрытие, и доливать тем же объёмом "Q"
Например, для доливки текущей позиции шорт должны быть выполнены условия: тренд идёт вниз по индикатору, позиция меньше полной, и уровень последнего DeltaPercent_Частичное_зкрытие ниже на DeltaPercent_Доливка.


добавил параметр DeltaPercentAdd - влияющий только на процент отката для добора позиции

демонстрация работы

UoAndDoownMA-07.png
UoAndDoownMA-07.png (33.37 КБ) 1084 просмотра


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

function Initialize()
{
   StrategyName = "UpAndDownMA";
   AddInput("Input1", Inputs.Candle, 5, true, "GAZP=МБ ЦК");
   AddParameter("StartQ", 450, "Стартовое кол-во", 0);
   AddParameter("Q", 50, "Кол-во докупки", 0);
   AddParameter("DeltaPercent", 0.5, "% изменения цены для продажи", 0);
   AddParameter("DeltaPercentAdd", 0.2, "% изменения цены для докупки", 0);
   AddParameter("SMAper", 100, "MA Period", 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
   AddChartIndicator("SMA", new Dictionary <string, string>{{"Period", "SMAper"}});
}

function OnUpdate()
{

// evge 13.04.2019 https://alfadirect4.ru
// модификация стратегии StepByStep от AlfaDirect
// evge 06.08.2020 https://alfadirect4.ru
// работа по MA + DeltaPercent от sMA[0]
// разделены параметры для добора (DelataPercentAdd) и закрытия частями (DelataPercent) позиции
// весь алгоритм работает по DeltaPercent и только в части добора позиции на откат DeltaPercentAdd

var CP = CurrentPosition();

var sMA = SMA(Input1, SMAper);
var NN = sMA[0] > sMA[1] && Input1.Close[0] > sMA[0]*(1.0 + 0.01*DeltaPercent) ? 1 : sMA[0] < sMA[1] && Input1.Close[0] < sMA[0]*(1.0 + 0.01*DeltaPercent) ? - 1 : N;
if (N == 0) N = NN;

// Переворот при смене направления
if (N != NN && CP >= 0 && NN < 0) { ClosePosition(); xPosition = 1; N = NN; CP = 0; return; }
if (N != NN && CP <= 0 && NN > 0) { ClosePosition(); xPosition = -1; N = NN; CP = 0; return; }


if (xPosition !=0 && CP == 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*DeltaPercentAdd) && pos + Q <= LongLimit )
   {
      EnterLongLimit(Input1.Close[0]*(1.0 + 0.5*0.01*DeltaPercentAdd), Q);
        xPrice =  Input1.Close[0];
     }
//Правило 2.1. Если цена выросла и кол-во больше допустимого,
//           то продаем и добавляем цену продажи в начало списка
   if ( N < 0 && Input1.Close[0] > MaxPrice*(1.0 + 0.01*DeltaPercentAdd) && pos - Q >= ShortLimit )
   {
      EnterShortLimit(Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercentAdd), 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];
     }
}
никогда такого не было и вот опять

Konstantin
Сообщения: 17
Зарегистрирован: 11 окт 2017, 15:25
Благодарил (а): 5 раз

Re: Усреднение!

Непрочитанное сообщение Konstantin » 07 авг 2020, 11:41

evge писал(а):
Konstantin писал(а):А ещё лучше объеденить оба варианта. Нужно ввести переменную DeltaPercent_Доливка. Она будет ориентировачно в два раза меньше нашей DeltaPercent_Частичное_закрытие, и доливать тем же объёмом "Q"
Например, для доливки текущей позиции шорт должны быть выполнены условия: тренд идёт вниз по индикатору, позиция меньше полной, и уровень последнего DeltaPercent_Частичное_зкрытие ниже на DeltaPercent_Доливка.


добавил параметр DeltaPercentAdd - влияющий только на процент отката для добора позиции



Но тогда, при установке параметра DeltaPercentAdd равным DeltaPercent, отчёт должен быть похож на тот, что я прикреплял выше.
А получилось вот что:
Вложения
Отчёт-2.png
Отчёт-2.png (34.83 КБ) 1079 просмотров

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

Re: Усреднение!

Непрочитанное сообщение evge » 07 авг 2020, 11:45

Это скорее всего из-за xPrice, замените обратно в 4 строках в конце на

подобные

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

xPrice =  Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercent);

на

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

xPrice =  Input1.Close[0];


и протестируйте

у меня с установкой не Input1.Close[0] на тех же параметрах выдало лучшие результаты и я оставил их.

вернул как был код, всё же лучше оставить как было, это совпадение что улучились результаты в единичном случае
никогда такого не было и вот опять

Konstantin
Сообщения: 17
Зарегистрирован: 11 окт 2017, 15:25
Благодарил (а): 5 раз

Re: Усреднение!

Непрочитанное сообщение Konstantin » 07 авг 2020, 11:52

evge писал(а):Это скорее всего из-за xPrice, замените обратно в 4 строках в конце на

подобные

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

xPrice =  Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercent);

на

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

xPrice =  Input1.Close[0];


и протестируйте

у меня с установкой не Input1.Close[0] на тех же параметрах выдало лучшие результаты и я оставил их.

вернул как был код, всё же лучше оставить как было, это совпадение что улучились результаты в единичном случае


Не совсем понял, что вы оставили в итоге?

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

Re: Усреднение!

Непрочитанное сообщение evge » 07 авг 2020, 11:56

В коде выше внес исправление. Вернул как было изначально во всех четырех правилах добора и закрытия частями.

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

xPrice =  Input1.Close[0];
никогда такого не было и вот опять

Konstantin
Сообщения: 17
Зарегистрирован: 11 окт 2017, 15:25
Благодарил (а): 5 раз

Re: Усреднение!

Непрочитанное сообщение Konstantin » 07 авг 2020, 12:12

evge писал(а):В коде выше внес исправление. Вернул как было изначально во всех четырех правилах добора и закрытия частями.

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

xPrice =  Input1.Close[0];


Ясно, но почему-то у меня всё равно, при параметрах:
500
50
1,4
1,4
62
получилось:
Отчёт-2.png
Отчёт-2.png (34.83 КБ) 1072 просмотра


А должно быть примерно это:
Отчёт.png
Отчёт.png (32.75 КБ) 1072 просмотра

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

Re: Усреднение!

Непрочитанное сообщение evge » 07 авг 2020, 12:27

у меня в обеих вариациях и на старом коде и на модифицированном с DeltaPercentAdd выходит как на первой картинке.

т.е. нет разницы
никогда такого не было и вот опять

Konstantin
Сообщения: 17
Зарегистрирован: 11 окт 2017, 15:25
Благодарил (а): 5 раз

Re: Усреднение!

Непрочитанное сообщение Konstantin » 07 авг 2020, 12:37

evge писал(а):у меня в обеих вариациях и на старом коде и на модифицированном с DeltaPercentAdd выходит как на первой картинке.

т.е. нет разницы


Вы можете целиком код выложить, может закралась какая-нибудь ошибка?, потому что у меня не повторяется результат.

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

Re: Усреднение!

Непрочитанное сообщение evge » 07 авг 2020, 13:26

Код который выше, он полностью как у меня.
никогда такого не было и вот опять


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

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

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