PointAndFigureTrend_v1.3 600+
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «pointandfiguretrend_v1.3 600+.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
PointAndFigureTrend_v1.3 600+ — индикатор для MetaTrader 4, построенный на методике графиков «точки и фигуры» (Point & Figure). Он рассчитывает направление тренда на основе P&F-диаграммы и отображает результат в отдельном окне в виде двух гистограмм: восходящего и нисходящего тренда. Индикатор поддерживает отображение P&F-боксов, стрелок входа и выхода, а также отправку уведомлений через звук, электронную почту и push-сообщения.
Настройки программы
| Настройка | Описание |
|---|---|
| TimeFrame (TimeFrame) | Таймфрейм — Таймфрейм для расчёта индикатора; 0 означает период текущего графика. |
| Appplied to (Price) | Применяемая цена — Ценовой тип, используемый для расчётов: Close, Open, High, Low, Median и другие. |
| Use High/Low (UseHighLow) | Использовать High/Low — Переключатель использования значений High и Low вместо выбранной цены для построения P&F-диаграммы. |
| Box Size in pips (BoxSize) | Размер бокса — Размер одного бокса в пунктах (pips) для построения графика точек и фигур. |
| Reversal Multiplier (Multiplier) | Множитель разворота — Множитель, определяющий величину разворота при смене направления P&F-диаграммы. |
| PreSmoothing Period (PreSmooth) | Период предварительного сглаживания — Период сглаживающей оценки, применяемой к ценовым данным перед расчётом P&F. |
| PreSmoothing Method (PreSmoothMode) | Метод предварительного сглаживания — Выбор метода скользящего среднего для предварительного сглаживания цен. |
| PnF Level (PnFLevel) | Уровень P&F — Пороговый уровень для фильтрации сигналов и отображения горизонтальных уровней на графике. |
| Show wicks (ShowWicks) | Показать тени — Переключатель отображения теней (wicks) на P&F-боксах. |
| Number of bars counted: 0-all bars (CountBars) | Количество баров — Число баров, участвующих в расчёте; 0 означает все доступные бары. |
| pnfboxes | PnF Boxes — Разделитель группы настроек отображения P&F-боксов. |
| Show Point and Figure (ShowPnFBoxes) | Показать P&F-боксы — Включает отрисовку цветных прямоугольных блоков P&F-диаграммы на графике. |
| UpTrend Color (UpTrendColor) | Цвет восходящего тренда — Цвет для отображения восходящих P&F-боксов и гистограммы. |
| DownTrend Color (DnTrendColor) | Цвет нисходящего тренда — Цвет для отображения нисходящих P&F-боксов и гистограммы. |
| UniqueName | Уникальное имя — Префикс имён графических объектов индикатора на графике. |
| arrows | Стрелки — Разделитель группы настроек отображения стрелок. |
| Show Arrows (ShowArrows) | Показать стрелки — Включает отображение стрелок входа и выхода на графике. |
| Arrow Size (ArrowSize) | Размер стрелки — Размер шрифта стрелок на графике. |
| Arrow Font Name (ArrowFontName) | Шрифт стрелок — Имя шрифта, используемого для отрисовки стрелок. |
| ArrowBuyCode (ArrowBuyCode) | Код символа покупки — Код символа Wingdings для стрелки покупки. |
| ArrowSellCode (ArrowSellCode) | Код символа продажи — Код символа Wingdings для стрелки продажи. |
| UpTrend Arrow Color (UpArrowColor) | Цвет стрелки покупки — Цвет стрелки входа в длинную позицию. |
| DownTrend Arrow Color (DnArrowColor) | Цвет стрелки продажи — Цвет стрелки входа в короткую позицию. |
| Alerts | Оповещения — Разделитель группы настроек оповещений. |
| Alert On (AlertOn) | Включить алерт — Включает вывод pop-up уведомлений при возникновении сигналов. |
| 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 при каждом сигнале. |
| Push Notification On (PushNotificationOn) | Push-уведомления — Включает отправку push-уведомлений на мобильное устройство. |
Поиск по коду файла
???//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrLimeGreen
#property indicator_color2 clrOrangeRed
#property indicator_width1 2
#property indicator_width2 2
#property indicator_level1 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; // Box Size in pips
input double Multiplier = 2; // Reversal Multiplier
input int PreSmooth = 1; // PreSmoothing Period
input ENUM_MA_MODE PreSmoothMode = 0; // PreSmoothing Method
input double PnFLevel = 10; // PnF Level
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 = false; // Show Point and Figure
input color UpTrendColor = clrPaleGreen; // UpTrend Color
input color DnTrendColor = clrLightSalmon; // DownTrend Color
input string UniqueName = "P&FTrend";
input string arrows = "==== Arrows ====";
input bool ShowArrows = false; // Show Arrows
input int ArrowSize = 15; // Arrow Size
input string ArrowFontName = "Wingdings"; // Arrow Font Name
input int ArrowBuyCode = 233; // ArrowBuyCode
input int ArrowSellCode = 234; // ArrowSellCode
input color UpArrowColor = clrDeepSkyBlue; // UpTrend Arrow Color
input color DnArrowColor = clrRed; // DownTrend Arrow Color
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 upTrend[];
double dnTrend[];
double pnfNumber[];
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)
{
Comment("");
if(ShowArrows || ShowPnFBoxes) {ObjectsDeleteAll(0,UniqueName); ChartRedraw();}
}
int start()
{
// код доступен только после оплаты
}
bool buysignal, sellsignal, buyexit, sellexit;
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;
upTrend[shift] = 0;
dnTrend[shift] = 0;
pnfNumber[shift] = pnfNumber[shift+1];
if(trend[shift] > 0)
{
if(trend[shift+1] < 0)
{
upTrend[shift] = NormalizeDouble((pnfPrice[shift] - pnfPrice[shift+1])/_point,Digits);
pnfNumber[shift] = 1;
}
else
{
upTrend[shift] = NormalizeDouble(upTrend[shift+1] + (pnfPrice[shift] - pnfPrice[shift+1])/_point,Digits);
if(pnfPrice[shift] != pnfPrice[shift+1]) pnfNumber[shift]+= 1;
}
}
else
if(trend[shift] < 0)
{
if(trend[shift+1] > 0)
{
dnTrend[shift] = NormalizeDouble((pnfPrice[shift] - pnfPrice[shift+1])/_point,Digits);
pnfNumber[shift] =-1;
}
else
{
dnTrend[shift] = NormalizeDouble(dnTrend[shift+1] + (pnfPrice[shift] - pnfPrice[shift+1])/_point,Digits);
if(pnfPrice[shift] != pnfPrice[shift+1]) pnfNumber[shift]-= 1;
}
}
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(ShowArrows)
{
buysignal = (PnFLevel > 0 && upTrend[shift] > PnFLevel && upTrend[shift+1] <= PnFLevel)||(PnFLevel == 0 && upTrend[shift] > 0 && upTrend[shift+1] <= 0);
sellsignal = (PnFLevel > 0 && dnTrend[shift] <-PnFLevel && dnTrend[shift+1] >=-PnFLevel)||(PnFLevel == 0 && dnTrend[shift] < 0 && dnTrend[shift+1] >= 0);
if(PnFLevel > 0)
{
buyexit = dnTrend[shift] < 0 && upTrend[shift+1] > PnFLevel;
sellexit = upTrend[shift] > 0 && dnTrend[shift+1] <-PnFLevel;
}
double gap = MathCeil(iATR(NULL,0,14,shift+1)/_Point);
string dn_name = UniqueName+" BuyEntry " +TimeToStr(Time[shift]);
string up_name = UniqueName+" SellEntry "+TimeToStr(Time[shift]);
ObjectDelete(dn_name);
ObjectDelete(up_name);
if(buysignal ) drawArrow(up_name,Time[shift],NormalizeDouble(Low[shift] - gap*Point,Digits),ArrowFontName,ArrowSize,ANCHOR_LOWER,CharToStr((uchar)ArrowBuyCode ),UpArrowColor);
if(sellsignal) drawArrow(dn_name,Time[shift],NormalizeDouble(High[shift]+ gap*Point,Digits),ArrowFontName,ArrowSize,ANCHOR_UPPER,CharToStr((uchar)ArrowSellCode),DnArrowColor);
dn_name = UniqueName+" BuyExit " +TimeToStr(Time[shift]);
up_name = UniqueName+" SellExit "+TimeToStr(Time[shift]);
ObjectDelete(dn_name);
ObjectDelete(up_name);
if(buyexit ) drawArrow(up_name,Time[shift],NormalizeDouble(High[shift]+ gap*Point,Digits),ArrowFontName,ArrowSize,ANCHOR_LOWER,CharToStr(251),UpArrowColor);
if(sellexit) drawArrow(dn_name,Time[shift],NormalizeDouble(Low[shift] - gap*Point,Digits),ArrowFontName,ArrowSize,ANCHOR_UPPER,CharToStr(251),DnArrowColor);
}
}
if(AlertOn || EmailOn || PushNotificationOn)
{
buysignal = (PnFLevel > 0 && upTrend[AlertShift] > PnFLevel && upTrend[AlertShift+1] <= PnFLevel)||(PnFLevel == 0 && upTrend[AlertShift] > 0 && upTrend[AlertShift+1] <= 0);
sellsignal = (PnFLevel > 0 && dnTrend[AlertShift] <-PnFLevel && dnTrend[AlertShift+1] >=-PnFLevel)||(PnFLevel == 0 && dnTrend[AlertShift] < 0 && dnTrend[AlertShift+1] >= 0);
if(PnFLevel > 0)
{
buyexit = dnTrend[AlertShift] < 0 && upTrend[AlertShift+1] > PnFLevel;
sellexit = upTrend[AlertShift] > 0 && dnTrend[AlertShift+1] <-PnFLevel;
}
if(buysignal || sellsignal || buyexit || sellexit)
{
if(isNewBar(TimeFrame))
{
if(AlertOn)
{
BoxAlert(buysignal ," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits));
BoxAlert(sellsignal," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits));
BoxAlert(buyexit ," : BUY Exit @ " +DoubleToStr(Close[AlertShift],Digits));
BoxAlert(sellexit ," : SELL Exit @ " +DoubleToStr(Close[AlertShift],Digits));
}
if(EmailOn)
{
EmailAlert(buysignal ,"BUY Signal" ," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits),EmailsNumber);
EmailAlert(sellsignal,"SELL Signal"," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits),EmailsNumber);
EmailAlert(buyexit ,"BUY Exit" ," : BUY Exit @ " +DoubleToStr(Close[AlertShift],Digits),EmailsNumber);
EmailAlert(sellexit ,"SELL Exit" ," : SELL Exit @ " +DoubleToStr(Close[AlertShift],Digits),EmailsNumber);
}
if(PushNotificationOn)
{
PushAlert(buysignal ," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits));
PushAlert(sellsignal," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits));
PushAlert(buyexit ," : BUY Exit @ " +DoubleToStr(Close[AlertShift],Digits));
PushAlert(sellexit ," : SELL Exit @ " +DoubleToStr(Close[AlertShift],Digits));
}
}
else
{
if(AlertOn)
{
WarningSound(buysignal ,SoundsNumber,SoundsPause,UpTrendSound,Time[AlertShift]);
WarningSound(sellsignal,SoundsNumber,SoundsPause,DnTrendSound,Time[AlertShift]);
WarningSound(buyexit ,SoundsNumber,SoundsPause,UpTrendSound,Time[AlertShift]);
WarningSound(sellexit ,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 : arПоказано первые 50% кода (символов: 36266)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.