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

 

Merci, mais elle est

Vitaly Muzichenko:

iCustom pour aider


iCustom est une bonne solution pour iCustom mais iCustom exécute toujours l'ensemble du code de l'indicateur, et si j'ai besoin de beaucoup de paramètres d'indicateur dans un EA (et c'est le cas) alors au lieu d'un calcul d'indicateur nous en aurons plusieurs, ce qui peut ralentir considérablement le processus jusqu'à ce que le tick actuel soit manqué, j'ai oublié les variables prédéfinies......

int rates_Bars ;

variable globale définie

int prev_calculated=0 ;

se bloque sur le nombre d'éléments du tableau

 
ijonhson:

Je suis désolé, mais je ne comprends pas pourquoi oncalculate devrait transmettre les valeurs des variables prédéfinies si elles sont globales et également disponibles.

Regardez un exemple

//+-------------------------------------------------------+
//|Параметры функции                             PROBA.mq4|
//+-------------------------------------------------------+
#property   strict

void OnStart()
{
 Alert(Сумма(2,5));
 
 int Сум=0;
 Сумма(2,5,Сум);  // Передаем в функцию 2 числа и получаем сумму
 Alert(Сум);
}

int Сумма(int a, int b)
{
  return a+b;
}

void Сумма(int a, int b, int & s)
{
  s= a+b;
}

Les paramètres d'une fonction peuvent être des entrées - que nous lui passons - et des sorties - qu'elle nous renvoie.

 
ijonhson: int rates_Bars ; int prev_calculated=0 ;

Ces variables sont nécessaires pour calculer l'ensemble de la ligne d'indicateur, mais vous avez besoin d'une seule valeur. Tout est beaucoup plus simple. Analyser le programme d'indicateurs et déterminer la formule utilisée pour le calcul. Et utiliser cette formule dans le conseiller expert

 

Les gars, dites-moi comment mettre en œuvre cet algorithme :

Il existe une série temporelle avec le volume Volume

Je veux comparer le Volume[1] pour qu'il soit plus grand que chacune des barres précédentes du Volume[1] et spécifier une fenêtre (nombre) de barres précédentes avec une variable externe (extern int).


Écrire un échantillon de code, si ce n'est pas difficile

 
John Smith:

Les gars, dites-moi comment mettre en œuvre cet algorithme :

Il existe une série temporelle avec le volume Volume

Je veux comparer le Volume[1] pour qu'il soit plus grand que chacune des barres précédentes du Volume[1] et spécifier une fenêtre (nombre) de barres précédentes avec une variable externe (extern int).


Écrire un échantillon de code, si ce n'est pas difficile

  for(int i=1; i<NumBar; i++) {
    ArrayResize(Buf, i);
    Buf[i-1] = Volume[i];
  }

 double min= Buf[ArrayMinimum(Buf)];
 double max= Buf[ArrayMaximum(Buf)];

 if(max < Volume[0]) { ... }
 
STARIJ:

Est-ce que ça a marché ? Comment cela fonctionnait-il avant ?


Il a fonctionné sans erreur, il me semble l'avoir supprimé moi-même, par auto-remplacement via ctrl+h, et je ne l'ai pas remarqué >_<. De toute façon, c'est probablement les Illuminati qui ont fait ça. Merci encore !

 
John Smith:

Les gars, dites-moi comment mettre en œuvre cet algorithme :

Il existe une série temporelle avec le volume Volume

Je veux comparer le Volume[1] pour qu'il soit plus grand que chacune des barres précédentes du Volume[1] et spécifier une fenêtre (nombre) de barres précédentes avec une variable externe (extern int).


Écrire un échantillon de code, si ce n'est pas difficile

Ce n'est pas difficile. Je l'ai écrit sur mes genoux de mémoire (j'ai peut-être oublié quelque chose)...

//+------------------------------------------------------------------+
bool IsLastVolumeTheLargest(const string symbol_name, const ENUM_TIMEFRAMES timeframe,const int start_pos,const int count)
  {
   long array[];  // Массив для хранения объёмов
   //--- если скопировалось меньше, чем нужно, вернём false
   if(CopyTickVolume(symbol_name,timeframe,start_pos,count,array)<count) return false;
   //--- вернём флаг того, что максимальный объём находится в последней ячейке массива (соответствует индексу start_pos)
   return ArrayMaximum(array)==count-1;
  }
//+------------------------------------------------------------------+
 

Bonjour. Je ne peux pas partager le fichier. La tâche - J'ai besoin que le fichier de l'ancienne période (par exemple M20) soit généré sur М1 pendant le test manuel dans МТ4 (MQL4) testeur. Dans ce but, j'ai écrit un indicateur basé sur le script PeriodConverter. Étant donné qu'en mode test, il est impossible d'enregistrer le fichier (EURUSD20.csv) directement dans le dossier Historique, le fichier est enregistré dans le dossier partagé par tous les terminaux - \\MetaQuotes\Terminal\Common. Ensuite, le script bouclé, travaillant sur un graphique M1 standard, copie les données du fichier EURUSD20.csv vers le fichier EURUSD20.hst, situé dans le dossier History. Le fichier EURUSD20.csv ne peut pas être ouvert dans le script, si en même temps il est ouvert dans l'indicateur dans le testeur (5004 ERR_FILE_CANNOT_OPEN File open error). Si vous retirez l'indicateur du testeur, le fichier du script est ouvert et copié sans problème. Le fichier est ouvert dans l'indicateur comme suit : ExtHandle=FileOpen(c_symbol+(string)20+".csv",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ|FILE_SHARE_READ|FILE_COMMON) ;
Le fichier du script est ouvert comme suit : ExtHandleR=FileOpen("EURUSD20.csv",FILE_BIN|FILE_READ|FILE_SHARE_READ) ;
Veuillez indiquer mon erreur.

 
tvv:

Bonjour. Je ne peux pas partager le fichier. La tâche - J'ai besoin que le fichier de l'ancienne période (par exemple M20) soit généré sur М1 pendant le test manuel dans МТ4 (MQL4) testeur. Dans ce but, j'ai écrit un indicateur basé sur le script PeriodConverter. Étant donné qu'en mode test, il est impossible d'enregistrer le fichier (EURUSD20.csv) directement dans le dossier Historique, le fichier est enregistré dans le dossier partagé par tous les terminaux - \\MetaQuotes\Terminal\Common. Ensuite, le script bouclé, travaillant sur un graphique M1 standard, copie les données du fichier EURUSD20.csv vers le fichier EURUSD20.hst, situé dans le dossier History. Le fichier EURUSD20.csv ne peut pas être ouvert dans le script, si en même temps il est ouvert dans l'indicateur dans le testeur (5004 ERR_FILE_CANNOT_OPEN File open error). Si vous retirez l'indicateur du testeur, le fichier du script est ouvert et copié sans problème. Le fichier est ouvert dans l'indicateur comme suit : ExtHandle=FileOpen(c_symbol+(string)20+".csv",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ|FILE_SHARE_READ|FILE_COMMON) ;
Le fichier est ouvert dans le script comme suit : ExtHandleR=FileOpen("EURUSD20.csv",FILE_BIN|FILE_READ|FILE_SHARE_READ|FILE_COMMON) ;
Veuillez me signaler mon erreur.

L'avez-vous fait remarquer ?

 
Alexey Viktorov:

L'avez-vous précisé ?

Je ne comprends pas. Cette option indique l'emplacement du fichier - \MetaQuotes\Terminal\Common. Sans cette option, je ne pourrai pas récupérer le fichier qui a été généré dans le testeur. Sans cette option, le fichier sera recherché dans MQL4\Files - et je ne peux pas y placer le fichier du testeur.