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

Обсуждение, описание стратегий и роботов, идеи для стратегий
ip851874
Сообщения: 41
Зарегистрирован: 21 ноя 2020, 22:56
Благодарил (а): 14 раз

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

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

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

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

function Initialize()
{

   StrategyName = "InvestPozitive 2MA";
   AddChartIndicator("EMA", new Dictionary <string, string>{{"Period", "Pfast"}});
   AddChartIndicator("EMA", new Dictionary <string, string>{{"Period", "Pslow"}});
   AddParameter("Pfast", 7, "быстрая ema", 1);
   AddParameter("Pslow", 14, "медленная ema", 0)
   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;
if (!Started) Started = (Input1.Close[0] <= OnPrice && Input1.Close[1] > OnPrice) || (Input1.Close[0] >= OnPrice && Input1.Close[1] < OnPrice);
if (!Started) return;

// Правило 1: Открытие позиции на начальный объем
// и расчет DeltaPrice
if ( (EMA(Input1.Close, Pfast) > EMA(Input1.Close, Pslow)) && (Pfast < Pslow) )
   {
      
   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;
     }
   
     

}



Подскажите почему компиляцию перестал проходить? Что то где то намудрил

Maks
Сообщения: 52
Зарегистрирован: 15 июн 2020, 15:29
Благодарил (а): 8 раз
Поблагодарили: 27 раз

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

Непрочитанное сообщение Maks » 19 май 2023, 16:25

1.
ip851874 писал(а):   AddParameter("Pslow", 14, "медленная ema", 0)

В AddParameter не хватает ";"

2. И в правиле 1 не хватает закрывающей скобки "}"

3. В вопросе не хватает сообщения компилятора (в котором эти две ошибки написаны)

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

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

Непрочитанное сообщение ip851874 » 19 май 2023, 23:35

Спасибо! Поправил.

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

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

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

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

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

function Initialize()
{

   StrategyName = "InvestPozitive 2MA";
   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 ( (LastPrice == 100000000000) )
   {   
       // Проверки
       if ( (EMA(Input1.Close, Pfast) > SMA(Input1.Close, Pslow)) && (Pfast < Pslow) )
   {
      EnterLong();
   }

      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;
     }
   
     

}




Сейчас закупается на максимальный лот, потом его сразу продает а только потом покупает qStart

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

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

Непрочитанное сообщение ip851874 » 20 май 2023, 09:47

и открытие не по пересечению
Вложения
2023-05-20_09-45-22.png

Maks
Сообщения: 52
Зарегистрирован: 15 июн 2020, 15:29
Благодарил (а): 8 раз
Поблагодарили: 27 раз

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

Непрочитанное сообщение Maks » 22 май 2023, 12:49

ip851874 писал(а):и открытие не по пересечению


в условиях нет пересечения.
Есть
EMA...Pfast > SMA...Pslow


и если это условие не выполнено, то что? идём дальше по коду и всё равно покупаем если qStart>0. Идея точно была именно в этом?

Сейчас закупается на максимальный лот, потом его сразу продает а только потом покупает qStart

сейчас в коде так и написано (хаотично). В правиле 1 купили, в правиле 4 (вероятно) продали. Конечно если выполнены условия правила 4, но они часто будут выполнены сразу

в первом приближении можно/нужно взять исходный (работающий) код и воспользоваться советом Евгения:
evge писал(а):условие перенесите, добавив его сюда

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

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

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

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

Непрочитанное сообщение ip851874 » 23 май 2023, 00:37

Идея была осуществлять вход по сигналу а сопровождение и выход оставить по стратегии и после выхода из позиции ждать подходящий сигнал. Работает только в лонг. За сигнал взял 2 скользящие.


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

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

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