Страница 2 из 3

Re: Опять про вызов индикатора от индикатора

Добавлено: 19 мар 2021, 21:11
evge

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

function Initialize()
{
IndicatorName = "IndexDemo";
PriceStudy = false;
AddInput("Input", Inputs.Candle);
AddSeries("CurrentIndex_", DrawAs.Line, Color.Green);
AddSeries("MaxIndex_", DrawAs.Line, Color.Red);
AddParameter("Period", 2500, 2);
}

function Evaluate()
{

CurrentIndex_ = CurrentIndex;
MaxIndex_ = MaxIndex;

}


IndexDemo-01.png
IndexDemo-01.png (39.01 КБ) 13265 просмотров

Re: Опять про вызов индикатора от индикатора

Добавлено: 19 мар 2021, 23:50
alex_m
Господа, это просто фантастика, спасибо огромное за пояснения!

Re: Опять про вызов индикатора от индикатора

Добавлено: 20 мар 2021, 10:07
alex_m
Итак, поменял название параметров, добавил еще на всякий случай проверку

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

if (CurrentIndex < MACD_sign_period) return;

в _my_MA_MA_MACD, вроде - работает!
Это я так понимаю как я то специфика АД4, с пересечением имен параметров в разных индикаторах? В стратегиях тоже таког нужно избегать? Потому что есть у меня одна стратегия, которая просто перестала даже тестироваться, после окна Тестирование ничего не происходит. Не пойму почему и не пойму где рантайм логи, связанные с выполнением стратегий искать.

Re: Опять про вызов индикатора от индикатора

Добавлено: 20 мар 2021, 10:16
alex_m
И еще один вопрос общего характера, на примере кода из обсуждаемого тут индикатора.

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

function Evaluate()
{
   if (CurrentIndex < MACD_sign_period) return;
 
     var MA_diff = MY._my_MA_MA_diff(Input,MA_fast_type,MA_fast_period,MA_slow_type,MA_slow_period);
   var sign_line = SMA(MA_diff, MACD_sign_period);
   
   if (MACD_sign_type == 1)
   {
      sign_line = SMA(MA_diff, MACD_sign_period);
   }
   else if (MACD_sign_type == 2)
   {
      sign_line = EMA(MA_diff, MACD_sign_period);
   }
   else if (MACD_sign_type == 3)
   {
      sign_line = WMA(MA_diff, MACD_sign_period);
   }
   else
   {
      sign_line = SMA(MA_diff, MACD_sign_period);
   }
   
   MACD_Line = MA_diff[0];
   MACD_Sign = sign_line[0];
}


При объявлении переменных без явного типа, с помощью var я вызываю

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

var sign_line = SMA(MA_diff, MACD_sign_period);

Делаю это потому, что компилятор просит типизирвоать переменную при ее инициализации. Логично. Типизирую я с помощью вызова SMA, так же предполагая, что возвращаемый тим EMA и WMA такой же. В результате это так и есть, так как код работает.

Вопрос, а где посмотреть, какой тип возвращают эти функции, чтобы при объявлении переменных в явном виде его задавть? Мне не очень нравится такой подход с неявной типизацией. В доке есть только такое описание вызова встроенных индикаторов, но оно ответа не дает. Или дает, я просто не пониманию?

screen5.jpg
screen5.jpg (53.97 КБ) 13150 просмотров

Re: Опять про вызов индикатора от индикатора

Добавлено: 20 мар 2021, 16:30
BugsDigger
Документация явных типов не приводит.
Можно смотреть дизассемблером ILspy, если квалификация позволяет.
Для C# автоматическая типизация - абсолютно нормальное явление.
Типы рядов вы можете также увидеть в каком-то моем коде (я как раз чарез дизассемблер смотрел), например:

viewtopic.php?t=903

Входные данные (Input) TA.Script.AdsInput
Выходная серия TA.Script.XSeries

Насчет имен параметров - тоже сталкивался иногда; очевидно, какие-то конфликты с глобальными символами самого терминала.

Мало того, был глюк с тем, что я вставлял комменты в инициализацию, после чего были ошибки компиляции. М.б. уже исправили, но стараюсь все же там ничего лишнего не писать. Проблема м.б. связана с тем, что код индикатора, как я понимаю, компилируется не напрямую, а на его основе генерируется некоторый промежуточный текст, который уже, собственно, компилируется, и тут какие-то не предвиденные разработчиками комбинации получаются.

Re: Опять про вызов индикатора от индикатора

Добавлено: 21 мар 2021, 21:58
alex_m
Большое спасибо за помощь, разбираюсь дальше.

Re: Опять про вызов индикатора от индикатора

Добавлено: 28 мар 2021, 17:57
evge
BugsDigger писал(а):Понятно, что работа с такими объемами данных с практической точки зрения бессмысленна. Поэтому для счета индикатора в буфер данных берется некоторое ограниченное количество точек, а именно MaxIndex+1 (MaxIndex - некоторое предопределенное "разумно-достаточное" число, что-то вроде ~5000).


Протестировал одну стратегию на 20 тысяч баров и вывел её график отчета и что-то он подтормаживал хорошо.
Вывел на него IndexDemo индикатор, а там:

IndexDemo-02.png
IndexDemo-02.png (27.02 КБ) 12573 просмотра


т.е. что-то поменяли в плане лимитов подгружаемых баров графика.

Re: Опять про вызов индикатора от индикатора

Добавлено: 29 мар 2021, 06:42
BugsDigger
В режиме тестирования индикаторы вначале вычисляются, затем по ним идет имитация деятельности (именно поэтому индикаторы, которые меняют свои прошлые значения тестировать не получится.), так что для теста возможны другие лимиты (если они вообще есть) на "глубину" данных.

Что будет, если период тестирования весьма велик? Ясное дело, посчитанные индикаторы будут занимать много памяти (посмотрите в диспетчере задач), и, соответственно, система может начать тормозить из-за свопа.

Re: Опять про вызов индикатора от индикатора

Добавлено: 29 мар 2021, 07:11
evge
при 64 гб оперативной памяти свопить?

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

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

не стал бы смотреть какие индексы у баров, если бы не заметил что АД4 прилично по времени стал "задумываться" при выводе графика после тестирования большого периода.

Возможно, снято ограничение на 5000 баров. Даже выше тест индикатора на графике выдал больше 5000, хотя через параметры я запросил 5000. Но не стал проверять больше тогда.

Re: Опять про вызов индикатора от индикатора

Добавлено: 29 мар 2021, 07:29
BugsDigger
У меня всего 8 Гб, хотя и 64 забить, наверное, нетрудно.
Насчет медленного отображения можно предположить, что м.б. что-то порушилось в логике проверки ДО рисования (если таковая логика вообще есть), т.е. стоит ли делать отрисовку (за пределами окна или если окна нет в принципе, как в тестировании)... Темна вода...