Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 545

 
GSB:

Que tipo de tomada? Você pode chamar o mesmo indicador com parâmetros completamente diferentes



Se no próprio indicador
extern int       periodAMA=10;
na EA
extern int periodAMA_1= 8; 
extern int periodAMA_2=13; 

como o código indicador reconhece os parâmetros transmitidos e seus nomes são diferentes?

Mas tudo é como você disse. Eu verifiquei novamente com o roteiro)

 
Forexman77:
Se no próprio indicador no Expert Advisor

como o código indicador reconhece os parâmetros transmitidos e os nomes são diferentes?

Mas tudo é como você disse. Verificado novamente com o roteiro)


A(s) variável(s) no programa de chamada pode(m) ser nomeada(s) como você quiser e seu nome não está relacionado ao nome da variável no indicador, elas são variáveis diferentes, e são chamadas a partir de diferentes linhas terminais.

O indicador é chamado com base em seu nome, os parâmetros são passados para ele durante cada chamada a partir da 4ª posição e, em seguida, os parâmetros iCustom().

Se a variável per1=9; for declarada e iCustom() estiver na posição 4, o indicador será calculado com um período de 9; se você definir outra variável, seu valor será usado durante o cálculo, e isto se aplica a todos os parâmetros do indicador, o principal é defini-los na ordem correta, como no próprio indicador. A variável que será passada (sua referência) como o primeiro parâmetro do indicador - no quarto lugar iCustom() do segundo e assim por diante.



 
GSB:

A(s) variável(s) no programa de chamada pode(m) ser nomeada(s) como você quiser, seu nome não está relacionado ao nome da variável no indicador, são variáveis diferentes, e são chamadas a partir de diferentes linhas terminais.

O indicador é chamado por seu nome, os parâmetros são passados a ele durante cada chamada a partir da 4ª posição, e depois os parâmetros iCustom().

Se a variável per1=9 for declarada e iCustom() for posicionada em 4, o indicador será calculado com um período de 9; se você definir outra variável, seu valor será usado durante o cálculo e isto se aplica a todos os parâmetros do indicador, o principal é defini-los na ordem correta, como no próprio indicador. A variável que será passada (sua referência) como o primeiro parâmetro do indicador - o quarto iCustom() do segundo e assim por diante.



Eu peguei. No livro didático, parece ser chamado de transferência dos valores citados.
 

Pensei que não deveria desperdiçar o fórum e ter um tópico à parte, mas realmente espero um feedback construtivo sobre meu problema, não estou avançando sem ele :(.
Eu tentei escrever vários indicadores, tudo parece estar bem, agora eu importei tudo para minha EA usando a função iCustom(). O código no Expert Advisor:

double ma=iCustom(NULL,0,"TestMA",0,1);

O próprio indicador (eu o escrevi para testes)

//+------------------------------------------------------------------+
//|                                                       TestMA.mq4 |
//|                                  Copyright 2014, Semyon Polyakov |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Semyon Polyakov"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
 
   SetIndexStyle(0,DRAW_LINE,EMPTY,1,clrRed);
   SetIndexBuffer(0,ExtMapBuffer1);
//---
   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[])
  {
//---
    int counted_bars=IndicatorCounted(),
       limit;
 
   if(counted_bars>0)
      counted_bars--;
   
   limit=Bars-counted_bars;
     
   for(int i=0;i<limit;i++)
   {
      ExtMapBuffer1[i]=SimpleMA(i,20,close);
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
  double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
   if(position>=0 && period>0)
     {
      //--- calculate value
      for(int i=0;i<period;i++) result+=price[position+i];
      result/=period;
     }
//---
   return(result);
  }
//+------------------------------------------------------------------+

A seguir, a coisa VAZIO_VALOR ao testar.

Isto é, quando começamos os testes, temos a data de início da EA e tudo antes dessa data o iCustom fornece os valores indicadores corretos, tudo depois disso é testado diretamente - EMPTY_VALUE. :(
Já estou cansado de procurar no Google e no fórum, eles escrevem sobre "não olhar para o futuro", mas não vejo isso no código. Onde eu sou um tolo?)

 
Semionn:

Pensei que não deveria desperdiçar o fórum e ter um tópico à parte, mas realmente espero um feedback construtivo sobre meu problema, não estou avançando sem ele :(.
Eu tentei escrever vários indicadores, tudo parece estar bem, agora eu importei tudo para minha EA usando a função iCustom(). O código no Expert Advisor:

O próprio indicador (eu o escrevi para testes)

A seguir, a coisa VAZIO_VALOR ao testar.

Isto é, quando começamos os testes, temos a data de início da EA e tudo antes dessa data o iCustom fornece os valores indicadores corretos, tudo depois disso é testado diretamente - EMPTY_VALUE. :(
Já estou cansado de procurar no Google e no fórum, eles escrevem sobre "não olhar para o futuro", mas não vejo isso no código. Onde eu sou um tolo?)

O erro parece estar no código do Expert Advisor, por que você não usa um debugger? Definir pontos de verificação, ver valores variáveis, e ver se o indicador é chamado, o que é antes e depois de sua data
 
GSB:
O erro parece estar no código do Expert Advisor, por que você não usa um debugger? Definir pontos de verificação, ver valores variáveis, e ver se o indicador é chamado, o que é antes e depois de sua data

O depurador só pode ser usado em modo de conta demo, não em teste, além de eu ter escrito - o indicador é chamado, funciona e retorna valores, mesmo corretos, mas somente antes da data especificada (data de início do teste). Eu produzo os valores das variáveis no EA, por isso digo que tudo é bom no início, e depois VAZIO_VALOR
 
Semionn:

O depurador só pode ser usado em modo de conta demo, não em teste, além de ter escrito - o indicador é chamado, funciona e retorna valores, até mesmo corretos, mas somente até a data especificada (data de início do teste). Eu produzo os valores das variáveis no EA, por isso digo que tudo é bom no início, e depois VAZIO_VALOR


Você já leu atentamente como rastrear novas barras em indicadores personalizados?

[O primeiro parâmetro de taxas_total contém o número de barras disponíveis para o indicador para cálculo e corresponde ao número de barras disponíveis no gráfico.

Observe a conexão entre o valor retornado pela OnCalculate() e o segundo parâmetro de entrada pré_calculado. O parâmetro pré_calculado na chamada de função contém um valor retornado pela OnCalculate() na chamada anterior. Isto permite algoritmos econômicos para o cálculo do indicador personalizado a fim de evitar cálculos repetidos para aquelas barras que não mudaram desde a chamada anterior desta função.

Para isso, geralmente é suficiente retornar o valor do parâmetro rate_total, que contém o número de barras na chamada de função atual. Se desde a última chamada do OnCalculate() os dados de preço mudaram (um histórico mais profundo foi bombeado ou o histórico foi preenchido), então o valor do parâmetro de entrada pré_calculado será ajustado a zero pelo terminal. [/QUOTE]

 

Você precisa encontrar a média dos momentos de um dia em 20 dias e depois encontrar a média dos momentos de 20 dias em cinco dias.

Encontrar a média de 20 dias não foi um problema. Mas não seicomo obtera média de cinco dias apartir desta média .

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--- input parameters
extern int       Period_MA_1=1;
extern int       p          =20;
//--- buffers
double ExtMapBuffer1[];
double val20[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double momentum20;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
    
   for(int i=0;i<limit;i++)
   {
      momentum20=0;
      ArrayInitialize(val20,0);      
      for(int k=p;k>=0;k--)
      {
      ArrayResize(val20,p);
      val20[k]=Close[i+k]-Close[i+k+Period_MA_1];
      momentum20=momentum20+val20[k];
      }
      momentum20=momentum20/p;
      ExtMapBuffer1[i]=momentum20;
   }
   return(0);
  }
 
Forexman77:

Você precisa encontrar a média dos momentos de um dia em 20 dias e depois encontrar a média dos momentos de 20 dias em cinco dias.

Encontrar a média de 20 dias não foi um problema. Mas não seicomo obtera média de cinco dias apartir desta média .



//+------------------------------------------------------------------+
//|                                                   ForexMan77.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 Lime
#property  indicator_color2 Yellow
#property  indicator_color3 Red

//--- input parameters
extern int       Period_MA_1=1;
extern int       p2          =20;
extern int       p3          =5;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted(),
   i,limit1,limit2,limit3;
   limit1=Bars-counted_bars-1;
   limit2=limit1;
   limit3=limit2;
   if(limit1>0) 
     {
      limit1=Bars-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
     }

   for(i=limit1;i>=0;i--) ExtMapBuffer1[i]=iMomentum(NULL, 0, Period_MA_1, PRICE_CLOSE, i);
   for(i=limit2;i>=0;i--) ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer1, 0, p2, 0, MODE_SMA,i);
   for(i=limit3;i>=0;i--) ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer2, 0, p3, 0, MODE_SMA,i);

   return(0);
  }
//+------------------------------------------------------------------+
 

Ajuda

int OnInit()
{
   EventSetTimer(60);
   Print(GetLastError());

   return(INIT_SUCCEEDED);
}

Temporizador não funciona, devolve faltas e erro 4051

Ou não deveria funcionar no testador?