[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 279

 

Algo está errado com minha função de devolver o valor dos elementos da mesma matriz. Descreverei tudo em ordem em relação a esta questão.

As variáveis globais são:

extern int i_TF = 0;
int g_maPeriod[3] = {6, 25, 150, 250},             // Периоды обрабатываемых МА
    g_singMa[3] = {1,2,3,4};                     // признаки машек, добавляемые к основному мэйджику

// Идентификаторы сигналов
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

#define CROSS_UP             0                                 // Признак нахождения быстрой средней
                                                               // ..над медленной
#define CROSS_DN             1                                // Признак нахождения медленной..
                                                               // ..средней над быстрой
#define CROSS_NO            -1                                 // Признак равенства двух средних
int crossDir[3];

Funções utilizadas neste cálculo:

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& crossDir[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   Print("g_maPeriod[0] = ", g_maPeriod[0]);
   Print("g_maPeriod[1] = ", g_maPeriod[1]);
   Print("g_maPeriod[2] = ", g_maPeriod[2]);
   Print("g_maPeriod[3] = ", g_maPeriod[3]);
   
   for (int i=0; i<4; i++)
   {
      double ema1;
      double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);

      crossDir[i] = CROSS_NO;

      Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
      if (ema1 < ema365_1 && ema0 > ema365_0)
      {
         Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
         crossDir[i] = CROSS_UP;
      }
      if (ema1 > ema365_1 && ema0 < ema365_0)
      {
         Print("ema1 > 365_1 ", ema1 ," > ", ema365_1);
         crossDir[i] = CROSS_DN;
      }
   }
}

Além disso, imprimo o valor dos itens da matriz retornados pela funçãoGetStateMa(int& crossDir[]):

   Print("crossDir[0] = ", crossDir[0]);
   Print("crossDir[1] = ", crossDir[1]);
   Print("crossDir[2] = ", crossDir[2]);
   Print("crossDir[3] = ", crossDir[3]);

Isto é o que é devolvido:

2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[3] = 0
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[2] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[1] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[0] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: open #1 buy 0.10 EURUSD at 1.29654 ok
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3129 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3017 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2886 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2916 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[3] = 250
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[2] = 150
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[1] = 25
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[0] = 6

O valor dos elementos da matrizcrossDir[] é retornado diferente, embora todos eles devam ter o valor de 1.

Isto pode ser visto a partir do desajuste das expressões que comparam os períodos Mach 4 e 365 períodos. Você pode me dizer por que os valores são devolvidos de forma incorreta?

 
Ekburg:


Obrigado por ser específico, porque o link que me foi enviado não tinha estas matrizes, e não prestei atenção à coluna da esquerda porque eu estava trabalhando.

mas ninguém engolirá tudo o que você cuspir, a não ser você ;)


Como você aprendeu, se é que aprendeu alguma coisa, com as dicas? Somente o auto-estudo ativo e inquisitivo dará frutos! Eu te mastiguei e você está "cuspindo de volta" com bons conselhos! Arranje uma babá para limpar sua bagunça!
 
Boa noite a todos, tenho o indicador B construído a partir do indicador A (via iCustom) . Ambos os indicadores estão no gráfico. Quando mudo os parâmetros do indicador A , o indicador B não reconstrói automaticamente, ele precisa ser recompilado à força! Por que o indicador B não reconstrói automaticamente? Por favor, informe qual é o meu erro?
 
MK07:
Boa noite a todos, tenho o indicador B construído a partir do indicador A (através do iCustom) . Ambos os indicadores estão no gráfico. Quando mudo os parâmetros do indicador A , o indicador B não se reconstrói automaticamente, preciso recompilá-lo à força. Por que o indicador B não se reconstrói automaticamente? Por favor, diga-me o meu erro?
Você chama o indicador A (via iCustom) com algumas configurações específicas que são INDEPENDENTES das configurações do indicador A. Isso significa que o terminal calcula simultaneamente duas cópias independentes do indicador A. O indicador que é chamado do exterior (de outro código) é calculado virtualmente pelo terminal.
 
TarasBY:
Você chama o indicador A (via iCustom) com certas configurações, que NÃO dependem das configurações do indicador A. Ou seja, o terminal calcula simultaneamente duas cópias independentes do indicador A.

O que deve ser feito para que o terminal calcule a segunda variante do indicador A?
 
MK07:
O que deve ser feito para que o terminal calcule a segunda versão do indicador A?
Seja mais específico sobre a tarefa.
 
borilunad:

Como você aprendeu, se você aprendeu, com as instruções? Somente o auto-estudo ativo e inquisitivo dará frutos! Eu te mastiguei e você está cuspindo bons conselhos! Arranje uma babá para limpar sua bagunça!

modere seu ego! Eu não me recuo em relação a esse conselho, eu o segui e lhe agradeci, mas não o aceito assim! perguntei e respondi de forma civilizada!
 

Olá!

O valor da variável Ponto precisa ser usado na EA.

Mas é igual a 0.

Tanto quanto sei, isto se deve aos 5 dígitos após o ponto decimal na citação.

Existe alguma maneira de determinar este valor?

Obrigado.

 
TarasBY:
Por favor, torne sua tarefa mais clara.

Indicador A - AO normal (My_AO) - topo da figura.

Indicador B-histograma(+1/-1) do indicador AO (My_AO) - do meio na figura.

Quando você muda os parâmetros do indicador A (o inferior na figura), o indicador B não muda mesmo que você recompile.

Mostrei dois indicadores AO (My_AO) ao mesmo tempo apenas para ilustrar o que acontece com os indicadores, mas em condições reais deveria haver um AO (My_AO).



O primeiro código é o indicador A.

Segundo código - indicador B.

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2  2
#property  indicator_width3  2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod =5;
extern int LowPeriod  =34;
//---- indicator buffers
double     ExtBuffer0[];
double     ExtBuffer1[];
double     ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);
   SetIndexDrawBegin(0,34);
   SetIndexDrawBegin(1,34);
   SetIndexDrawBegin(2,34);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("My_AO");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd
   for(int i=0; i<limit; i++)
      ExtBuffer0[i]=iMA(NULL,0,FastPeriod,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,LowPeriod,0,MODE_SMA,PRICE_MEDIAN,i);
//---- dispatch values between 2 buffers
   bool up=true;
   for(i=limit-1; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
      if(current>prev) up=true;
      if(current<prev) up=false;
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
      else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]=0.0;
        }
        
       
     }
//---- done
   return(0);
  }
#property indicator_separate_window
#property indicator_minimum -1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1  2
#property  indicator_width2  2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
    double UP,DN;     
  
  
    int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        UP=iCustom(NULL,0,"My_AO",1,i+1);               
        DN=iCustom(NULL,0,"My_AO",2,i+1);    
             
        
       if(UP>0)       
         {ExtMapBuffer1[i+1]=1;
          ExtMapBuffer2[i+1]=0;
         }
         
       if(UP<0)       
         {ExtMapBuffer1[i+1]=-1;
          ExtMapBuffer2[i+1]=0;
         }  
         
                              
       if(DN>0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=1;
         }
              
       if(DN<0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=-1;
         }
               
                       
    
    }
//----
   return(0);
 
   }
   
//+------------------------------------------------------------------+    
   
        
        
 
MK07:

Indicador A - indicador AO normal (My_AO) - figura superior.

Indicador B - histograma(+1/-1) do indicador AO (My_AO) - no meio da figura.

Se você alterar os parâmetros do indicador A (parte inferior da figura), o indicador B não muda mesmo que você recompile.

Os dois indicadores AO (My_AO) ao mesmo tempo, eu mostrei apenas para ilustrar o que acontece com os indicadores, mas na vida real deveria haver um AO (My_AO).

O primeiro código é o indicador A.

O segundo código é o indicador B.

E esta ordem de coisas é normal (estes são os princípios do terminal).

Se você quiser alterar os parâmetros do indicador A, faça a troca de informações entre os indicadores (pode ser um arquivo, variáveis globais do terminal, RAM): o indicador A passa os parâmetros inicializáveis durante a inicialização e o indicador B verifica periodicamente as mudanças do indicador A. Quando detecta mudanças, o indicador B também deve ser inicializado com os novos parâmetros (forced init()).