Ind_VilkaFractals_v1.1_v1

Download script
Author: lekhach � 2009
Ind_VilkaFractals_v1.1_v1

This script is a specialized technical analysis tool designed for the MetaTrader platform to identify and visualize specific price action patterns known as "forks" (or "vilsas") based on fractal geometry. It automates the detection of structural shifts in the market to help traders identify potential trend reversals or significant price movements.

Core Functionality

The logic operates by scanning historical price data to locate "Fractals"—these are specific high and low points where the price reaches a peak or valley relative to the bars immediately surrounding them. The script focuses on two primary directions:

  • Upper Fractals: Identifying local price ceilings.
  • Lower Fractals: Identifying local price floors.

How the Logic Works

Rather than simply marking every fractal point, the script applies a specific logical filter to identify a "fork" pattern. It monitors the sequence of these high and low points:

  1. Trend Tracking: The tool keeps a running history of consecutive fractals in both upward and downward directions.
  2. Pattern Recognition:
    • For Upward Trends, it looks for a sequence where three consecutive upper fractals show a descending price level (Lower Highs).
    • For Downward Trends, it looks for a sequence where three consecutive lower fractals show an ascending price level (Higher Lows).
  3. Dynamic Drawing: When these specific conditions are met, the script automatically draws trend lines on your chart. These lines connect the fractal points to visualize the structural "fork" clearly.
  4. Automatic Cleanup & Validation:
    • The script includes a validation check: if a new price movement breaks the logic of the current trend line (crossing back over it), the script automatically deletes the invalid lines to keep the chart clean.
    • To prevent clutter, it limits the number of visible lines on the screen based on user settings, removing the oldest lines as new ones appear.

User Alerts and Visuals

  • Real-time Notifications: The script can be configured to send a pop-up alert at the exact moment a "fork" pattern is completed, providing an immediate signal for the trader.
  • Visual Distinction: It uses different colors (traditionally Blue for upper structures and Red for lower structures) and distinct arrow markers to ensure that the price action is easy to interpret at a glance.

In summary, this script acts as an automated "scout" that filters out market noise, identifies significant structural shifts in price, draws geometric trend lines for those shifts, and alerts the user when a specific structural pattern is formed.

Indicators Used
Fractals
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
10 Views
0 Downloads
0 Favorites
Ind_VilkaFractals_v1.1_v1
//+------------------------------------------------------------------+
//|                                       Ind_VilkaFractals_v1.1.mq4 |
//|                      Copyright © 2009, Alexey Sleptsov (lekhach) |
//|                                             lekhach18@rambler.ru |
//+------------------------------------------------------------------+
// Èíäèêàòîð ðàáîòàåò ïî ñòðàòåãèè "Âèëêà ×óâàøîâà".
//--------------------------------------------------------------------
#property copyright "lekhach © 2009"
#property link      "lekhach18@rambler.ru"
//--------------------------------------------------------------------
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_width1 1
#property indicator_width2 1
//---- input parameters
extern int   Lines=20;           // Êîëè÷åñòâî âèäèìûõ/íåâèäèìûõ ôðàêòàëüíûõ ëèíèé
extern bool  AlertTrue=true;     // Âêë/âûêë ñèãíàëà
extern color LinesColorUp=Blue;  // Öâåò âåðõíèõ ôðàêòàëüíûõ ëèíèé
extern color LinesColorDown=Red; // Öâåò íèæíèõ ôðàêòàëüíûõ ëèíèé
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//--- my variables
int Up=0;
int BufUp=0;
int Down=0;
int BufDown=0;
double BufPriceUp[100000];
double BufDateUp[100000];
double BufPriceDown[100000];
double BufDateDown[100000];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,217);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,218);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("Fractals");
   SetIndexLabel(0,"FractalsUp");
   SetIndexLabel(1,"FractalsDown");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//   ObjectsDeleteAll();
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();
   int limit;
//---- Ïîñëåäíèé ïîñ÷èòàííûé áàð áóäåò ïåðåñ÷èòàí
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- Îñíîâíîé öèêë
   for(int i=limit; i>2; i--)
     {
      ExtMapBuffer1[i]=iFractals(NULL,0,MODE_UPPER,i);
      ExtMapBuffer2[i]=iFractals(NULL,0,MODE_LOWER,i);
//---- Áëîê Up-ôðàêòàëîâ
      BufPriceUp[i]=iFractals(NULL,0,MODE_UPPER,i);
      BufDateUp[i]=Time[i];
      if (iFractals(NULL,0,MODE_UPPER,i)!=0)
        {
         Up++;
         BufPriceUp[Up]=iFractals(NULL,0,MODE_UPPER,i);
         BufDateUp[Up]=Time[i];
         if (Up>2 && Up-BufUp>1 && BufPriceUp[Up]<BufPriceUp[Up-1] && BufPriceUp[Up-1]<BufPriceUp[Up-2])
           {
            BufUp=Up;
            ObjectCreate("LineUp"+(Up-1),OBJ_TREND,0,BufDateUp[Up-1],BufPriceUp[Up-1],BufDateUp[Up],BufPriceUp[Up]);
            ObjectCreate("LineUp"+Up,OBJ_TREND,0,BufDateUp[Up-2],BufPriceUp[Up-2],BufDateUp[Up-1],BufPriceUp[Up-1]);
            if (ObjectGetValueByShift("LineUp"+Up,i-1)>ObjectGetValueByShift("LineUp"+(Up-1),i-1))
              {
               ObjectDelete("LineUp"+Up);
               ObjectDelete("LineUp"+(Up-1));
              }
              else if (AlertTrue==true) Alert("Íèçõîäÿùàÿ âèëêà! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
           } 
         ObjectSet("LineUp"+(Up-1),OBJPROP_COLOR,LinesColorUp);
         ObjectSet("LineUp"+(Up-1),OBJPROP_WIDTH,2);
         ObjectSet("LineUp"+(Up-1),OBJPROP_RAY,True);
         ObjectSet("LineUp"+Up,OBJPROP_COLOR,LinesColorUp);
         ObjectSet("LineUp"+Up,OBJPROP_WIDTH,2);
         ObjectSet("LineUp"+Up,OBJPROP_RAY,True);         
         if (Up>Lines+1) ObjectDelete("LineUp"+(Up-Lines-1));
        }
//---- Áëîê Down-ôðàêòàëîâ
      BufPriceDown[i]=iFractals(NULL,0,MODE_LOWER,i);
      BufDateDown[i]=Time[i];
      if (iFractals(NULL,0,MODE_LOWER,i)!=0)
        {
         Down++;
         BufPriceDown[Down]=iFractals(NULL,0,MODE_LOWER,i);
         BufDateDown[Down]=Time[i];
         if (Down>2 && Down-BufDown>1 && BufPriceDown[Down]>BufPriceDown[Down-1] && BufPriceDown[Down-1]>BufPriceDown[Down-2])
           {
            BufDown=Down;
            ObjectCreate("LineDown"+(Down-1),OBJ_TREND,0,BufDateDown[Down-1],BufPriceDown[Down-1],BufDateDown[Down],BufPriceDown[Down]);
            ObjectCreate("LineDown"+Down,OBJ_TREND,0,BufDateDown[Down-2],BufPriceDown[Down-2],BufDateDown[Down-1],BufPriceDown[Down-1]);
            if (ObjectGetValueByShift("LineDown"+Down,i-1)<ObjectGetValueByShift("LineDown"+(Down-1),i-1))
              {
               ObjectDelete("LineDown"+Down);
               ObjectDelete("LineDown"+(Down-1));
              } 
              else if (AlertTrue==true) Alert("Âîñõîäÿùàÿ âèëêà! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
           } 
         ObjectSet("LineDown"+(Down-1),OBJPROP_COLOR,LinesColorDown);
         ObjectSet("LineDown"+(Down-1),OBJPROP_WIDTH,2);
         ObjectSet("LineDown"+(Down-1),OBJPROP_RAY,True);
         ObjectSet("LineDown"+Down,OBJPROP_COLOR,LinesColorDown);
         ObjectSet("LineDown"+Down,OBJPROP_WIDTH,2);
         ObjectSet("LineDown"+Down,OBJPROP_RAY,True);
         if (Down>Lines+1) ObjectDelete("LineDown"+(Down-Lines-1));
        }
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments