Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1339

 
Kira27 #:
Ciao!!! Dimmi dove ho sbagliato, non lo capisco nemmeno io)

Su 275 strumenti, ne elabora 27 e poi si blocca, occupa memoria e produce una stringa di errore quando lo script è costretto a terminare.

Se questo array

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

poi usandolo in

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

non è affatto giusto.

O ho capito male qualcosa?

 
Alexey Viktorov #:

Se questo array

poi usandolo in

non è affatto giusto.

O ho frainteso qualcosa?

Ci sono molte cose che non vanno.

 
Alexey Viktorov #:

Se questo array

poi usandolo in



Пример:



//+------------------------------------------------------------------+ 
//|                                              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); 
  } 
//+------------------------------------------------------------------+
 

non è affatto giusto.

O ho frainteso qualcosa?

Perché nell'esempio alla funzione


CopyBuffer

e usare

 

Alexey Viktorov #:


O ho frainteso qualcosa?

Lo scopo dello script è quello di passare attraverso ogni strumento nel Market Watch su timeframes da 1min a 4H per trovare il prezzo sopra la MA200 e se questo fatto viene rilevato, generare un avviso con il nome del simbolo con il prezzo sopra la MA su tutti i 6 timeframes.

 
Artyom Trishkin #:

Ci sono molte cose che non vanno.

Sii più specifico, se non ti dispiace)

 
Kira27 #:

Sii più specifico, se non ti dispiace)

L'indicizzazione delle matrici è semplicemente inquietante... Copiare gli stessi dati in un ciclo... Creare nuove maniglie in un ciclo - senza parole...

Non voglio nemmeno guardare il resto, mi dispiace

 
Artyom Trishkin #:

L'indicizzazione delle matrici è semplicemente inquietante... Copiare gli stessi dati in un ciclo... Creare nuove maniglie in un ciclo - senza parole...

Non voglio nemmeno guardare il resto del codice, mi dispiace

Non capisco l'indicizzazione degli array, quali sono gli array che non ti piacciono? I dati alla linea 43 della funzione CopyBuffer copia gli handle su diversi timeframe, da 1 minuto a 4H. 5 prezzi dell'indicatore MA sono copiati, per le prime 5 barre, e sia l'handle che l'array con 5 barre sono azzerati ad ogni iterazione

ArrayFree(bufer_MA);


e il manico viene cancellato.

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

Se puoi proporre un algoritmo per gestire 274 simboli e ognuno di essi su 6 timeframes in qualche altro modo, ne sarei felice. È solo che il thread si chiama un po' -- Domande dai principianti. Se fossi un professionista, probabilmente non avrei domande.

 

lacreazione di maniglie in diverse situazioni non sembra costosa, è solo un puntatore senza precaricamento? il lavoro principale è fatto con CopyBuffer

non c'è bisogno di rimuovere l'handle nel ciclo, potresti aver bisogno di controllarlo. Personalmente, ho un problema costante solo quando creo il primo; si risolve con Sleep() per caricare un grafico o la funzione di precaricamento delle quotazioni

gli sviluppatori avrebbero dovuto deciderlo da soli, la velocità non è importante in OnInit, intendevo il primo indicatore con 7 simboli, l'errore si presenta sempre a diverse iterazioni

----------

come funziona la creazione di un handle, in un ciclo speciale è necessario controllare la disponibilità o è sufficiente un'altra creazione (cioè la sovrascrittura)?

 
Fast235 #:

lacreazione di maniglie in diverse situazioni non sembra costosa, è solo un puntatore senza precaricamento? il lavoro principale è fatto con CopyBuffer

non c'è bisogno di rimuovere l'handle nel ciclo, potresti aver bisogno di controllarlo. Personalmente, ho un problema costante solo quando creo il primo; si risolve con Sleep() per caricare un grafico o precaricando la funzione delle quotazioni

gli sviluppatori avrebbero dovuto deciderlo da soli, la velocità non è importante in OnInit, intendevo il primo indicatore con 7 simboli, l'errore si presenta sempre a diverse iterazioni

----------

come funziona la creazione di un handle, in un ciclo speciale è necessario controllare la disponibilità o basta un'altra creazione (cioè la sovrascrittura)?

Stai parlando con me o è una domanda per gli esperti locali?)

 
Kira27 #:

Stai parlando con me o è una domanda per gli esperti qui?)

Sulla creazione e la rimozione delle maniglie,

Funziona, sono interessato al modo giusto, spero che gli sviluppatori me lo dicano.