Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Можно ли в стандартном индикаторе Fractals сделать настраиваемым число баров построения т.е отличным от 5?
Если да, то как это сделать.
Здравствуйте.
Можно ли в стандартном индикаторе Fractals сделать настраиваемым число баров построения т.е отличным от 5?
Если да, то как это сделать.
в кодабазе есть такой https://www.mql5.com/ru/search#!keyword=fractals&module=mql5_module_codebase
Спасибо. Нужен такой только на mq4 https://www.mql5.com/ru/code/1381
Удивительно, скомпилировала в редакторе МТ4, работает, только грузит процессор, что изменить, чтобы не грузил?
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plot UpFractals
#property indicator_label1 "Up Fractals"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot DnFractals
#property indicator_label2 "Down Fractals"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrTomato
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- input parameters
input int InpLeftSide = 3; // Кол-во баров слева от фрактала
input int InpRightSide = 3; // Кол-во баров справа от фрактала
//--- indicator buffers
double UpFractalsBuffer[];
double DnFractalsBuffer[];
//--- global variables
int minRequiredBars;
int leftSide, rightSide;
int maxSide;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() {
//---
if ( InpLeftSide < 1 ) {
leftSide = 2;
printf("Неккоретно указан параметр \"Кол-во баров слева от фрактала\": %d. Будет использовано значение: %d.",
InpLeftSide, leftSide);
} else {
leftSide = InpLeftSide;
}
if ( InpRightSide < 1 ) {
rightSide = 2;
printf("Неккоретно указан параметр \"Кол-во баров справа от фрактала\": %d. Будет использовано значение: %d.",
InpRightSide, rightSide);
} else {
rightSide = InpRightSide;
}
//---
minRequiredBars = leftSide + rightSide + 1;
maxSide = int(MathMax(leftSide, rightSide));
//---
SetIndexBuffer(0, UpFractalsBuffer, INDICATOR_DATA);
SetIndexBuffer(1, DnFractalsBuffer, INDICATOR_DATA);
//---
PlotIndexSetInteger(0, PLOT_ARROW, 217);
PlotIndexSetInteger(1, PLOT_ARROW, 218);
//---
PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, -10);
PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, 10);
//---
for ( int i = 0; i < 2; i++ ) {
PlotIndexSetInteger(i, PLOT_DRAW_BEGIN, minRequiredBars);
PlotIndexSetDouble(i, PLOT_EMPTY_VALUE, 0.0);
}
//---
IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
//---
IndicatorSetString(INDICATOR_SHORTNAME, "ffra ("+(string)leftSide+", "+(string)rightSide+")");
//---
return(0);
}
//+------------------------------------------------------------------+
//| Check if is Up Fractal function |
//+------------------------------------------------------------------+
bool isUpFractal(int bar, int max, const double &High[]) {
//---
for ( int i = 1; i <= max; i++ ) {
if ( i <= leftSide && High[bar] < High[bar-i] ) {
return(false);
}
if ( i <= rightSide && High[bar] <= High[bar+i] ) {
return(false);
}
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| Check if is Down Fractal function |
//+------------------------------------------------------------------+
bool isDnFractal(int bar, int max, const double &Low[]) {
//---
for ( int i = 1; i <= max; i++ ) {
if ( i <= leftSide && Low[bar] > Low[bar-i] ) {
return(false);
}
if ( i <= rightSide && Low[bar] >= Low[bar+i] ) {
return(false);
}
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
int startBar, lastBar;
//---
if ( rates_total < minRequiredBars ) {
Print("Недостаточно данных для расчёта");
return(0);
}
//---
if (prev_calculated < minRequiredBars) {
startBar = leftSide;
ArrayInitialize(UpFractalsBuffer, 0.0);
ArrayInitialize(DnFractalsBuffer, 0.0);
}
else {
startBar = rates_total - minRequiredBars;
}
//---
lastBar = rates_total - rightSide;
for ( int bar = startBar; bar < lastBar && !IsStopped(); bar++ ) {
//---
if ( isUpFractal(bar, maxSide, high) ) {
UpFractalsBuffer[bar] = high[bar];
} else {
UpFractalsBuffer[bar] = 0.0;
}
//---
if ( isDnFractal(bar, maxSide, low) ) {
DnFractalsBuffer[bar] = low[bar];
} else {
DnFractalsBuffer[bar] = 0.0;
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Спасибо. Нужен такой только на mq4 https://www.mql5.com/ru/code/1381
Исправления минимальные:
//| iXBarsFractals.mq4 |
//| Copyright 2011, Rone. redaction 2016 by artmedia70 |
//| rone.sergey@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, Rone."
#property link "rone.sergey@gmail.com"
#property version "1.00"
#property description "Индикатор позволяет отдельно указывать кол-во баров слева и справа от фрактала. Хорошо подходит "
#property description "для определения как локальных, так и глобальных экстремумов."
#property strict
//--- indicator buffers
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plot UpFractals
#property indicator_label1 "Up Fractals"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot DnFractals
#property indicator_label2 "Down Fractals"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrTomato
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- input parameters
input int InpLeftSide = 3; // Кол-во баров слева от фрактала
input int InpRightSide = 3; // Кол-во баров справа от фрактала
//--- indicator buffers
double UpFractalsBuffer[];
double DnFractalsBuffer[];
//--- global variables
int minRequiredBars;
int leftSide,rightSide;
int maxSide;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
leftSide=(InpLeftSide<2?2:InpLeftSide);
rightSide=(InpRightSide<2?2:InpRightSide);
//---
minRequiredBars=leftSide+rightSide+1;
maxSide=int(fmax(leftSide,rightSide));
//---
SetIndexBuffer(0,UpFractalsBuffer,INDICATOR_DATA);
SetIndexBuffer(1,DnFractalsBuffer,INDICATOR_DATA);
//---
SetIndexArrow(0,217);
SetIndexArrow(1,218);
//PlotIndexSetInteger(0,PLOT_ARROW,217);
//PlotIndexSetInteger(1,PLOT_ARROW,218);
//---
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-10);
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,10);
//---
for(int i=0; i<2; i++) {
PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,minRequiredBars);
PlotIndexSetDouble(i,PLOT_EMPTY_VALUE,0.0);
}
//---
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
IndicatorSetString(INDICATOR_SHORTNAME,"XBarsFractals("+(string)leftSide+", "+(string)rightSide+")");
//---
return(0);
}
//+------------------------------------------------------------------+
//| Check if is Up Fractal function |
//+------------------------------------------------------------------+
bool isUpFractal(int bar,int max,const double &high[])
{
//---
for(int i=1; i<=max; i++) {
if(i<=leftSide && high[bar]<high[bar-i]) return(false);
if(i<=rightSide && high[bar]<=high[bar+i]) return(false);
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| Check if is Down Fractal function |
//+------------------------------------------------------------------+
bool isDnFractal(int bar,int max,const double &low[])
{
//---
for(int i=1; i<=max; i++) {
if(i<=leftSide && low[bar]>low[bar-i]) return(false);
if(i<=rightSide && low[bar]>=low[bar+i]) return(false);
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
int startBar,lastBar;
//---
if(rates_total<minRequiredBars) return(0);
//---
if(prev_calculated<minRequiredBars) {
startBar=leftSide;
ArrayInitialize(UpFractalsBuffer, 0.0);
ArrayInitialize(DnFractalsBuffer, 0.0);
}
else startBar=rates_total-minRequiredBars;
//---
lastBar=rates_total-rightSide;
for(int bar=startBar; bar<lastBar && !IsStopped(); bar++) {
//---
if(isUpFractal(bar,maxSide,high)) UpFractalsBuffer[bar]=high[bar];
else UpFractalsBuffer[bar]=0.0;
//---
if(isDnFractal(bar,maxSide,low)) DnFractalsBuffer[bar]=low[bar];
else DnFractalsBuffer[bar]=0.0;
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Правда я бы немного иначе бы делал, но это сила привычки...
Можно даже вот так:
rightSide=(InpRightSide<1?1:InpRightSide);
Тогда будет совсем смешные фракталы выводить...
Исправления минимальные:
Правда я бы немного иначе бы делал, но это сила привычки...
Можно даже вот так:
rightSide=(InpRightSide<1?1:InpRightSide);
Тогда будет совсем смешные фракталы выводить...
Спасибо, вот такого
В справке МТ4 тоже нет, чем заменить?
Спасибо, вот такого
В справке МТ4 тоже нет, чем заменить?
Это "Смещение стрелок по вертикали для стиля DRAW_ARROW"
Ничем из стандартного.
Просто можно задать смещение либо жёстко в настройках, либо по значению ATR
И вот эти строки сделайте так:
for(int i=0; i<2; i++) {
SetIndexDrawBegin(i,minRequiredBars);
SetIndexEmptyValue(i,0);
//PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,minRequiredBars);
//PlotIndexSetDouble(i,PLOT_EMPTY_VALUE,0.0);
}
//---
Это "Смещение стрелок по вертикали для стиля DRAW_ARROW"
Удалите то, что тут закомментировано, и впишите то, что вписано.
Всё равно грузит.
Вызываю из другого индикатора, даже на мгновение зависает терминал.
Что ещё можно сделать?
Всё равно грузит.
Вызываю из другого индикатора, даже на мгновение зависает терминал.
Что ещё можно сделать?
Не вызывать из другого индикатора :)
Или показать как вы это делаете.
- Бесплатные приложения для трейдинга
- Форексный VPS бесплатно на 24 часа
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти на MQL5 - языки очень похожи.
Здесь можно будет обсудить задачи, алгоритмы их решения, да и впрочем, любые вопросы, так или иначе касающиеся программирования для МТ.
Надеюсь, что к решению вопросов подтянутся другие опытные участники нашего форума, и ветка будет интересна всем.