← К каталогу
Исходный код · ID 2710

JMA

jma.mq5
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

JMA — это пользовательский индикатор для платформы MetaTrader 4, разработанный Weld из Jurik Research. Он рассчитывает и отображает адаптивную скользящую среднюю JMA на основном графике на основе цен закрытия.

Индикатор имеет два настраиваемых параметра: Length (по умолчанию 14) и Phase (по умолчанию 0), которые управляют периодом сглаживания и фазовой характеристикой расчёта соответственно.

Для работы используются четыре внутренних буфера: один для основного значения JMA (отображается линией), и три вспомогательных для промежуточных вычислений. Индикатор требует минимум 30 баров истории для начала корректного отображения значений.

Расчёт адаптивно реагирует на волатильность цены, изменяя скорость сглаживания в зависимости от текущей динамики рынка.

Настройки программы

НастройкаОписание
Length Длина — Целочисленный параметр, задающий основной период сглаживания индикатора. Значение по умолчанию — 14.
Phase Фаза — Целочисленный параметр, управляющий фазовой характеристикой расчёта. Значение по умолчанию — 0.
Получить полный код

Поиск по коду файла

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Aqua

extern int       Length = 14;
extern int       Phase  = 0;

double JMAValueBuffer [];
double fC0Buffer [];
double fA8Buffer [];
double fC8Buffer [];

double list[128], ring1[128], ring2[11], buffer[62];

bool   initFlag;

int    limitValue, startValue, loopParam, loopCriteria;
int    cycleLimit, highLimit, counterA, counterB;

double cycleDelta, lowDValue, highDValue, absValue, paramA, paramB;
double phaseParam, logParam, JMAValue, series, sValue, sqrtParam, lengthDivider;

int   s58, s60, s40, s38, s68;

int init()
  {
      // код доступен только после оплаты
   }

int start()
  {
      // код доступен только после оплаты
   }

   int counted_bars = IndicatorCounted();

   if (counted_bars < 0) return (-1);
   int limit = Bars - counted_bars - 1;

   for (int shift = limit; shift >= 0; shift--) {
      series = Close [shift];

      if (loopParam < 61) { 
         loopParam++; 
         buffer [loopParam] = series; 
      } 
      if (loopParam > 30) {
         if (initFlag) { 
            initFlag = false;

            int diffFlag = 0; 
            for (int i = 1; i <= 29; i++) { 
               if (buffer [i + 1] != buffer [i]) diffFlag = 1;
            }  
            highLimit = diffFlag * 30;

            if (highLimit == 0) paramB = series;
            else paramB = buffer[1];

            paramA = paramB; 
            if (highLimit > 29) highLimit = 29; 
         } else 
            highLimit = 0;

         for (i = highLimit; i >= 0; i--) { 
			   if (i == 0) sValue = series; else sValue = buffer [31 - i]; 

			   if (MathAbs (sValue - paramA) > MathAbs (sValue - paramB)) absValue = MathAbs(sValue - paramA); else absValue = MathAbs(sValue - paramB); 
			   double dValue = absValue + 0.0000000001; //1.0e-10; 

			   if (counterA <= 1) counterA = 127; else counterA--; 
			   if (counterB <= 1) counterB = 10;  else counterB--; 
			   if (cycleLimit < 128) cycleLimit++; 
			   cycleDelta += (dValue - ring2 [counterB]); 
			   ring2 [counterB] = dValue; 
			   if (cycleLimit > 10) highDValue = cycleDelta / 10.0; else highDValue = cycleDelta / cycleLimit; 

			   if (cycleLimit > 127) { 
				   dValue = ring1 [counterA]; 
				   ring1 [counterA] = highDValue; 
				   s68 = 64; s58 = s68; 
				   while (s68 > 1) { 
					   if (list [s58] < dValue) { 
						   s68 = s68 / 2.0; 
						   s58 += s68; 
					   } else 
					   if (list [s58] <= dValue) { 
						   s68 = 1; 
					   } else { 
						   s68 = s68 / 2.0; 
						   s58 -= s68; 
					   }
               } 
            } else {
			      ring1 [counterA] = highDValue; 
			      if ((limitValue + startValue) > 127) {
				      startValue--; 
				      s58 = startValue; 
			      } else {
				      limitValue++; 
				      s58 = limitValue; 
			      }
			      if (limitValue > 96) s38 = 96; else s38 = limitValue; 
			      if (startValue < 32) s40 = 32; else s40 = startValue; 
		      }

		      s68 = 64; 
		      s60 = s68; 
		      while (s68 > 1) {
			      if (list [s60] >= highDValue) {
				      if (list [s60 - 1] <= highDValue) {
					      s68 = 1; 
				      }
				      else {
					      s68 = s68 / 2.0; 
					      s60 -= s68; 
				      }
			      }
			      else {
				      s68 = s68 / 2.0; 
				      s60 += 

Показано первые 50% кода (символов: 5816)

Открыть по тарифу

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

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
581,60₽ ≈ $7.11