Erreurs, bugs, questions - page 2635

 
Aleksandr Prishenko:

Cette plateforme (MT5) est-elle conçue pour le trading sur les marchés financiers ou s'agit-il d'un cirque ? Que devons-nous faire à chaque fois que nous devons refaire les codes pour vos mises à jour ? J'en ai marre.

hmm....

Qu'est-ce que tu dois réviser exactement ? Peut-être que moi aussi ?

Je ne pense pas avoir fait quoi que ce soit à propos des mises à jour..........

 
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   4
//--- plot Value
#property indicator_label1  "Volume;Volume1"
#property indicator_type1   DRAW_FILLING
#property indicator_color1  clrBlue,clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- plot Middle
#property indicator_label2  "Middle line"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrMediumOrchid
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot OverBought
#property indicator_label3  "Bands upper"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrDeepPink
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- plot OverSold
#property indicator_label4  "Bands lower" //нижняя линия
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrDeepPink
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1
//---
enum OSCILLATOR_NAME {
   MACD,             // MACD
   MOMENTUM,         // Momentum
   RSI,              // RSI
   MFI,               // MFI 
   AC                // AC
};
//---
enum LEVEL_MODE {
   CONST_VALUE_MODE, // Constant level value mode
   MA_MODE,          // Moving Average mode
   BB_MODE           // Bollinger Bands Mode
};
//---
enum DRAW_MODE {
   LINE,             // Line
   FILLING,          // Filling
   HISTOGRAM         // Histogram
};
//--- input parameters
input ENUM_TIMEFRAMES      TF_Oscillator = PERIOD_CURRENT;                        // TIMEFRAMES Oscillator
input OSCILLATOR_NAME      InpOscillator = MACD;                         // Oscillator
input int                  InpOscPeriod1 = 1;                          // MACD Fast EMA / Period for: RSI,MFI,Momentum 
input int                  InpOscPeriod2 = 34;                           //  MACD Slow EMA
input int                  InpOscPeriod3 = 1;                           //  MACD Signal
input ENUM_APPLIED_PRICE   InpAppliedPrice = PRICE_CLOSE;               // Applied price
input  ENUM_APPLIED_VOLUME InpVOLUME = VOLUME_TICK;                    //Applied Volume for MFI
input DRAW_MODE            InpDrawMode = LINE;                       // Draw Mode 
input int                  InpLevelsPeriod = 40;                        // Levels Period Upper
input int                  InpLevelsPeriod1 = 35;                        // Levels Period  Lower
input double               InpLevelsIndent = 3.0;                       // Deviation Upper
input double               InpLevelsIndent1 = 4.0;                       //  Deviation Lower

 LEVEL_MODE           InpLevelsMode = BB_MODE;                     // Levels Mode
bool                 InpIndentAutoCorrection = true;              // Levels Auto Correction
//input string               InpDivider = "---For Stochastic or MACD---"; // Just Divider NOT Parameter 
//input ENUM_STO_PRICE       InpStochPrice = STO_LOWHIGH;                 // Stochastic Price

//--- indicator buffers
double         ExtBuffer1[]; //Line
double         ExtBuffer2[];//Middle
double         ExtBuffer3[];//Upper
double         ExtBuffer4[];//Lowe
double         ExtBuffer5[];
double         ExtBuffer6[];
//--- global variables
int            oscPeriod1;
int            levelsPeriod;
int            levelsPeriod1;
int            minRequiredBars;
int            oscHandle;
int            oscPeriod2;
int            oscPeriod3;
double         midValue;
double         addValue;
double         levelsIndent,levelsIndent1 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//---
   if ( InpOscPeriod1 < 1 ) {
      oscPeriod1 = 14;
      printf("Incorrected input parameter InpOscPeriod1 = %d. Indicator will use value %d.", InpOscPeriod1, oscPeriod1);
   } else {
      oscPeriod1 = InpOscPeriod1;
   }
   
   if ( InpLevelsPeriod < 1 ) {
      levelsPeriod = 10;
      printf("Incorrected input parameter InpLevelsPeriod = %d. Indicator will use value %d.", InpLevelsPeriod, levelsPeriod);
   } else {
      levelsPeriod = InpLevelsPeriod;
   }
   if ( InpLevelsPeriod1 < 1 ) {
      levelsPeriod = 10;
      printf("Incorrected input parameter InpLevelsPeriod = %d. Indicator will use value %d.", InpLevelsPeriod, levelsPeriod);
   } else {
      levelsPeriod1 = InpLevelsPeriod1;
   }
   
   if ( InpOscPeriod2 < 1 ) {
      oscPeriod2 = 3;
      printf("Incorrected input parameter InpOscPeriod2 = %d. Indicator will use value %d.", InpOscPeriod2, oscPeriod2);
   } else {
      oscPeriod2 = InpOscPeriod2;
   }
   
   if ( InpOscPeriod3 < 1 ) {
      oscPeriod3 = 3;
      printf("Incorrected input parameter InpOscPeriod3 = %d. Indicator will use value %d.", InpOscPeriod3, oscPeriod3);
   } else {
      oscPeriod3 = InpOscPeriod3;
   }
   
   levelsIndent = MathAbs(InpLevelsIndent);// Levels Indent / Deviation
   levelsIndent1 = MathAbs(InpLevelsIndent1);// Levels Indent / Deviation
//---
   minRequiredBars = 20; // oscPeriod1 + oscPeriod2 + oscPeriod3 + levelsPeriod - 1;
//--- indicator buffers mapping
   SetIndexBuffer(0, ExtBuffer1, INDICATOR_DATA);
   SetIndexBuffer(1, ExtBuffer2, INDICATOR_DATA);
   SetIndexBuffer(2, ExtBuffer3, INDICATOR_DATA);
   SetIndexBuffer(3, ExtBuffer4, INDICATOR_DATA);
   SetIndexBuffer(4, ExtBuffer5, INDICATOR_DATA);
   SetIndexBuffer(5, ExtBuffer6, INDICATOR_DATA);
//---
   string shortname = "Oscillator For BBS: ";
//---
   switch ( InpOscillator ) {
 
      case MACD:
         oscHandle = iMACD(_Symbol, TF_Oscillator, oscPeriod1, oscPeriod2, oscPeriod3, InpAppliedPrice);
         midValue = 0.0;
         shortname += "MACD (" + (string)oscPeriod1 + ", " + (string)oscPeriod2 + ", " + (string)oscPeriod3 + ")";
         break;
         
      case MOMENTUM:
         oscHandle = iMomentum(_Symbol, TF_Oscillator, oscPeriod1, InpAppliedPrice);
         midValue = 100.0;
         levelsAutoCorrect(0.03, 5.0, 0.5);
         shortname += "Momentum (" + (string)oscPeriod1 + ")";
         break;
         
      case RSI:
         oscHandle = iRSI(_Symbol, TF_Oscillator, oscPeriod1, InpAppliedPrice);
         midValue = 50.0;
         levelsAutoCorrect(5.0, 50.0, 20.0);
         shortname += "RSI (" + (string)oscPeriod1 + ")";
         break;
      case MFI:
         oscHandle = iMFI(_Symbol, TF_Oscillator, oscPeriod1, InpVOLUME);
         midValue = 50.0;
         levelsAutoCorrect(5.0, 50.0, 20.0);
         shortname += "MFI (" + (string)oscPeriod1 + ")";
         break;
         
       case AC:
         oscHandle = iAC(_Symbol,0);
         midValue = 0.0;
         levelsAutoCorrect(5.0, 50.0, 20.0);
         shortname += "AC";
         break; 
               
      default:
         oscHandle = INVALID_HANDLE;
         Print("Unknown Oscillator!");
         return(-1);
   }
//---
   switch ( InpDrawMode ) {
      case FILLING:
         SetIndexBuffer(2, ExtBuffer3, INDICATOR_DATA);
         PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_FILLING);
         break;
         
      case HISTOGRAM:
         SetIndexBuffer(2, ExtBuffer3, INDICATOR_COLOR_INDEX);
         PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_HISTOGRAM2);
         break;
         
      case LINE:
      default:
         SetIndexBuffer(2, ExtBuffer3, INDICATOR_DATA);
         PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
         break;
   }
//---
   IndicatorSetString(INDICATOR_SHORTNAME, shortname); 
//---
   return(0);
}
//+------------------------------------------------------------------+
//| Levels indent / deviation correction function                    |
//+------------------------------------------------------------------+
void levelsAutoCorrect(double minIndent, double maxIndent, double correctIndent)
 {
//---
   if ( InpLevelsMode == BB_MODE ) {
      if ( levelsIndent > 4.0   ) {
         levelsIndent = 2.0;
         printf("Incorrected deviation input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent);
      }
      if ( levelsIndent1 > 4.0  ) {
         levelsIndent1 = 2.0;
         printf("Incorrected deviation input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent1);
      }
   } else {
      if ( levelsIndent < minIndent || levelsIndent > maxIndent ) {
         levelsIndent = correctIndent;
         printf("Incorrected indent input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent);
      }
      
      if ( levelsIndent1 < minIndent || levelsIndent1 > maxIndent ) {
         levelsIndent1 = correctIndent;
         printf("Incorrected indent input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent1);
      } 
      
   }
//---
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
   int startBar, calculated, toCopy;
//---
   if ( rates_total < minRequiredBars ) {
      Print("Not enough bars for calculation.");
      return(0);
   }
//---
   calculated = BarsCalculated(oscHandle);
   if ( calculated < rates_total ) {
      Print("Not all data of oscHandle is calculated (", calculated, " bars. Error #", GetLastError());
      return(0);
   }
//---
   if ( prev_calculated > rates_total || prev_calculated <= 0 ) {
      startBar = minRequiredBars;
      toCopy = rates_total;
   } else {
      startBar = prev_calculated - 1;
      toCopy = rates_total - prev_calculated;
      if ( prev_calculated > 0 ) {
         toCopy += 1;
      }
   }
//---
   if ( CopyBuffer(oscHandle, 0, 0, toCopy, ExtBuffer1) <= 0 ) {
      Print("Getting Oscillator is failed. Error #", GetLastError());
      return(0);
   }
//---
   if ( InpLevelsMode != CONST_VALUE_MODE ) { //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      SimpleMAOnBuffer(rates_total, prev_calculated, oscPeriod1+levelsPeriod, levelsPeriod, ExtBuffer1, ExtBuffer2);
   }
//---   
   for ( int bar = startBar; bar < rates_total; bar++ ) {
      double value, sum = 0.0, sum1 = 0.0;
      double middleLine, indent, indent1;
      //---
      switch ( InpLevelsMode ) {
         case MA_MODE:
            middleLine = ExtBuffer2[bar];
            indent = levelsIndent;
            indent1 = levelsIndent1;
            break;
         case BB_MODE:          //просмотреть формулу
            middleLine = value = ExtBuffer2[bar];
            for ( int i = bar - levelsPeriod + 1; i <= bar; i++ ) {
               sum += MathPow(ExtBuffer1[i]-value, 2);
            }
            indent = levelsIndent * MathSqrt(sum/levelsPeriod); 
            for ( int k = bar - levelsPeriod1 + 1; k <= bar; k++ ) {
               sum1 += MathPow(ExtBuffer1[k]-value, 2);
            }
            indent1 = levelsIndent1 * MathSqrt(sum/levelsPeriod1);            
            break;
         case CONST_VALUE_MODE:
         default:
            middleLine = ExtBuffer2[bar] = midValue;
            indent = levelsIndent;
            indent1 = levelsIndent1;
            break;
      }
      //---
      switch ( InpDrawMode ) {
         case LINE:
            ExtBuffer3[bar] = middleLine + indent; //Upper
            ExtBuffer4[bar] = middleLine - indent1; //Lowe
            break;
         case FILLING:
            ExtBuffer3[bar] = middleLine;
            ExtBuffer4[bar] = middleLine + indent;
            ExtBuffer5[bar] = middleLine - indent1;
            break;
         case HISTOGRAM:
            if ( ExtBuffer1[bar] >= ExtBuffer2[bar] ) {
               ExtBuffer3[bar] = 0;
            } else {
               ExtBuffer3[bar] = 1;
            }
            ExtBuffer4[bar] = middleLine;
            ExtBuffer5[bar] = middleLine + indent;
            ExtBuffer6[bar] = middleLine - indent1;
            break;
      }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+

Quel genre d'erreur ? Je n'ai pas vu ce genre d'erreur depuis plusieurs versions.

         case BB_MODE:
            middleLine = value = ExtBuffer2[bar];
            for ( int i = bar - levelsPeriod + 1; i <= bar; i++ ) {
               sum += MathPow(ExtBuffer1[i]-value, 2);
2020.02.05 10:56:13.220 Core 1 2017.11.01 00:00:00 array out of range in 'Oscillator For BBS.mq5' (308,41)

 
Aleksandr Prishenko:

Quel genre d'erreur ? Je n'ai pas vu ce genre d'erreur depuis plusieurs versions.

2020.02.05 10:56:13.220 Core 1 2017.11.01 00:00:00 array out of range in 'Oscillator For BBS.mq5' (308,41)

А... Je vois...

Ce n'est probablement pas lié aux mises à jour. Il faut comprendre pourquoi.....

 
Vladislav Andruschenko:

А... Je vois...

Eh bien, ce n'est probablement pas lié aux mises à jour. Je dois comprendre pourquoi.....

Cela fonctionne depuis plus de 5 ans)) Le code n'a pas changé).

 
Aleksandr Prishenko:

Cela fonctionne depuis plus de 5 ans)) Le code n'a pas changé)

Il ne s'ensuit pas du tout que les erreurs sont dues aux mises à jour de la plate-forme. Tu es hors du tableau.

 
Evgeny Potapov:

Bonjour !

Je veux exécuter certains MT4 avec un fichier batch.

Pouvez-vous me dire comment faire et pourquoi mon code ne fonctionne pas :

Au mieux, il exécute quelques MT4, puis se bloque.

Bien sûr, la mémoire vive ne manque pas.

De plus, je l'ai essayé sur différents ordinateurs

La clé du mode portable est-elle requise par hasard ?

Est-ce qu'il démarre tous les terminaux manuellement ?

 
Alexey Viktorov:

Roman, c'est la deuxième fois que vous tombez dans le piège du manque de volonté de lire la documentation.

Et dans la documentation de mql4, si ma mémoire est bonne, il était clairement indiqué que les variables ne devaient pas être utilisées comme taille de tableau.

Ce n'est pas tout à fait la même chose, mais merci quand même de citer la documentation.

 
Koldun Zloy:

Je ne suis pas un développeur, mais je vais commenter.

Pour un tableau statique, le compilateur doit allouer un certain nombre d'octets en mémoire au moment de la compilation.

Combien de mémoire le compilateur doit-il allouer si row et col sont inconnus au moment de la compilation ?

Les valeurs initiales ne sont utilisées que si les paramètres sont omis lors de l'appel. Les paramètres réels ne sont connus qu'au moment de l'exécution.

Donc, pas de gadgets, apprenez la langue.

Cela semble correct, merci, j'avais la même idée en tête.
Les exemples en C sont exactement ceux qui me guident.

int N, M;
int i, j;
scanf("%d", &N);
scanf("%d", &M);

int A[N][M];
for (i = 0; i < N; i++) { 
   for (j = 0; j < M; j++) {
      A[i][j] = 10 + rand() % (20 - 10 + 1);
      printf("%d ", A[i][j]);
   }
}

puts("\n");

Mais apparemment, les compilateurs modernes sont devenus plus stricts.
J'ai vérifié ce code dans VS et il se plaint également de la mémoire de tableau non allouée.
Peut-être cet échantillon est-il destiné à d'autres compilateurs, ou est-il obsolète et dépend-il de la norme du langage ?

 

Il y a maintenant trois icônes dans l'en-tête de la page mql5.com à côté du bouton de profil :

1.Favoris

2. nourrir

3. Messages

Veuillez ajouter une autre icône, quelque chose comme :

4. Argent

où le montant de tous les fonds reçus pendant la journée (marché, freelance, etc.) serait affiché, ce serait très pratique, et maintenant pour cela il faut aller dans le profil pour voir le solde disponible.

 
Koldun Zloy:

Je ne suis pas un développeur, mais je vais commenter.

Pour un tableau statique, le compilateur doit allouer un certain nombre d'octets en mémoire au moment de la compilation.

Combien de mémoire le compilateur doit-il allouer si row et col sont inconnus au moment de la compilation ?

Les valeurs initiales ne sont utilisées que si les paramètres sont omis lors de l'appel. Les paramètres réels ne sont connus qu'au moment de l'exécution.

Donc, pas de gadgets, apprenez la langue.

Je parle à voix haute, mais c'est plutôt un appel au développeur.
Alors Zloy, ne le prends pas personnellement.

Il s'avère que les matrices dynamiques ne peuvent être traitées qu'au moyen d'objets ou de structures. Une autre béquille est créée en général.
Il n'y a pas de pointeurs sur les variables dans mql, nous devons donc utiliser l'approche objet où les pointeurs sont disponibles.
Ainsi, pour utiliser les matrices dynamiques, un utilisateur doit connaître la POO et travailler avec des pointeurs, et de plus, en exécution MQL.
Combien d'entre eux ont cette connaissance ? Vous connaissez la réponse vous-même. Je n'ai pas de difficultés à comprendre l'approche objet, mais pour ceux qui ne connaissent pas la POO
Ils créent un seuil artificiel pour l'utilisation du langage, en particulier lorsqu'il s'agit de matrices dynamiques.
À mon sens, un développeur devrait au contraire s'intéresser à rendre le langage plus facile à utiliser, plutôt que de le compliquer.
En d'autres termes, ils doivent développer les fonctions qui sont nécessaires à l'utilisateur pour travailler confortablement avec la langue.
Et d'autant plus avec les matrices, qui sont presque la base des méthodes numériques.

Pour cette raison, je voudrais vous demander de créer des fonctions similaires à ArrayResize, mais pour les matrices ArrayResizeMx(A, n, m),
et peut-être aussi pour ceux qui sont multidimensionnels. En d'autres termes, donner la possibilité de travailler avec des matrices non pas comme avec des objets, mais comme avec des tableaux habituels dans le style C.
En particulier pour la représentation visuelle des matrices, la fonction ArrayPrint(A, 0) imprime les matrices à partir de tableaux, et non d'objets.

Raison: