Questions des débutants MQL5 MT5 MetaTrader 5 - page 1339

 
Kira27 #:
Salut ! !! Dites-moi où je me suis trompé, je ne comprends pas moi-même)

Sur 275 outils, il en traite 27, puis se bloque, occupe la mémoire et produit une chaîne d'erreur lorsque le script est forcé de se terminer.

Si ce tableau

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

puis en l'utilisant dans

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

ce n'est pas bien du tout.

Ou ai-je mal compris quelque chose ?

 
Alexey Viktorov #:

Si ce tableau

puis en l'utilisant dans

n'est pas du tout juste.

Ou ai-je mal compris quelque chose ?

Il y a beaucoup de choses qui ne vont pas.

 
Alexey Viktorov #:

Si ce tableau

puis en l'utilisant dans



Пример:



//+------------------------------------------------------------------+ 
//|                                              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'est pas du tout juste.

Ou ai-je mal compris quelque chose ?

Pourquoi mal ? Parce que dans l'exemple de la fonction


CopyBuffer

et utiliser

 

Alexey Viktorov #:


Ou ai-je mal compris quelque chose ?

Le but du script est de parcourir chaque instrument dans le Market Watch sur des timeframes de 1min à 4H pour trouver le prix au-dessus de la MA200 et si ce fait est détecté, de générer une alerte avec le nom du symbole avec le prix au-dessus de la MA sur les 6 timeframes.

 
Artyom Trishkin #:

Il y a beaucoup de choses qui ne vont pas.

Soyez plus précis, si vous le voulez bien)

 
Kira27 #:

Soyez plus précis, si vous le voulez bien)

L'indexation des tableaux est tout simplement effrayante... Copier les mêmes données dans une boucle... Créer de nouvelles poignées en boucle - pas de mots...

Je ne veux même pas regarder les autres, désolé.

 
Artyom Trishkin #:

L'indexation des tableaux est tout simplement effrayante... Copier les mêmes données dans une boucle... Créer de nouvelles poignées en boucle - pas de mots...

Je ne veux même pas regarder le reste du code, désolé.

Les données de la ligne 43 de la fonction CopyBuffer copient des poignées sur différentes échelles de temps, de 1 minute à 4H. Les prix de l'indicateur 5 MA sont copiés, pour les 5 premières barres, et la poignée et le tableau avec 5 barres sont remis à zéro à chaque itération.

ArrayFree(bufer_MA);


et l'identifiant est supprimé.

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

Si vous pouvez proposer un algorithme pour traiter 274 symboles et chacun d'entre eux sur 6 horizons temporels d'une autre manière, j'en serais ravi. C'est juste que le fil de discussion s'appelle en quelque sorte : Questions de débutants. Si j'étais un pro, je n'aurais probablement pas de questions.

 

lacréation de handles dans différentes situations ne semble pas coûteuse, c'est juste un pointeur sans préchargement ? le travail principal est fait avec CopyBuffer

il n'est pas nécessaire de supprimer la poignée dans la boucle, il faut peut-être la vérifier. Personnellement, j'ai un problème constant uniquement lors de la création de la première ; il est résolu par Sleep() pour charger un graphique ou la fonction de préchargement des cotations.

les développeurs auraient dû le décider eux-mêmes, la vitesse n'est pas importante dans OnInit, je parlais du premier indicateur avec 7 symboles, l'erreur apparaît toujours à des itérations différentes

----------

comment fonctionne la création d'un handle, dans une boucle spéciale est-il nécessaire de vérifier la disponibilité ou une autre création suffit-elle (c'est-à-dire un écrasement) ?

 
Fast235 #:

lacréation de handles dans différentes situations ne semble pas coûteuse, c'est juste un pointeur sans préchargement ? le travail principal est fait avec CopyBuffer

il n'est pas nécessaire de supprimer la poignée dans la boucle, il faut peut-être la vérifier. Personnellement, j'ai un problème constant uniquement lors de la création de la première ; il est résolu par Sleep() pour charger un graphique ou par le préchargement de la fonction de cotation.

les développeurs auraient dû le décider eux-mêmes, la vitesse n'est pas importante dans OnInit, je parlais du premier indicateur avec 7 symboles, l'erreur apparaît toujours à des itérations différentes

----------

comment fonctionne la création d'un handle, dans une boucle spéciale est-il nécessaire de vérifier la disponibilité ou une autre création suffit (i.e. écrasement) ?

C'est à moi que vous parlez ou c'est une question pour les experts locaux).

 
Kira27 #:

C'est à moi que vous parlez, ou c'est une question pour les experts ici).

À propos de la création et de la suppression de poignées,

Cela fonctionne, je suis intéressé par le bon chemin, j'espère que les développeurs me le diront.