Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 695

 
psyman:

Por alguma razão, não consigo pegar uma barra no laço, que começa às 15 horas.

Se eu escrever if(i<24) como condição, o registro exibe a hora de cada barra para o dia, mas a condição exigida não é cumprida:


E em que período de tempo você executa o indicador?

 
psyman:

Sentinela em ambos os casos.

Funciona:

//+------------------------------------------------------------------+
//|                                                     TestHour.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property strict
//--- plot Hour
#property indicator_label1  "Hour"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  #ifdef __MQL4__ 2 #else 6 #endif 
//--- input parameters
input uchar    InpHour  =  15;   // The required hour
//--- indicator buffers
double         BufferHour[];
//--- global variables
int            hour_req;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- set global variables
   hour_req=int(InpHour>23 ? 23 : InpHour);
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferHour,INDICATOR_DATA);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Hour("+(string)hour_req+")");
#ifdef __MQL4__
   SetIndexLabel(0,"Hour("+(string)hour_req+")");
#else 
   PlotIndexSetString(0,PLOT_LABEL,"Hour("+(string)hour_req+")");
   ArraySetAsSeries(BufferHour,true);
#endif 
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries(time,true);
#endif 
//--- Проверка количества доступных баров
   if(rates_total<1) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferHour,0);
     }
//--- Подготовка данных

//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      int hour=GetTimeHour(time[i]);
      BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Возвращает час указанного времени                                |
//+------------------------------------------------------------------+
int GetTimeHour(const datetime time)
  {
   #ifdef __MQL4__
   return TimeHour(time);
   #endif 
   MqlDateTime tm;
   if(!TimeToStruct(time,tm)) return WRONG_VALUE;
   return tm.hour;
  }
//+------------------------------------------------------------------+
 

Obrigado, mas é tão complicado para alguém que não está sobrecarregado com experiência e conhecimento, é uma bagunça :-)


BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0);

Por que fazer umahora de verificação>0 ao transferir dados para o buffer? E se não for assim, por que atribuir 0,1?



Eu queria fazer destaque no gráfico principal, mas não por uma linha, mas por dia ordinal da semana seg, quarta, quarta... via SetIndexArrow(0, 140); (talvez haja uma maneira mais simples, mas até agora nada mais apareceu), mas por alguma razão eu não posso fazer seu código funcionar na janela principal em quatro, e em cinco não há tal propriedade.

 
psyman:

Obrigado, mas é tão complicado para alguém que não está sobrecarregado com experiência e conhecimento, é uma bagunça :-)


Por que fazer umahora de verificação>0ao transferir dados para o buffer? E se não for assim, por que atribuir 0,1?



Eu queria fazer destaque no gráfico principal, mas não por uma linha, mas por dia ordinal da semana seg, quarta, quarta... via SetIndexArrow(0, 140); (talvez haja uma maneira mais simples, mas até agora nada mais apareceu), mas por alguma razão eu não posso fazer seu código funcionar na janela principal em quatro, e em cinco não há tal propriedade.

O buffer é preenchido com o valor da hora. E se a hora for zero, o histograma não será desenhado. Portanto, devemos verificar se a hora é zero (nós a ajustamos para procurar por zero hora nas configurações), e se for zero, devemos inserir 0,1 no buffer, não o valor da hora (zero), para exibir a coluna do histograma. Isto mostrará um valor 0 em vez de 0,1 na janela de dados, já que os dígitos indicadores estão definidos para zero.

 
psyman:

Obrigado, mas é tão complicado para alguém que não está sobrecarregado com experiência e conhecimento, é uma bagunça :-)


Por que fazer umahora de verificação>0 ao transferir dados para o buffer? E se não for assim, por que atribuir 0,1?



Eu queria fazer destaque no gráfico principal, mas não por uma linha, mas por dia ordinal da semana seg, quarta, quarta... via SetIndexArrow(0, 140); (talvez haja uma maneira mais simples, mas até agora nada mais apareceu), mas por alguma razão eu não posso fazer seu código funcionar na janela principal em quatro, e em cinco já não há nenhuma propriedade desse tipo.

PlotIndexSetInteger(0,PLOT_ARROW,140);

Mas você precisa criar um número de amortecedores igual ao número de semanas. E a cada tampão é dado um código de seta de 140 a 149 - 1,2,3,4,5,6,7,8,9,10 - dez semanas é suficiente para um ano? Isso são apenas 70 dias. Ou como você o queria?

 
Bom dia a todos vocês!
Por favor, ajude!
Este BB MACD - indicador para MetaTrader 4 foi baixado por mim a partir daquihttps://www.mql5.com/en/code/9325
Este indicador é calculado em dois ciclos.
Usando os dados do buffer MACD anterior, as Bandas de Bollinger são calculadas.

Uma tentativa de mudar a direção da contagem do ciclo principal e calcular tudo de uma só vez em um ciclo e, ao mesmo tempo, livrar-se de
Ao mesmo tempo, para se livrar do ciclo adicional ao calcular as Bandas de Bollinger acabou em um fiasco.
O indicador produz os mesmos resultados que seu homólogo intocado, mas freia o terminal de forma selvagem ao calcular o histórico.
Se você deixá-lo em um período mensal, você não vai notar, mas se você deixá-lo em 15 minutos

Tenho que reiniciá-la.

Não posso ter certeza do que fazer com ele.

Posso perguntar quem pode sugerir como calcular os locais mais lentos nos programas?

Obrigado antecipadamente pelas dicas!


Este é o original. E abaixo é o mesmo com minhas mudanças.

//+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

#property  copyright "Copyright © 2005, adoleh2000"
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  Lime    //bbMacd up
#property  indicator_color2  Magenta //bbMacd up
#property  indicator_color3  Blue    //Upperband
#property  indicator_color4  Red     //Lowerband
//---- indicator parameters
extern int FastLen = 12;
extern int SlowLen = 26;
extern int Length = 10;
extern double StDv = 2.5;
//----
int loopbegin;
int shift;
double zeroline;
//---- indicator buffers
double ExtMapBuffer1[];  // bbMacd
double ExtMapBuffer2[];  // bbMacd
double ExtMapBuffer3[];  // Upperband Line
double ExtMapBuffer4[];  // Lowerband Line
//---- buffers
double bbMacd[];
double Upperband[];
double Lowerband[];
double avg[];
double bbMacdline;
double sDev;
double mean;
double sumSqr;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 6 additional buffers are used for counting.
   IndicatorBuffers(8);   
//---- drawing settings     
   SetIndexBuffer(0, ExtMapBuffer1); // bbMacd line
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0, 108);
   IndicatorDigits(Digits + 1);
//----
   SetIndexBuffer(1, ExtMapBuffer2); // bbMacd line
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexArrow(1, 108);
   IndicatorDigits(Digits + 1);
//----   
   SetIndexBuffer(2, ExtMapBuffer3); // Upperband line
   SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1);
   IndicatorDigits(Digits + 1);
//----   
   SetIndexBuffer(3, ExtMapBuffer4); // Lowerband line
   SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);
   IndicatorDigits(Digits + 1);
//----
   SetIndexBuffer(4, bbMacd);
   SetIndexBuffer(5, Upperband);        
   SetIndexBuffer(6, Lowerband);
   SetIndexBuffer(7, avg);    
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("BB MACD(" + FastLen + "," + SlowLen + "," + Length+")");
   SetIndexLabel(0, "bbMacd");
   SetIndexLabel(1, "Upperband");
   SetIndexLabel(2, "Lowerband");  
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom BB_MACD                                                   |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) 
       return(-1);
//---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(int i = 0; i < limit; i++)
       bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) - 
                   iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);
//----
   for(i = 0; i < limit; i++)
     {
       avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);
       sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);  
       Upperband[i] = avg[i] + (StDv * sDev);
       Lowerband[i] = avg[i] - (StDv * sDev);
       ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd
       ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd
       ExtMapBuffer3[i]=Upperband[i];  // Upperband
       ExtMapBuffer4[i]=Lowerband[i];  // Lowerband
       //----
       if(bbMacd[i] > bbMacd[i+1])
           ExtMapBuffer2[i] = EMPTY_VALUE;
       //----
       if(bbMacd[i] < bbMacd[i+1])
           ExtMapBuffer1[i] = EMPTY_VALUE;
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+


//================


//+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

/*
Осторожно!!!
В том коде мной изменено направление расчёта главного цикла. Осторожно!!! Этот индикатор очень медленно выполняется!!! Его можно бросить только на недельный или месячный таймфрейм где в истории мало баров, если ниже 4х часов то терминал вешается!!! */
#property  copyright "Copyright © 2005, adoleh2000" #property  link      "http://www.metaquotes.net/" //---- indicator settings #property  indicator_separate_window #property  indicator_buffers 4 #property  indicator_color1  Lime    //bbMacd up #property  indicator_color2  Magenta //bbMacd up #property  indicator_color3  Blue    //Upperband #property  indicator_color4  Red     //Lowerband //---- indicator parameters extern int FastLen = 12; extern int SlowLen = 26; extern int Length = 10; extern double StDv = 2.5; //---- int loopbegin; int shift; double zeroline; //---- indicator buffers double ExtMapBuffer1[];  // bbMacd double ExtMapBuffer2[];  // bbMacd double ExtMapBuffer3[];  // Upperband Line double ExtMapBuffer4[];  // Lowerband Line //---- buffers double bbMacd[]; double Upperband[]; double Lowerband[]; double avg[]; double bbMacdline; double sDev; double mean; double sumSqr; //+------------------------------------------------------------------+ //| Custom indicator initialization function                         | //+------------------------------------------------------------------+ int init()   { //---- 6 additional buffers are used for counting.    IndicatorBuffers(8);   //---- drawing settings        SetIndexBuffer(0, ExtMapBuffer1); // bbMacd line    SetIndexStyle(0, DRAW_ARROW);    SetIndexArrow(0, 108);    IndicatorDigits(Digits + 1); //----    SetIndexBuffer(1, ExtMapBuffer2); // bbMacd line    SetIndexStyle(1, DRAW_ARROW);    SetIndexArrow(1, 108);    IndicatorDigits(Digits + 1); //----      SetIndexBuffer(2, ExtMapBuffer3); // Upperband line    SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1);    IndicatorDigits(Digits + 1); //----      SetIndexBuffer(3, ExtMapBuffer4); // Lowerband line    SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);    IndicatorDigits(Digits + 1); //----    SetIndexBuffer(4, bbMacd);    SetIndexBuffer(5, Upperband);            SetIndexBuffer(6, Lowerband);    SetIndexBuffer(7, avg);     //---- name for DataWindow and indicator subwindow label    IndicatorShortName("BB MACD-2(" + FastLen + "," + SlowLen + "," + Length+")");    SetIndexLabel(0, "bbMacd");    SetIndexLabel(1, "Upperband");    SetIndexLabel(2, "Lowerband");            //---- initialization done    return(0);   } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function                       | //+------------------------------------------------------------------+ int deinit()   { //----    return(0);   } //+------------------------------------------------------------------+ //| Custom BB_MACD                                                   | //+------------------------------------------------------------------+ int start()   {    int limit, i,MaxPeriod;    int counted_bars = IndicatorCounted(); //---- check for possible errors    if(counted_bars < 0)        return(-1); //---- last counted bar will be recounted    if(counted_bars > 0)        counted_bars--;    limit = Bars - counted_bars;             if(counted_bars==0){              for(i=Bars-1; i>=1; i--) bbMacd[i]=0.0;//обнулим первый рассчитываемый массив              MaxPeriod= MathMax(MathMax(FastLen,SlowLen), Length);//это самые старые бары в истории которые не будем рассчитывать       limit=limit-MaxPeriod;    }    //      //---- основной цикл   for(i=limit; i>=1; i--){//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //В этом месте изменено направление пересчёта в основном цикле. //И все расчёты зависимых друг от друга буферов производятся последовательно  в одном цикле. //Дополнительный цикл расчета удалён.        bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) -                    iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);                           avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);        sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);          Upperband[i] = avg[i] + (StDv * sDev);        Lowerband[i] = avg[i] - (StDv * sDev);        ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd        ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd        ExtMapBuffer3[i]=Upperband[i];  // Upperband        ExtMapBuffer4[i]=Lowerband[i];  // Lowerband        //----        if(bbMacd[i] > bbMacd[i+1])            ExtMapBuffer2[i] = EMPTY_VALUE;        //----        if(bbMacd[i] < bbMacd[i+1])            ExtMapBuffer1[i] = EMPTY_VALUE;      }//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //---- done    return(0);   } //+------------------------------------------------------------------+
BB MACD
BB MACD
  • www.mql5.com
