Erreurs, bugs, questions - page 269

 
AndrNuda:
Vous êtes tellement lents :) Les chutes ne sont pas fausses, mais tout fonctionne. Vous cherchez au mauvais endroit. )))) Il y a une fonction correcte.
Intelligent ?
 
BoraBo:

J'essaie de comprendre pourquoi ArrayIsSeries(High) est toujours faux.

L'aide pour cette fonction dit(https://www.mql5.com/ru/docs/array/arrayisseries)

Valeur de retour

Retourne vrai si le tableau vérifié est un tableau de séries temporelles, sinon retourne faux. Les tableaux passés en paramètre à OnCalculate() doivent être vérifiés pour l'ordre dans lequel les éléments du tableau sont accédés avec ArrayGetAsSeries().

Le tableau que vous avez déclaré n'est pas une série temporelle et ne peut en aucun cas le devenir. Les séries temporelles sont des tableaux définis par l'exécution, par exemple, dans la fonction OnCalculate():

int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time
                 const double& open[],       // Open
                 const double& high[],       // High
                 const double& low[],        // Low
                 const double& close[],      // Close
                 const long& tick_volume[],  // Tick Volume
                 const long& volume[],       // Real Volume
                 const int& spread[]         // Spread
   )
Документация по MQL5: Операции с массивами / ArrayIsSeries
Документация по MQL5: Операции с массивами / ArrayIsSeries
  • www.mql5.com
Операции с массивами / ArrayIsSeries - Документация по MQL5
 
Rosh:

L'aide pour cette fonction dit(https://www.mql5.com/ru/docs/array/arrayisseries)

Le tableau que vous avez déclaré n'est pas une série temporelle et ne peut en aucun cas le devenir. Les séries temporelles sont des tableaux prédéfinis à l'exécution, par exemple dans la fonction OnCalculate():

ArrayGetAsSeries ne fonctionne pas comme prévu.
 
AlexSTAL:
ArrayGetAsSeries ne fonctionne pas comme prévu.
La fonction ArrayGetAsSeries change uniquement la direction de l'indexation, mais ne transforme pas le tableau en série temporelle. Qu'essayez-vous d'obtenir avec cette fonction ?
 
Rosh:
Les séries temporelles sont des tableaux prédéfinis à l'exécution, par exemple dans OnCalculate():
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time
                 const double& open[],       // Open
                 const double& high[],       // High
                 const double& low[],        // Low
                 const double& close[],      // Close
                 const long& tick_volume[],  // Tick Volume
                 const long& volume[],       // Real Volume
                 const int& spread[]         // Spread
   )


Ce qui est écrit dans l'aide :

Примечание

Для проверки массива на принадлежность к таймсерии следует применять функцию ArrayIsSeries(). Массивы ценовых данных, переданных в качестве входных параметров в функцию OnCalculate(), не обязательно имеют направление индексации как у таймсерий. Нужное направление индексации можно установить функцией ArraySetAsSeries().

 
joo:

Ce qui est écrit dans l'aide :


Faites fonctionner un tel indicateur et vous verrez par vous-même :

//+------------------------------------------------------------------+
//|                                           CheckArrayIsSeries.mq5 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void checkArray(const double & array[])
  {
   if(ArrayGetAsSeries(array))
     {
      Print("array can use as timeseria");
     }
     else
     {
      Print("array can not use as timeseria!!!");
     }
     
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   if(ArrayIsSeries(open))
     {
      Print("open[] is timeseria");
      checkArray(open);
     }
   else
     {
        {
         Print("open[] is timeseria!!!");
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Rosh:
La fonction ArrayGetAsSeries ne change que la direction de l'indexation, mais ne transforme pas un tableau en série temporelle. Qu'essayez-vous d'obtenir avec cette fonction ?

Cette fonction vérifie la direction, pas le changement.

1) Sans initialisation

double Buf[];
void OnStart()
  {
   ArrayResize(Buf, 3);

   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf));             // ArrayGetAsSeries(Buf): false
   
   // Меняем направление на обратный порядок
   Print("Установка в true прошла: ", ArraySetAsSeries(Buf, true));     // Установка в true прошла: true
   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf));             // ArrayGetAsSeries(Buf): false
   
   // Меняем направление на прямой порядок
   Print("Установка в false прошла: ", ArraySetAsSeries(Buf, false));   // Установка в false прошла: true
   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf));             // ArrayGetAsSeries(Buf): false
  }

2) Avec initialisation

double Buf[];
void OnStart()
  {
   ArrayResize(Buf, 3);
   Buf[0] = 0; Buf[1] = 1; Buf[2] = 2;

   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf));             // ArrayGetAsSeries(Buf): false
   
   // Меняем направление на обратный порядок
   Print("Установка в true прошла: ", ArraySetAsSeries(Buf, true));     // Установка в true прошла: true
   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf), " [", Buf[0], ",", Buf[1], ",", Buf[2], "]"); // ArrayGetAsSeries(Buf): true [2,1,0]
   
   // Меняем направление на прямой порядок
   Print("Установка в false прошла: ", ArraySetAsSeries(Buf, false));   // Установка в false прошла: true
   Print("ArrayGetAsSeries(Buf): ", ArrayGetAsSeries(Buf), " [", Buf[0], ",", Buf[1], ",", Buf[2], "]"); // ArrayGetAsSeries(Buf): false [0,1,2]
  }

3) Le code ci-dessus, mais avec la fonction ArrayGetAsSeries qui obtient la direction d'indexation du tableau.

double High[];
#include <Indicators\TimeSeries.mqh>
void OnStart()
  {
   Print("ArrayGetAsSeries(High) ",ArrayGetAsSeries(High));                   // ArrayGetAsSeries(High) false

   CiHigh z;

   int count=3;
   if(z.Create(_Symbol,_Period)==true)
     {
      if(z.GetData(0,count,High)==count)
        {
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
         Print("ArraySetAsSeries(High,true) ",ArraySetAsSeries(High,true));   // ArraySetAsSeries(High,true) true
         Print("ArrayGetAsSeries(High) true = ",ArrayGetAsSeries(High));      // ArrayGetAsSeries(High) true = false
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
         Print("ArraySetAsSeries(High,false) ",ArraySetAsSeries(High,false)); // ArraySetAsSeries(High,false) true
         Print("ArrayGetAsSeries(High) false = ",ArrayGetAsSeries(High));     // ArrayGetAsSeries(High) false = false
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
        }
      else
         Print("Не удалось получить ",count," данных таймсерии.");
     }
   else Print("Ошибка создания таймсерии.");
   Print("ArrayGetAsSeries(High) ",ArrayGetAsSeries(High));                   // ArrayGetAsSeries(High) false
   Print("GetLastError() ",GetLastError());
  }
Dans le service d'assistance, je me suis trompé dans le nom de la fonction.


 
Rosh:

Faites fonctionner un tel indicateur et vous verrez par vous-même :

C'est compréhensible. Et ma question ne portait pas sur les erreurs, tout fonctionne comme indiqué dans l'aide :

Примечание

Для проверки массива на принадлежность к таймсерии следует применять функцию ArrayIsSeries(). Массивы ценовых данных, переданных в качестве входных параметров в функцию OnCalculate(), не обязательно имеют направление индексации как у таймсерий. Нужное направление индексации можно установить функцией ArraySetAsSeries().


La question s'est posée en raison de la divergence entre la couleur et le gras mis en évidence dans l'aide et ce que vous avez dit :

Rosh:
Les séries temporelles sont des tableaux prédéfinis à l'exécution, par exemple dans OnCalculate():

C'est pourquoi je le fais dans OnCalculate() :

    //--------------------------------------
    if (ArrayGetAsSeries(time)!=true)
      ArraySetAsSeries(time,true);
    if (ArrayGetAsSeries(open)!=true)
      ArraySetAsSeries(open,true);
    if (ArrayGetAsSeries(high)!=true)
      ArraySetAsSeries(high,true);
    if (ArrayGetAsSeries(low)!=true)
      ArraySetAsSeries(low,true);
    if (ArrayGetAsSeries(close)!=true)
      ArraySetAsSeries(close,true);
    //--------------------------------------
 
Rosh:

L'aide pour cette fonction dit(https://www.mql5.com/ru/docs/array/arrayisseries)

Le tableau que vous avez déclaré n'est pas une série temporelle et ne peut en aucun cas le devenir. Les séries chronologiques sont des tableaux prédéfinis, par exemple dans la fonction OnCalculate():

Le contrôle ne fonctionne pas non plus dans l'indicateur.

//+------------------------------------------------------------------+
//|                                                    ind_proba.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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 count=3;
   int i=0;
   int limit;
//   bool printCom;

   if(prev_calculated>0)
     {
      limit=1;
     }
   else
     {
      Print("rates_total  ",rates_total,"  prev_calculated  ",prev_calculated);
      for(i=0; i<count; i++) Print(i,"=",open[i]);
      Print("ArraySetAsSeries(open,true) ",ArraySetAsSeries(open,true));
      Print("ArrayIsSeries(open) true = ",ArrayIsSeries(open));
      Print("ArrayGetAsSeries(open) true = ",ArrayGetAsSeries(open));
      for(i=0; i<count; i++) Print(i,"=",open[i]);
      Print("ArraySetAsSeries(open,false) ",ArraySetAsSeries(open,false));
      Print("ArrayIsSeries(open) false = ",ArrayIsSeries(open));
      Print("ArrayGetAsSeries(open) false = ",ArrayGetAsSeries(open));
      for(i=0; i<count; i++) Print(i,"=",open[i]);
     }
   Print("GetLastError() ",GetLastError());
//--- return value of prev_calculated for next call

   return(rates_total);
  }
//+------------------------------------------------------------------+

De plus,prev_calculated ne fonctionne plus, il est toujours à 0 :

 

Oui, je pense qu'avec ces fonctions, ils se sont déjà arrangés.


Mais comme un souhait, pour que je n'oublie pas - dans l'éditeur, lorsque vous êtes invité après avoir tapé trois ou combien de caractères, lorsque vous cliquez en haut debout sur la première ligne de la liste n'est pas supprimé de la liste. Comme c'était déjà le cas en studio, je pense que beaucoup seront "ennuyés" si ce n'est pas fait de la même manière qu'en studio. IMHO.