PointAndFigureChart_v1.1 600+
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «pointandfigurechart_v1.1 600+.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор рассчитывает и отображает 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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.