Стратегии и роботы > Проверка условия на заданном временном отрезке.
Проверка условия на заданном временном отрезке.
Здравствуйте! Подскажите, пожалуйста, как для робота, в АД4,можно реализовать проверку следующего условия:
"На протяжении n предыдущих периодов, ЕМА1>EMA2". Т.е. на протяжении, например 20-ти предыдущих баров, EMA1 всегда находится выше ЕМА2.
И еще, как вычесть среднюю длину свечей (High-Low) за n периодов. Чтобы можно было заменить n на P1, например, и поиграться с оптимизацией.
Спасибо.
"На протяжении n предыдущих периодов, ЕМА1>EMA2". Т.е. на протяжении, например 20-ти предыдущих баров, EMA1 всегда находится выше ЕМА2.
И еще, как вычесть среднюю длину свечей (High-Low) за n периодов. Чтобы можно было заменить n на P1, например, и поиграться с оптимизацией.
Спасибо.
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 369 раз
- Контактная информация:
Re: Проверка условия на заданном временном отрезке.
Здравствуйте!
например так,
самый простой, но не самый быстрый способ
Максим писал(а):Здравствуйте! Подскажите, пожалуйста, как для робота, в АД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;
никогда такого не было и вот опять
Re: Проверка условия на заданном временном отрезке.
evge писал(а):
самый простой, но не самый быстрый способКод: Выделить всё
double sum = 0;
for (int x = 0; x < P1; x++)
{
sum += Input1.High[x] - Input1.Low[x];
}
sum /= P1;
Спасибо, все получилось )) А как на этом отрезке можно получить значения High самого верхнего бара, и Low самого нижнего? Для расчета стопа, например.
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 369 раз
- Контактная информация:
Re: Проверка условия на заданном временном отрезке.
в стратегиях можно так:
MinValue(Series, N=1, D=0) – возвращает минимальное значение из N точек ряд Series со смещением D назад
MaxValue(Series, N=1, D=0) – возвращает максимальное значение из N точек ряд Series со смещением D назад
т.е. код будет такой
Работают эти функции "очень медленно". Это заметно на тестировании и оптимизации стратегий.
Работают только в стратегиях, в индикаторах не работали эти функции (на новых версиях АД4 не проверял).
Ну или вариант опять же самостоятельно, ищем минимальное максимальное значение за период. Например, в том же цикле. Модифицированный код:
в H, L будут минимум и максимум за период P1
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
никогда такого не было и вот опять
-
- Сообщения: 17
- Зарегистрирован: 10 фев 2019, 12:55
- Благодарил (а): 4 раза
- Поблагодарили: 6 раз
Re: Проверка условия на заданном временном отрезке.
А что мешает в коде стратегии применять стандартные методы расширения?
P.S. Я не пишу стратегий во встроенном в терминал функционале, поэтому прошу извинить, если топик не по теме.
Код: Выделить всё
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
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 369 раз
- Контактная информация:
Re: Проверка условия на заданном временном отрезке.
Код: Выделить всё
// Накопители для параметров бара
List<double> archiveClose = new List<double>();
List<double> archiveHigh = new List<double>();
List<double> archiveLow = new List<double>();
будут переопределены в каждом OnUpdate()
можно, но тогда в Initialize():
Код: Выделить всё
AddGlobalVariable("archiveClose", Types.DoubleList); // Создание списка
никогда такого не было и вот опять
Re: Проверка условия на заданном временном отрезке.
Здравствуйте. Аналогичная задача, только нужно определить, было ли пересечение ЕМА-шек в течение последних (например, 20 баров). Пытаюсь сделать через CrossAbove и CrossBelow, но что-то не так, выдает ошибку.
Например.
Если в течение последних 20 баров, ЕМА1 пересекала ЕМА2 вверх - в шорт не входим;
Если в течение последних 20 баров, ЕМА1 пересекала ЕМА2 вниз - в лонг не входим;
И еще. Нужно определить смену направления ценового канала (в течение n - баров). Например, если началось снижение верхней границы - в лонг не входим, и наоборот, если нижняя граница стала расти - не входим в шорт (см пример)
Например.
Если в течение последних 20 баров, ЕМА1 пересекала ЕМА2 вверх - в шорт не входим;
Если в течение последних 20 баров, ЕМА1 пересекала ЕМА2 вниз - в лонг не входим;
И еще. Нужно определить смену направления ценового канала (в течение n - баров). Например, если началось снижение верхней границы - в лонг не входим, и наоборот, если нижняя граница стала расти - не входим в шорт (см пример)
- Вложения
-
- prise.jpg (61.27 КБ) 25070 просмотров
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 369 раз
- Контактная информация:
Re: Проверка условия на заданном временном отрезке.
Здравствуйте!
Пройтись по N барам циклом и узнать было ли пересечение.
Как небольшой пример:
Пройтись по 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
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 369 раз
- Контактная информация:
Re: Проверка условия на заданном временном отрезке.
По второму вопросу аналогично.
Проверяя только верхнюю и нижнюю границы PriceChannel на падение или рост и аналогичная проверка в условии открытия позиции.
Проверяя только верхнюю и нижнюю границы PriceChannel на падение или рост и аналогичная проверка в условии открытия позиции.
никогда такого не было и вот опять
Вернуться в «Стратегии и роботы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей