Стратегии и роботы > Psar+adx

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

Psar+adx

Непрочитанное сообщение Orange2000 » 03 май 2020, 22:06

Всем привет. Есть идея. Пытаюсь ее запрограммировать. Начал с простого, просто с лонга. Выход по тейку и стопу.
Условие на лонг:
Close выше параболика.
И в течении следующих 6 свечей вход в лонг если ADX(19) пересек линию 30 и сигнальная линия PosDi находится выше 30.
Так же в течении этих 6 свечей нужно что бы цена осталась примерно в зоне цены начального условия Close выше параболика, пусть будет +-20пп.
Выход стоп 10пп и тэйк 25пп.
IMG-e10e595c0e45e6759ab5df10b5091f2d-V.jpg


Вот грубая заготовка, которую я смог осилить)

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

function Initialize()
{
   StrategyName = "ant";
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (Input1.Close > PSAR(Input1, 0.02, 0.2)) && (ADX(Input1, 19).GetValue("ADX", 0) > 30) && (ADX(Input1, 14).GetValue("PosDI", 0) > 30) )
   {
      EnterLong();
      BreakingStop(10, 25, SignalPriceType.DeltaFromAveragePrice);
   }

}


Нужно как-то прописать что после сигнала по параболику ждать именно что бы адх пересек снизу вверх 30. И что бы в это время PosDi был выше 30.

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

Re: Psar+adx

Непрочитанное сообщение evge » 04 май 2020, 15:19

Я так понял, проблема в том что после исполнения стопа или тейка, вновь может быть открыта позиция?

проверить на пересечение снизу вверх можно так

ADX(Input1, 19).GetValue("ADX", 0) > 30 && ADX(Input1, 19).GetValue("ADX", 1) < 30

т.е. на текущем баре ADX выше 30, на предыдущем ниже.

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

function Initialize()
{
   StrategyName = "ant";
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{

   var A = ADX(Input1, 19)["ADX"];

   /// ПРАВИЛО 1
   if ( Input1.Close > PSAR(Input1, 0.02, 0.2) && A[0] > 30 && A[1] < 30 && ADX(Input1, 14)["PosDI"][0] > 30 )
   {
      EnterLong();
      BreakingStop(10, 25, SignalPriceType.DeltaFromAveragePrice);
   }

}


PosDI от ADX(14) это не ошибка, может там тоже 19 нужно?
никогда такого не было и вот опять

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

Re: Psar+adx

Непрочитанное сообщение Orange2000 » 04 май 2020, 18:39

Спасибо Евгений за ответ. Да, там 19 надо) но там понятно.
Проблема, что бы после пересечения параболика, входить в лонг только если в следущие 6 баров было пересечение АДХ снизу вверх линии30.

Я тут подумал, может правильней первоначально ловить событие ADX(19) пересек линию 30 снизу и уже в этот момент смотреть где параболик был в последние 6 баров и что бы цена не ушла сильно. Ну и с posDi там просто уже.

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

Re: Psar+adx

Непрочитанное сообщение evge » 04 май 2020, 19:00

понятно.

про 6 баров можно так:

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

function Initialize()
{
   StrategyName = "ant";
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
   AddGlobalVariable("PI", Types.Int, 0);
}

function OnUpdate()
{

   var A = ADX(Input1, 19);
   var P = PSAR(Input1, 0.02, 0.2);
   
   //запомним индекс бара в глоб. переменной, где PSAR изменился в Long
   if (Input1.Close[0] > P[0] && Input1.Close[1] < P[1]) PI = CurrentIndex;

   /// ПРАВИЛО 1
   if (CurrentIndex - PI < 6 && A["ADX"][0] > 30 && A["ADX"][1] < 30 && A["PosDI"][0] > 30 )
   {
      EnterLong();
      BreakingStop(10, 25, SignalPriceType.DeltaFromAveragePrice);
   }

}
никогда такого не было и вот опять

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

Re: Psar+adx

Непрочитанное сообщение Orange2000 » 04 май 2020, 19:44

Все четко. И получается нужно еще учесть что бы цена далеко не ушла за эти 1-6 баров. Нужно запомнить цену в момент пересечения параболика.

Вот в строчке :

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

//запомним индекс бара в глоб. переменной, где PSAR изменился в Long
   if (Input1.Close[0] > P[0] && Input1.Close[1] < P[1]) PI = CurrentIndex;

видимо надо как-то и цену запомнить?) как потом ее сравнить я думаю и сам смогу)

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

Re: Psar+adx

Непрочитанное сообщение evge » 04 май 2020, 19:58

Orange2000 писал(а):видимо надо как-то и цену запомнить?)


Да.

Добавляем ещё одну глоб. переменную.
Проверка на +\- 20 пп

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

function Initialize()
{
   StrategyName = "ant";
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
   AddGlobalVariable("PI", Types.Int, 0);
   AddGlobalVariable("Price", Types.Double, 0);
}

function OnUpdate()
{

   var A = ADX(Input1, 19);
   var P = PSAR(Input1, 0.02, 0.2);
   
   //запомним индекс и цену бара в глоб. переменных, где PSAR изменился в Long
   if (Input1.Close[0] > P[0] && Input1.Close[1] < P[1]) { PI = CurrentIndex; Price = Input1.Close[0]; }

   /// ПРАВИЛО 1
   if (CurrentIndex - PI < 6 && A["ADX"][0] > 30 && A["ADX"][1] < 30 && A["PosDI"][0] > 30 && Input1.Close[0] > Price - 20 && Input1.Close[0] < Price + 20 )
   {
      EnterLong();
      BreakingStop(10, 25, SignalPriceType.DeltaFromAveragePrice);
   }

}
никогда такого не было и вот опять

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

Re: Psar+adx

Непрочитанное сообщение Orange2000 » 04 май 2020, 20:09

Круто)
Спасибо. Вот вопрос, немного не в тему, и видимо уже не раз задавался.
Вот эти две глобальные переменные. В первом случае тип int а вот с ценой double. С ценой так, что там могут быть десятичные?

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

Re: Psar+adx

Непрочитанное сообщение evge » 04 май 2020, 20:24

Индекс он целочисленный,
Цена необязательно.

Целочисленные типы
Числовые типы с плавающей запятой

в АД4 Types:

• Types – тип переменной
o Int
o Long
o Double
o Boolean
o String
o DateTime
o IntList
o DoubleList
o DoubleDictionary
никогда такого не было и вот опять


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

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

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