[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 498

 
TarasBY:
Vous pouvez chercher sur Google "Windows Task Scheduler". Vous pouvez le consulter ici.
Faut-il créer des programmes (tâches) distincts pour désactiver les terminaux activés ?
 
yosuf:
Faut-il créer des programmes (tâches) distincts pour désactiver les terminaux activés ?
Docent, lisez attentivement le document au lien de TarasBY et n'inventez pas de bêtises.
 

Voici mon tutoriel de test de la chouette brute :

//+---------------------------------------------------------------------------------------+
//|                               Strategy №1 for H1.mq4                                  |
//|                                        hoz                                            |
//|                                                                                       |
//+---------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

//----- Входные параметры -----------
extern string     H1 = "___ Общие параметры индикаторов ___";
extern int        i_TF = 60;
extern string     H2 = "_____ Параметры быстрой машки _____";
extern int        i_maFastPeriod = 5,
                  i_maFastShift = 0,
                  i_maFastMethod = 1;
extern string     H3 = "____ Параметры медленной машки ____";
extern int        i_maSlowPeriod = 19,
                  i_maSlowShift = 0,
                  i_maSlowMethod = 1;
extern string     H4 = "_______ Параметры Моментума _______";
extern int        i_momPeriod = 18;
extern string     H5 = "_______ Параметры Стохастика ______";
extern int        i_stoch_D = 3,                   // Сигнальная линия
                  i_stoch_K = 13,                  // Главная линия
                  i_stoch_slowing = 3;             // Замедление
                  
int g_ticket,                                      // Тикет текущей позиции
    g_type;                                        // Тип текущей позиции

//Иднентификаторы типов сигналов
#define CROSSINGTOUP                 1             // Пересечение быстрой медленную снизу вверх
#define CROSSINGTODOWN              -1             // Пересечение быстрой медленную сверху вниз
#define CROSSINGWAIT                 0             // Отсуствие пересечения машек

#define SIGNAL_BUY                   1             // Сигнал покупки
#define SIGNAL_SELL                 -1             // Сигнал продажи
#define SIGNAL_NO                    0             // Отсуствие сигнала

//+---------------------------------------------------------------------------------------+
//| Функция инициализации эксперта                                                        |
//+---------------------------------------------------------------------------------------+
int init()
  {
   
   return(0);
  }
//+---------------------------------------------------------------------------------------+
//| Функция деинициализации эксперта                                                      |
//+---------------------------------------------------------------------------------------+
int deinit()
  {

   return(0);
  }

//+---------------------------------------------------------------------------------------+
//| Проверка пересечения скользящих средних                                               |
//+---------------------------------------------------------------------------------------+
int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)
{
      if ((i_maFast2<i_maSlow2) && (i_maFast1>i_maSlow1))             // Если быстрая скользящая пересекла медленную снизу вверх..
      return(CROSSINGTOUP);                                           //.. значит, - пересечение вверх
                                                 
      if ((i_maFast2>i_maSlow2) && (i_maFast1<i_maSlow1))             // Если быстрая скользящая средняя пересекла медленную сверху вниз..
      return(CROSSINGTODOWN);                                         //..значит, - пересечение вниз
 
   return(CROSSINGWAIT);                                              // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Стохастика                                                       |
//+---------------------------------------------------------------------------------------+
int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)
{
   for(int i=1;i<=Bars;i++)
   {
      if((stochD2<stochK2) && (stochD1>stochK1))                     // Если сигнальная линия пересекла главную снизу вверх..
      return(CROSSINGTOUP);                                          //..значит, - пересечение вверх
      if((stochD2>stochK2) && (stochD1<stochK1))                     // Если сигнальная линия пересекла главную сверху вниз..
      return(CROSSINGTODOWN);                                        // ..значит, - пересечение вниз
   }
   return(CROSSINGWAIT);                                             // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Моментума                                                        |
//+---------------------------------------------------------------------------------------+
void GetMomentumSignal()
{
   double momentum = iMomentum(Symbol(),i_TF,i_momPeriod,0,0);
}

//+---------------------------------------------------------------------------------------+
//| Получение общего сигнала для входа в рынок                                            |
//+---------------------------------------------------------------------------------------+
int GetSignal()
{
   for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }
      if( GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)==CROSSINGTOUP || i_maFast1>i_maSlow1 )
      return(SIGNAL_BUY);
}

//+---------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                   |
//+---------------------------------------------------------------------------------------+
void FindOrders()
{
   
}
//+---------------------------------------------------------------------------------------+
//| Функция start эксперта                                                                |
//+---------------------------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }

La fonction int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2) récupère le signal de croisement.

La fonction intGetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2) reçoit le signal de la stochastique.

La fonction void GetMomentumSignal() permet d'obtenir la valeur de la quantité de mouvement.

L'int GetSignal() obtiendra le signal général basé sur les 3 fonctions précédentes et pas seulement celles-ci. La question est la suivante. Puisque la fonctionint GetSignal() est la principale, pour ainsi dire, et qu'elle obtient le signal principal, j'obtiens toutes les valeurs des volets(i_maFast1,i_maFast2, i_maSlow1 eti_maSlow2) et des stochastiques(stochD1,stochD2,stochK1,stochK2)

Ai-je bien optimisé le code?

Bien entendu, tous les paramètres obtenus dans la fonctionGetSignal() sont transmis par référence aux fonctions correspondantes.

Mais ici, ce fragment

     if( GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)==CROSSINGTOUP || i_maFast1>i_maSlow1 )
      return(SIGNAL_BUY);

il y a une erreur à la compilation :

'&' - variable expected E:\Insall'd soft's\Forex\Admiral Markets\experts\Strategy №1 for H1.mq4 (109, 31)
'&' - variable expected	E:\Insall'd soft's\Forex\Admiral Markets\experts\Strategy №1 for H1.mq4 (109, 50)
'&' - variable expected	E:\Insall'd soft's\Forex\Admiral Markets\experts\Strategy №1 for H1.mq4 (109, 69)
'&' - variable expected	E:\Insall'd soft's\Forex\Admiral Markets\experts\Strategy №1 for H1.mq4 (109, 88)
4 ошибок, 0 предупреждений
Pourquoi ?

 
Je n'aime pas fouiller dans le code de gauche, mais j'ai tout de suite compris pourquoi il y a un & ( !) après double dans les fonctions. C'est ce qui provoque des erreurs !
 
hoz:

Voici mon tutoriel de test sur les hiboux bruts :

une erreur apparaît lors de la compilation :

Pourquoi ?

Parce que :

//+---------------------------------------------------------------------------------------+
//| Получение общего сигнала для входа в рынок                                            |
//+---------------------------------------------------------------------------------------+
int GetSignal()
{
   for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }
      if( GetCrossingMa(i_maFast1, i_maFast2, i_maSlow1, i_maSlow2)==CROSSINGTOUP || i_maFast1>i_maSlow1 )
      return(SIGNAL_BUY);
}
 
borilunad:
Je n'aime pas fouiller dans le code personnalisé, mais j'ai immédiatement remarqué pourquoi il y a un & ( !) après le double dans les fonctions. C'est ce qui provoque des erreurs !

C'est donc logique. Il s'agit de transférer des paramètres via des liens.

Pour éviter d'expliquer le code plus en détail, je vais l'expliquer brièvement.

Il y a 3 fonctions :(int GetCrossingMa, int GetStochSignal et int GetSignal())

La fonction int GetSignal() obtient les valeurs des volets et d'autres indicateurs qui sont transmis par référenceaux fonctionsnon essentielles(int GetCrossingMa etint GetStochSignal) pour obtenir les signaux correspondants dans ces fonctions. Je veux le faire pour éviter de récupérer les mêmes données dans différentes fonctions. Je ne pense pas qu'il soit judicieux de calculer les mêmes masques dans 2 fonctions ou plus. Il est plus facile de le calculer une fois, et c'est tout. Pourquoi gaspiller des ressources supplémentaires à ce sujet ?

 
hoz:

C'est donc logique. Il s'agit de transférer des paramètres via des liens.

Pour éviter d'expliquer le code en détail, je vais l'expliquer brièvement.

Il y a 3 fonctions :(int GetCrossingMa, int GetStochSignal et int GetSignal())

La fonction int GetSignal() obtient les valeurs des volets et d'autres indicateurs qui sont transmis par référenceaux fonctionsnon essentielles(int GetCrossingMa etint GetStochSignal) pour obtenir les signaux correspondants dans ces fonctions. Je veux le faire pour éviter de récupérer les mêmes données dans différentes fonctions. Je ne pense pas qu'il soit judicieux de calculer les mêmes masques dans 2 ou plusieurs fonctions. Il est plus facile de le calculer une fois, et c'est tout. Pourquoi gaspiller des ressources supplémentaires à ce sujet ?

Avez-vous programmé dans un autre langage que µl4 ?

 
hoz:

Voici mon tutoriel de test de la chouette brute :

La fonction int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2) récupère le signal de croisement.

La fonction intGetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2) reçoit le signal de la stochastique.

La fonction void GetMomentumSignal() permet d'obtenir la valeur de la quantité de mouvement.

L'int GetSignal() obtiendra le signal général basé sur les 3 fonctions précédentes et pas seulement celles-ci. La question est la suivante. Puisque la fonctionint GetSignal() est la principale, pour ainsi dire, et qu'elle obtient le signal principal, j'obtiens toutes les valeurs des volets(i_maFast1,i_maFast2, i_maSlow1 eti_maSlow2) et des stochastiques(stochD1,stochD2,stochK1,stochK2)

Ai-je bien optimisé le code ?

Bien entendu, tous les paramètres obtenus dans la fonctionGetSignal() sont transmis par référence aux fonctions correspondantes.

Mais ici, ce fragment

il y a une erreur lors de la compilation :

Pourquoi ?

Il peut s'agir d'une variante de la recherche de signaux sur la barre dont nous avons besoin :

//+---------------------------------------------------------------------------------------+
//| Проверка пересечения скользящих средних                                               |
//+---------------------------------------------------------------------------------------+
int GetCrossingMa (int fi_Bar = 1)
{
    double i_maFast1 = iMA (Symbol(), i_TF, i_maFastPeriod, i_maFastShift, i_maFastMethod, 0, fi_Bar),      // Вычисляем быстрые скользящие..
           i_maFast2 = iMA (Symbol(), i_TF, i_maFastPeriod, i_maFastShift, i_maFastMethod, 0, fi_Bar + 1),    //..средние
           i_maSlow1 = iMA (Symbol(), i_TF, i_maSlowPeriod, i_maSlowShift, i_maSlowMethod, 0, fi_Bar),      // Вычисляем медленные скользящие..
           i_maSlow2 = iMA (Symbol(), i_TF, i_maSlowPeriod, i_maSlowShift, i_maSlowMethod, 0, fi_Bar + 1);    //..средние
//----
    if (i_maFast2 < i_maSlow2) if (i_maFast1 > i_maSlow1)             // Если быстрая скользящая пересекла медленную снизу вверх..
    return (CROSSINGTOUP);                                           //.. значит, - пересечение вверх
    if (i_maFast2 > i_maSlow2) if (i_maFast1 < i_maSlow1)             // Если быстрая скользящая средняя пересекла медленную сверху вниз..
    return (CROSSINGTODOWN);                                         //..значит, - пересечение вниз
//----
    return (CROSSINGWAIT);                                              // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Стохастика                                                       |
//+---------------------------------------------------------------------------------------+
int GetStochSignal (int fi_Bar = 1)
{
    double stochD1 = iStochastic (Symbol(), i_TF, i_stoch_D, i_stoch_K, i_stoch_slowing, 0, 0, 1, fi_Bar),     // Вычисляем значения сигнальной линии..
           stochD2 = iStochastic (Symbol(), i_TF, i_stoch_D, i_stoch_K, i_stoch_slowing, 0, 0, 1, fi_Bar + 1),   //..стохастика
           stochK1 = iStochastic (Symbol(), i_TF, i_stoch_D, i_stoch_K, i_stoch_slowing, 0, 0, 0, fi_Bar),     // Вычисляем значения главной линии..
           stochK2 = iStochastic (Symbol(), i_TF, i_stoch_D, i_stoch_K, i_stoch_slowing, 0, 0, 0, fi_Bar + 1);   //..стохастика
//----
      if (stochD2 < stochK2) if (stochD1 > stochK1)                     // Если сигнальная линия пересекла главную снизу вверх..
      return (CROSSINGTOUP);                                          //..значит, - пересечение вверх
      if (stochD2 > stochK2) if (stochD1 < stochK1)                     // Если сигнальная линия пересекла главную сверху вниз..
      return (CROSSINGTODOWN);                                        // ..значит, - пересечение вниз
   }
//----
   return (CROSSINGWAIT);                                             // Ожидаем пересечения
}
//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Моментума                                                        |
//+---------------------------------------------------------------------------------------+
double GetMomentumSignal (int fi_Bar = 0)
{return (iMomentum (Symbol(), i_TF, i_momPeriod, 0, fi_Bar));}
//+---------------------------------------------------------------------------------------+
//| Получение общего сигнала для входа в рынок                                            |
//+---------------------------------------------------------------------------------------+
int GetSignal (int fi_Bar = 1)
{
    int li_Signal;
//----
      double ld_SignalMomentum = GetMomentumSignal (fi_Bar);
      int    li_SignalStoch = GetStochSignal (fi_Bar),
             li_CrossingMA = GetCrossingMa (fi_Bar);
//----
    return (li_Signal);
}

Et dans la dernière fonction GetSignal() vous faites une "addition" de tous les signaux (par vous-même).

P.S. Il y a un moment "délicat" pour obtenir le signal de l'indicateur. Par exemple, vous pouvez fixer le fait que maSlow soit supérieur ou inférieur à maFast, ou vous pouvez "attraper" le moment de leur intersection. L'approche et le code sont différents.

 
Roman.:

Avez-vous programmé dans un autre langage que µl4 ?


Un peu en Perl et un peu en Pxp. Mais je n'ai pas sérieusement abordé d'autres langues car je n'en ai pas eu besoin. Est-ce important ?
 
hoz:

C'est donc logique. Il s'agit de transférer des paramètres via des liens.

Pour éviter d'expliquer le code en détail, je vais l'expliquer brièvement.

Il y a 3 fonctions :(int GetCrossingMa, int GetStochSignal et int GetSignal())

La fonction int GetSignal() obtient les valeurs des volets et d'autres indicateurs qui sont transmis par référenceaux fonctionsnon essentielles(int GetCrossingMa etint GetStochSignal) pour obtenir les signaux correspondants dans ces fonctions. Je veux le faire pour éviter de récupérer les mêmes données dans différentes fonctions. Je ne pense pas qu'il soit judicieux de calculer le même masque dans 2 ou plusieurs fonctions. Il est plus facile de le calculer une fois, et c'est tout. Pourquoi gaspiller des ressources supplémentaires à ce sujet ?

Les explications sont claires, mais les actions ne le sont pas.
C'est ça : Les actions "Lafonction int GetSignal() obtient les valeurs des échelles et autres indicateurs" dans votre variante sont "discutables", pour ne pas dire plus, car il n'y a pas besoin de telles actions.

Ce code :

   for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }

complet P.... Vous réalisez ce qui se passe ici ? - Toute la "rangée de barres" est recherchée en vain, et à la fin de la boucle, les variables se retrouvent avec des valeurs... devinez ce qui se passe ensuite.