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

 
Konstantin Nikitin:

Sim, é isso que quero dizer. Certo, sentimos falta disso. O principal é que ele entenda o que é o que...

Ele quem? Foi onde eu comecei.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta de iniciantes sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos

Alexey Viktorov, 2019.06.11 09:06

Você não pode usar o SymbolInfoInteger para obter o Point())).

E em geral, é necessário lembrar esse Ponto() ou _Ponto somente para o símbolo atual. Para outros símbolos além daquele em que a EA trabalha, você deve usar esta função.

A função SymbolInfoInteger retorna não apenas valores int, mas também valores longos, bool e enumerações.

A seguir, é claro, ele quis dizer Dígitos() ou _Dígitos e escreveu o que ele tinha escrito. E a última linha de resposta dizia respeito à segunda parte da pergunta. Não se esqueça do provérbio russo: "Um homem inteligente não dirá, um tolo não adivinhará". adivinhou e disse, portanto, não é nem uma coisa nem outra.
 
Alexey Viktorov:

Может вам очень не повезло, но я не люблю колупаться в чужом коде. Тем более править его...

Alexey Viktorov:

Próxima pergunta: Com que freqüência você acha que o valor do indicador será exatamente 50?

Como entendi o problema, deveria ser uma cor >50 e outra <50, mas ainda não vi ==50 em nenhum lugar. É claro, para não perder no caso ===50, devemos acrescentar >=50 a um deles e <=50 a outro. Pode parecer melhor.

E a segunda pergunta: qual foi a necessidade de mudar toda a indexação do buffer? Depois de reindexar, você consertou tudo em seu código? Talvez fosse mais fácil fazer o índice de tampão de cor 4, e os tampões auxiliares 5 e 6 de acordo. Você teria menos a editar e menos chances de cometer mais alguns erros.

  • Obrigado pela resposta. Se Luby tivesse mexido no código de outra pessoa, muito provavelmente o teríamos perdido como especialista, então é SORREDO a este respeito.
  • Sobre <= ou >= Concordo, omissão, claro que uma delas deve estar presente, assim que eu passar, mas por enquanto não é uma questão de princípio.
  • Triado, reatribuído um buffer de uma cor, reatribuído grupos inteiros, grupos trocados (acima/abaixo) - nada ajuda. Vou agora terminar o posto e tentar fazer um indicador de histograma separado, sem linhas. Se funcionar, vou tentar combiná-las novamente. Esta é uma questão de princípio. Eu não quero deixar para trás pontos brancos de incompreensão.

 
Sergey Voytsekhovsky:

  • Obrigado por sua resposta. Se Lubilee estivesse bisbilhotando no código de outras pessoas, provavelmente o teríamos perdido como especialista, então é apenas SORRENTE a esse respeito.
  • Sobre <= ou >= Concordo, omissão, claro que uma delas deve estar presente, assim que eu passar, mas até agora não é uma questão de princípio.
  • Triado, reatribuído um buffer de uma cor, reatribuído grupos inteiros, grupos trocados (acima/abaixo) - nada ajuda. Vou agora terminar o posto e tentar fazer um indicador de histograma separado, sem linhas. Se funcionar, vou tentar combiná-las novamente. Esta é uma questão de princípio. Não quero deixar manchas brancas de incompreensão para trás.

Você deve ter mexido no cérebro quando estava mudando a indexação do buffer.

Volte e pegue o código antigo da Mensagem 8806 e mude apenas a seqüência tampão.

   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
Em seguida, trace as condições quando é necessário colocar 0 e quando é necessário colocar 1
 
Alexey Viktorov:

Você não deve ter pensado muito quando mudou a indexação do buffer.

Volte e pegue o código antigo do correio 8806 e mude ali apenas a seqüência tampão.

Em seguida, trace as condições quando colocar 0 no buffer de cor e quando colocar 1

Eu fiz isso, não ajudei, admiti que estava cometendo erros, depois de seu posto eu o fiz novamente. Aqui estão os lugares de código que eu mudei. O antigo é descomentado.

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID

#property indicator_type3   DRAW_COLOR_HISTOGRAM2
#property indicator_color3  clrGreen,clrRed
#property indicator_style3  STYLE_SOLID

#property indicator_width1  3 
#property indicator_width2  2 
#property indicator_width3  1 
//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing
//--- indicator buffers
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
     //double    ExtHighesBuffer[];
     //double    ExtLowesBuffer[];
     //double    ColorHistogram_2Colors[];
double    ColorHistogram_2Colors[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(3,ColorHistogram_2Buffer2,INDICATOR_DATA);
        //SetIndexBuffer(4,ExtHighesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(5,ExtLowesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(6,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   //PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetString(0,PLOT_LABEL,"Main");
   PlotIndexSetString(1,PLOT_LABEL,"Signal");
        //PlotIndexSetString(2,PLOT_LABEL,"UP");
        //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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 i,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>=50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,colors[i]);
   return(rates_total);
  }
//+------------------------------------------------------------------+ 

Assim era antes de eu fazer as mudanças. O histograma está lá, a cor certa não está.

É assim que as coisas são agora. O histograma desapareceu, ele não é exibido.

