← К каталогу
Исходный код · ID 2773

PointAndFigureChart_v1.1 600+

pointandfigurechart_v1.1 600+.mq5

Похожие материалы по тегам

#__slope direction line.mq5MQL5 / MetaTrader 5 · 1 общих теговrange breakout @meowforex1.pineTradingView · 1 общих тегов#1.mtf_collider_h4_close_13_v18bar.mq4MQL4 / MetaTrader 4 · 1 общих тегов!mth_fasttmaline_edit3.mq4MQL4 / MetaTrader 4 · 1 общих тегов!mth_fasttmaline_edit2.mq4MQL4 / MetaTrader 4 · 1 общих тегов!mth_fasttmaline_edit.mq4MQL4 / MetaTrader 4 · 1 общих тегов
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Индикатор рассчитывает и отображает Point and Figure (PnF) диаграмму на графике MetaTrader 4. Основные данные PnF выводятся в виде гистограммных буферов, а также рисуются цветные прямоугольные объекты, обозначающие восходящие и нисходящие тренды.

Поддерживается выбор различных типов цен (Close, Open, High, Low и другие), а также применение множества методов скользящих средних для предварительного сглаживания. Дополнительно доступна работа с Heikin Ashi ценами.

Индикатор оснащён системой уведомлений: звуковые сигналы, email-рассылка и push-уведомления срабатывают при смене направления тренда. Настраиваются таймфрейм, размер шага, множитель разворота, отображение теней и количество обрабатываемых баров.

Настройки программы

НастройкаОписание
TimeFrame (TimeFrame) Таймфрейм — Таймфрейм, на котором рассчитывается индикатор. Если задан таймфрейм текущего графика или ниже, используется таймфрейм графика.
Appplied to (Price) Применяемая цена — Тип цены, на который направлен расчёт: Close, Open, High, Low, Median, Typical и другие варианты.
Use High/Low (UseHighLow) Использовать High/Low — Переключатель использования значений High/Low вместо сглаженных ценовых данных при расчёте ячеек.
Step Size in pips(if StepSize=0 and VoltyLength=0 then StepSize = HiLoRange*VoltyRatio/100) (BoxSize) Размер шага — Размер шага в пипсах для построения ячеек PnF. При значении 0 рассчитывается автоматически на основе диапазона цен.
Reversal Multiplier (Multiplier) Множитель разворота — Множитель разворота, определяющий величину разворота ячейки PnF относительно шага.
PreSmoothing Period (PreSmooth) Период сглаживания — Период предварительного сглаживания для расчёта ценовых данных.
PreSmoothing Method (PreSmoothMode) Метод сглаживания — Метод сглаживания из обширного списка: SMA, EMA, Wilder, LWMA и другие.
Show wicks (ShowWicks) Показать тени — Включает или отключает отображение теней (минимум/максимум) для ячеек PnF.
Number of bars counted: 0-all bars (CountBars) Количество баров — Количество обрабатываемых баров. Значение 0 означает все бары.
pnfboxes Разделитель PnF ячеек — Текстовый параметр, используемый как разделитель группы настроек PnF-ящиков.
Show Point and Figure (ShowPnFBoxes) Показать PnF ячейки — Включает или отключает отображение цветных прямоугольных объектов PnF на графике.
UpTrend Color (UpTrendColor) Цвет восходящего тренда — Цвет прямоугольников восходящего тренда.
DownTrend Color (DnTrendColor) Цвет нисходящего тренда — Цвет прямоугольников нисходящего тренда.
UniqueName Уникальное имя — Уникальный префикс для имён графических объектов PnF на графике.
Alerts Разделитель уведомлений — Текстовый параметр, используемый как разделитель группы настроек уведомлений.
Alert On (AlertOn) Включить уведомления — Включает или отключает всплывающие уведомления при смене направления тренда.
Alert Shift:0-current bar,1-previous bar (AlertShift) Сдвиг уведомлений — Сдвиг бара для проверки условий уведомлений: 0 — текущий бар, 1 — предыдущий.
Number of sounds after Signal (SoundsNumber) Количество звуков — Количество звуковых сигналов, воспроизводимых при появлении тренда.
Pause in sec between sounds (SoundsPause) Пауза между звуками — Пауза в секундах между повторными звуковыми сигналами.
UpTrend Sound (UpTrendSound) Звук восходящего тренда — Звуковой файл, воспроизводимый при появлении восходящего тренда.
DownTrend Sound (DnTrendSound) Звук нисходящего тренда — Звуковой файл, воспроизводимый при появлении нисходящего тренда.
Email Alert On (EmailOn) Включить email-уведомления — Включает или отключает отправку email-уведомлений при смене тренда.
Emails Number (EmailsNumber) Количество email — Количество отправляемых email-сообщений при сигнале.
Push Notification On (PushNotificationOn) Включить push-уведомления — Включает или отключает push-уведомления на мобильные устройства при смене тренда.
Получить полный код

Поиск по коду файла

???//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers   4
#property indicator_color1    clrLimeGreen
#property indicator_color2    clrOrangeRed
#property indicator_width1    4
#property indicator_width2    4
#property indicator_color3    clrLimeGreen
#property indicator_color4    clrOrangeRed
#property indicator_width3    0
#property indicator_width4    0

#property strict 

enum ENUM_PRICE
{
   close,               // Close
   open,                // Open
   high,                // High
   low,                 // Low
   median,              // Median
   typical,             // Typical
   weightedClose,       // Weighted Close
   medianBody,          // Median Body (Open+Close)/2
   average,             // Average (High+Low+Open+Close)/4
   trendBiased,         // Trend Biased
   haClose,             // Heiken Ashi Close
   haOpen,              // Heiken Ashi Open
   haHigh,              // Heiken Ashi High   
   haLow,               // Heiken Ashi Low
   haMedian,            // Heiken Ashi Median
   haTypical,           // Heiken Ashi Typical
   haWeighted,          // Heiken Ashi Weighted Close
   haMedianBody,        // Heiken Ashi Median Body
   haAverage,           // Heiken Ashi Average
   haTrendBiased        // Heiken Ashi Trend Biased   
};

enum ENUM_MA_MODE
{
   SMA,                 // Simple Moving Average
   EMA,                 // Exponential Moving Average
   Wilder,              // Wilder Exponential Moving Average
   LWMA,                // Linear Weighted Moving Average
   SineWMA,             // Sine Weighted Moving Average
   TriMA,               // Triangular Moving Average
   LSMA,                // Least Square Moving Average (or EPMA, Linear Regression Line)
   SMMA,                // Smoothed Moving Average
   HMA,                 // Hull Moving Average by A.Hull
   ZeroLagEMA,          // Zero-Lag Exponential Moving Average
   DEMA,                // Double Exponential Moving Average by P.Mulloy
   T3_basic,            // T3 by T.Tillson (original version)
   ITrend,              // Instantaneous Trendline by J.Ehlers
   Median,              // Moving Median
   GeoMean,             // Geometric Mean
   REMA,                // Regularized EMA by C.Satchwell
   ILRS,                // Integral of Linear Regression Slope
   IE_2,                // Combination of LSMA and ILRS
   TriMAgen,            // Triangular Moving Average generalized by J.Ehlers
   VWMA,                // Volume Weighted Moving Average
   JSmooth,             // M.Jurik's Smoothing
   SMA_eq,              // Simplified SMA
   ALMA,                // Arnaud Legoux Moving Average
   TEMA,                // Triple Exponential Moving Average by P.Mulloy
   T3,                  // T3 by T.Tillson (correct version)
   Laguerre,            // Laguerre filter by J.Ehlers
   MD,                  // McGinley Dynamic
   BF2P,                // Two-pole modified Butterworth filter by J.Ehlers
   BF3P,                // Three-pole modified Butterworth filter by J.Ehlers
   SuperSmu,            // SuperSmoother by J.Ehlers
   Decycler,            // Simple Decycler by J.Ehlers
   eVWMA,               // Modified eVWMA
   EWMA,                // Exponential Weighted Moving Average
   DsEMA,               // Double Smoothed EMA
   TsEMA                // Triple Smoothed EMA
};   

