Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1339

 
Kira27 #:
Olá!! Diga-me onde errei, eu próprio não o compreendo)

De 275 ferramentas, processa 27 e depois fica preso, ocupa a memória e produz uma cadeia de erros quando o guião é forçado a terminar.

Se esta matriz

   double bufer_MA[];  //Буфер для хендла

e depois utilizá-lo em

         CopyBuffer(MA200,0,TimeCurrent(),5,bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма

não é de todo correcto.

Ou será que entendi mal alguma coisa?

 
Alexey Viktorov #:

Se esta matriz

e depois utilizá-lo em

não é de todo correcto.

Ou será que entendi mal alguma coisa?

Há muitas coisas erradas com ele.

 
Alexey Viktorov #:

Se esta matriz

então a sua utilização em



Пример:



//+------------------------------------------------------------------+ 
//|                                              TestCopyBuffer3.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00"
 
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 
//---- plot MA 
#property indicator_label1  "MA" 
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrRed 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- input parameters 
input bool               AsSeries=true; 
input int                period=15; 
input ENUM_MA_METHOD     smootMode=MODE_EMA; 
input ENUM_APPLIED_PRICE price=PRICE_CLOSE; 
input int                shift=0; 
//--- indicator buffers 
double                   MABuffer[]; 
int                      ma_handle; 
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- indicator buffers mapping 
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA); 
   Print("Параметр AsSeries = ",AsSeries); 
   Print("Индикаторный буфер после SetIndexBuffer() является таймсерией = ", 
         ArrayGetAsSeries(MABuffer)); 
//--- set short indicator name 
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries); 
//--- set AsSeries (depends on input parameter) 
   ArraySetAsSeries(MABuffer,AsSeries); 
   Print("Индикаторный буфер после ArraySetAsSeries(MABuffer,true); является таймсерией = ", 
         ArrayGetAsSeries(MABuffer)); 
//--- 
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price); 
   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[]) 
  { 
//--- check if all data calculated 
   if(BarsCalculated(ma_handle)<rates_total) return(0); 
//--- we can copy not all data 
   int to_copy; 
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total; 
   else 
     { 
      to_copy=rates_total-prev_calculated; 
      //--- last value is always copied 
      to_copy++; 
     } 
//--- try to copy 
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0); 
//--- return value of prev_calculated for next call 
   return(rates_total); 
  } 
//+------------------------------------------------------------------+
 

não é de todo correcto.

Ou será que entendi mal alguma coisa?

Porquê errado? Porque no exemplo para a função


CopyBuffer

e utilização

 

Alexey Viktorov #:


Ou será que entendi mal alguma coisa?

O objectivo do guião é percorrer cada instrumento no Market Watch em prazos de 1min a 4H para encontrar o preço acima do MA200 e se este facto for detectado, gerar um alerta com o nome do símbolo com o preço acima do MA em todos os 6 prazos.

 
Artyom Trishkin #:

Há muitas coisas erradas com ele.

Seja mais específico, se não se importar)

 
Kira27 #:

Seja mais específico, se não se importar)

A indexação da matriz é simplesmente assustadora... Copiar os mesmos dados num loop... Criar novas pegas em loop - sem palavras...

Nem quero olhar para o resto deles, lamento

 
Artyom Trishkin #:

A indexação da matriz é simplesmente assustadora... Copiar os mesmos dados num loop... Criar novas pegas em loop - sem palavras...

Nem quero olhar para o resto do código, desculpe

Os dados na linha 43 da função CopyBuffer copiam alças em diferentes intervalos de tempo, de 1 minuto a 4H. 5 preços indicadores de MA são copiados, para as primeiras 5 barras, e tanto a alça como a matriz com 5 barras são zerados a cada iteração

ArrayFree(bufer_MA);


e o cabo é apagado.

 IndicatorRelease(MA200); //Удаление хендла

Se puder propor um algoritmo para lidar com 274 símbolos e cada um deles em 6 prazos de outra forma, terei todo o prazer em fazê-lo. É só que o fio é como que chamado -- Perguntas de principiantes. Se eu fosse um profissional, provavelmente não teria quaisquer perguntas.

 

acriação de pegas em diferentes situações não parece onerosa, é apenas um ponteiro sem pré-carga? o trabalho principal é feito com CopyBuffer

não há necessidade de remover o cabo no laço, pode ser necessário verificá-lo. Pessoalmente, só tenho um problema constante ao criar o primeiro; ele é resolvido por Sleep() para carregar um gráfico ou pré-carga de cotações

os próprios criadores deveriam tê-lo decidido, a velocidade não é importante no OnInit, referia-me ao primeiro indicador com 7 símbolos, o erro está sempre a aparecer em diferentes iterações

----------

como funciona a criação de um puxador, num laço especial é necessário verificar a disponibilidade ou é apenas mais uma criação suficiente (ou seja, sobregravação)?

 
Fast235 #:

acriação de pegas em diferentes situações não parece onerosa, é apenas um ponteiro sem pré-carga? o trabalho principal é feito com CopyBuffer

não há necessidade de remover o cabo no laço, pode ser necessário verificá-lo. Pessoalmente, tenho um problema constante apenas quando crio o primeiro; é resolvido por Sleep() para carregar um gráfico ou a função de pré-carregamento de aspas

os próprios criadores deveriam tê-lo decidido, a velocidade não é importante no OnInit, referia-me ao primeiro indicador com 7 símbolos, o erro está sempre a aparecer em diferentes iterações

----------

como funciona a criação de um puxador, num laço especial é necessário verificar a disponibilidade ou apenas outra criação é suficiente (ou seja, sobrescrever)?

Está a falar comigo ou é uma pergunta para peritos locais?)

 
Kira27 #:

Está a falar comigo, ou isso é uma pergunta para os peritos aqui?)

Sobre a criação e remoção de pegas,

Funciona, estou interessado na forma correcta, espero que os criadores me digam.

Razão: