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 318

 
muzzletop:
Boa tarde. Eu tenho um EA, funciona bem no testador de estratégia (abre pedidos e tudo). Mas quando acabo de colocá-lo em um gráfico, nada acontece. A EA não funciona. Também notei uma cruz ao lado do nome da EA no gráfico. Como consertá-lo?


Quando você coloca a EA no gráfico uma janela se abre com parâmetros, há diferentes separadores - na primeira "Geral" você tem que colocar um tique na frente de "Permitir que a EA negocie".

Se a EA já estiver na tabela e for exibida com uma cruz - na barra de ferramentas, clique no botão "EAs" (cubo amarelo em um chapéu com um círculo vermelho e um quadrado branco dentro do círculo).

 

Boa tarde. Ajude-me a lidar com um problema estranho.

A questão é: estou escrevendo um indicador múltiplo, ou seja, um indicador, que, estando aberto a qualquer momento, calculará e dará sinais para todos os outros momentos também.

A base do indicador é o RSI.

No init() ao mudar o período de tempo, uma matriz separada é colocada em correspondência da linha indicadora. Para cada um deles a linha é exibida, quando você está neste ou naquele momento, mas os cálculos para outros momentos não estão acontecendo (a função iRSI está estupidamente perseguindo zeros no cálculo). Isto é, a hora atual é calculada, mas outras vezes não são.

Estou colando o código:

#property indicator_separate_window
#property indicator_minimum 20
#property indicator_maximum 80

#property indicator_level1 20          // уровень RSI
#property indicator_level2 42          // уровень RSI
#property indicator_level3 50          // уровень RSI
#property indicator_level4 58          // уровень RSI
#property indicator_level5 80          // уровень RSI

#property indicator_levelcolor White   // цвет уровней 

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 2           // толщина RSI

//--- buffers
double   RSI_M1[];               // буферы под RSI
double   RSI_M5[];
double   RSI_M15[];
double   RSI_M30[];
double   RSI_H1[];
double   RSI_H4[];
double   RSI_D1[];
double   RSI_W1[];
double   RSI_MN[];

int         RSI_per           = 12;                // период RSI
int         RSIPriceType      =  PRICE_CLOSE;      // покакой цене считать RSI
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   IndicatorShortName("test");
   
   switch(Period()) {
      case PERIOD_M1:
          SetIndexBuffer(0, RSI_M1);
          break;
      case PERIOD_M5:
          SetIndexBuffer(0, RSI_M5);
          break;
      case PERIOD_M15:
          SetIndexBuffer(0, RSI_M15);
          break;
      case PERIOD_M30:
          SetIndexBuffer(0, RSI_M30);
          break;
      case PERIOD_H1:
          SetIndexBuffer(0, RSI_H1);
          break;
      case PERIOD_H4:
          SetIndexBuffer(0, RSI_H4);
          break;
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          break;
      case PERIOD_W1:
          SetIndexBuffer(0, RSI_W1);
          break;
      case PERIOD_MN1:
          SetIndexBuffer(0, RSI_MN);
          break;
   }   
   
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexLabel(0,"RSI(" + RSI_per + ")");
//----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int   shift, _Bars;
   static int  _counted_bars_W1 = 0,
               _counted_bars_D1 = 0;
   //--------------------------------------------------------------------
   _Bars = iBars(NULL, PERIOD_W1);
   shift = _Bars - _counted_bars_W1 - 1;   // Индекс первого непосчитанного
   _counted_bars_W1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_W1[shift]       = iRSI(NULL, PERIOD_W1, RSI_per, RSIPriceType, shift);
      Print(RSI_W1[shift]);
      shift--;
   }
   //------------------------------------------
   _Bars = iBars(NULL, PERIOD_D1);
   shift = _Bars - _counted_bars_D1 - 1;   // Индекс первого непосчитанного
   _counted_bars_D1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_D1[shift]       = iRSI(NULL, PERIOD_D1, RSI_per, RSIPriceType, shift);
      shift--;
   }
   //------------------------------------------   
   return(0);
  }
//+------------------------------------------------------------------+

O que é interessante, se deixarmos apenas uma matriz para a linha indicadora e calcularmos apenas W1 a qualquer momento, tudo é calculado e desenhado corretamente a qualquer momento(!).
Qual é o truque? É impossível tomar diferentes matrizes para a linha indicadora durante a inicialização, dependendo do tempo?

 
satorifx:

Boa tarde. Ajude-me a lidar com um problema estranho.

A questão é: estou escrevendo um indicador múltiplo, ou seja, um indicador, que, estando aberto a qualquer momento, calculará e dará sinais para todos os outros momentos também.

A base do indicador é o RSI.

No init() ao mudar o período de tempo, uma matriz separada é colocada em correspondência da linha indicadora. Para cada um deles a linha é exibida, quando você está neste ou naquele momento, mas os cálculos para outros momentos não estão acontecendo (a função iRSI está estupidamente perseguindo zeros no cálculo). Isto é, a hora atual é calculada, mas outras vezes não são.

Estou colando o código:

O que é interessante, se deixarmos apenas uma matriz para a linha indicadora e calcularmos apenas W1 a qualquer momento, tudo é calculado e desenhado corretamente a qualquer momento(!).
Qual é o truque? É impossível tomar diferentes matrizes para a linha indicadora durante a inicialização, dependendo do tempo?

Somente W1 e D1 são lidos! O que você quer? Acabe com isso para os outros!
 
borilunad:
Somente W1 e D1 são lidos! O que você quer? Acabe com isso para os outros!

Não é essa a questão. Eu dei cálculos apenas para D1 e W1, de modo que o código não seja muito longo. Nota: em cada tick em cada período de tempo, os valores calculados de W1 são impressos. Portanto, se qualquer hora for aberta, exceto W1, os zeros são impressos. Se funcionar para a W1, funcionará para outros.
 
satorifx:

Não é essa a questão. Eu dei cálculos apenas para D1 e W1, para não tornar o código muito longo. Favor observar: em cada tick em qualquer período de tempo, os valores calculados de W1 são impressos. Portanto, se qualquer hora for aberta, exceto W1, os zeros são impressos. Se funcionar para W1, funcionará para todos os outros.
Certo! Temos que abrir o gráfico semanal para mostrá-lo em outros gráficos!
 
borilunad:
Correto! Para mostrar em outros gráficos, você tem que abrir o gráfico semanal também!


Para ser honesto, eu não entendi esta declaração.
E não há necessidade de mostrar mais nada. Se você executar o código, verá que ele já mostra o que eu quero: em D1 ele mostra o gráfico RSI D1 e em W1 - gráfico RSI W1, mas ao mesmo tempo, se D1 está aberto, então RSI para W1 são todos zero, e se W1 está aberto, então os cálculos para D1 são zero. A questão é por que este é o caso e como corrigi-lo.

 

O problema é que a matriz de índices se inicializa e se redimensiona para o tamanho correto.
Assim, quando abro D1 - RSI_D1[] torna-se indexado, e tudo está bem com ele, mas outras matrizes permanecem em estado embrionário.
Eu tentei desta maneira: declarei todas as matrizes desta maneira:

double   RSI_W1[]    =  {0};
Eu mudei o interruptor no init() desta forma:
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          ArrayResize(RSI_W1, iBars(NULL, PERIOD_W1));
          break;

Entretanto, no ArrayResize GetLastError dá um erro:

EURUSD,Daily: não pode redimensionar a matriz

EURUSD,Daily: algum erro de matriz

De qualquer forma, quem pode me dizer como resolver este problema?

 
satorifx:

O problema é que a matriz índice se inicializa e se redimensiona para o tamanho correto.
Assim, quando abro D1 - RSI_D1[] torna-se indexado, e tudo está bem com ele, mas outras matrizes permanecem em estado embrionário.
Eu tentei desta maneira: declarei todas as matrizes desta maneira:

Eu mudei o interruptor no init() desta forma:

Entretanto, no ArrayResize GetLastError dá um erro:

EURUSD,Daily: não pode redimensionar a matriz

EURUSD,Daily: algum erro de matriz

De qualquer forma, quem pode me dizer como resolver este problema?

Se a matriz for dinâmica, certifique-se de que ao escrever valores nela, você aumente o tamanho da matriz para acomodar os novos dados. ArrayResize()
 
artmedia70:
Se a matriz for dinâmica, certifique-se de aumentar o tamanho da matriz para acomodar os novos dados ao escrever valores para ela. ArrayResize()

Eu escrevi sobre isso acima:
Mas ArrayResize GetLastError dá um erro:

EURUSD,Daily: não é possível redimensionar a matriz

EURUSD,Daily: algum erro na matriz
 
satorifx:
Foi sobre isto que escrevi acima:
Entretanto, no ArrayResize GetLastError dá um erro:

EURUSD,Daily: não pode redimensionar a matriz

EURUSD,Daily: algum erro de matriz
satorifx:


Para ser honesto, eu não entendi essa afirmação.
E não há necessidade de mostrar mais nada. Se você executar meu código, verá que tudo já é mostrado: RSI D1 é mostrado em D1 e RSI W1 em W1, mas ao mesmo tempo, se D1 está aberto, então RSI para W1 são todos nulos, e se W1 está aberto, então RSI para D1 são todos nulos. A questão é por que este é o caso e como corrigi-lo.

Porque o buffer está sozinho e mostra um a um em sua chamada!

#property indicator_buffers 1
Você realmente acha que não tenho nada melhor para fazer do que baixar seus "códigos" e testá-los? Estou lhe ajudando com conselhos. E se algo está errado, está tudo lá em cima para você! Ou será que a preguiça nasceu antes de você?!
Razão: