FX Fish_v1
Download scriptThis technical indicator is designed to analyze price movements and provide visual signals for potential trading opportunities. It operates by calculating the relative position of the current market price compared to a specific range of recent historical data, translating that movement into a dynamic histogram.
Core Logic and Data Processing
The script begins by defining a look-back period (a set number of previous candles) to establish a "boundary" for the market. It identifies the highest high and the lowest low within this timeframe to create a price corridor.
Based on user preferences, the tool selects a specific reference point from each candle—such as the closing price, the opening price, or an average of several points (High, Low, Open, Close). By comparing this reference point against the established high/low boundaries, the script determines where the price is currently sitting within its recent range.
The Calculation Mechanism
The tool uses a two-step mathematical transformation to smooth out market noise:
- Relative Positioning: It calculates how far the current price has moved away from the center of the high/low range. This value is then "smoothed" using a weighted formula that ensures the movement isn't overly reactive to tiny, insignificant flickers in price.
- Logarithmic Scaling: The smoothed position is converted into a logarithmic scale. This helps normalize the data, making it easier to see significant trends while minimizing the impact of extreme outliers.
The results are displayed in a separate window as a histogram:
- Lime (Green): Indicates bullish momentum or positive positioning.
- Red: Indicates bearish momentum or negative positioning.
Signal Generation
The script identifies specific trading triggers by looking for "momentum shifts"—moments where the trend changes direction rapidly. It looks for three specific scenarios to provide visual alerts on the chart:
- Buy Signals: Triggered when the current momentum is strongly positive and shows a distinct upward turn compared to the previous two points in time, exceeding a specific intensity threshold.
- Sell Signals: Triggered when the current momentum is strongly negative and shows a distinct downward turn compared to the previous two points in time, exceeding that same intensity threshold.
- Exit Signals: The logic also monitors for "crosses" where the momentum switches from positive to negative (or vice versa). These are flagged as exit points to indicate that the current trend may be losing steam or reversing.
Visual Presentation
For the end-user, the script automates the heavy lifting of data analysis by placing text labels directly on the chart. If enabled, it will print "BUY AT," "SELL AT," or "EXIT AT" along with the specific price at the moment the mathematical conditions are met. This allows traders to quickly identify where the tool suggests a trend shift is occurring without having to manually interpret the histogram values.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
// FX_FISH
#property copyright "Copyright © 2005, Kiko Segui"
#property link "webtecnic@terra.es"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_level1 0
#property indicator_level2 0.30
#property indicator_level3 -0.30
double buffer1[];
double buffer2[];
extern int period=10;
extern int price=0; // 0 or other = (H+L)/2
// 1 = Open
// 2 = Close
// 3 = High
// 4 = Low
// 5 = (H+L+C)/3
// 6 = (O+C+H+L)/4
// 7 = (O+C)/2
extern bool Mode_Fast= False;
extern bool Signals= False;
int init()
{
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2,Lime);
SetIndexBuffer(0,buffer1);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
SetIndexBuffer(1,buffer2);
return(0);
}
int deinit()
{
int i;
double tmp;
for (i=0;i<Bars;i++)
{
ObjectDelete("SELL SIGNAL: "+DoubleToStr(i,0));
ObjectDelete("BUY SIGNAL: "+DoubleToStr(i,0));
ObjectDelete("EXIT: "+DoubleToStr(i,0));
}
return(0);
}
double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
int buy=0,sell=0;
int start()
{
int i;
int barras;
double _price;
double tmp;
double MinL=0;
double MaxH=0;
double Threshold=1.2;
barras = Bars;
if (Mode_Fast)
barras = 100;
i = 0;
while(i<barras)
{
MaxH = High[Highest(NULL,0,MODE_HIGH,period,i)];
MinL = Low[Lowest(NULL,0,MODE_LOW,period,i)];
switch (price)
{
case 1: _price = Open[i]; break;
case 2: _price = Close[i]; break;
case 3: _price = High[i]; break;
case 4: _price = Low[i]; break;
case 5: _price = (High[i]+Low[i]+Close[i])/3; break;
case 6: _price = (Open[i]+High[i]+Low[i]+Close[i])/4; break;
case 7: _price = (Open[i]+Close[i])/2; break;
default: _price = (High[i]+Low[i])/2; break;
}
Value = 0.33*2*((_price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;
Value=MathMin(MathMax(Value,-0.999),0.999);
Fish = 0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
buffer1[i]= 0;
buffer2[i]= 0;
if ( (Fish<0) && (Fish1>0))
{
if (Signals)
{
ObjectCreate("EXIT: "+DoubleToStr(i,0),OBJ_TEXT,0,Time[i],_price);
ObjectSetText("EXIT: "+DoubleToStr(i,0),"EXIT AT "+DoubleToStr(_price,4),7,"Arial",White);
}
buy = 0;
}
if ((Fish>0) && (Fish1<0))
{
if (Signals)
{
ObjectCreate("EXIT: "+DoubleToStr(i,0),OBJ_TEXT,0,Time[i],_price);
ObjectSetText("EXIT: "+DoubleToStr(i,0),"EXIT AT "+DoubleToStr(_price,4),7,"Arial",White);
}
sell = 0;
}
if (Fish>=0)
{
buffer1[i] = Fish;
}
else
{
buffer2[i] = Fish;
}
tmp = i;
if ((Fish<-Threshold) &&
(Fish>Fish1) &&
(Fish1<=Fish2))
{
if (Signals)
{
ObjectCreate("SELL SIGNAL: "+DoubleToStr(i,0),OBJ_TEXT,0,Time[i],_price);
ObjectSetText("SELL SIGNAL: "+DoubleToStr(i,0),"SELL AT "+DoubleToStr(_price,4),7,"Arial",Red);
}
sell = 1;
}
if ((Fish>Threshold) &&
(Fish<Fish1) &&
(Fish1>=Fish2))
{
if (Signals)
{
ObjectCreate("BUY SIGNAL: "+DoubleToStr(i,0),OBJ_TEXT,0,Time[i],_price);
ObjectSetText("BUY SIGNAL: "+DoubleToStr(i,0),"BUY AT "+DoubleToStr(_price,4),7,"Arial",Lime);
}
buy=1;
}
Value1 = Value;
Fish2 = Fish1;
Fish1 = Fish;
i++;
}
return(0);
}
//+------------------------------------------------------------------+
Comments