[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 309

 
artmedia70:
Exactement. La variable globale Reason obtient une valeur, mais elle ne l'obtient pas dans deinit(), mais dans init() de sorte que lors de l'exécution de init(), vous pouvez voir la raison de la dernière désinitialisation et effectuer une certaine action basée sur la valeur. Mais il ne fonctionne pas comme il le devrait.

On vous a dit comment faire. C'est dans deinit() que l'on trouve la raison de la dernière désinitialisation et qu'on la passe par une variable déclarée globalement. Dans init() on vérifie la valeur de la variable et on trouve la raison de la dernière désinitialisation. Ça marche ! !!

PS Apparemment, tout le monde ne réalise pas que init()/deinit() ne modifient pas les valeurs des variables déclarées globalement, à moins que cela ne soit explicitement indiqué dans les déclarations au sein des fonctions.

En fait, il est préférable de ne pas fermer les ordres dans init(). Là, MarketInfo() ne fonctionne souvent pas comme prévu.

int    DeinitReason = 0; // определяем переменную на глобальном уровне
...
int init ()
{
...
      if ( DeinitReason == 3) // если смена таймфрейма
...
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
 
Mislaid:
On vous a dit comment faire. C'est dans deinit() que l'on trouve la raison de la dernière désinitialisation et qu'on la passe par une variable déclarée globalement. Dans init() on vérifie la valeur de la variable et on trouve la raison de la dernière désinitialisation. Ça marche ! !!
J'ai réalisé qu'Artyom a un problème spécifique avec le passage du TF M5. Il y a une erreur. Nous devrions vérifier si c'est le cas. Peut-être s'agit-il d'un bug dans MT4.
 
Zhunko:
Ceci suggère ce que vous feriez avec cette fonction. Une fonction comme celle-ci est généralement exécutée par l'histoire.

Je ne peux même pas imaginer exécuter la fonction dans une boucle...
 
hoz:

Je ne peux pas imaginer une fonction qui tournerait en boucle...

Vous êtes les bienvenus :
for(i=OrdersTotal()-1;i>=0;i--){
    Print(GetOrderInfo(i,OrderMagic,.....));// вызов пользовательской функции 
}

for(i=0;i<OrdersTotal();i++){/// вызов функции "ордерс тотал" на каждой итерации

}
 
Zhunko:
J'ai réalisé qu'Artem a un problème avec le passage de M5 TF. Il y a une erreur. Je voudrais vérifier si c'est le cas. Il s'agit peut-être d'un bug de MT4.

Non, ce n'est pas un bug. Voici l'EA. Changement des délais de M1 à H1

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+ 
19:20:02 111 CADJPY,M15 : initialisé
19:20:09 111 CADJPY,M15 : DeinitReason 3
19:20:09 111 CADJPY,M15 : désinitialisé
19:20:09 111 CADJPY,M15 : uninit reason 3
19:20:09 Supertrend[1] CADJPY,M15 : désinitialisé
19:20:09 Supertrend[1] CADJPY,M15 : uninit reason 3
19:20:09 HLC CADJPY,M15 : désinitialisé
19:20:09 HLC CADJPY,M15 : uninit reason 3
19:20:09 AMA optimisé1 CADJPY,M15 : Désinitialisé
19:20:09 AMA optimisé1 CADJPY,M15 : uninit reason 3
19:20:09 AMA optimisé1 CADJPY,M15 : Désinitialisé
19:20:09 AMA optimisé1 CADJPY,M15 : uninit reason 3
19:20:09 Supertrend[1] CADJPY,H1 : initialisé
19:20:09 HLC CADJPY,H1 : initialisé
19:20:09 AMA optimisé1 CADJPY,H1 : initialisé
19:20:09 AMA optimisé1 CADJPY,H1 : initialisé
19:20:09 111 CADJPY,H1 : initialisé
 
Mislaid:

Non, ce n'est pas un bug. Voici l'EA. Changement des délais de M1 à H1

C'est bien ! J'ai aussi beaucoup de raisons pour la désinitialisation.

Mislaid:

En fait, il est préférable de ne pas fermer les ordres dans init(). Là, MarketInfo() ne fonctionne souvent pas comme prévu.

Oui. Vous ne pouvez pas. C'est écrit dans l'aide.

hoz:

Je ne peux même pas imaginer que la fonction tourne en boucle...
C'est la routine.
 
Zhunko:

C'est bien ! Parce que moi aussi j'ai beaucoup de choses liées aux raisons de la désinitialisation.

Oui. Vous ne pouvez pas. C'est écrit dans l'aide. C'est une chose courante.

Voici la dernière variante à vérifier. La précédente n'était pas très réussie, parce que init()/deinit() parfois ne font pas ami-ami avec print()

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
bool firststart = true;
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   firststart = true;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if ( firststart )
  {
      Print( "DeinitReason ", DeinitReason, " ", Period( ) );
      firststart = false;
  }
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Je me suis demandé comment écrire une fonction. L'idée est que lorsque N bougies se retournent dans une certaine direction, il doit calculer le nombre de bougies. MAIS. Pour cela, il y a plusieurs conditions, ou plus précisément, il y en aura une liste au fil du temps.

Disons que la tendance, par exemple, est dirigée vers le bas,... ...un pullback augmente. Je veux que, si 5 chandeliers sont montés, et que chaque chandelier était haussier, et, par exemple, la taille de chaque chandelier était plus grande quei_sizeOfCurrBar, et d'autres conditions, le nombre de barres continuellement haussières soit affiché, et que la fonction renvoie un résultat.

Quelle est la meilleure façon de l'écrire ? En ce moment, j'ai commencé à écrire, et je comprends que je devrais le faire passer par une boucle par barres, et en quelque sorte limiter la vue dans la profondeur de l'histoire non pas par un nombre fixe de barres, mais par barres, avec ces paramètres, qui nous intéressent par conditions.

Voilà ce que j'ai :

int LastCandlesType()
{
   bool up,    // Свеча направлена вверх
        dn;    // Свеча направлена вниз
   int cnt;    // Счётчик идущих друг за другом бычьих свечей
   
   for (int i=Bars-1; i>=Bars-6; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром.
          continue;
      
      if (Close[i] > Open[i])                               // 
          up = true;

      cnt++;
   }
   if (cnt == 5)
       return (BULL_CANDLES);
}

Pour le moment, nous allons simplement de l'avant-dernière barre à la barre d'indice 6, c'est-à-dire 5 barres d'affilée. Mais je veux que mon conseiller expert recherche uniquement les barres qui sont haussières et non pas toutes les barres d'affilée. Comment la mettre en œuvre de manière adéquate ?

J'ai en quelque sorte correctement filtré par taille.

Et quand tout est déjà écrit, le compteur calculera le nombre de barres continues avec les paramètres nht,etvsvb et s'il y a assez de ces barres, une valeur de la fonction sera retournée.

 
Mislaid:

On vous a dit comment faire. C'est dans deinit() que l'on trouve la raison de la dernière désinitialisation et qu'on la passe par une variable déclarée globalement. Dans init() on vérifie la valeur de la variable et on trouve la raison de la dernière désinitialisation. Ça marche ! !!

PS Apparemment, tout le monde ne réalise pas que init()/deinit() ne modifient pas les valeurs des variables déclarées globalement, à moins que cela ne soit explicitement indiqué dans les déclarations au sein des fonctions.

En fait, il est préférable de ne pas fermer les ordres dans init(). Là, MarketInfo() ne fonctionne souvent pas comme prévu.

Et où me voyez-vous fermer des positions dans init() ? J'ai posé une question sur la demande de suppression, mais où je les supprime - je n'ai pas dit cela, et encore moins demandé. Pourquoi pensez-vous cela ?
 

Une telle question. Comment optimiser maintenant ? Le squelette de l'Expert Advisor est maintenant le suivant :

init(){
        //если файл истории не существовал, формируем заголовок
}

start(){
        //ловим тики
        //смотрим, сколько прошло секунд с последнего вызова start():
                //если 1 или больше, то---(блок свеч)---
                        //запоминаем, сколько прошло секунд
                        //---(блок выбора режима)---
                        //формируем RateInfo - столько раз, сколько прошло секунд
                //если 0, то---(блок теней)---
                        //редактируем RateInfo - столько раз, сколько прошло секунд в прошлый раз
}

//---(блок выбора режима)---
//флаги в экстерне - все бычьи, все медвежьи или любые
//если все бычьи, то в close всегда ask
//если все медвежьи, то в close всегда bid
//Если любые, то
        //если текущий бид меньше предыдущего, то медвежья
        //в любом другом случае бычья

J'ai mis open-close dans les variables et supprimé le deuxième bloc FileSeek, qui est devenu inutile, ajouté la sélection du style de chandelier (tout haussier, tout baissier, n'importe lequel), ajouté des ombres si le prochain ascendant ou descendant est supérieur ou inférieur au précédent haut et bas, ajouté le traçage avec le print, qui est activé par un drapeau dans l'en-tête, tout commenté avec des liens vers les numéros de ligne, essayé de rendre le code lisible pour le forum. J'ai également ajouté les numéros de ligne à l'impression.

Maintenant, regardez :

En haut, il s'agit d'une période de temps en tic-tac, en bas, d'une deuxième période de temps. Les ombres (queues) se produisent lorsque deux ticks ont été capturés en une seconde et que l'offre ou la demande diffère de la précédente. Le tic-tac fonctionne comme une horloge. Le deuxième tic-tac est en retard, ce qui signifie qu'il prend plus de temps pour traiter le tic-tac que l'intervalle minimal entre les tics. C'est pourquoi je demande comment optimiser le code. Je joins le code et je répète que j'ai tout surcommenté. Si vous voulez vérifier comment il fonctionne - vous le configurez comme un EA sur les minutes, puis dans la recherche autonome et ouvrir 'sec'+nom de l'instrument.

Dossiers :
hhi.jt.mq4  29 kb
Raison: