Стратегии и роботы > Проверка условия на заданном временном отрезке.

Обсуждение, описание стратегий и роботов, идеи для стратегий
Максим
Сообщения: 16
Зарегистрирован: 07 апр 2019, 11:01
Благодарил (а): 14 раз

Проверка условия на заданном временном отрезке.

Непрочитанное сообщение Максим » 07 апр 2019, 12:00

Здравствуйте! Подскажите, пожалуйста, как для робота, в АД4,можно реализовать проверку следующего условия:
"На протяжении n предыдущих периодов, ЕМА1>EMA2". Т.е. на протяжении, например 20-ти предыдущих баров, EMA1 всегда находится выше ЕМА2.

И еще, как вычесть среднюю длину свечей (High-Low) за n периодов. Чтобы можно было заменить n на P1, например, и поиграться с оптимизацией.
Спасибо.

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

Re: Проверка условия на заданном временном отрезке.

Непрочитанное сообщение evge » 07 апр 2019, 13:29

Здравствуйте!

Максим писал(а):Здравствуйте! Подскажите, пожалуйста, как для робота, в АД4,можно реализовать проверку следующего условия:
"На протяжении n предыдущих периодов, ЕМА1>EMA2". Т.е. на протяжении, например 20-ти предыдущих баров, EMA1 всегда находится выше ЕМА2.


например так,

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

var E1 = EMA(Input1.Close, 5);
var E2 = EMA(Input1.Close, 50);
bool B = true; //E1 > E2 по умолчанию
for (int x = 0; x < 20; x++)
{
if (E1[x] < E2[x]) { B = false; break; }
}
if (B) { ... } //Если E1 > E2 за 20 баров


Максим писал(а):И еще, как вычесть среднюю длину свечей (High-Low) за n периодов. Чтобы можно было заменить n на P1, например, и поиграться с оптимизацией.
Спасибо.


самый простой, но не самый быстрый способ

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

double sum = 0;
for (int x = 0; x < P1; x++)
{
sum += Input1.High[x] - Input1.Low[x];
}
sum /= P1;
никогда такого не было и вот опять

Максим
Сообщения: 16
Зарегистрирован: 07 апр 2019, 11:01
Благодарил (а): 14 раз

Re: Проверка условия на заданном временном отрезке.

Непрочитанное сообщение Максим » 07 апр 2019, 18:21

evge писал(а):


самый простой, но не самый быстрый способ

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

double sum = 0;
for (int x = 0; x < P1; x++)
{
sum += Input1.High[x] - Input1.Low[x];
}
sum /= P1;


Спасибо, все получилось )) А как на этом отрезке можно получить значения High самого верхнего бара, и Low самого нижнего? Для расчета стопа, например.

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

Re: Проверка условия на заданном временном отрезке.

Непрочитанное сообщение evge » 08 апр 2019, 06:24

в стратегиях можно так:

MinValue(Series, N=1, D=0) – возвращает минимальное значение из N точек ряд Series со смещением D назад
MaxValue(Series, N=1, D=0) – возвращает максимальное значение из N точек ряд Series со смещением D назад

т.е. код будет такой

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

double L = 0, H = 0;
L = MinValue(Input1.Low, P1, 0);
H = MaxValue(Input1.High, P1, 0);

Работают эти функции "очень медленно". Это заметно на тестировании и оптимизации стратегий.

Работают только в стратегиях, в индикаторах не работали эти функции (на новых версиях АД4 не проверял).

Ну или вариант опять же самостоятельно, ищем минимальное максимальное значение за период. Например, в том же цикле. Модифицированный код:

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

double sum = 0, H = 0, L = Double.MaxValue;
for (int x = 0; x < P1; x++)
{
sum += Input1.High[x] - Input1.Low[x];
if (Input1.High[x] > H) H = Input1.High[x];
if (Input1.Low[x] < L) L = Input1.Low[x];
}
sum /= P1;


в H, L будут минимум и максимум за период P1
никогда такого не было и вот опять

Bobson
Сообщения: 17
Зарегистрирован: 10 фев 2019, 12:55
Благодарил (а): 4 раза
Поблагодарили: 6 раз

Re: Проверка условия на заданном временном отрезке.

Непрочитанное сообщение Bobson » 08 апр 2019, 19:55

А что мешает в коде стратегии применять стандартные методы расширения?

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

int period= 20;
// Накопители для параметров бара
List<double> archiveClose = new List<double>();
List<double> archiveHigh = new List<double>();
List<double> archiveLow = new List<double>();
// Добавляем значения бара
archiveClose.Add(Input1.Close[0]);
archiveHigh.Add(Input1.High[0]);
archiveLow.Add(Input1.Low[0]);
// Ограничиваем количество значений в List
if (archiveClose.Count() > period) archiveClose.RemoveAt(0);
if (archiveHigh.Count() > period) archiveHigh.RemoveAt(0);
if (archiveLow.Count() > period) archiveLow.RemoveAt(0);
// Функции расширения, работающие намного быстрее прямого перебора for(...)
double average = archiveClose.Average(); // Среднее значение за период, аналог SMA
double max = archiveHigh.Max(); // Максимальное значение High за период, аналог HHV в Метастоке
double min = archiveLow.Min(); // Минимальное значение Low за период, аналог функции LLV в Метастоке


P.S. Я не пишу стратегий во встроенном в терминал функционале, поэтому прошу извинить, если топик не по теме.

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

Re: Проверка условия на заданном временном отрезке.

Непрочитанное сообщение evge » 08 апр 2019, 20:10

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

// Накопители для параметров бара
List<double> archiveClose = new List<double>();
List<double> archiveHigh = new List<double>();
List<double> archiveLow = new List<double>();


будут переопределены в каждом OnUpdate()

можно, но тогда в Initialize():

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

AddGlobalVariable("archiveClose", Types.DoubleList); // Создание списка
никогда такого не было и вот опять

Максим
Сообщения: 16
Зарегистрирован: 07 апр 2019, 11:01
Благодарил (а): 14 раз

Re: Проверка условия на заданном временном отрезке.

Непрочитанное сообщение Максим » 21 дек 2019, 11:47

Здравствуйте. Аналогичная задача, только нужно определить, было ли пересечение ЕМА-шек в течение последних (например, 20 баров). Пытаюсь сделать через CrossAbove и CrossBelow, но что-то не так, выдает ошибку.

Например.

Если в течение последних 20 баров, ЕМА1 пересекала ЕМА2 вверх - в шорт не входим;
Если в течение последних 20 баров, ЕМА1 пересекала ЕМА2 вниз - в лонг не входим;

И еще. Нужно определить смену направления ценового канала (в течение n - баров). Например, если началось снижение верхней границы - в лонг не входим, и наоборот, если нижняя граница стала расти - не входим в шорт (см пример)
Вложения
prise.jpg
prise.jpg (61.27 КБ) 19654 просмотра

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

Re: Проверка условия на заданном временном отрезке.

Непрочитанное сообщение evge » 23 дек 2019, 12:08

Здравствуйте!

Пройтись по N барам циклом и узнать было ли пересечение.

Как небольшой пример:

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

function Initialize()
{
   StrategyName = "EMAEMA";
   AddParameter("P1", 21, "slow preiod EMA", 1);
   AddParameter("P2", 8, "fast period EMA", 1);
   AddParameter("PN", 10, "period scan", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{
   var I = Input1;
   var E1 = EMA(I, P1);
   var E2 = EMA(I, P2);
   
   bool cU = false, cD = false; // cU - Cross Up, cD - Cross Down
   for (int x = 0; x < PN; x++)
   {
      if (E2[x] > E1[x] && E2[x+1] < E1[x+1]) cU = true;
      if (E2[x] < E1[x] && E2[x+1] > E1[x+1]) cD = true;
      if (cU && cD) break;
   }
   
   //если на текущем баре пересекли вверх и не было пересечений вниз за PN баров
   if (E2[0] > E1[0] && E2[1] < E1[1])
   if (!cD) EnterLong();

   //если на текущем баре пересекли вниз и не было пересечений вверх за PN баров
   if (E2[0] < E1[0] && E2[1] > E1[1])
   if (!cU) EnterShort();
   
}
никогда такого не было и вот опять

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

Re: Проверка условия на заданном временном отрезке.

Непрочитанное сообщение evge » 23 дек 2019, 12:10

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

Максим
Сообщения: 16
Зарегистрирован: 07 апр 2019, 11:01
Благодарил (а): 14 раз

Re: Проверка условия на заданном временном отрезке.

Непрочитанное сообщение Максим » 23 дек 2019, 15:26

Спасибо, огромное!


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

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

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