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

Обсуждение, описание стратегий и роботов, идеи для стратегий
Orange2000
Сообщения: 47
Зарегистрирован: 13 мар 2019, 00:45
Благодарил (а): 37 раз
Поблагодарили: 1 раз

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

Непрочитанное сообщение Orange2000 » 17 апр 2020, 23:44

Приветствую Евгений.

А сложно изменить стратегию от 13 апреля 19года что бы она всегда закрывала позицию в конце дня. Скажем в 23-45. И потом с утра по новой уже.

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

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

Непрочитанное сообщение evge » 18 апр 2020, 19:07

Добрый день!

Готово. Закрывает по GAZP в 18:30.
В коде H и M задают время, после которого позиция будет закрытия и остановлен алгоритм (через return).
Вообще H и M можно вынести в параметры.
В тоже время производится переворот в другую сторону по торговле на следующий день.
Это задается через N = -N;
Можно закомментировать эту строку и переворота не будет, торговать будет в туже сторону на следующий день.

А если N = -N заменить на

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

      if (CurrentPL() < 0) N =- N;

переворот направления торговли будет только если ПУ закрываемой в H:M позиции был убыточным.

Добавлен следующий код:

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

//+evge выход из позиции после H:M и приостановка работы до следующего дня
int H = 18, M = 30;
if (BarTime(0) >= AsTime(H, M, 0))
{
   if (CurrentPosition() != 0)
   {   
      ClosePosition();
      N =- N;
      xPrice = 10000000000.0;
      LastPrice.Clear();
      xPosition = 0;
      MaxPrice = Double.MaxValue;
      MinPrice = 0;      
   }
   return;
}
//-evge


Полный код.

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

/**
**/

function Initialize()
{
   StrategyName = "UpAndDownCP";
   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

//+evge выход из позиции после H:M и приостановка работы до следующего дня
int H = 18, M = 30;
if (BarTime(0) >= AsTime(H, M, 0))
{
   if (CurrentPosition() != 0)
   {   
      ClosePosition();
      N =- N;
      xPrice = 10000000000.0;
      LastPrice.Clear();
      xPosition = 0;
      MaxPrice = Double.MaxValue;
      MinPrice = 0;      
   }
   return;
}
//-evge

// Переворот стратегии 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];
     }
}
никогда такого не было и вот опять

Orange2000
Сообщения: 47
Зарегистрирован: 13 мар 2019, 00:45
Благодарил (а): 37 раз
Поблагодарили: 1 раз

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

Непрочитанное сообщение Orange2000 » 18 апр 2020, 20:52

Евгений благодарю!
Такое исчерпывающее решение. Браво)

Orange2000
Сообщения: 47
Зарегистрирован: 13 мар 2019, 00:45
Благодарил (а): 37 раз
Поблагодарили: 1 раз

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

Непрочитанное сообщение Orange2000 » 21 апр 2020, 00:09

что-то не закрылся робот в конце сессии. Торговал фьюч сбера. Выставил 23-49 в коде. Но не закрылся робот и как-будто подвис даже. Потому что правая кнопка не работала по строчке с роботом...
в чем может быть проблема?

в сообщениях робота тоже пусто

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

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

Непрочитанное сообщение evge » 21 апр 2020, 06:04

Кратно таймфрейму нужно и НЕ указывать время последнего бара таймфрейма.

Если таймфрейм 5 минут, то и время должно быть 23:40, но не более 23:40, т.к. это уже будет сигнал для следущего дня. Последний бар 23:45 будет доступен только в первый тик следующего дня на баре в 10:00.

23:49 при таймфрейме 5 минут не отработает, т.к. BarTime() на следующий день в 10:00 будет 23:45,а это меньше 23:49
никогда такого не было и вот опять

Orange2000
Сообщения: 47
Зарегистрирован: 13 мар 2019, 00:45
Благодарил (а): 37 раз
Поблагодарили: 1 раз

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

Непрочитанное сообщение Orange2000 » 21 апр 2020, 09:57

Евгений, был минутный тайм фрейм)
Но возможно, я что-то не допонимаю...и надо было сделать 23-48..попробую сегодня

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

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

Непрочитанное сообщение evge » 21 апр 2020, 10:25

Выше я ошибся. 23:45 последний бар дня, а не 23:50 (поправил выше). 23:50 бара нет.

аналогично для минутного 23:49 последний бар и будет он доступен в старт торгов следующего дня, т.е. в 10:00.
Т.е. в минутном таймфрейме указывать надо бар 23:48 (для закрытия на 23:49) или ранее.

BarTime-01.png
BarTime-01.png (13.14 КБ) 17158 просмотров

BarTime-02.png
BarTime-02.png (6.78 КБ) 17158 просмотров
никогда такого не было и вот опять

Orange2000
Сообщения: 47
Зарегистрирован: 13 мар 2019, 00:45
Благодарил (а): 37 раз
Поблагодарили: 1 раз

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

Непрочитанное сообщение Orange2000 » 21 апр 2020, 11:13

Спасибо Евгений. Я уже тоже глянул. 49 последний бар)
Хотя в коде и написано что по достижении (больше или равно) 23 49 00 закрыть позицию, но особенности альфы я так понял, а именно ждет закрытия бара ( в нашем случае 49 минутного)...

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

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

Непрочитанное сообщение evge » 21 апр 2020, 14:31

Ждет закрытия и дождется его только на первом тике следующего бара!
т.е. о том что предыдущий бар закрыт информация появится в стратегии только на первом тике следующего бара и сработает событие OnUpdate(). Есть конечно т.н. "живой бар", но это другая история :)
никогда такого не было и вот опять

Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

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

Непрочитанное сообщение Den » 21 апр 2020, 17:54

"Живой бар" с детства и до сих пор нетрудоспособный инвалид.


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

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

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