BB_MACD Indicator.
 
Northwest:
Bom dia a todos vocês!
Por favor, ajude!
Este BB MACD - indicador para MetaTrader 4 foi baixado por mim a partir daquihttps://www.mql5.com/en/code/9325
Este indicador é calculado em dois ciclos.
Usando os dados do buffer MACD anterior, as Bandas de Bollinger são calculadas.

Uma tentativa de mudar a direção da contagem do ciclo principal e calcular tudo de uma só vez em um ciclo e, ao mesmo tempo, livrar-se do
Ao mesmo tempo, para se livrar do ciclo adicional ao calcular as Bandas de Bollinger acabou em um fiasco.
O indicador produz os mesmos resultados que seu homólogo intocado, mas freia o terminal de forma selvagem ao calcular o histórico.
Se você deixá-lo em um período mensal, você não vai notar, mas se você deixá-lo em 15 minutos

Tenho que reiniciá-la.

Não posso ter certeza do que fazer com ele.

Posso perguntar quem pode sugerir como calcular os locais mais lentos nos programas?

Obrigado antecipadamente pelas dicas!


Este é o original. E abaixo é o mesmo com minhas mudanças.


//================


Devolva tudo isso, não torture o computador

iBandsOnArray, iStdDevOnArray calculado para dados armazenados em uma matriz

A matriz, por outro lado, é preenchida em 1 laço

 
Alekseu Fedotov:

Coloque tudo de volta, não torture o computador

iBandsOnArray, iStdDevOnArray calculado para dados armazenados em uma matriz

Uma matriz, por outro lado, é preenchida em 1 ciclo

1. Coloque tudo de volta, não torture seu computador .

Desculpe, mas você não vai recuperá-lo. Você tem que fazer o indicador contar da esquerda para a direita.

Não o estou incomodando, estou usando-o para o fim a que se destina.

2.iBandsOnArray, iStdDevOnArray calculado usando dados armazenados na matriz

Sim, eles são calculados usando dados da matriz bbMacd[], então o que segue?

3. a matriz é preenchida em um loop.

Em um ou no primeiro?

Você está dizendo que, para preencher uma matriz, você precisa de um loop pessoal, no qual essa matriz seja preenchida

está cheia e nenhuma outra operação pode ser realizada?


É importante para mim descobrir por que o indicador abranda e como calcular os lugares onde ele acontece.

Tenho mais perguntas, mas não tenho respostas.

Infelizmente, você não ofereceu nenhuma pista.

 

Como posso desativar a reinicialização quando o cronograma da EA muda?


Há algumas informações aqui:

EAExecutando OnDeinit e OnInit, o objeto de classe global não muda.

https://www.mql5.com/ru/forum/170952/page61#comment_6132824


Também é correto para mql4?