FX_FISH Mod2_v2
Download scriptTechnical Overview: FX_FISH Indicator Logic
The FX_FISH script is a custom technical analysis tool designed to identify market momentum and potential entry or exit points by analyzing price action trends. Instead of looking at raw price alone, it calculates the relative position of the current price compared to recent historical extremes (the highest highs and lowest lows) over a specific timeframe.
Core Methodology
The logic functions by transforming standard price data into a normalized value. It looks back at a set number of bars (defaulting to 30) to establish a "range." By determining where the current price sits within that range, the script calculates a weighted momentum value. This value is then smoothed out using a mathematical formula (logarithmic and recursive calculations) to reduce market noise and ensure the resulting visual data is fluid rather than erratic.
Visual Representation
The indicator operates in a separate window below the main price chart. It uses two distinct histograms:
- Lime/Positive Values: These represent upward momentum or "bullish" conditions.
- Red/Negative Values: These represent downward momentum or "bearish" conditions.
- Horizontal Levels: The indicator includes specific reference levels (0.2, 0.5, 1.0 and their negative counterparts) to help users gauge the intensity of the current trend.
Signal Generation Logic
The script is designed to trigger three types of visual notifications on the chart when specific mathematical conditions are met:
1. Buy Signals A "BUY" signal is generated when the momentum value exceeds a specific positive threshold and shows a distinct accelerating move (the current value is higher than the previous two recorded points). This suggests a strong shift toward upward movement.
2. Sell Signals Conversely, a "SELL" signal appears when the momentum value drops below a negative threshold and shows a sharp downward acceleration compared to the previous two points, suggesting a significant shift toward a bearish trend.
3. Exit Notifications The logic also includes an automated "EXIT" detection system. It monitors for "crossovers"—moments where the momentum switches from positive to negative (or vice versa). When this flip occurs, the script identifies a potential point where the current trend has exhausted itself, providing a visual cue to consider closing an existing position.
Key Customizations
Users can refine the logic through several primary settings:
- Period: Adjusts how far back the indicator looks to determine high/low extremes.
- Price Type: Allows the user to choose which specific price point (Open, Close, High, Low, or averages) serves as the foundation for the calculations.
- Mode_Fast: A toggle that changes how quickly the indicator reacts to new data points.
- Signals: A master switch to turn the on-chart text labels (Buy, Sell, Exit) on or off.
// 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.2
#property indicator_level2 0.5
#property indicator_level3 1.0
#property indicator_level4 -0.2
#property indicator_level5 -0.5
#property indicator_level6 -1.0
// #property indicator_maximum 2
// #property indicator_minimum -2
double buffer1[];
double buffer2[];
extern int period=30;
extern int price=6; // 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= True;
extern bool Signals= False;
int init()
{
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3,RoyalBlue);
SetIndexBuffer(0,buffer1);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,3,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 = 1;
i = 300;
while(i>-1)
{
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 -0.5*Fish2;
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