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

 
Vladimir Karputov:

Lá:

Obrigado. Estarei no computador, talvez eu dê uma olhada.
 
Artyom Trishkin:
Obrigado. Estarei no computador, talvez eu dê uma olhada.

o indicador é escrito em um formato muito antigo em MQL4, não o toco há muito tempo, não tenho certeza se me lembro como foi escrito

@zig2003 como opção, tente remover o IndicatorBuffers(6) desde o início()

e na parte superior # de tampas_indicadoras de propriedade 6

 
Igor Makanu, e depois de corrigir o indicador, o que preciso comparar com o que na EA para programar uma inversão?
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
zig2003:
Igor Makanu, e depois de corrigir o indicador, o que devo comparar em meu Conselheiro Especialista para programar o pivô?

cada indicador consiste em vários buffers indicadores

quando você chama o indicador do Expert Advisor através do iCustom(), você obtém o valor de um buffer em uma determinada barra, e você pode visualizar este valor na janela de dados Ctrl+D

o que comparar depende de seu TS, seja os valores de tampão indicador ou tampão e preço - há muitas variantes

Você deve primeiro criar um indicador MA, e depois, quando o entender, você chamará seu próprio indicador em vez do MA

Não é tão fácil - basta escrever alguns comandos e seu Conselheiro Especializado estará pronto


ZS: um pivô indicador é uma comparação de vários valores de buffers indicadores, a julgar por sua captura de tela na barra número 2 deve ser definido próximo ao preço do buffer número 1 e o restante dos buffers teráValores VAZIO_VALOR, e na barra №1, ao contrário, o buffer №1 tem o valor VAZIO_VALOR , e um de 2 ou 3 buffers terá o valor diferente de VAZIO_VALOR - você deve olhar tudo isso na janela de visão geral dos dados (mova a seta do mouse nas barras e você verá os valores dos buffers)

 

Igor, obrigado, eu corrigi o indicador, mas o valor do tampão ainda não apareceu. Há muito tempo passei por essa fase, tudo é simples lá, há duas linhas - dois amortecedores. Normalmente para indicadores similares, que consistem em uma linha, mas com tampões diferentes para cor, escrevo o código assim:

//Функция для определения входа и выхода по AMA 
 int Enter()
  {
   double AMAbuy_1  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,1);             //Подключаем AMA для первого бара (buy)
   double AMAsell_1 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,1);             //                                (sell)
   double AMAbuy_2  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,2);             //Подключаем AMA для второго бара (buy)       
   double AMAsell_2 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,2);             //                                (sell)                    
                         
   if(AMAbuy_1>0 && AMAsell_2>0)                                                                                 //Вход в бай
      return(1);                                                                                           
   if(AMAsell_1>0 && AMAbuy_2>0)                                                                                 //Вход в селл
      return(-1);                                                                                          
        
   return(0);
  } 

Mas isto é apenas se um amortecedor real for atribuído a cada cor. Quando você muda de cor na primeira barra fechada, o valor do tampão torna-se maior que zero, enquanto na barra anterior ou era igual a zero ou o tampão de outra cor era maior que zero. Não consigo obter o valor para a segunda cor de venda deste indicador e não sei com o que compará-lo para captar a inversão. Tentei todos os números tampão. Isto é lamentável, porque esta mesa giratória do Mladenov, embora antiga, mas com tendências muito decentes em estratégias manuais.... Alguém pode adivinhar como tirar o valor do segundo tampão e escrever a fórmula para a inversão?

 
zig2003:

Igor, obrigado, eu corrigi o indicador, mas o valor do tampão ainda não apareceu. Há muito tempo passei por essa fase, tudo é simples lá, há duas linhas - dois amortecedores. Normalmente para indicadores similares, que consistem em uma linha, mas com tampões diferentes para cor, escrevo o código assim:

Mas isto é apenas se um verdadeiro tampão for atribuído a cada cor. Quando você muda de cor na primeira barra fechada, o valor de tampão torna-se maior que zero, enquanto na barra anterior ou era igual a zero ou o tampão de outra cor era maior que zero. Não consigo obter o valor para a segunda cor deste indicador e não consigo entender com o que compará-lo para captar a inversão. E isto é lamentável, porque este indicador de Mladenov, embora antigo, mas com uma tendência muito boa em estratégias manuais.... Alguém pode descobrir como escrever a fórmula de reversão?

Sem nenhuma edição de indicadores.

O que significam os dados nos dois amortecedores - em 0 e 1:

  • Se houver um valor no buffer 0 e nenhum valor no buffer 1, esta é a direção a seguir ( linha indicadora azul (se padrão))
  • Se houver um valor em buffer 0 e houver um valor em buffer 1, então esta é uma direção curta (cor vermelha da linha indicadora (se padrão))

Mudança de direção (cor) da linha:

  • Há sempre um valor no buffer 0 e, a propósito, sempre é possível defini-lo (comparar valores em três barras: 2<=1 && 1>0 --> para baixo, 2>=1 && 1<0 --> para cima)
    ...
    Mas você também pode usar apenas o buffer 1:
  • Se não há valor no buffer 1 na barra 0 e há um valor na barra 1, isto é uma mudança de direção da linha para longo;
  • Se houver um valor na barra 0 no buffer 1 e nenhum valor na barra 1, isto é uma mudança de direção da linha para curto prazo;

"Nenhum valor" aqui é EMPTY_VALUE. Ou DBL_MAX - não importa, é a mesma coisa. Isto é, não é zero, mas VAZIO_VALOR.

 
zig2003:

Alguém pode adivinhar como tirar o valor do segundo tampão e escrever a fórmula do pivô?

Você não precisa adivinhar, primeiro você deve reescrever o indicador em uma forma normal correspondente ao estado atual da MQL4

Coloquei o código em ordem um pouco, mas não tenho certeza de que não haverá erros. Não gosto do código fonte, mas trabalhei com o que tenho.

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrTomato
#property indicator_color3 clrTomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
input int    Range           = 9;
input int    FastMA          = 3;
input int    SlowMA          = 30;
input int    filter          = 25;
input int    normalizeDigits = 4;

input bool   alertsOn        = false;
input bool   alertsOnCurrent = false;
input bool   alertsMessage   = true;
input bool   alertsSound     = true;
input bool   alertsEmail     = false;
input string soundfile       = "alert2.wav";


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0, fAMA);
   SetIndexLabel(0, "fAMA");
   SetIndexBuffer(1, Downa);
   SetIndexLabel(1, "Downa");
   SetIndexBuffer(2, Downb);
   SetIndexLabel(2, "Downb");
   SetIndexBuffer(3, trend);
   SetIndexLabel(3, "trend");
   SetIndexBuffer(4, mAMA);
   SetIndexLabel(4, "mAMA");
   SetIndexBuffer(5, AMA);
   SetIndexLabel(5, "AMA");
   for (int i=0; i<indicator_buffers; i++) {
      SetIndexStyle(i, DRAW_LINE);
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],        // Low
                 const double &close[],      // Close
                 const long &tick_volume[],  // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
                )
{
   int limit;
   if(prev_calculated==0) limit=rates_total-1;
   else limit=rates_total-prev_calculated+1;
   if (trend[limit] == -1) ClearPoint(limit, Downa, Downb);
   double k1 = 2.0 / (SlowMA + 1);
   double k2 = 2.0 / (FastMA + 1) - k1;
   for(int i = limit; i>= 0; i--) {
      double sdAMA = 0;
      double Noise = 0;
      for(int k=0; k<Range; k++) Noise += MathAbs(Close[i+k] - Close[i+k+1]);
      double ER    = 0;
      if(Noise != 0) ER = MathAbs(Close[i] - Close[i+Range]) / Noise;
      double SSC   = (ER*k2+k1);



      AMA[i]  = AMA[i+1] + NormalizeDouble(SSC*SSC*(Close[i] - AMA[i+1]), normalizeDigits);
      mAMA[i] = AMA[i];

      if(filter < 1) fAMA[i] = mAMA[i];
      else {
         for(k = i; k <= i + SlowMA - 1; k++)  sdAMA = sdAMA + MathAbs(mAMA[k] - mAMA[k+1]);
         double dAMA  = mAMA[i] - mAMA[i+1];
         if(dAMA >= 0)
            if(dAMA < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) &&  High[i] <= High[Highest(NULL, 0, MODE_HIGH, 4, i)]+10*Point)
               fAMA[i] = fAMA[i+1];
            else   fAMA[i] = mAMA[i];
         else if(MathAbs(dAMA) < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) && Low[i] > Low[Lowest(NULL, 0, MODE_LOW, 4, i)]-10*Point)
            fAMA[i] = fAMA[i+1];
         else  fAMA[i] = mAMA[i];
      }

      Downa[i] = EMPTY_VALUE;
      Downb[i] = EMPTY_VALUE;
      trend[i] = trend[i+1];
      if (fAMA[i]> fAMA[i+1]) trend[i] =1;
      if (fAMA[i]< fAMA[i+1]) trend[i] =-1;
      if (trend[i]==-1) PlotPoint(i, Downa, Downb, fAMA);
   }

//


   if (alertsOn) {
      if (alertsOnCurrent)
         int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
         if (trend[whichBar] == 1)
            doAlert("buy");
         else  doAlert("sell");
   }
   return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;

   if (previousAlert != doWhat || previousTime != Time[0]) {
      previousAlert  = doWhat;
      previousTime   = Time[0];

      //
      //


      message =  StringConcatenate(Symbol(), " at ", TimeToStr(TimeLocal(), TIME_SECONDS), " AMA STL_Color ", doWhat);
      if (alertsMessage) Alert(message);
      if (alertsEmail)   SendMail(StringConcatenate(Symbol(), " AMA STL_Color "), message);
      if (alertsSound)   PlaySound(soundfile);
   }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClearPoint(int i, double& first[], double& second[])
{
   if ((second[i]  != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE))
      second[i+1] = EMPTY_VALUE;
   else if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE))
      first[i+1] = EMPTY_VALUE;
}
void PlotPoint(int i, double& first[], double& second[], double& from[])
{
   if (first[i+1] == EMPTY_VALUE)
      if (first[i+2] == EMPTY_VALUE) {
         first[i]  = from[i];
         first[i+1]  = from[i+1];
         second[i] = EMPTY_VALUE;
      }
      else  {
         second[i] = from[i];
         second[i+1] = from[i+1];
         first[i]  = EMPTY_VALUE;
      }
   else     {
      first[i]  = from[i];
      second[i]   = EMPTY_VALUE;
   }
}
//+------------------------------------------------------------------+

Aqui eu vejo os valores dos buffers indicadores deste indicador:


 
Rapazes, obrigado pelas dicas. EspecialmenteIgor Makanu. Sim, de fato, eu fiz 6 buffers em vez dos três padrão e os valores 1 e -1 apareceram em um dos buffers, mas não nos originais. É por isso que não consegui tirar os valores. E eu mesmo nunca teria adivinhado. Tudo está de volta ao normal agora. Tudo está funcionando. Igor, obrigado também pela destilação do indicador no novo formato. Obrigado novamente por seu conhecimento!!!!
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
Igor Makanu:

Você não precisa adivinhar, primeiro você precisa reescrever o indicador em uma forma normal correspondente ao estado atual do idioma MQL4

Coloquei o código em ordem um pouco, mas não tenho certeza de que não haverá erros, não gosto do código fonte, mas trabalhei com o que tenho

Aqui eu vejo os valores dos buffers indicadores deste indicador:

Funciona sem sobrescrever, e facilita muito a obtenção de seus dados. Eu o descrevi acima - você só precisa olhar suas leituras de buffer na janela de dados (Ctrl+D)

 
Artyom Trishkin:

Ele funciona sem reescrever e permite receber seus dados de forma muito simples. Eu o descrevi acima - você só precisa olhar suas leituras de buffer na janela de dados (Ctrl+D)

Escrevi acima que não me lembro como a função IndicatorCounted() funciona nos indicadores antigos, a nova forma de indicadores com OnCalculate() é mais compreensível

Bem, a questão parece estar resolvida, tudo bem ;)

Razão: