Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 349

 
Pyro:

Tout est remis à zéro pendant l'initialisation, sauf les variables globales.
Et si vous éteignez l'ordinateur ou si le serveur sur lequel le conseiller-expert fonctionne est en panne ?
 
artmedia70:
Et ici, nous devrions préciser que les GV sont des variables terminales, et non des variables EA.

J'ai commencé à lire et à étudier. Je sais maintenant que les Variables Globales et les Variables Globales sont des choses différentes.

Au fait, à propos de l'erreur 129, sur laquelle je vous ai si souvent interrogé. Le problème, c'est que j'ai un DC à 5 chiffres,

Mon conseiller expert est un slipage 2, c'est probablement la raison pour laquelle il n'a pas pu suivre le cours. Maintenant, je l'ai réglé sur 15 pips.

 
artmedia70:
Et il convient ici de préciser que les GV sont des variables terminales, et non des variables EA.


Je veux dire que l'EA peut travailler avec eux, juste pour sauvegarder les valeurs pendant l'initialisation (entre autres choses).
 
Forexman77:
Que se passe-t-il si j'éteins mon ordinateur ou si le serveur sur lequel tourne l'EA tombe en panne ?


C'est là que ça devient intéressant. Les variables globales sont stockées dans le cache et, dans certaines circonstances, sont écrites dans le fichier. Il semble qu'après un certain temps ou pendant la désinitialisation. Parfois, j'avais l'habitude de perdre gvariables.dat (Global Variables values) lors du redémarrage. Il faut en tenir compte. Ou ils n'ont tout simplement pas eu le temps de le copier sur le disque à partir du cache. Cela signifie que nous n'avons aucune garantie qu'ils sont déjà sur le disque et non dans le cache. Corrigez-moi si je me trompe.


Forexman77:

J'ai commencé à lire et à étudier. Je sais maintenant que les variables globales et les Variables Globales sont des choses différentes.

Au fait, à propos de l'erreur 129 sur laquelle on m'a si souvent interrogé. Le truc, c'est que j'ai un DC à cinq chiffres,

Mon conseiller expert est un slipage 2, c'est probablement la raison pour laquelle il n'a pas pu suivre le cours. Je le fixerais à 15 pips.


Je ne pense pas que ce soit la raison. J'ai un 3 sur mes cinq chiffres. Tout s'ouvre normalement. Autant que je m'en souvienne, les courtiers ont convenu qu'un point est toujours un point de base, universellement accepté (le 4ème chiffre après zéro) et qu'un point fractionnaire est un point fractionnaire. Ainsi, lorsque vous saisissez 6, 7 et 8 chiffres, vous ne devez pas changer la signification de "point" à chaque fois.
 
Pyro:

C'est là que ça devient intéressant. Les variables globales sont stockées dans un cache et, dans certaines circonstances, sont écrites dans un fichier. C'est un peu comme après une certaine période de temps. Il est arrivé qu'en fonctionnement réel, le fichier gvariables.dat (fichier dans lequel les valeurs des variables globales sont stockées) soit tout simplement perdu lors d'un redémarrage brutal de l'ordinateur. Il faut en tenir compte. Ou ils n'ont tout simplement pas eu le temps de le copier sur le disque depuis le cache. Cela signifie que nous n'avons aucune garantie qu'ils sont déjà sur le disque et non dans le cache. Corrigez-moi si je me trompe.
Tu pourrais essayer de l'écrire, puis d'éteindre l'ordinateur. Et quand vous l'allumez, essayez Alerte pour voir si c'est là. Bien que je ne mentirai pas, je n'utilise pour l'instant que des variables statiques et des drapeaux et je ne peux rien dire de sûr sur les variables globales.
 
Forexman77:
Vous pourriez peut-être essayer de l'enregistrer, puis éteindre l'ordinateur. Et quand vous l'allumez, essayez d'appeler Alerte pour voir s'il est là. Bien que je ne mentirai pas, je n'utilise pour l'instant que des variables statiques et des drapeaux et je ne peux rien dire avec certitude au sujet des variables globales.


Vous pouvez simplement regarder dans le menu -> Outils -> Variables globales. Il y a une liste là. Ou utilisez GlobalVariableCheck. Mon expérience montre qu'il est préférable de tout sauvegarder dans un fichier physique, cependant.
 
Bonjour !
Veuillez trouver des erreurs dans mon raisonnement.

C'est le deuxième jour que je me débats avec la création de l'indicateur, à savoir l'affichage de la ligne sur la fenêtre supplémentaire qui est attachée à la fenêtre principale. A mon avis, il est nécessaire de faire des calculs sur les barres non calculées et de donner les valeurs des résultats des calculs au tampon. Cette fois, j'utilise un code plus complexe pour l'exemple (j'aime travailler avec des codes relativement énormes). Voici la "clairière de la créativité" :

//+--------------------------------------------+
#property indicator_separate_window
#property indicator_minimum -10
#property indicator_maximum 10
#property indicator_buffers 1
#property  indicator_color1 Blue
extern double N = 1;
//+--------------------------------------------+
//Deklaration                                  |
//+--------------------------------------------+
double A; double C;       
double M; double D;
double L; double I;
double B; double F;
double K; double Buf_0[];
double G; 
//+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//+--------------------------------------------+
int start() {
//Level 1
A = iRSI(Symbol(),0,10,0,0);
M = iRSI(Symbol(),0,20,0,0);
L = iRSI(Symbol(),0,15,0,0);
B = iStochastic(Symbol(),0,10,6,6,0,0,0,0);
K = iStochastic(Symbol(),0,10,6,6,0,0,1,0);
C = iADX(Symbol(),0,10,0,0,0);
D = iADX(Symbol(),0,10,0,1,0);
I = iADX(Symbol(),0,10,0,2,0);
F = iRVI(Symbol(),0,10,0,0);
  //Level 2
  Buf_0[0] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
  return; } 
//+-------------------------------------------+ 

.

Vous pouvez clairement voir que la valeur du tampon "dans cette compensation" est "0", c'est-à-dire que cet indicateur ne tracera la ligne qu'à partir du moment où la plateforme commerciale démarre. Et j'ai besoin de données historiques en plus des données réelles.

J'ai utilisé les informations décrites dans ce code (tiré du tutoriel MQ4) :

//--------------------------------------------------------------------
// separatewindow.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
#property indicator_separate_window // Отображение в отдельном окне
#property indicator_buffers 1       // Количество буферов
#property  indicator_color1 Blue     // Цвет первой линии
#property  indicator_color2 Red      // Цвет второй линии
 
extern int History  =50;            // Колич.баров в расчётной истории
extern int Aver_Bars=5;             // Количество баров для расчёта
 
double Buf_0[];                     // Объявление индикаторного массива
//--------------------------------------------------------------------
int init()                          // Специальная функция init()
  {
   SetIndexBuffer(0,Buf_0);         // Назначение массива буферу
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линии
   return;                          // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
int start()                         // Специальная функция start()
  {
   int i,                           // Индекс бара
   n,                               // Формальный параметр
   Counted_bars;                    // Количество просчитанных баров 
   double
   Sum_H,                           // Сумма значений High за период
   Sum_L;                           // Сумма значений Low  за период
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1)                 // Если много баров то ..
      i=History-1;                  // ..рассчитывать заданное колич.
   while(i>=0)                      // Цикл по непосчитанным барам
     {
      Sum_H=0;                      // Обнуление в начале цикла
      Sum_L=0;                      // Обнуление в начале цикла
      for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений 
        {
         Sum_H=Sum_H + High[n];     // Накопление суммы макс.значений
         Sum_L=Sum_L + Low[n];      // Накопление суммы мин. значений
        }
      Buf_0[i]=(Sum_H-Sum_L)/Aver_Bars;// Знач. 0 буфера на i-ом баре
      i--;                          // Расчёт индекса следующего бара
     }
//--------------------------------------------------------------------
   return;                          // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------
Je choisirai ce dont j'ai besoin et je l'obtiendrai...
extern int History  =50;            // Колич.баров в расчётной истории
extern int Aver_Bars=5;             // Количество баров для расчёта
double Buf_0[];                     // Объявление индикаторного массива
int start()                         // Специальная функция start()
  {
   int i,                           // Индекс бара
   n,                               // Формальный параметр
   Counted_bars;                    // Количество просчитанных баров 
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1)                 // Если много баров то ..
      i=History-1;                  // ..рассчитывать заданное колич.
      Buf_0[i]=(Sum_H-Sum_L)/Aver_Bars;// Знач. 0 буфера на i-ом баре
      i--;  

Ensuite, en le ramenant à une "vue de parade" en enlevant les commentaires et en divisant logiquement, j'obtiens :

//|+--------------------------------------+
//|Inputs                                 |
//|+--------------------------------------+
extern int History  =50;
//|+--------------------------------------+
//|Declaration                            |
//|+--------------------------------------+
double Buf_0[];
int i;
int n;
int Counted_bars;
//|+--------------------------------------+
//| Start?                                |
//| Yes, babe!                            |
//|+--------------------------------------+
int start(){
//+-----------+
//Level 1 
//+-----------+
Counted_bars=IndicatorCounted();
i=Bars-Counted_bars-1;
  //+-----------+
  //Level 2
  //+-----------+
  if (i>History-1) i=History-1;
    //+------------+
    //Level 3 
    //+------------+
    Buf_0[i]= 
    i--;  
//+---------------------------------------+

Ici, je me retrouve avec des objets qui doivent être synthétisés avec le code "principal". Après avoir effectué la fusion, j'obtiens le code suivant :

//+--------------------------------------------+
#property indicator_separate_window
#property indicator_minimum -10
#property indicator_maximum 10
#property indicator_buffers 1
#property  indicator_color1 Blue
//|+--------------------------------------------+
//|Inputs                                       |
//|+--------------------------------------------+
extern double N = 1;
extern int History  =50;
//|+--------------------------------------------+
//|Deklaration                                  |
//|+--------------------------------------------+
double A; double C;       int i;
double M; double D;
double L; double I;       int Counted_bars;
double B; double F;
double K; double Buf_0[];
double G; 
//|+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//|+--------------------------------------------+
int start() {
       //|+-----------+
       //|Level 1     |
       //|+-----------+
       A = iRSI(Symbol(),0,10,0,0);
       M = iRSI(Symbol(),0,20,0,0);
       L = iRSI(Symbol(),0,15,0,0);
B = iStochastic(Symbol(),0,10,6,6,0,0,0,0);
K = iStochastic(Symbol(),0,10,6,6,0,0,1,0);
       C = iADX(Symbol(),0,10,0,0,0);
       D = iADX(Symbol(),0,10,0,1,0);
       I = iADX(Symbol(),0,10,0,2,0);
       F = iRVI(Symbol(),0,10,0,0);
   Counted_bars=IndicatorCounted();
              i=Bars-Counted_bars-1;
         //+-----------+
         //Level 2     |
         //+-----------+
         if (i>History-1) i=History-1;
         Buf_0[i] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
         return; } 
//+-------------------------------------------+
Pendant la programmation, j'ai modifié de manière décorative le code "principal" et supprimé certaines valeurs du code "appendice". Après avoir exécuté le code, j'ai remarqué la ligne horizontale, qui indiquait une erreur dans mon raisonnement, car les indicateurs techniques utilisés dans l'indicateur personnalisé ne peuvent pas donner, sur une longue période de temps, les valeurs qui construisent le graphique de la fonction " y = x ".

Synopsis.
Je m'appelle John (Eugène, mais à l'américaine).

J'ai 15 ans, je fais du trading depuis 5 jours et je sens un énorme progrès dans l'apprentissage des domaines du trading de devises, à savoir l'analyse des indicateurs et l'analyse graphique (en bref, t.a. :) ).
J'ai l'impression que le "trading manuel" est de moins en moins prometteur, j'ai donc décidé de passer directement au "trading automatisé".

"REPRENDRE" TOUS LES JUGEMENTS INADÉQUATS ! Je veux en savoir plus et vos commentaires m'aideront.

 
Link_x:
Bonjour !
Veuillez trouver des erreurs dans mon raisonnement.

Ici se termine le deuxième jour où je me débats avec la création de l'indicateur, à savoir l'affichage de la ligne sur une fenêtre supplémentaire attachée à la fenêtre principale. A mon avis, il faut faire des calculs sur les barres non calculées et donner les résultats des calculs au tampon. Cette fois, j'utilise un code plus complexe pour l'exemple (j'aime travailler avec des codes relativement énormes). Voici la "clairière de la créativité" :

.

Vous pouvez clairement voir que "dans cette fenêtre" la valeur de la mémoire tampon est "0", c'est-à-dire que cet indicateur ne tracera une ligne qu'à partir du moment où la plateforme de trading est lancée. Et j'ai besoin de données historiques en plus des données réelles.

J'ai utilisé les informations décrites dans ce code (tiré du tutoriel MQ4) :

Je vais isoler ce dont j'ai besoin et je vais...

Ensuite, en le ramenant à une "vue de parade" en enlevant les commentaires et en divisant logiquement, j'obtiens :

Ici, je me retrouve avec des objets qui doivent être synthétisés avec le code "principal". Après avoir effectué la fusion, j'obtiens ce code :

Au cours de la programmation, j'ai modifié de manière décorative le code "principal" et supprimé certaines valeurs du code "appendice". Après avoir lancé le code, j'ai remarqué la ligne horizontale, qui indiquait une erreur dans mon raisonnement, car les indicateurs techniques utilisés dans l'indicateur personnalisé ne peuvent pas donner, pendant une longue période, les valeurs qui construisent le graphique de la fonction " y = x ".

Synopsis.
Je m'appelle John (Eugène, mais à l'américaine).

J'ai 15 ans, je m'occupe de trading depuis 5 jours et je sens que je fais de grands progrès dans l'étude des domaines du trading de devises, à savoir l'analyse des indicateurs et l'analyse des graphiques (en bref, t.a. :) ).
J'ai l'impression que le "trading manuel" devient de moins en moins prometteur, j'ai donc décidé de passer directement au "trading automatisé".

"S'EN PRENDRE" À TOUS LES JUGEMENTS INADÉQUATS ! Je veux en savoir plus et vos commentaires m'aideront.

Le début est bon.

Faites attention à la variable Historique, essayez de substituer une valeur différente.

//                Джон(Евгений).mq4 

//+--------------------------------------------+
#property indicator_separate_window
//#property indicator_minimum -10
//#property indicator_maximum 10
#property indicator_buffers 1
#property  indicator_color1 Blue
//|+--------------------------------------------+
//|Inputs                                       |
//|+--------------------------------------------+
extern double N = 1;
extern int History  =50;
//|+--------------------------------------------+
//|Deklaration                                  |
//|+--------------------------------------------+
double A; double C;       int i;
double M; double D;
double L; double I;       int Counted_bars;
double B; double F;
double K; double Buf_0[];
double G; 
//|+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//|+--------------------------------------------+
int start()
{
       //|+-----------+
       //|Level 1     |
       //|+-----------+
 for( i=0; i<History; i++)
    {    
       A = iRSI(Symbol(),0,10,0,i);
       M = iRSI(Symbol(),0,20,0,i);
       L = iRSI(Symbol(),0,15,0,0);
       B = iStochastic(Symbol(),0,10,6,6,0,0,0,i);
       K = iStochastic(Symbol(),0,10,6,6,0,0,1,i);
       C = iADX(Symbol(),0,10,0,0,i);
       D = iADX(Symbol(),0,10,0,1,i);
       I = iADX(Symbol(),0,10,0,2,i);
       F = iRVI(Symbol(),0,10,0,i);
    Buf_0[i] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
   }
 return;
} 
//+-------------------------------------------+
 
Link_x:
Bonjour !
Veuillez trouver des erreurs dans mon raisonnement.

Le deuxième jour de développement de l'indicateur touche à sa fin, j'ai du mal à afficher la ligne sur la fenêtre supplémentaire attachée à la fenêtre principale. A mon avis, il est nécessaire de faire des calculs sur les barres non calculées et de donner des valeurs aux résultats des calculs au tampon. Cette fois, j'utilise un code plus complexe pour l'exemple (j'aime travailler avec des codes relativement énormes). Voici la "clairière de la créativité" :

.

Vous pouvez clairement voir que "dans cette fenêtre" la valeur de la mémoire tampon est "0", c'est-à-dire que cet indicateur ne tracera une ligne qu'à partir du moment où la plateforme de trading est lancée. Et j'ai besoin de données historiques en plus des données réelles.

J'ai utilisé les informations décrites dans ce code (tiré du tutoriel MQ4) :

Je vais isoler ce dont j'ai besoin et je vais...

Ensuite, en le ramenant à une "vue de parade" en enlevant les commentaires et en divisant logiquement, j'obtiens :

Ici, je me retrouve avec des objets qui doivent être synthétisés avec le code "principal". Après avoir effectué la fusion, j'obtiens ce code :

Au cours de la programmation, j'ai modifié de manière décorative le code "principal" et supprimé certaines valeurs du code "appendice". Après avoir lancé le code, j'ai remarqué la ligne horizontale, qui indiquait une erreur dans mon raisonnement, car les indicateurs techniques utilisés dans l'indicateur personnalisé ne peuvent pas donner, pendant une longue période, les valeurs qui construisent le graphique de la fonction " y = x ".

Synopsis.
Je m'appelle John (Eugène, mais à l'américaine).

J'ai 15 ans, je m'occupe de trading depuis 5 jours et je sens que je fais de grands progrès dans l'étude des domaines du trading de devises, à savoir l'analyse des indicateurs et l'analyse des graphiques (en bref, t.a. :) ).
J'ai l'impression que le "trading manuel" devient de moins en moins prometteur, j'ai donc décidé de passer directement au "trading automatisé".

"S'EN PRENDRE" À TOUS LES JUGEMENTS INADÉQUATS ! Je veux en savoir plus et vos commentaires m'aideront.


Commencez à creuser du côté des boucles (for, wile, while do) pour savoir pourquoi vous en avez besoin ;)))


Si vous avez besoin de valeurs sur des données historiques - vous ne pouvez pas le faire sans énumérer ces mêmes données dans une boucle ;)

Plus haut, vous avez donné un exemple avec l'historique, qui définit le nombre de barres de l'historique, qui seront traitées par l'indicateur, et c'est ainsi que vous devez procéder.

 


Sur l'image, j'ai marqué d'une flèche l'endroit où la sortie doit se trouver. Je ne comprends pas quel est le problème. On entre, on se rappelle l'heure,

Ensuite, sortez lorsque le temps est plus long que l'entrée avec un décalage d'une période et que le prix est inférieur à la MA min de 3 jours.

Le code est le suivant :

signal =   MA_6_t - iClose(Symbol(),Period(),0);
MA_2_t=iMA(NULL,0,3,0,MODE_EMA,PRICE_LOW,0); 
static datetime t;

if  (signal > 0.006) 
          {                                          
          Opn_S=true; 
          t=Time[0];                      
          }
if  (Bid <= MA_2_t)
      {
       if (Time[1]>t)
          {                                      
          Cls_S=true;         
          }
      }
Qu'en pensez-vous ?
Raison: