Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 379

 
Taras Slobodyanik:

Je ne vois pas de zéro, tu as fait une erreur quelque part.


Les deux imprimantes donnent-elles les mêmes valeurs ?

Parce qu'il n'y a pas de fonctions Print dans mon code et que ces lignes se suivent, les valeurs ne changent donc en aucune façon.

Mais Var donne 0 et Code donne la valeur nécessaire

 
LuckySith:

Mais je sors tout de suite la valeur que j'ai attribuée. Le code est donc essentiellement le suivant :

a=b ;

Imprimer (a) ;

Imprimer (b) ;

Mais a est égal à zéro alors que b est imprimé correctement.

Il est possible que si int a et double b>0 et b<1 lors de l'assignation d'une valeur réelle à une variable entière, la partie fractionnaire soit éliminée.

 
STARIJ:

Ceci est possible si int a et double b>0 et b<1 lors de l'affectation d'une valeur réelle à une variable entière, la partie fractionnaire est éliminée.


b est supérieur à un beaucoup supérieur à un

a est un tableau de type double

 

Le problème a été résolu.

J'ai créé le tableau de la manière suivante :


double ligne[] ;

Avec cette option, lors de l'affectation de ligne[0]=x ; l'élément nul apparaissait toujours vide.


Quand j'ai écrit


double ligne [20] ;


Tout fonctionne comme il se doit. Je ne comprends pas pourquoi, dans le premier cas, j'ai simplement créé un tableau non borné ; quelle est la différence ?

 
LuckySith:

Le problème a été résolu.

J'ai créé le tableau de la manière suivante :


double ligne[] ;

Avec cette option, lors de l'affectation de ligne[0]=x ; l'élément nul apparaissait toujours vide.


Quand j'ai écrit


double ligne [20] ;


Tout fonctionne comme il se doit. Je ne comprends pas pourquoi, dans le premier cas, j'ai simplement créé un tableau non borné ; quelle est la différence ?

Vous avez créé un tableau dynamique, dont la taille doit être définie et contrôlée par vous-même.

 
Artyom Trishkin:

Vous avez créé un tableau dynamique, mais vous devez définir et contrôler la taille vous-même.

La directive #property strict accélère la découverte de cette erreur. Le programme se termine par un message du type : "array out of range in 'C.mq4' (31,32)".
 

Il n'y a personne pour aider ? L'impasse pour moi est exposée iciécrire les informations de l'iVolume actueldans le fichier?

Le code du logiciel est décrit ici: https://www.mql5.com/ru/forum/160683/page378#comment_6053255

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2017.11.14
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
LRA:

Indicateur par les données du fichier - a entré cette ligne dans la recherche et a trouvé


Pour extraire des données d'un fichier, vous devez d'abord le remplir.

 

Aïe... Des gens bien ! À l'aide, s'il vous plaît ! J'apprends à programmer. Sans votre aide, c'est une impasse.

J'essaie d'écrire les données de l'indicateur dans un fichier, afin de pouvoir les utiliser ultérieurement pour construire un indicateur. L'indicateur est dessiné comme une ligne basée sur la différence entre le volume des ticks positifs et le volume des ticks négatifs pour la barre actuelle.

J'ai utilisé la référence MQL4 pour recevoir des informations sur la façon de télécharger un tableau de données dans un fichier. En conséquence, j'ai obtenu un code plein d'erreurs. Je n'arrive pas à comprendre l'essence des erreurs et, en général, je n'ai pas utilisé correctement l'indication du livre de référence ou non. Quelqu'un peut-il m'aider ?

input string             InpFileName="111.csv";      // Имя файла 
input string             InpDirectoryName="Data";     // Имя каталога 

datetime Время=0;   // Время прошлого бара
double Bid1;
double   Buf_1[];
// double ExtBuffer;
long V1; // объем для текущего тика вверх
long V2; // накопленный объем для всех тиков вверх текущего бара
long V3; // объем текущего тика вниз
long V4; // накопленный объем для всех тиков вниз для текущего бара
long V5;  // отрицательные и положительные iVolume нарастающим итогом


void OnInit()
{
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
   //SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
   V5 = 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[])
{
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
//      Buf_1[0]=0;         // и обнулить последний элемент буфера
   }
   
   datetime date_Buf_1; // массив дат индикатора 
   datetime time_Buf_1; // массив времени 
// --- считаю объем для положительных и отрицательных тиков      
   if(Bid >= Bid1) 
{
   if(Bid > Bid1) // если тик положительный..
{   
   V1 = iVolume(NULL, 0, 0); // если повышающий цену тик, то находим его объем
   V2 = V1 + V2;
}
  else
{
   V1 = 0;                // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
   V2 = V1 + V2;      
}               
}              
   else 
{
   V3 = iVolume(NULL, 0, 0); // если понижающий цену тик 
   V4 = V3 + V4;             // то находим его объем  
}
  
   V5 = V2-V4;               // определяем разницу (дельту) между объемами положительных и отрицательных тиков
   Bid1=Bid;
   Buf_1 [0] = V5; // в буфер сгружаем  дельту

//   ExtBuffer = Buf_1 [0];
//   double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0); 

// запись в файл данных буфера

//--- установим для массивов признак таймсерии 
   ArraySetAsSeries(Buf_1,true); 
   ArraySetAsSeries(date_Buf_1,true);
   
//--- скопируем таймсерию 
   int copied=CopyTime(NULL,0,0,0,date_Buf_1);    

//--- подготовим массив Buf_1 
   ArrayResize(Buf_1,copied); 
//--- скопируем значения линии индикатора  
   for(int i=0;i<copied;i++) 
     { 
      Buf_1[i]= V5; 
     } 
//--- откроем файл для записи значений индикатора 
   ResetLastError(); 
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV); 
   if(file_handle!=INVALID_HANDLE) 
     { 
      PrintFormat("Файл %s открыт для записи",InpFileName); 
      PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH)); 
      //--- сначала запишем значения индикатора 
      FileWrite(file_handle,Buf_1); 
      //--- запишем время и значения в файл 
      for(int i=0;i<Buf_1;i++) 
         FileWrite(file_handle,time_Buf_1[i],Buf_1[i]); 
      //--- закрываем файл 
      FileClose(file_handle); 
      PrintFormat("Данные записаны, файл %s закрыт",InpFileName); 
     } 
   else 
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError()); 
  }
   
  return(rates_total);
}
 
YarTrade: J'essaie d'écrire les données de l'indicateur dans un fichier afin de pouvoir les utiliser ultérieurement pour construire l'indicateur. L'indicateur est construit comme une ligne, basée sur les données de la différence entre le volume des ticks positifs et le volume des ticks négatifs pour la barre actuelle.

Si vous pensez que quelqu'un qui regarde votre code peut rapidement trouver une erreur, vous vous trompez. Le compilateur recherche les erreurs. Le texte du programme doit être formaté - MetaEditor dispose d'un outil de style pour cela. Si vous aimez un style différent, utilisez, par exemple, le programme AStyle.exe. Après le stylisme, vous verrez rapidement que le programme 1) a une parenthèse fermante supplémentaire. 2) Variable déclarée : datetime date_Buf_1 ; // indicateur de tableau de dates - pour que ce soit un tableau, il doit être [size] ou [] pour un tableau dynamique et ensuite la taille doit être définie par ArrayResize il semble. Et vous devez le faire avant d'utiliser un tableau - voir les articles ci-dessus à ce sujet. 3) FileOpen(InpDirectoryName+"//"+InpFileName - il semble que les bâtons devraient être inclinés dans l'autre direction. Et vous feriez mieux de vous passer de InpDirectoryName+"//" - vous trouverez le fichier dans le dossier Files de toute façon.

sur la ligne : int copied=CopyTime(NULL,0,0,0,date_Buf_1) ; le compilateur se fâche, start=end=0 number=0

Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Данная функция предназначена для оформления исходного кода в соответствии с рекомендуемым стандартом. Это позволяет сделать код более читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще анализировать в последующем как его автору, так и другим пользователям. Для того чтобы запустить стилизатор, необходимо выполнить...