Acho que não estou pensando direito novamente.


 
Sergey Voytsekhovsky:

Eu fiz isso, não funcionou, cometi erros, depois de seu posto eu o fiz novamente. Aqui estão os lugares no código que eu mudei. O antigo é descomentado.

Assim era antes de eu fazer as mudanças. O histograma está lá, a cor certa não está.

É assim que as coisas são agora. O histograma desapareceu, ele não é exibido.

Devo estar de novo a racionar meus miolos.


Aqui não há lógica alguma. A seqüência deve ser a seguinte: O valor do histograma é determinado e o i-ésimo índice do buffer indicador é preenchido. Em seguida, uma verificação separada, se este valor >=50 o buffer de cores é preenchido com 0, caso contrário 1. isto é determinado pela seqüência de cores na diretiva

#property indicator_color3  clrGreen,clrRed

Se 0, a cor clrGreen é tomada e se 1, clrRed

E esta linha é completamente desnecessária, e a seqüência é a oposta da primeira.

color     colors[]={clrRed,clrGreen};

E isto

int       cl;

adicionado para que propósito? É mais fácil de preencher diretamente.

ColorHistogram_2Colors[i]=0;
// или 
ColorHistogram_2Colors[i]=1;

Para preencher o buffer de cores, eu usaria esta construção

         ColorHistogram_2Colors[i]=ExtMainBuffer[i] >= 50 ? 0 : 1; 
O ?: operador é equivalente a se, mas aplicado mais facilmente
 
Alexey Viktorov:

A lógica aqui é quebrada em geral. A seqüência deve ser a seguinte: Definir o valor do histograma, preencher o i-ésimo índice do buffer de indicadores. Em seguida, uma verificação separada, se este valor >=50 o buffer de cor é preenchido com 0, caso contrário 1. isto é determinado pela seqüência de cores na diretiva

Se 0, a cor clrGreen é tomada e se 1, clrRed

E esta linha é absolutamente desnecessária, e a seqüência é a oposta da primeira.

E isto

adicionado para que propósito? É mais fácil de preencher diretamente.

Para preencher o buffer de cores, eu usaria esta construção

O ?: operador é equivalente a se, mas mais fácil de usar

WURRAA, e minha alma cantou. Alexey, muito obrigado !!!!!

Tudo funcionou, não entendo bem como é possível prescindir da matriz

color     colors[]={clrRed,clrGreen};

porque sua descrição foi apagada. Então, você pode prescindir de uma matriz extra aqui?


 
Sergey Voytsekhovsky:

  • Obrigado por sua resposta. Se Lubilee estivesse bisbilhotando no código de outras pessoas, provavelmente o teríamos perdido como especialista, então é apenas SORRENTE a esse respeito.
  • Sobre <= ou >= Concordo, omissão, claro que uma delas deve estar presente, assim que eu passar, mas por enquanto não é uma questão de princípio.
  • Tentou, reatribuiu um buffer de uma cor, reatribuiu grupos inteiros, trocou grupos em lugares (acima/abaixo) - nada ajuda. Vou agora terminar o posto e tentar fazer um indicador de histograma separado, sem linhas. Se funcionar, vou tentar combiná-las novamente. Esta é uma questão de princípio. Não quero deixar manchas brancas de incompreensão para trás.

Meu Squeaky é apenas um milagre, ele o leva para todos os lugares e em todos os lugares.

p.s Eu ainda não aprendi como anexar uma imagem corretamente, por favor me desculpem, vou postar screenshots.

Arquivos anexados:
EURUSD.png  52 kb
GBPUSD.png  54 kb
 
Alexey Viktorov:

Para preencher o tampão colorido, eu usaria esta construção

O ?: operador é equivalente a se, mas mais fácil de usar

Um grande conselho e uma grande ciência para o futuro!!! Foi ainda um pouco mais longe. Abaixo está o resultado.

Assim foi:

if(ExtMainBuffer[i]>=50){
         //cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=0;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
if(ExtMainBuffer[i]<50){
         //cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=1;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 

Assim se tornou, a eficácia da abordagem é óbvia!!! Obrigado.

      ColorHistogram_2Buffer1[i]=ExtMainBuffer[i] >= 50 ? 50 : ExtMainBuffer[i]; 
      ColorHistogram_2Buffer2[i]=ExtMainBuffer[i] >= 50 ? ExtMainBuffer[i] : 50; 
      ColorHistogram_2Colors [i]=ExtMainBuffer[i] >= 50 ? 0 : 1;
         Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
            " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
            " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
            " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
            " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
 
Sergey Voytsekhovsky:

Um grande conselho e uma grande ciência para o futuro!!! Foi ainda um pouco mais longe do que isso. Abaixo está o resultado.

Assim foi:

Assim se tornou, a eficácia da abordagem é óbvia!!! Obrigado.

Aqui não há eficiência - três condições if-else em vez de uma. Aqui, é pior do jeito que é...

 
Artyom Trishkin:

Aqui não há eficiência: há três condições de "if-else" em vez de uma. Aqui é pior...

Sim, de fato, eu não tinha notado isso. Parece melhor, há menos cartas.

E não há como colocar três execuções (não sei como dizer corretamente) sob um único operador?: de uma só vez?

Razão: