J_TPO_v1
Download scriptThis script is a specialized technical analysis tool designed to provide visual data on a trading chart. Instead of looking at simple price movements, it analyzes the underlying structure and distribution of historical price data to identify specific market characteristics.
How the Logic Works
The tool processes market information through three primary stages:
1. Data Collection and Windowing The script looks back at a specific number of previous price points (defined by the "Len" parameter). It creates a rolling window of data, constantly updating as new price information becomes available. This ensures that the analysis is always focused on the most recent market behavior while maintaining enough historical context to be meaningful.
2. Sorting and Distribution Analysis Once the relevant data points are gathered, the script performs a complex internal organization of these prices. It identifies the relative "rank" or position of every price point within its window. By organizing the data this way, it can see not just what the prices were, but where they sit in relation to one another—effectively mapping out the density of the market activity.
3. Statistical Calculation After the data is organized, the script calculates a specific statistical value based on the variance and distribution of those prices. It measures how much the market deviates from its average behavior within that time window.
The final result is a numerical value produced for every point on your chart. If no significant data is gathered (which would result in a zero value), the script defaults to a very tiny number to ensure the visual line remains consistent and does not break.
Summary of Visual Output
The end result is a smooth line displayed in a separate window at the bottom of your trading platform. This line represents a smoothed statistical "map" of price distribution, helping traders visualize the intensity or stability of market movements rather than just the raw price fluctuations.
//+------------------------------------------------------------------+
//| J_TPO.mq4 |
//| Copyright © 2004, |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, ."
#property link ""
#property indicator_separate_window
#property indicator_minimum -1
#property indicator_maximum 1
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
//---- input parameters
extern int Len=14;
//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0, ExtMapBuffer1);
//----
return(0);
}
//+------------------------------------------------------------------+
//| J_TPO indicatop |
//+------------------------------------------------------------------+
int start()
{
//int limit;
//int counted_bars=IndicatorCounted();
//---- check for possible errors
//if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
//if(counted_bars>0) counted_bars--;
//limit=Bars-counted_bars;
//---- main loop
double f0, f8, f10, f18, f20, f28, f30, f40, k,
var14, var18, var1C, var20, var24, shift, value;
int f38, f48, var6, var12, varA, varE;
double arr0[300], arr1[300], arr2[300], arr3[300];
//f38=0;
for(int i=Bars-Len-100; i>=0; i--)
{
var14=0;
var1C=0;
if(f38==0)
{
f38=1;
f40=0;
if (Len-1>= 2) f30=Len-1;
else f30=2;
f48=f30+1;
f10=Close[i];
arr0[f38] = Close[i];
k=f48;
f18 = 12 / (k * (k - 1) * (k + 1));
f20 = (f48 + 1) * 0.5;
}
else
{
if (f38 <= f48) f38 = f38 + 1;
else f38 = f48 + 1;
f8 = f10;
f10 = Close[i];
if (f38 > f48)
{
for (var6 = 2; var6<=f48; var6++) arr0[var6-1] = arr0[var6];
arr0[f48] = Close[i];
}
else arr0[f38] = Close[i];
if ((f30 >= f38) && (f8 != f10)) f40 = 1;
if ((f30 == f38) && (f40 == 0)) f38 = 0;
}
if (f38 >= f48)
{
for (varA=1; varA<=f48; varA++)
{
arr2[varA] = varA;
arr3[varA] = varA;
arr1[varA] = arr0[varA];
}
for (varA=1; varA<=(f48-1); varA++)
{
var24 = arr1[varA];
var12 = varA;
var6 = varA + 1;
for (var6=varA+1; var6<=f48; var6++)
{
if (arr1[var6] < var24)
{
var24 = arr1[var6];
var12 = var6;
}
}
var20 = arr1[varA];
arr1[varA] = arr1[var12];
arr1[var12] = var20;
var20 = arr2[varA];
arr2[varA] = arr2[var12];
arr2[var12] = var20;
}
varA = 1;
while (f48 > varA)
{
var6 = varA + 1;
var14 = 1;
var1C = arr3[varA];
while (var14 != 0)
{
if (arr1[varA] != arr1[var6])
{
if ((var6 - varA) > 1)
{
var1C = var1C / (var6 - varA);
varE = varA;
for (varE=varA; varE<=(var6-1); varE++)
arr3[varE] = var1C;
}
var14 = 0;
}
else
{
var1C = var1C + arr3[var6];
var6 = var6 + 1;
}
}
varA = var6;
}
var1C = 0;
for (varA=1; varA<=f48; varA++)
var1C = var1C + (arr3[varA] - f20) * (arr2[varA] - f20);
var18 = f18 * var1C;
}
else
var18 = 0;
value = var18;
if (value == 0) value = 0.00001;
ExtMapBuffer1[i]=value;
}
//---- done
return(0);
}
//+------------------------------------------------------------------+
Comments