Общие вопросы по разработке > Как выбрать меньшее значение?

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Аватара пользователя
Tyler_Durden
Сообщения: 68
Зарегистрирован: 01 дек 2017, 20:42
Благодарил (а): 6 раз

Как выбрать меньшее значение?

Непрочитанное сообщение Tyler_Durden » 21 мар 2018, 23:55

Добрый день ! Евгений, подскажите пожалуйста как выбрать минимальное/максимальное значение из двух или трех последних сигналов?

тут он берет просто последний сигнал и вычитает из него последний противоположный, а надо минимум / максимум из нескольких.

Скажем из последнего High вычесть минимальный Low из трёх последних Low

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

function Evaluate()
{
var lastLVal = MY.indicator(Input).GetLastValues ("L", 1)[0];
var lastHVal = MY.indicator(Input).GetLastValues ("H", 1)[0];


if ( (lastHVal.X > lastLVal.X ? lastHVal.Y : lastLVal.Y) == (lastHVal.Y) )

D = Math.Abs(lastHVal.Y  - lastLVal.Y);

{

if ( (lastHVal.X > lastLVal.X ? lastHVal.Y : lastLVal.Y) == (lastLVal.Y) )

U = Math.Abs(lastHVal.Y  - lastLVal.Y);

 

}
}

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

Re: Как выбрать меньшее значение?

Непрочитанное сообщение evge » 22 мар 2018, 07:53

для начала определитесь сколько последних значений вы хотите анализировать, например перенеся это в параметры

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

function Initialize()
{
...
AddParameter("BarCount", 3);
...
}


затем, получая последние значения нужно в параметрах единицу (1) заменить на этот параметр, т.е. получать в LastLVal и LastHVal мы будем не одно последнее значение, а серию значений размером BarCount. По этой же причине убираем в конце [0], иначе было бы бессмысленно считать, например, 10 значений, но записать в переменную только последнее. Нам понадобятся именно серии значений для поиска максимума и минимума из этих значений.

пример для Fractal индикатора:

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

//получаем серию последних значений по индикатору
var lastLVal = MY.Fractal(Input, Period).GetLastValues("L", (int)ValuesCount);
var lastHVal = MY.Fractal(Input, Period).GetLastValues("H", (int)ValuesCount);


хотя в АД4 и есть методы:

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

но работают они только в стратегиях :(, поэтому придётся искать минимум и максимум "вручную", изобретая велосипед :)

получить максимум и минимум в коде индикатора можно так:

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

//вычисляем максимальное и минимальные значение H, L для 3-х последних значений серий
double maxH = lastHVal[ValuesCount - 1].Y, minL = lastLVal[ValuesCount - 1].Y;
for (int x = 1; x < ValuesCount; x++)
{
   maxH = Math.Max(maxH, lastHVal[x].Y);
   minL = Math.Min(minL, lastLVal[x].Y);
}


ну а далее по вашему коду т.к. в LastLVal и LastHVal содержится не значения, а серии то указываем в проверках получение значение по индексу, например так [ValuesCount - 1] (последнее значение).

что-то подобное этому:

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

...
if ( (lastHVal[ValuesCount - 1].X > lastLVal[ValuesCount - 1].X ? lastHVal[ValuesCount - 1].Y : lastLVal[ValuesCount - 1].Y) == (lastHVal[ValuesCount - 1].Y) )
...
никогда такого не было и вот опять

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

Re: Как выбрать меньшее значение?

Непрочитанное сообщение evge » 22 мар 2018, 07:54

полный код (на всякий)

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

function Initialize()
{
IndicatorName = "test1";
PriceStudy = false;
AddInput("Input", Inputs.Candle);
AddSeries("U", DrawAs.Histogram, Color.Green);
AddSeries("D", DrawAs.Histogram, Color.Red);

AddParameter("Period", 3);
AddParameter("ValuesCount", 3);
}

function Evaluate()
{

var lastLVal = MY.Fractal(Input, Period).GetLastValues("L", (int)ValuesCount);
var lastHVal = MY.Fractal(Input, Period).GetLastValues("H", (int)ValuesCount);

//вычисляем максимальное и минимальные значение H, L для ValuesCount последних значений серий
double maxH = lastHVal[ValuesCount - 1].Y, minL = lastLVal[ValuesCount - 1].Y;
for (int x = 1; x < ValuesCount; x++)
{
   maxH = Math.Max(maxH, lastHVal[x].Y);
   minL = Math.Min(minL, lastLVal[x].Y);
}

var last = lastHVal[ValuesCount - 1].X > lastLVal[ValuesCount - 1].X ? lastHVal[ValuesCount - 1].Y : lastLVal[ValuesCount - 1].Y;

if ( last == lastHVal[ValuesCount - 1].Y ) D = maxH - minL;
if ( last == lastLVal[ValuesCount - 1].Y ) U = maxH - minL;

}


Логику не разбираю и не вникаю!

Привел это как рабочий вариант примера получения минимального и максимального значения из серии значений индикаторов.

У себя сможете аналогично применить в вашем коде и подстроить под логику вашего индикатора.
никогда такого не было и вот опять

Аватара пользователя
Tyler_Durden
Сообщения: 68
Зарегистрирован: 01 дек 2017, 20:42
Благодарил (а): 6 раз

Re: Как выбрать меньшее значение?

Непрочитанное сообщение Tyler_Durden » 22 мар 2018, 12:57

Евгений, спасибо большое за ответ.

я только не понял момент, он будет вычитать из максимального сигнала [H] минимальный сигнал [Low]

и все это ( как Н так и L ) из последних x<ValuesCount

а я спрашивал о том , чтобы это вычиталось из последнего ПОЯВИВШЕГОСЯ СИГНАЛА (через Math.Abs как как важно абсолютное значение разницы)

То есть из

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

var lastLVal = MY.indicator(Input).GetLastValues ("L", 1)[0];


как тут это условие прописать?

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

Re: Как выбрать меньшее значение?

Непрочитанное сообщение evge » 22 мар 2018, 13:18

я дал выше пример как вычислить максимум \ минимум, вычитать можно из чего угодно. Если хотите, то вычитайте из последнего "сигнала".

Tyler_Durden писал(а):

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

var lastLVal = MY.indicator(Input).GetLastValues ("L", 1)[0];

как тут это условие прописать?


выше оно есть по тексту в приведенном примере

lastLVal[lastLVal.Count - 1]

равноценно в данном случае для кода выше

lastLVal[lastLVal.Count - 1].Y - значение последнего "сигнала"
никогда такого не было и вот опять

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

Re: Как выбрать меньшее значение?

Непрочитанное сообщение evge » 22 мар 2018, 13:25

Tyler_Durden писал(а):через Math.Abs как как важно абсолютное значение разницы


у вас в индикаторе бывают случаи кода High < Low ?
никогда такого не было и вот опять

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

Re: Как выбрать меньшее значение?

Непрочитанное сообщение evge » 22 мар 2018, 13:38

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

function Initialize()
{
IndicatorName = "test1";
PriceStudy = false;
AddInput("Input", Inputs.Candle);
AddSeries("U", DrawAs.Histogram, Color.Green);
AddSeries("D", DrawAs.Histogram, Color.Red);

AddParameter("Period", 3);
AddParameter("ValuesCount", 3);
}

function Evaluate()
{

var lastLVal = MY.Fractal(Input, Period).GetLastValues("L", (int)ValuesCount);
var lastHVal = MY.Fractal(Input, Period).GetLastValues("H", (int)ValuesCount);

//вычисляем максимальное и минимальные значение H, L для ValuesCount последних значений серий
double maxH = lastHVal[ValuesCount - 1].Y, minL = lastLVal[ValuesCount - 1].Y;
for (int x = 1; x < ValuesCount; x++)
{
   maxH = Math.Max(maxH, lastHVal[x].Y);
   minL = Math.Min(minL, lastLVal[x].Y);
}

var last = lastHVal[ValuesCount - 1].X > lastLVal[ValuesCount - 1].X;

if ( last ) D = maxH - minL; else U = maxH - minL;
//if ( last ) D = lastHVal[ValuesCount - 1].Y - minL; else U = maxH - lastLVal[ValuesCount - 1].Y;

// если нужно последнее, а не максимум из последних, то
// можете maxH заменять на lastHVal[ValuesCount - 1].Y и \ или minL заменять на lastLVal[ValuesCount - 1].Y

// например, выше строку можно закомментировать, а ниже раскомментировать и тогда будет показываться разница между последним Максимумом и минимумом из последних минимумов ValuesCount, и наоборот для последнего минимума

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

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

Re: Как выбрать меньшее значение?

Непрочитанное сообщение evge » 22 мар 2018, 13:56

перепроверил ещё раз!

оказывается оно хранит в обратном порядке в отличие от серий.

т.е. 0 это не последнее значение, последнее у нас будет вот так

lastHVal[ValuesCount - 1].Y

lastLVal[ValuesCount - 1].Y

ну, а вообще, конечно возможно стольких значений и нет в данных и поэтому ещё более правильно проверять есть ли вообще там данные и количество получать через .Count

lastHVal[lastHVal.Count - 1].Y

lastLVal[lastLVal.Count - 1].Y
никогда такого не было и вот опять

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

Re: Как выбрать меньшее значение?

Непрочитанное сообщение evge » 22 мар 2018, 14:04

Функция GetLastValues() конечно странная, получает свежие данные (будущего) при вызове её в прошлом.

Т.е. даже 100-500 баров назад, выполняя GetLastValues() индикаторам, мы получим данные будущего :), похоже на ошибку в АД4, не знаю и не уверен точно.
никогда такого не было и вот опять

Аватара пользователя
Tyler_Durden
Сообщения: 68
Зарегистрирован: 01 дек 2017, 20:42
Благодарил (а): 6 раз

Re: Как выбрать меньшее значение?

Непрочитанное сообщение Tyler_Durden » 22 мар 2018, 20:57

Евгений , спасибо большое за ответ !


Вернуться в «Общие вопросы по разработке»

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

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