Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos
É possível personalizar o número de barras de construção no indicador padrão Fractals , ou seja, diferente de 5?
Em caso afirmativo, como isso pode ser feito?
Olá.
É possível personalizar o número de barras de construção no indicador padrão Fractals , ou seja, diferente de 5?
Em caso afirmativo, como isso pode ser feito?
existe tal no codebasehttps://www.mql5.com/ru/search#!keyword=fractals&module=mql5_module_codebase
Obrigado. Eu preciso de um só para mq4https://www.mql5.com/pt/code/1381
Compilei-o no editor MT4, ele funciona, mas carrega a cpu, o que devo mudar para não carregá-lo?
#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);
}
//+------------------------------------------------------------------+
Obrigado. Precisa de um só no mq4https://www.mql5.com/pt/code/1381
As correções são mínimas:
//| 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);
}
//+------------------------------------------------------------------+
É verdade, eu o faria um pouco diferente, mas é a força do hábito.
Você poderia até mesmo fazer isso assim:
rightSide=(InpRightSide<1?1:InpRightSide);
Então você terá fractais bem engraçados...
As correções são mínimas:
Embora o tivesse feito de forma um pouco diferente, mas isso é força do hábito.
Você poderia até mesmo fazer isso assim:
rightSide=(InpRightSide<1?1:InpRightSide);
Nesse caso, exibirá fractais absolutamente ridículos.
Obrigado, assim.
Você não consegue encontrá-lo no MT4 Help também, com o que substituí-lo?
Obrigado, há um como este.
Também não na ajuda do MT4, com o que substituí-lo?
É "Vertical Arrow Offset for DRAW_ARROW Style".
Nenhum dos padrões.
Você pode apenas definir o offset nas configurações, ou pelo valor de ATR
E fazer com que estas linhas sejam assim:
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);
}
//---
Este é o "Vertical Arrow Offset for DRAW_ARROW Style".
Elimine o que é comentado aqui e coloque o que está escrito.
Ainda está carregando.
Chamada de outro indicador, até mesmo pendura o terminal por um momento.
O que mais posso fazer?
Ainda está carregando.
Chamada de outro indicador, até mesmo pendura o terminal por um momento.
O que mais posso fazer?
Não ligar de outro indicador :)
Ou mostre como você o faz.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Nesta linha eu quero começar a ajudar aqueles que realmente querem entender e aprender programação na nova MQL4 e querem mudar facilmente para a MQL5 - as linguagens são muito semelhantes.
Este blog será um bom lugar para discutir tarefas, algoritmos de sua solução e quaisquer outras questões relativas à programação MT de uma forma ou de outra.
Espero que outros membros experientes do nosso fórum se juntem a nós e que este tópico seja interessante para todos.