2. Да, можно использовать.
3. Пример здесь - http://forexsystems.ru/phpBB/viewtopic.php?t=622&postdays=0&postorder=asc&highlight=tsi&start=30
Rosh, поправь меня, если ошибаюсь по поводу вопроса 1.
Можно и не использовать дополнительный индикатор, а просто
использовать эти массивы в качестве возвращаемых аргументов
своих функций, к которым обращение идет по ссылке, а ля Си. Вообще говоря, в MQL4 эта возможность вроде как не документирована,
хотя в одном из примеров в Help, ArrayCopySeries(), видно, что пользовательскую функцию можно объявить с аргументом
с обращением по ссылке (через одиночный амперсанд). Есть еще
как пример библиотека функций быстрого преобразования Фурье
https://www.mql5.com/en/code/7722, автор которой работает с массивами таким методом.
Разумеется, эти массивы не будут отображаться на чарте.
Ну.... там вылезает еще один .... проблем, с оптимизацией вычислений. (Не вникал , сказал что думаю).
А вот теперь и мне стало интересно. И что же там за проблема такая?
Оптимизация алгоритма, ресурсы начнет жрать по экспоненте от количества баров нв графике. Для советников в тестере это будет просто убийца. Встатьте в любой пустой советник вызов индикатора AMA из CodeBase и запустите тестирование (а лучше оптимизацию).
На счет АМА не знаю, но библиотеки быстрого преобразования Фурье просто "летают" в тестере. :) Конечно многое зависит еще от самого кода эксперта...
//+------------------------------------------------------------------+ //| TestAMA.mq4 | //| Rosh | //| http://www.alpari-idc.ru/ru/experts/articles/ | //+------------------------------------------------------------------+ #property copyright "Rosh" #property link "http://www.alpari-idc.ru/ru/experts/articles/" //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Print("Начало"); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- Print("Финиш"); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- double val; val=iCustom(Symbol(),0,"AMA",0,1); //---- return(0); } //+------------------------------------------------------------------+
и код индикатора
//+------------------------------------------------------------------+ //| AMA.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| https://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, by konKop,wellx" #property link "https://www.metaquotes.net/" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Sienna #property indicator_color2 DeepSkyBlue #property indicator_color3 Gold //---- input parameters extern int periodAMA=9; extern int nfast=2; extern int nslow=30; extern double G=2.0; extern double dK=2.0; //---- buffers double kAMAbuffer[]; double kAMAupsig[]; double kAMAdownsig[]; //+------------------------------------------------------------------+ int cbars=0, prevbars=0, prevtime=0; double slowSC,fastSC; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE,0,2); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,159); SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2,159); //SetIndexDrawBegin(0,nslow+nfast); SetIndexBuffer(0,kAMAbuffer); SetIndexBuffer(1,kAMAupsig); SetIndexBuffer(2,kAMAdownsig); IndicatorDigits(4); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int i,pos=0; double noise=0.000000001,AMA,AMA0,signal,ER; double dSC,ERSC,SSC,ddK; if (prevbars==Bars) return(0); //---- TODO: add your code here slowSC=(2.0 /(nslow+1)); fastSC=(2.0 /(nfast+1)); cbars=IndicatorCounted(); if (Bars<=(periodAMA+2)) return(0); //---- check for possible errors if (cbars<0) return(-1); //---- last counted bar will be recounted if (cbars>0) cbars--; pos=Bars-periodAMA-2; AMA0=Close[pos+1]; while (pos>=0) { if(pos==Bars-periodAMA-2) AMA0=Close[pos+1]; signal=MathAbs(Close[pos]-Close[pos+periodAMA]); noise=0.000000001; for(i=0;i<periodAMA;i++) { noise=noise+MathAbs(Close[pos+i]-Close[pos+i+1]); }; ER =signal/noise; dSC=(fastSC-slowSC); ERSC=ER*dSC; SSC=ERSC+slowSC; AMA=AMA0+(MathPow(SSC,G)*(Close[pos]-AMA0)); kAMAbuffer[pos]=AMA; ddK=(AMA-AMA0); if ((MathAbs(ddK)) > (dK*Point) && (ddK > 0)) kAMAupsig[pos] =AMA; else kAMAupsig[pos]=0; if ((MathAbs(ddK)) > (dK*Point) && (ddK < 0)) kAMAdownsig[pos]=AMA; else kAMAdownsig[pos]=0; AMA0=AMA; pos--; }; //---- prevbars=Bars; return(0); }
Я просто хочу сказать, что можно использовать простые массивы для промежуточных расчетов.
Только злоупотреблять не нужно и, по возможности писать оптимальный код. И все будет нормально работать...
Насколько я понял он не оптимизирован для быстрого вычисления и просчитывается полностью на каждом тике. Это вероятно вариант когда-то кем-то переделанный из индикатора еще под MT3.
У меня AMA оптимизированный, пересчитывает только последние измененные бары, он считается очень быстро (т.е. полный просчет только на первом запуске).
Кстати если для работы не нужны данные последнего формирующегося бара (работаем только по сформированной истории), то его можно еще ускорить исключив из вычислений последний бар и он будет фактически пересчитывать только сменяющийся бар один раз при формировании нового, остальное время расчет будет вообще пропускаться.
В общем как всегда - эффективный код писать надо. :)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
2. Можно ли использовать простые массивы для промежуточных расчетов индикаторных буфферов.
3. Как это будет выглядеть в коде и что нужно учесть
С уважением
Максим
kotmot@bk.ru