UT_FAST1
Download scriptThis script is a sophisticated technical indicator designed for the MetaTrader platform. It functions by processing market price data through multiple layers of mathematical filters to identify trends and momentum. Below is a professional breakdown of its logic:
Core Functionality
The script acts as an advanced trend-following and smoothing engine. It doesn't just look at the current price; it analyzes historical price behavior to calculate "smoothed" values that filter out market noise while highlighting significant price movements.
Key Logic Components
1. Multi-Source Data Processing The script is designed to handle different types of price data (such as Open, High, Low, or Close prices). It can be configured to prioritize one over the other, allowing users to tailor the sensitivity of the indicator based on their specific trading style.
2. Advanced Smoothing Algorithms At its heart, the script employs complex mathematical operations—including logarithms, square roots, and power functions—to calculate a "Smooth" value. Rather than using a simple moving average, it uses these formulas to adapt to different market conditions, ensuring that the resulting lines on your chart are neither too jagged (noisy) nor too lagging (slow).
3. Dynamic Trend Detection The script features a logic path that compares recent price changes against historical averages. It calculates whether current momentum is accelerating or decelerating by comparing multiple points in time. This helps in identifying "pivot" points where a trend might be shifting.
4. Dual-Layer Analysis (The 'Fast' vs. 'Slow' Logic) The script contains two distinct modes of operation:
- Standard Mode: Uses a complex set of calculations to generate a primary trend line.
- Alternative Mode (JMA/Linear): A specific secondary logic path that applies specialized smoothing techniques. This allows the indicator to provide a "secondary opinion" on price action, which can help traders confirm signals from the primary line.
5. Visualization and Thresholds The script is programmed to display specific horizontal levels (thresholds) on a separate window. These levels act as visual boundaries, helping traders quickly identify zones of overextension or equilibrium without having to calculate the numbers manually.
Summary for the Trader
In simple terms, this script takes messy market data and "cleans" it using high-level math. It produces smooth lines that represent the "true" direction of the price. By combining these smoothed lines with automated trend detection, it helps traders see where the market is going while ignoring the minor fluctuations that often lead to false signals.
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
double arr_global_76[];
extern int key = 111699999996;
extern double Smooth = 1;
double var_92 = 100;
extern int bars = 1000;
int var_104 = 0;
extern int Progression = 3;
extern int Len = 12;
extern int Sensitivity = 30;
int var_120 = 1,var_124 = 0;
double var_128 = 0,var_136,var_144,var_152,var_160,var_168,var_176,var_184,var_192,var_200 = 0;
int var_208,var_212,var_216,var_220,var_224,var_228,var_232,var_236,var_240,var_244;
int var_248,var_252,var_256 = 0;
int var_512,var_516,var_520,var_524,var_528,var_532,var_552;
int var_468,var_472,var_476,var_480,var_484,var_488 = 0;
double var_260,var_268,var_276,var_284,var_292,var_300,var_308,var_316,var_324,var_332;
double var_340,var_348,var_356,var_364,var_372,var_380,var_388,var_396,var_404,var_412;
double var_420,var_428,var_436,var_444,var_452,var_460 = 0,var_536,var_544;
double arr_global_492[128];
double arr_global_496[128];
double arr_global_500[11];
double arr_global_504[62];
double arr_global_508[300];
double arr_global_556[];
double arr_global_560[15000];
double arr_global_564[15000];
double var_568,var_576 = 0,var_584,var_592,var_600 = 0;
//+------------------------------------------------------------------+
int init()
{
for (var_208 = 0; var_208 < 128; var_208++) arr_global_492[var_208] = 0.0;
for (var_208 = 0; var_208 < 128; var_208++) arr_global_496[var_208] = 0.0;
for (var_208 = 0; var_208 < 11; var_208++) arr_global_500[var_208] = 0.0;
for (var_208 = 0; var_208 < 62; var_208++) arr_global_504[var_208] = 0.0;
SetIndexStyle(0,DRAW_LINE,0,1);
SetIndexBuffer(0,arr_global_76);
SetIndexStyle(1,DRAW_LINE,0,1);
SetIndexBuffer(1,arr_global_556);
SetLevelValue(0,4);
SetLevelValue(1,8);
SetLevelValue(2,23);
SetLevelValue(3,27);
SetLevelValue(4,6);
SetLevelValue(5,25);
return(0);
}
//+------------------------------------------------------------------+
int start()
{
int var_start_0,var_start_4,var_start_8;
switch (key)
{
case 34562788: loadJMA(); break;
default: if (Bars > var_600)
{
var_600 = Bars;
int var_start_16 = 0;
for (int var_start_20 = 0; var_start_20 < bars; var_start_20++)
{
var_584 = 0;
var_592 = 0;
for (int var_start_24 = Len; var_start_24 <= Len + Progression * Sensitivity; var_start_24 = var_start_24 + Progression)
{
var_568 = iCustom(NULL,0,"UT_FAST1",34562788,var_start_24,bars,0,var_start_20);
var_576 = iCustom(NULL,0,"UT_FAST1",34562788,var_start_24,bars,0,var_start_20 + 1);
if (var_568 > var_576) var_584++; else var_592++;
}
arr_global_560[var_start_20] = var_584;
arr_global_564[var_start_20] = var_592;
}
lenars(arr_global_560,1);
//lenars(arr_global_564,2);
return(0);
}
}
return(0);
}
//+------------------------------------------------------------------+
void loadJMA()
{
double var_loadJMA_0;
var_220 = 63;
var_224 = 64;
if (var_120 == 1)
{
for (var_208 = 1; var_208 < var_220 + 1; var_208++) arr_global_492[var_208] = -1000000;
for (var_208 = var_224; var_208 < 128; var_208++) arr_global_492[var_208] = 1000000;
var_120 = 0;
}
var_468 = 1;
if (Smooth <= 1.0) var_380 = 0.0000000001; else var_380 = (Smooth - 1.0) / 2;
if (var_92 < -100.0) { var_268 = 0.5; } else
if (var_92 > 100.0) { var_268 = 2.5; } else
{ var_268 = var_92 / 100 + 1.5; }
var_144 = MathLog(MathSqrt(var_380));
var_152 = var_144;
if ((var_144 / MathLog(2.0) + 2.0) < 0.0) var_160 = 0; else var_160 = var_152 / MathLog(2.0) + 2.0;
var_404 = var_160;
if ((var_404 - 2.0) >= 0.5) var_388 = var_404 - 2.0; else var_388 = 0.5;
var_372 = MathSqrt(var_380) * var_404;
var_396 = var_372 / (var_372 + 1.0);
var_380 = var_380 * 0.9;
var_332 = var_380 / (var_380 + 2.0);
var_468 = 1;
if (bars == 0) bars = Bars;
for (var_124 = bars + 1000; var_124 >= 0; var_124--)
{
switch (var_104)
{
case 0: var_loadJMA_0 = Close[var_124]; break;
case 1: var_loadJMA_0 = Open[var_124]; break;
case 2: var_loadJMA_0 = (Open[var_124] + High[var_124] + Low[var_124] + Close[var_124]) / 4; break;
case 3: var_loadJMA_0 = High[var_124]; break;
case 4: var_loadJMA_0 = Low[var_124]; break;
default:var_loadJMA_0 = Close[var_124];
}
if (var_484 < 61)
{
var_484 = var_484 + 1;
arr_global_504[var_484] = var_loadJMA_0;
}
if (var_484 > 30)
{
if (var_468 != 0)
{
var_468 = 0;
var_212 = 0;
for (var_208 = 1; var_208 < 30; var_208++)
{
if (arr_global_504[var_208 + 1] != arr_global_504[var_208]) var_212 = 1;
}
var_472 = var_212 * 30;
if (var_472 == 0) var_308 = var_loadJMA_0; else var_308 = arr_global_504[1];
var_276 = var_308;
if (var_472 > 29) var_472 = 29;
}
else
{
var_472 = 0;
}
for (var_208 = var_472; var_208 >= 0; var_208--)
{
if (var_208 == 0) var_260 = var_loadJMA_0; else var_260 = arr_global_504[31 - var_208];
var_292 = var_260 - var_276;
var_324 = var_260 - var_308;
if (MathAbs(var_292) > MathAbs(var_324)) var_152 = MathAbs(var_292); else var_152 = MathAbs(var_324);
var_412 = var_152;
var_136 = var_412 + 0.0000000001;
if (var_236 <= 1) var_236 = 127; else var_236--;
if (var_240 <= 1) var_240 = 10; else var_240--;
if (var_256 < 128) var_256++;
var_176 = var_176 + var_136 - arr_global_500[var_240];
arr_global_500[var_240] = var_136;
if (var_256 > 10) var_200 = var_176 * 0.1; else var_200 = var_176 / var_256;
if (var_256 == 30) var_516 = 0;
if (var_256 > 127)
{
var_184 = arr_global_496[var_236];
arr_global_496[var_236] = var_200;
var_252 = 64;
var_244 = var_252;
var_512 = var_244;
while (var_252 > 1)
{
if (arr_global_492[var_244] < var_184)
{
var_252 = var_252 / 2;
var_244 = var_244 + var_252;
var_512 = var_244;
}
else
{
if (arr_global_492[var_244] <= var_184)
{
var_252 = 1;
}
else
{
var_252 = var_252 / 2;
var_244 = var_244 - var_252;
var_512 = var_244;
}
}
}
}
else
{
arr_global_496[var_236] = var_200;
if (var_220 + var_224 > 127)
{
var_224--;
var_244 = var_224;
var_512 = var_244;
}
else
{
var_220++;
var_244 = var_220;
var_512 = var_244;
}
if (var_220 > 96) var_228 = 96; else var_228 = var_220;
if (var_224 < 32) var_232 = 32; else var_232 = var_224;
}
var_252 = 64;
var_248 = var_252;
while (var_252 > 1)
{
if (arr_global_492[var_248] >= var_200)
{
if (arr_global_492[var_248 - 1] <= var_200)
{
var_252 = 1;
}
else
{
var_252 = var_252 / 2;
var_248 = var_248 - var_252;
}
}
else
{
var_252 = var_252 / 2;
var_248 = var_248 + var_252;
}
if ((var_248 == 127) && (var_200 > arr_global_492[127])) var_248 = 128;
}
if (var_256 > 127)
{
if (var_244 >= var_248)
{
if ((var_228 + 1 > var_248) && (var_232 - 1 < var_248))
{
var_192 = var_192 + var_200;
}
else
{
if ((var_232 > var_248) && (var_232 - 1 < var_244))
{
var_192 = var_192 + arr_global_492[var_232 - 1];
}
}
}
else
{
if (var_232 >= var_248)
{
if ((var_228 + 1 < var_248) && (var_228 + 1 > var_244))
{
var_192 = var_192 + arr_global_492[var_228 + 1];
}
}
else
{
if (var_228 + 2 > var_248)
{
var_192 = var_192 + var_200;
}
else
{
if ((var_228 + 1 < var_248) && (var_228 + 1 > var_244))
{
var_192 = var_192 + arr_global_492[var_228 + 1];
}
}
}
}
if (var_244 > var_248)
{
if ((var_232 - 1 < var_244) && (var_228 + 1 > var_244))
{
var_192 = var_192 - arr_global_492[var_244];
}
else
{
if ((var_228 < var_244) && (var_228 + 1 > var_248))
{
var_192 = var_192 - arr_global_492[var_228];
}
}
}
else
{
if ((var_228 + 1 > var_244) && (var_232 - 1 < var_244))
{
var_192 = var_192 - arr_global_492[var_244];
}
else
{
if ((var_232 > var_244) && (var_232 < var_248))
{
var_192 = var_192 - arr_global_492[var_232];
}
}
}
}
if (var_244 <= var_248)
{
if (var_244 >= var_248)
{
arr_global_492[var_248] = var_200;
}
else
{
for (var_516 = var_244 + 1; var_516 < var_248; var_516++) { arr_global_492[var_516 - 1] = arr_global_492[var_516]; }
arr_global_492[var_248 - 1] = var_200;
}
}
else
{
for (var_520 = var_244 - 1; var_520 >= var_248; var_520--) { arr_global_492[var_520 + 1] = arr_global_492[var_520]; }
arr_global_492[var_248] = var_200;
}
if (var_256 <= 127)
{
var_192 = 0;
for (var_528 = var_232; var_528 < var_228 + 1; var_528++) var_192 = var_192 + arr_global_492[var_528];
}
var_348 = var_192 / (var_228 - var_232 + 1);
if (var_488 + 1 > 31) var_488 = 31; else var_488++;
if (var_488 <= 30)
{
if (var_292 > 0.0) var_276 = var_260; else var_276 = var_260 - var_292 * var_396;
if (var_324 < 0.0) var_308 = var_260; else var_308 = var_260 - var_324 * var_396;
var_436 = var_loadJMA_0;
if (var_488 != 30) continue;
var_444 = var_loadJMA_0;
if (MathCeil(var_372) >= 1.0) var_168 = MathCeil(var_372); else var_168 = 1;
var_480 = var_168;
if (MathFloor(var_372) >= 1.0) var_152 = MathFloor(var_372); else var_152 = 1;
var_476 = var_152;
if (var_480 == var_476)
{
var_356 = 1;
}
else
{
var_168 = var_480 - var_476;
var_356 = (var_372 - var_476) / var_168;
}
if (var_476 <= 29) var_212 = var_476; else var_212 = 29;
if (var_480 <= 29) var_216 = var_480; else var_216 = 29;
var_420 = (var_loadJMA_0 - arr_global_504[var_484 - var_212]) * (1 - var_356) / var_476 + (var_loadJMA_0 - arr_global_504[var_484 - var_216]) * var_356 / var_480;
}
else
{
if (var_404 >= MathPow(MathAbs(var_412 / var_348),var_388)) var_144 = MathPow(MathAbs(var_412 / var_348),var_388); else var_144 = var_404;
if (var_144 < 1.0)
{
var_152 = 1.0;
}
else
{
if (var_404 >= MathPow(MathAbs(var_412 / var_348),var_388)) var_160 = MathPow(MathAbs(var_412 / var_348),var_388); else var_160 = var_404;
var_152 = var_160;
}
var_340 = var_152;
var_364 = MathPow(var_396,MathSqrt(var_340));
if (var_292 > 0.0) var_276 = var_260; else var_276 = var_260 - var_292 * var_364;
if (var_324 < 0.0) var_308 = var_260; else var_308 = var_260 - var_324 * var_364;
}
}
if (var_488 > 30)
{
var_300 = MathPow(var_332,var_340);
var_444 = (1 - var_300) * var_loadJMA_0 + var_300 * var_444;
var_452 = (var_loadJMA_0 - var_444) * (1 - var_332) + var_332 * var_452;
var_460 = var_268 * var_452 + var_444;
var_284 = var_300 * (-2.0);
var_316 = var_300 * var_300;
var_428 = var_284 + var_316 + 1.0;
var_420 = (var_460 - var_436) * var_428 + var_316 * var_420;
var_436 = var_436 + var_420;
}
}
var_128 = var_436;
arr_global_76[var_124] = var_128;
}
return;
}
//+------------------------------------------------------------------+
void lenars(double arr_lenars_0[], int inp_lenars_4)
{
double var_lenars_8;
var_220 = 63;
var_224 = 64;
if (var_120 == 1)
{
for (var_208 = 1; var_208 < var_220 + 1; var_208++) arr_global_492[var_208] = -1000000;
for (var_208 = var_224; var_208 < 128; var_208++) arr_global_492[var_208] = 1000000;
var_120 = 0;
}
var_468 = 1;
if (Smooth <= 1.0) var_380 = 0.0000000001; else var_380 = (Smooth - 1.0) / 2;
if (var_92 < -100.0) { var_268 = 0.5; } else
if (var_92 > 100.0) { var_268 = 2.5; } else
{ var_268 = var_92 / 100 + 1.5; }
var_144 = MathLog(MathSqrt(var_380));
var_152 = var_144;
if (var_144 / MathLog(2.0) + 2.0 < 0.0) var_160 = 0; else var_160 = var_152 / MathLog(2.0) + 2.0;
var_404 = var_160;
if (var_404 - 2.0 >= 0.5) var_388 = var_404 - 2.0; else var_388 = 0.5;
var_372 = MathSqrt(var_380) * var_404;
var_396 = var_372 / (var_372 + 1.0);
var_380 = var_380 * 0.9;
var_332 = var_380 / (var_380 + 2.0);
var_468 = 1;
if (bars == 0) bars = Bars;
for (var_124 = bars + 30; var_124 >= 0; var_124--)
{
var_lenars_8 = arr_lenars_0[var_124];
if (var_484 < 61)
{
var_484 = var_484 + 1;
arr_global_504[var_484] = var_lenars_8;
}
if (var_484 > 30)
{
if (var_468 != 0)
{
var_468 = 0;
var_212 = 0;
for (var_208 = 1; var_208 < 30; var_208++)
{
if (arr_global_504[var_208 + 1] != arr_global_504[var_208]) var_212 = 1;
}
var_472 = var_212 * 30;
if (var_472 == 0) var_308 = var_lenars_8; else var_308 = arr_global_504[1];
var_276 = var_308;
if (var_472 > 29) var_472 = 29;
}
else
{
var_472 = 0;
}
for (var_208 = var_472; var_208 >= 0; var_208--)
{
if (var_208 == 0) var_260 = var_lenars_8; else var_260 = arr_global_504[31 - var_208];
var_292 = var_260 - var_276;
var_324 = var_260 - var_308;
if (MathAbs(var_292) > MathAbs(var_324)) var_152 = MathAbs(var_292); else var_152 = MathAbs(var_324);
var_412 = var_152;
var_136 = var_412 + 0.0000000001;
if (var_236 <= 1) var_236 = 127; else var_236--;
if (var_240 <= 1) var_240 = 10; else var_240--;
if (var_256 < 128) var_256++;
var_176 = var_176 + var_136 - arr_global_500[var_240];
arr_global_500[var_240] = var_136;
if (var_256 > 10) var_200 = var_176 * 0.1; else var_200 = var_176 / var_256;
if (var_256 == 30) var_516 = 0;
if (var_256 > 127)
{
var_184 = arr_global_496[var_236];
arr_global_496[var_236] = var_200;
var_252 = 64;
var_244 = var_252;
var_512 = var_244;
while (var_252 > 1)
{
if (arr_global_492[var_244] < var_184)
{
var_252 = var_252 / 2;
var_244 = var_244 + var_252;
var_512 = var_244;
}
else
{
if (arr_global_492[var_244] <= var_184)
{
var_252 = 1;
}
else
{
var_252 = var_252 / 2;
var_244 = var_244 - var_252;
var_512 = var_244;
}
}
}
}
else
{
arr_global_496[var_236] = var_200;
if (var_220 + var_224 > 127)
{
var_224--;
var_244 = var_224;
var_512 = var_244;
}
else
{
var_220++;
var_244 = var_220;
var_512 = var_244;
}
if (var_220 > 96) var_228 = 96; else var_228 = var_220;
if (var_224 < 32) var_232 = 32; else var_232 = var_224;
}
var_252 = 64;
var_248 = var_252;
while (var_252 > 1)
{
if (arr_global_492[var_248] >= var_200)
{
if (arr_global_492[var_248 - 1] <= var_200)
{
var_252 = 1;
}
else
{
var_252 = var_252 / 2;
var_248 = var_248 - var_252;
}
}
else
{
var_252 = var_252 / 2;
var_248 = var_248 + var_252;
}
if ((var_248 == 127) && (var_200 > arr_global_492[127])) var_248 = 128;
}
if (var_256 > 127)
{
if (var_244 >= var_248)
{
if ((var_228 + 1 > var_248) && (var_232 - 1 < var_248))
{
var_192 = var_192 + var_200;
}
else
{
if ((var_232 > var_248) && (var_232 - 1 < var_244))
{
var_192 = var_192 + arr_global_492[var_232 - 1];
}
}
}
else
{
if (var_232 >= var_248)
{
if ((var_228 + 1 < var_248) && (var_228 + 1 > var_244))
{
var_192 = var_192 + arr_global_492[var_228 + 1];
}
}
else
{
if (var_228 + 2 > var_248)
{
var_192 = var_192 + var_200;
}
else
{
if ((var_228 + 1 < var_248) && (var_228 + 1 > var_244))
{
var_192 = var_192 + arr_global_492[var_228 + 1];
}
}
}
}
if (var_244 > var_248)
{
if ((var_232 - 1 < var_244) && (var_228 + 1 > var_244))
{
var_192 = var_192 - arr_global_492[var_244];
}
else
{
if ((var_228 < var_244) && (var_228 + 1 > var_248))
{
var_192 = var_192 - arr_global_492[var_228];
}
}
}
else
{
if ((var_228 + 1 > var_244) && (var_232 - 1 < var_244))
{
var_192 = var_192 - arr_global_492[var_244];
}
else
{
if ((var_232 > var_244) && (var_232 < var_248))
{
var_192 = var_192 - arr_global_492[var_232];
}
}
}
}
if (var_244 <= var_248)
{
if (var_244 >= var_248)
{
arr_global_492[var_248] = var_200;
}
else
{
for (var_516 = var_244 + 1; var_516 < var_248; var_516++) arr_global_492[var_516 - 1] = arr_global_492[var_516];
arr_global_492[var_248 - 1] = var_200;
}
}
else
{
for (var_520 = var_244 - 1; var_520 >= var_248; var_520--) arr_global_492[var_520 + 1] = arr_global_492[var_520];
arr_global_492[var_248] = var_200;
}
if (var_256 <= 127)
{
var_192 = 0;
for (var_528 = var_232; var_528 < var_228 + 1; var_528++) var_192 = var_192 + arr_global_492[var_528];
}
var_348 = var_192 / (var_228 - var_232 + 1);
if (var_488 + 1 > 31) var_488 = 31; else var_488++;
if (var_488 <= 30)
{
if (var_292 > 0.0) var_276 = var_260; else var_276 = var_260 - var_292 * var_396;
if (var_324 < 0.0) var_308 = var_260; else var_308 = var_260 - var_324 * var_396;
var_436 = var_lenars_8;
if (var_488 != 30) continue;
var_444 = var_lenars_8;
if (MathCeil(var_372) >= 1.0) var_168 = MathCeil(var_372); else var_168 = 1;
var_480 = var_168;
if (MathFloor(var_372) >= 1.0) var_152 = MathFloor(var_372); else var_152 = 1;
var_476 = var_152;
if (var_480 == var_476)
{
var_356 = 1;
}
else
{
var_168 = var_480 - var_476;
var_356 = (var_372 - var_476) / var_168;
}
if (var_476 <= 29) var_212 = var_476; else var_212 = 29;
if (var_480 <= 29) var_216 = var_480; else var_216 = 29;
var_420 = (var_lenars_8 - arr_global_504[var_484 - var_212]) * (1 - var_356) / var_476 + (var_lenars_8 - arr_global_504[var_484 - var_216]) * var_356 / var_480;
}
else
{
if (var_404 >= MathPow(MathAbs(var_412 / var_348),var_388)) var_144 = MathPow(MathAbs(var_412 / var_348),var_388); else var_144 = var_404;
if (var_144 < 1.0)
{
var_152 = 1.0;
}
else
{
if (var_404 >= MathPow(MathAbs(var_412 / var_348),var_388)) var_160 = MathPow(MathAbs(var_412 / var_348),var_388); else var_160 = var_404;
var_152 = var_160;
}
var_340 = var_152;
var_364 = MathPow(var_396,MathSqrt(var_340));
if (var_292 > 0.0) var_276 = var_260; else var_276 = var_260 - var_292 * var_364;
if (var_324 < 0.0) var_308 = var_260; else var_308 = var_260 - var_324 * var_364;
}
}
if (var_488 > 30)
{
var_300 = MathPow(var_332,var_340);
var_444 = (1 - var_300) * var_lenars_8 + var_300 * var_444;
var_452 = (var_lenars_8 - var_444) * (1 - var_332) + var_332 * var_452;
var_460 = var_268 * var_452 + var_444;
var_284 = var_300 * (-2.0);
var_316 = var_300 * var_300;
var_428 = var_284 + var_316 + 1.0;
var_420 = (var_460 - var_436) * var_428 + var_316 * var_420;
var_436 = var_436 + var_420;
}
}
var_128 = var_436;
if (inp_lenars_4 == 1) arr_global_76[var_124] = var_128; else arr_global_556[var_124] = var_128;
}
return;
}
Comments