#define pi 3.14159265358979323846  

input ENUM_TIMEFRAMES   TimeFrame            =        0;          // TimeFrame
input ENUM_PRICE        Price                =    close;          // Appplied to
input bool              UseHighLow           =    false;          // Use High/Low 
input double            BoxSize              =       10;          // Step Size in pips(if StepSize=0 and VoltyLength=0 then StepSize = HiLoRange*VoltyRatio/100)
input double            Multiplier           =        2;          // Reversal Multiplier 
input int               PreSmooth            =           1;       // PreSmoothing Period
input ENUM_MA_MODE      PreSmoothMode        =           0;       // PreSmoothing Method
input bool              ShowWicks            =    false;          // Show wicks
input int               CountBars            =        0;          // Number of bars counted: 0-all bars 

input string            pnfboxes             = "==== PnF Boxes: ====";
input bool              ShowPnFBoxes         =     true;          // Show Point and Figure
input color             UpTrendColor         = clrPaleGreen;      // UpTrend Color 
input color             DnTrendColor         = clrLightSalmon;    // DownTrend Color  
input string            UniqueName           =    "PnF";

input string            Alerts               = "=== Alerts, Emails & Notifications ===";
input bool              AlertOn              =       false;       // Alert On
input int               AlertShift           =           1;       // Alert Shift:0-current bar,1-previous bar
input int               SoundsNumber         =           5;       // Number of sounds after Signal
input int               SoundsPause          =           5;       // Pause in sec between sounds 
input string            UpTrendSound         = "alert.wav";       // UpTrend Sound
input string            DnTrendSound         = "alert2.wav";      // DownTrend Sound
input bool              EmailOn              =       false;       // Email Alert On
input int               EmailsNumber         =           *;       // Emails Number  
input bool              PushNotificationOn   =       false;       // Push Notification On

double UpBuffer[];
double DnBuffer[];
double UpWick[];
double DnWick[];
double pnfPrice[];
double trend[];
double mPrice[];
double hiPrice[];
double loPrice[];
double oPrice[];
double aPrice1[];
double hiPrice1[];
double loPrice1[];
double oPrice1[];

int      timeframe, cBars, draw_begin, ma_period, masize;
double   _point;
string   short_name, TF, IndicatorName;

int OnInit()
{
      // код доступен только после оплаты
   }

void OnDeinit(const int reason)
{
   if(ShowPnFBoxes) {ObjectsDeleteAll(0,UniqueName); ChartRedraw();}
}

int start()
{
      // код доступен только после оплаты
   }

double   xprice[2], pprice[2];
datetime pnftime, xtime[2], ptime[2];

void _PnFChart(int limit)
{
   double pnfopen;

   for(int shift = limit;shift >= 0;shift--) 
   {	
   if(shift > Bars - 2) continue;

   trend[shift] = trend[shift+1];
   trend[shift] = pnfChart(pnfPrice[shift],pnfopen,Price,BoxSize,Multiplier,UseHighLow,MathMin(Bars-ma_period-1,cBars),shift);

   if(pnfPrice[shift+1] <= 0) continue; 

   UpBuffer[shift] = EMPTY_VALUE; 
   DnBuffer[shift] = EMPTY_VALUE;

      if(trend[shift] > 0)
      {
      UpBuffer[shift] = pnfPrice[shift];
      DnBuffer[shift] = pnfPrice[shift+1];
      if(pnfPrice[shift] == pnfPrice[shift+1]) DnBuffer[shift] = pnfPrice[shift] - 0.001*Point; 
      }
      else
      if(trend[shift] < 0)
      {
      UpBuffer[shift] = pnfPrice[shift];
      DnBuffer[shift] = pnfPrice[shift+1];
      if(pnfPrice[shift] == pnfPrice[shift+1]) DnBuffer[shift] = pnfPrice[shift+1] + 0.001*Point;  
      }

      if(ShowWicks)
      {
      UpWick[shift] = EMPTY_VALUE; 
      DnWick[shift] = EMPTY_VALUE;   

         if(trend[shift] > 0) 
         {
         UpWick[shift] = MathMax(hiPrice1[shift],UpBuffer[shift]); 
         DnWick[shift] = MathMin(loPrice1[shift],UpBuffer[shift]);
         }
         else
         if(trend[shift] < 0) 
         {
         DnWick[shift] = MathMax(hiPrice1[shift],UpBuffer[shift]);
         UpWick[shift] = MathMin(loPrice1[shift],DnBuffer[shift]);
         } 
      }

      if(ShowPnFBoxes)
      {
         if(pnftime != Time[shift])  
         {
         xtime[1]  = xtime[0];
         ptime[1]  = ptime[0];
         xprice[1] = xprice[0];
         pprice[1] = pprice[0];
         pnftime   = Time[shift];
         }

         xtime[0]  = xtime[1];
         ptime[0]  = ptime[1];
         xprice[0] = xprice[1];
         pprice[0] = pprice[1];

         string xname = UniqueName + " up ";   
         string pname = UniqueName + " dn ";

         ObjectDelete(0,xname + TimeToString(Time[shift]));

         if(trend[shift] > 0)
         {
            if(trend[shift] != trend[shift+1])
            {
            xtime[0]  = Time[shift];
            xprice[0] = pnfPrice[shift+1]; 

            if(xprice[0] > 0) SetBox(xname + TimeToString(xtime[0]),0,xtime[0],xprice[0] + BoxSize*_point,xtime[0],pnfPrice[shift],true,UpTrendColor);
            if(pprice[0] > 0) SetBox(pname + TimeToString(ptime[0]),0,ptime[0],pprice[0] - BoxSize*_point,xtime[0],xprice[0]      ,true,DnTrendColor);
            }
            else
            {
            if(xprice[0] > 0) SetBox(xname + TimeToString(xtime[0]),0,xtime[0],xprice[0] + BoxSize*_point,Time[shift],pnfPrice[shift],true,UpTrendColor);
            }
         }

         ObjectDelete(0,pname + TimeToString(Time[shift]));

         if(trend[shift] < 0)
         {
            if(trend[shift] != trend[shift+1])
            {
            ptime[0]  = Time[shift];
            pprice[0] = pnfPrice[shift+1]; 

            if(pprice[0] > 0) SetBox(pname + TimeToString(ptime[0]),0,ptime[0],pprice[0] - BoxSize*_point,ptime[0],pnfPrice[shift],true,DnTrendColor);
            if(xprice[0] > 0) SetBox(xname + TimeToString(xtime[0]),0,xtime[0],xprice[0] + BoxSize*_point,ptime[0],pprice[0]      ,true,UpTrendColor);
            }
            else
            {
            if(pprice[0] > 0) SetBox(pname + TimeToString(ptime[0]),0,ptime[0],pprice[0] - BoxSize*_point,Time[shift],pnfPrice[shift],true,DnTrendColor);
            }
         }
      }
   }      

   if(AlertOn || EmailOn || PushNotificationOn)
   {
   bool uptrend = trend[AlertShift] > 0 && trend[AlertShift+1] <= 0;                  
   bool dntrend = trend[AlertShift] < 0 && trend[AlertShift+1] >= 0;

      if(uptrend || dntrend)
      {
         if(isNewBar(TimeFrame))
         {
            if(AlertOn)
            {
            BoxAlert(uptrend," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits));   
            BoxAlert(dntrend," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits)); 
            }

            if(EmailOn)
            {
            EmailAlert(uptrend,"BUY" ," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits),EmailsNumber); 
            EmailAlert(dntrend,"SELL"," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits),EmailsNumber); 
            }

            if(PushNotificationOn)
            {
            PushAlert(uptrend," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits));   
            PushAlert(dntrend," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits)); 
            }
         }
         else
         {
            if(AlertOn)
            {
            WarningSound(uptrend,SoundsNumber,SoundsPause,UpTrendSound,Time[AlertShift]);
            WarningSound(dntrend,SoundsNumber,SoundsPause,DnTrendSound,Time[AlertShift]);
            }
         }   
      }
   }   
}   

int      dir[2];
double   upband[2], loband[2], pnfclose[2];
datetime pnfprevtime;

int pnfChart(double& close,double& open,int pricemode,double size,double mult,bool hilo,int cbars,int bar)
{
   int app_price;
   double value, hiprice, loprice;

   if(pnfprevtime != Time[bar])
   {
   upband[1]   = upband[0]; 
   loband[1]   = loband[0];    
   dir[1]      = dir[0]; 
   pnfprevtime = Time[bar]; 
   }

   if(pricemode < 10) app_price = Price; else app_price = 0;

   mPrice[bar]  = getPrice(app_price,bar);
   hiPrice[bar] = High[bar];
   loPrice[bar] = Low [bar]; 
   oPrice[bar]  = Open[bar];

   if(bar > MathMin(Bars-ma_period-1,cBars)) return(-1);

   aPrice1 [bar] = allAveragesOnArray(0,mPrice ,PreSmooth,PreSmoothMode,masize,MathMin(Bars-ma_period-1,cBars),bar);   
   hiPrice1[bar] = allAveragesOnArray(1,hiPrice,PreSmooth,PreSmoothMode,masize,MathMin(Bars-ma_period-1,cBars),bar);  
   loPrice1[bar] = allAveragesOnArray(2,loPrice,PreSmooth,PreSmoothMode,masize,MathMin(Bars-ma_period-1,cBars),bar);  
   oPrice1 [bar] = allAveragesOnArray(3,oPrice ,PreSmooth,PreSmoothMode,masize,MathMin(Bars-ma_period-1,cBars),bar);    

   if(Price > 9)
   {
   aPrice1[bar] = HeikenAshi(0,Price-10,aPrice1[bar],hiPrice1[bar],loPrice1[bar],oPrice1[bar],MathMin(Bars-ma_period-1,cBars),bar,hiPrice1[bar],loPrice1[bar]);
   }

   double step = size*_point;

   if(!hilo)
   {
   hiprice = NormalizeDouble(MathFloor(aPrice1 [bar]/step)*step,Digits); 
   loprice = NormalizeDouble(MathCeil (aPrice1 [bar]/step)*step,Digits);
   }
   else
   {
   hiprice = NormalizeDouble(MathFloor(hiPrice1[bar]/step)*step,Digits);
   loprice = NormalizeDouble(MathCeil (loPrice1[bar]/step)*step,Digits);
   }

   if(bar < MathMin(Bars-ma_period-1,cBars))
   {
   upband[0] = upband[1]; 
   loband[0] = loband[1];   
   dir[0]    = dir[1]; 

   if(dir[0] != 0) value = NormalizeDouble(mult*step,Digits); else value  = step;

      if(dir[0] > 0) 
      {
         if(hiprice > upband[0]) 
         {
         upband[0] = NormalizeDouble(hiprice,Digits); 
         loband[0] = NormalizeDouble(upband[0] - value,Digits);
         }
         else
         {
            if(loprice < NormalizeDouble(upband[0] - value,Digits)) 
            {
            dir[0] =-1; 
            loband[0] = NormalizeDouble(loprice,Digits);
            upband[0] = NormalizeDouble(loband[0] + value,Digits);
            }
         }
      }
      else
      if(dir[0] < 0)
      {
         if(loprice < loband[0])
         {   
         loband[0] = NormalizeDouble(loprice,Digits); 
         upband[0] = NormalizeDouble(loband[0] + value,Digits);
         }
         else
         {
            if(hiprice > NormalizeDouble(loband[0] + value,Digits)) 
            {
            dir[0] = 1; 
            upband[0] = NormalizeDouble(hiprice,Digits); 
            loband[0] = NormalizeDouble(upband[0] - value,Digits);
            }
         }
      }
   }    
   else
   if(bar == MathMin(Bars-ma_period-1,cBars))
   { 
      if(Close[bar] >= Open[bar]) 
      {
      dir[0] = 1; 
      upband[0] = hiprice;
      loband[0] = loprice;// - value;
      }
      else
      {
      dir[0] =-1;   
      loband[0] = loprice;
      upband[0] = hiprice;//loprice + value; 
      }  
   }

   if(dir[0] > 0) close = upband[0]; else close = loband[0]; 

   return(dir[0]);
}

int averageSize(int mode)
{   
   int arraysize;

   switch(mode)
   {
   case DEMA     : arraysize = 2; break;
   case T3_basic : arraysize = 6; break;
   case JSmooth  : arraysize = 5; break;
   case TEMA     : arraysize = 4; break;
   case T3       : arraysize = 6; break;
   case Laguerre : arraysize = 4; break;
   case DsEMA    : arraysize = 2; break;
   case TsEMA    : arraysize = 3; break;
   default       : arraysize = 0; break;
   }

   return(arraysize);
}

double   tmp[][4][2], ma[4][4];
datetime prevtime[4];  

double allAveragesOnArray(int index,double& price[],int period,int mode,int arraysize,int cbars,int bar)
{
   int i;
   double MA[4];  

   switch(mode) 
	{
	case EMA: case Wilder: case SMMA: case ZeroLagEMA: case DEMA: case T3_basic: case ITrend: case REMA: case JSmooth: case SMA_eq: case TEMA: case T3: case Laguerre: case MD: case BF2P: case BF3P: case SuperSmu: case Decycler: case eVWMA: case DsEMA: case TsEMA:

		if(prevtime[index] != Time[bar])
      {
      ma[index][3] = ma[index][2]; 
      ma[index][2] = ma[index][1]; 
      ma[index][1] = ma[index][0]; 

      if(arraysize > 0) for(i=0;i<arraysize;i++) tmp[i][index][1] = tmp[i][index][0];

      prevtime[index] = Time[bar]; 
      }

      if(mode == ITrend || mode == REMA || mode == SMA_eq || (mode >= BF2P && mode < eVWMA)) for(i=0;i<4;i++) MA[i] = ma[index][i]; 
	}

   switch(mode)
   {
   case EMA       : ma[index][0] = EMAOnArray(price[bar],ma[index][1],period,cbars,bar); break;
   case Wilder    : ma[index][0] = WilderOnArray(price[bar],ma[index][1],period,cbars,bar); break;  
   case LWMA      : ma[index][0] = LWMAOnArray(price,period,bar); break;
   case SineWMA   : ma[index][0] = SineWMAOnArray(price,period,bar); break;
   case TriMA     : ma[index][0] = TriMAOnArray(price,period,bar); break;
   case LSMA      : ma[index][0] = LSMAOnArray(price,period,bar); break;
   case SMMA      : ma[index][0] = SMMAOnArray(price,ma[index][1],period,cbars,bar); break;
   case HMA       : ma[index][0] = HMAOnArray(price,period,cbars,bar); break;
   case ZeroLagEMA: ma[index][0] = ZeroLagEMAOnArray(price,ma[index][1],period,cbars,bar); break;
   case DEMA      : ma[index][0] = DEMAOnArray(index,0,price[bar],period,1,cbars,bar); break;
   case T3_basic  : ma[index][0] = T3_basicOnArray(index,0,price[bar],period,0.7,cbars,bar); break;
   case ITrend    : ma[index][0] = ITrendOnArray(price,MA,period,cbars,bar); break;
   case Median    : ma[index][0] = MedianOnArray(price,period,cbars,bar); break;
   case GeoMean   : ma[index][0] = GeoMeanOnArray(price,period,cbars,bar); break;
   case REMA      : ma[index][0] = REMAOnArray(price[bar],MA,period,0.5,cbars,bar); break;
   case ILRS      : ma[index][0] = ILRSOnArray(price,period,cbars,bar); break;
   case IE_2      : ma[index][0] = IE2OnArray(price,period,cbars,bar); break;
   case TriMAgen  : ma[index][0] = TriMA_genOnArray(price,period,cbars,bar); break;
   case VWMA      : ma[index][0] = VWMAOnArray(price,period,bar); break;
   case

Показано первые 50% кода (символов: 31634)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
3 163,40₽ ≈ $38.66