Erreurs, bugs, questions - page 1175

 

Salutations. Avez-vous des conseils pour les débutants sur les fonctions à utiliser pour définir un takeout commun sur une grille d'ordres en cas de signal inverse ?

 
J'apprends les opérations sur les fichiers. Quelqu'un sait-il si MQL4/5 fonctionne plus rapidement avec des fichiers csv ou txt ?
 
paladin800:
J'apprends les opérations sur les fichiers. Quelqu'un sait-il si MQL4/5 est plus rapide avec des fichiers csv ou txt ?
bin
 
papaklass:
Quels problèmes essayez-vous de résoudre en travaillant avec des fichiers ?
Vous devez écrire l'état des positions dans un fichier et utiliser MT4 pour lire ces données. Vous avez besoin d'une corrélation des positions d'un symbole avec un ou plusieurs autres symboles. Par exemple, s'il y a déjà un certain nombre de positions sur EURUSD, aucune autre position ne doit être ouverte sur GBPUSD. Je sais comment le faire sans opérations sur les fichiers, je veux juste apprendre à travailler avec des opérations sur les fichiers, pour élargir mes horizons.
 

Veuillez donner un exemple de code permettant d'appeler un indicateur de ressources lié à partir d'un EA, qui à son tour utilise un autre indicateur de ressources lié en lui-même. Par exemple, il existe un indicateur A, et B est appelé à partir de celui-ci. Il y a aussi l'expert C qui utilise A. Que faut-il écrire dans #resource et lors de l'appel à iCustom dans tous les cas ?

L'aide n'est pas clairement écrite à cet égard. La construction habituelle dans l'indicateur A :#resource "\Indicators\B.ex4" puisiCustom(::Indicators\B.ex4) fonctionne bien lorsque A est lancé par lui-même.Mais si A est inséré dans la#resource duconseiller expert"\Indicators\A.ex4", une erreur"cannot load resource for the attached indicator" apparaît,indiquant un mauvais chemin absolu synthétisé qui mentionne en quelque sorte le répertoire Libraries, alors que l'indicateur B est recherché à l'intérieur de lui-même (MQL4\Libraries\\::Indicators\B.ex4::Indicators\B.ex4).

 
meat:

En ce qui concerne ArraySize, j'ai soulevé un problème similaire sur MQL4 l'autre jour : https://www.mql5.com/ru/forum/152471. D'après ce que je comprends, tout devrait être identique dans MQL5.

Peut-être que mon message a été pris en compte :) Concernant ce problème, le Service Desk a répondu que la cause du problème était un fonctionnement incorrect de l'optimiseur et qu'ils changeront le type en uint dans les nouvelles versions. En fait c'est uint maintenant, juste non documenté :) Ils vont le changer en uint pour ArrayResize aussi, mais je leur ai conseillé de le changer en ulong, sinon ils devront revenir sur ce problème à cause du manque de valeurs 32 bits lors du stockage de gros volumes.

Quant à la valeur -1 en cas d'erreur, elle ne devrait pas poser de problème car : (int)-1 = (uint)-1 = 0xFFFFFFFFFF = UINT_MAX, c'est-à-dire que la représentation binaire est la même, mais l'opération de comparaison donnera un résultat différent, c'est-à-dire que si le code était

il deviendra incorrect.

Merci encore pour la demande, le type de retour des fonctions ArraySize et ArrayRange ne sera pas modifié, nous laisserons le type int. Nous avons corrigé l'optimiseur de code, maintenant l'erreur décrite par vous ne se produira pas.

Le nombre total d'éléments dans le tableau MQL ne doit pas dépasser INT_MAX et cela ne changera pas.
Si vous avez besoin de tableaux de taille supérieure dans un programme MQL, vous devez créer une classe distincte (par exemple, CBigArray).
 

J'essaie de maîtriser iCustom dans mql5. Je l'ai maîtrisé dans mql4 :)

Le problème est de dessiner quelque chose de similaire à MACD, mais au lieu d'une moyenne mobile rapide, l'indicateur VIDYA, qui se trouve dans le dossier Exemples, doit être utilisé.

J'ai pris un code MACD standard et mis des paramètres pour VIDYA au lieu de la MA. Le problème est que tout se compile mais rien ne se dessine.

J'ai marqué deux endroits dans le code ci-dessous où j'ai changé le code MACD standard. Sinon, tout est pareil. S'il vous plaît, dites-moi ce que j'ai manqué d'autre. Je suppose que c'est en aval, quelque part dans le code...

//+------------------------------------------------------------------+
//|                                                         MACD.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Moving Average Convergence/Divergence"
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   2
#property  indicator_type1   DRAW_HISTOGRAM
#property  indicator_type2   DRAW_LINE
#property  indicator_color1  Silver
#property  indicator_color2  Red
#property  indicator_width1  2
#property  indicator_width2  1
#property  indicator_label1  "MACD"
#property  indicator_label2  "Signal"
//--- input parameters
Первый вставленный кусок:
input int                Per=7;               // Per
input int                Per1=21;             // Per1
input int                Shift=0            // Shift
Конец

input int                InpSlowEMA=84;               // Slow EMA period
input int                InpSignalSMA=9;              // Signal SMA period
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price
//--- indicator buffers
double                   ExtMacdBuffer[];
double                   ExtSignalBuffer[];
double                   ExtFastMaBuffer[];
double                   ExtSlowMaBuffer[];
//--- MA handles
int                      ExtFastMaHandle;
int                      ExtSlowMaHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpSlowEMA)+","+string(InpSignalSMA)+")");
//--- get MA handles
Второй вставленный кусок
   ExtFastMaHandle=iCustom(NULL,0,"Examples\\VIDYA",
                     Per,
                     Per1,
                     Shift
                     );
Конец
   ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_SMA,InpAppliedPrice);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
//--- check for data
   if(rates_total<InpSignalSMA)
      return(0);
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtFastMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtSlowMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      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;
      if(prev_calculated>0) to_copy++;
     }
//--- get Fast EMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
     {
      Print("Getting fast EMA is failed! Error",GetLastError());
      return(0);
     }
//--- get SlowSMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
     {
      Print("Getting slow SMA is failed! Error",GetLastError());
      return(0);
     }
//---
   int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
//--- calculate MACD
   for(int i=limit;i<rates_total && !IsStopped();i++)
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Nilog:

J'essaie de maîtriser iCustom dans mql5. Dans mql4 j'ai pu le maîtriser virtuosement :)


Qu'est-ce qu'il écrit dans le journal ? Aucune vérification des erreurs (par exemple, lors de la réception d'un handle). Le numéro de tampon dans le nouvel indicateur correspond-il à l'ancien ?
 

Je ne sais pas si cela s'est déjà produit, mais la question est la suivante : nouvelle barre, la valeur PLOT_EMPTY_VALUE pour le tampon est fixée à 0.0, mais en fait il y a parfois des valeurs complètement différentes

 
TheLiteShadow:

Je ne sais pas si cela s'est déjà produit, mais la question est la suivante : nouvelle barre, la valeur PLOT_EMPTY_VALUE pour le tampon est fixée à 0.0, mais en fait il y a parfois des valeurs complètement différentes

Pour autant que je me souvienne, EMPTY_VALUE définit simplement la valeur qui sera considérée comme vide et non affichée. Cela n'a rien à voir avec l'initialisation du tampon. C'est à vous de remplir le tampon avec une valeur nulle pour qu'il n'y ait pas de déchets.