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

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

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

Непрочитанное сообщение evge » 11 мар 2021, 05:48

в комментариях к правилам расписано (с включенным poor = 1)

// Правило 5: Закрытие докупленной части позиции при росте выше последней цены на deltaPrice

последняя цена - цена последней докупки или цена закрытия части позиции (докупки).

после чего последняя цена выставляется в правиле 5 на цену закрытия и следующее закрытие будет по цене выше на deltaPrice уже от неё.
никогда такого не было и вот опять

ip851874
Сообщения: 40
Зарегистрирован: 21 ноя 2020, 22:56
Благодарил (а): 9 раз

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

Непрочитанное сообщение ip851874 » 25 окт 2021, 10:10

evge писал(а):Если что-то не так, сообщайте, поправлю код.

Евгений, при старте робот несколько раз закупился выше текущей цены, при текущей цене в 71155 выставил стартовую заявку по 71208. По какой причине это может вознкать?

ip851874
Сообщения: 40
Зарегистрирован: 21 ноя 2020, 22:56
Благодарил (а): 9 раз

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

Непрочитанное сообщение ip851874 » 23 янв 2023, 17:25

evge писал(а):Модифицированный (предварительный) вариант на проверку.

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

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

/**
Инвестиционная стратегия.
При старте покупает по текущим ценам начальный объем qStart.
Докупает на Q при снижении цены, не более позиции робота и не ниже порога (cmin).
Продает докупленное кол-во при росте цены выше цены начальной покупки.
Если Poor не равен 0, докупка закрывается частями по цене выше чем последняя цена на дельту.
Продает весь объем при росте цены выше целевой цены и останавливается
Algorithm = ИНВЕСТИЦИИ;**/

function Initialize()
{

   StrategyName = "Invest_positive";
   AddParameter("qStart", 1000, "Сколько купить при старте", 0);
   AddParameter("cmax", 160, "Целевая цена", 0);
   AddParameter("QC", 100, "Шаг закрытия позиции в штуках", 0);
   AddParameter("cmin", 60, "Нижний порог покупки", 0);
   AddParameter("Q", 100, "Шаг покупки в штуках", 0);
   AddParameter("Poor", 0, "Закрывать докупки частями, если значение не 0", 0);

   AddInput("Input1", Inputs.Candle, 1, true, "");

   AddGlobalVariable("LastPrice", Types.Double, 100000000000);
   AddGlobalVariable("LastPriceClose", Types.Double, 100000000000);
   AddGlobalVariable("FirstPrice", Types.Double, 0);
   AddGlobalVariable("DeltaPrice", Types.Double, 0);
   AddGlobalVariable("DeltaPriceClose", Types.Double, 0);

}

function OnUpdate()
{
// В момент запуска покупаем qStart акций
// Основная прибыль: продаем qStart акций по цели (cmax)
// Дополнительно: ниже цены старта покупаем (но не ниже cmin), выше продаем

// evge 14.03.2019 https://alfadirect4.ru
// модификация стратегии с закрытием по частям при движении к целевой цене

double c = Input1.Close[0];
double pos = CurrentPosition();
double qStep;

// Правило 1: Открытие позиции на начальный объем
// и расчет DeltaPrice
   if ( (LastPrice == 100000000000) )
   {   
       // Проверки
      if (Q <= 0)
      {
              ShowMessage("Не задано Q - шаг количества");
              Stop();
      }
      if ( cmin >= cmax )
      {
              ShowMessage("cmin больше, чем cmax ");
              Stop();
      }
   
       // Открываем позицию, если стартовое кол-во больше 0
       if (qStart > 0)
         EnterLong(qStart);
        LastPrice =  c;
   LastPriceClose = c;
        FirstPrice =  c;
      // Расчитываем дельту цены для докупки
      if (Q > 0 )
      {
         qStep = (LongLimit - qStart) / Q ;
         DeltaPrice = (LastPrice - cmin) / qStep;
      }
      // Расчитываем дельту цены для закрытия позиции частями
      if (QC > 0 )
      {
         qStep = qStart / QC ;
         DeltaPriceClose = (cmax - LastPrice) / qStep;
      }
   }
   
// Правило 2: Закрытие всей позиции при достижении сmax
   if ( c > cmax)
    {
       CloseLong();
       //ShowMessage("Цена достигла цели, робот закрывает позицию и будет остановлен");
       //Stop();
       // Остановка робота
     }

// Правило 2.1: закрытие позиции частями
   if ( c > LastPriceClose + DeltaPriceClose && c < cmax )
   {
   CloseLong(QC);
        LastPriceClose =  c;
     }

// Правило 2.2: повторный старт
   if ( pos < qStart && c <= FirstPrice)
   {
   EnterLong(qStart - pos);
        LastPrice =  c;
   LastPriceClose = c;
        //FirstPrice =  c;
     }
     

// Правило 3: Добавление к позиции при падении
   if ( c < LastPrice - DeltaPrice && c > cmin )
   {
   EnterLong(Q);
        LastPrice =  c;
     }

// Правило 4: Продажа докупки росте цены выше стартовой цены
   if ( c > FirstPrice && pos > qStart)
    {
   CloseLong(pos - qStart);
   LastPrice =  c;
     }
     
// Правило 5: Закрытие докупленной части позиции при росте выше последней цены на deltaPrice
   if ( Poor != 0 && c > LastPrice + DeltaPrice && pos > qStart)
    {
       CloseLong(Q);
       LastPrice =  c;
     }
}


пример работы и параметры тестирования на таймфрейме M5:

Invest-positive-mod-01.png
Invest-positive-mod-02.png


Помогите пожалуйста еще добавить точку входа для закупки стартовой позиции в модифицированной версии

Leonid_1234
Сообщения: 3
Зарегистрирован: 20 дек 2022, 15:16
Поблагодарили: 1 раз

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

Непрочитанное сообщение Leonid_1234 » 02 мар 2023, 16:56

Приветствую всех! Евгений, подскажите, пожалуйста, что делаю не так: скачал архив инвест_позитив/негатив, запустил роботов в режиме советника. роботы, проработав примерно час, так и не открыли стартовую сделку. Что-то с терминалом?

ip851874
Сообщения: 40
Зарегистрирован: 21 ноя 2020, 22:56
Благодарил (а): 9 раз

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

Непрочитанное сообщение ip851874 » 06 май 2023, 15:43

Еще цену входа можно добавить-отложенный старт по цене.

ip851874
Сообщения: 40
Зарегистрирован: 21 ноя 2020, 22:56
Благодарил (а): 9 раз

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

Непрочитанное сообщение ip851874 » 06 май 2023, 16:04

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

function Initialize()
{

   StrategyName = "Invest Pozitiv";
   AddParameter("OnPrice", 250, "Стартовая цена (начать торговлю при пересечении цены)", 0);
   AddParameter("qStart", 1000, "Сколько купить при старте", 0);
   AddParameter("cmax", 160, "Целевая цена", 0);
   AddParameter("cmin", 60, "Нижний порог покупки", 0);
   AddParameter("Q", 10, "Шаг покупки в штуках", 0);
   AddParameter("Poor", 0, "Закрывать докупки частями, если значение не 0", 0);
   


   AddInput("Input1", Inputs.Candle, 1, true, "");

   AddGlobalVariable("LastPrice", Types.Double, 100000000000);
   AddGlobalVariable("FirstPrice", Types.Double, 0);
   AddGlobalVariable("DeltaPrice", Types.Double, 0);
   AddGlobalVariable("Started", Types.Boolean, false);

}




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

function OnUpdate()
{
// В момент запуска покупаем qStart акций
// Основная прибыль: продаем qStart акций по цели (cmax)
// Дополнительна: ниже цены старта покупаем (но не ниже cmin), выше продаем
double c = Input1.Close[0];
double pos = CurrentPosition();
double qStep;

// Правило 1: Открытие позиции на начальный объем
// и расчет DeltaPrice
if (!Started) Started = (Input1.Close[0] <= OnPrice && Input1.Close[1] > OnPrice) || (Input1.Close[0] >= OnPrice && Input1.Close[1] < OnPrice);
if (!Started) return;

   if ( (LastPrice == 100000000000) )
   {   

ip851874
Сообщения: 40
Зарегистрирован: 21 ноя 2020, 22:56
Благодарил (а): 9 раз

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

Непрочитанное сообщение ip851874 » 07 май 2023, 17:03

evge писал(а):в комментариях к правилам расписано (с включенным poor = 1)

// Правило 5: Закрытие докупленной части позиции при росте выше последней цены на deltaPrice

последняя цена - цена последней докупки или цена закрытия части позиции (докупки).

после чего последняя цена выставляется в правиле 5 на цену закрытия и следующее закрытие будет по цене выше на deltaPrice уже от неё.

Подскажите как добавить вход по сигналу только один раз при старте и до полного выполнения сценария и остановки робота, например по пересечению МА, попробовал, но он входит каждый раз по пересечению.

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

function Initialize()
{

   StrategyName = "MyMTS2";
   AddParameter("Pfast", 3, "быстрая ema", 1);
   AddParameter("Pslow", 185, "медленная sma", 0);
   LongLimit = 0;
   AddChartIndicator("EMA", new Dictionary <string, string>{{"Period", "Pfast"}});
   AddChartIndicator("SMA", new Dictionary <string, string>{{"Period", "Pslow"}});
   AddParameter("qStart", 1000, "Сколько купить при старте", 0);
   AddParameter("cmax", 160, "Целевая цена", 0);
   AddParameter("cmin", 60, "Нижний порог покупки", 0);
   AddParameter("Q", 10, "Шаг покупки в штуках", 0);
   AddParameter("Poor", 0, "Закрывать докупки частями, если значение не 0", 0);
   


   AddInput("Input1", Inputs.Candle, 1, true, "");

   AddGlobalVariable("LastPrice", Types.Double, 100000000000);
   AddGlobalVariable("FirstPrice", Types.Double, 0);
   AddGlobalVariable("DeltaPrice", Types.Double, 0);
   AddGlobalVariable("Started", Types.Boolean, false);

}

function OnUpdate()
{
// В момент запуска покупаем qStart акций
// Основная прибыль: продаем qStart акций по цели (cmax)
// Дополнительна: ниже цены старта покупаем (но не ниже cmin), выше продаем

double c = Input1.Close[0];
double pos = CurrentPosition();
double qStep;

// Правило 1: Открытие позиции на начальный объем
// и расчет DeltaPrice когда будет сигнал на пересечение
if ( (EMA(Input1.Close, Pfast) > SMA(Input1.Close, Pslow)) && (Pfast < Pslow) )
   {
      EnterLong();
   }

   if ( (LastPrice == 100000000000) )
   {   
       // Проверки
      if (Q <= 0)
      {
              ShowMessage("Не задано Q - шаг количества");
              Stop();
      }
      if ( cmin >= cmax )
      {
              ShowMessage("cmin больше, чем cmax ");
              Stop();
      }
   
       // Открываем позицию, если стартовое кол-во больше 0
       if (qStart > 0)
         EnterLong(qStart);
        LastPrice =  c;
        FirstPrice =  c;
      // Расчитываем дельту цены для докупки
      if (Q > 0 )
      {
         qStep = (LongLimit - qStart) / Q ;
         DeltaPrice = (LastPrice - cmin) / qStep;
      }
   }
   
// Правило 2: Закрытие всей позиции при достижении сmax
   if ( c > cmax)
    {
       CloseLong();
       ShowMessage("Цена достигла цели, робот закрывает позицию и будет остановлен");
       Stop();
       // Остановка робота
     }
     
// Правило 3: Добавление к позиции при падении
   if ( c < LastPrice - DeltaPrice && c > cmin )
   {
      EnterLong(Q);
        LastPrice =  c;
     }
// Правило 4: Продажа докупки росте цены выше стартовой цены
   if ( c > FirstPrice && pos > qStart)
    {
       CloseLong(pos - qStart);
         LastPrice =  c;
     }
     
// Правило 5: Закрытие докупленной части позиции при росте выше последней цены на deltaPrice
   if ( Poor != 0 && c > LastPrice + DeltaPrice && pos > qStart)
    {
       CloseLong(Q);
       LastPrice =  c;
     }
   
     

}



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

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

Непрочитанное сообщение evge » 10 май 2023, 11:17

условие перенесите, добавив его сюда

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

 // Открываем позицию, если стартовое кол-во больше 0
       if (qStart > 0)
никогда такого не было и вот опять

ip851874
Сообщения: 40
Зарегистрирован: 21 ноя 2020, 22:56
Благодарил (а): 9 раз

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

Непрочитанное сообщение ip851874 » 10 май 2023, 18:53

evge писал(а):условие перенесите, добавив его сюда

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

 // Открываем позицию, если стартовое кол-во больше 0
       if (qStart > 0)

Спасибо!

ip851874
Сообщения: 40
Зарегистрирован: 21 ноя 2020, 22:56
Благодарил (а): 9 раз

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

Непрочитанное сообщение ip851874 » 12 май 2023, 03:14

evge писал(а):условие перенесите, добавив его сюда

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

 // Открываем позицию, если стартовое кол-во больше 0
       if (qStart > 0)


Евгений , благодарю за своевременную помощь!
Хочу вернутся к идее входа по цене и повторять закрытую сделку при повторном касании цены. Хочется вывести это в настройки как вы делали по частичной распродаже. Повторять сделку (Если значение не 0) :D


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

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

Сейчас этот форум просматривают: Bing [Bot] и 16 гостей