[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 1085

 
khorosh:

La fonction n'est pas la mienne - je l'ai récupérée en ligne, mais je ne l'ai pas utilisée. Je l'ai regardé attentivement maintenant - il y a un opérateur manquant.

La bonne méthode est la suivante :


Encore une fois, c'est faux ! L'EA émettra un nouveau signal sonore à chaque tic, car Fun_New_Bar() retournera toujours vrai. La question est de savoir pourquoi nous avons besoin de Fun_New_Bar() s'il retourne toujours vrai.
 
drknn:


Et cela ne fonctionne pas - vous avez dû écrire le programme de manière incorrecte. Et c'est parce que vous n'avez aucune idée de la façon dont votre propre code va fonctionner. Faisons le point. Le corps du conseiller expert :

Un nouveau tick arrive et la fonction Fun_New_Bar() est appelée. S'il retourne vrai au programme principal, une alerte apparaîtra. Sinon, l'EA termine son travail par retour et attend un nouveau tick. Tout se répète sur un nouveau tic-tac.

Vous dites que le code ne fonctionne pas ? Maintenant, regardez ce que vous avez dans votre sous-programme.

Une fonction booléenne est déclarée. Comme il s'agit d'une fonction et non d'une procédure, elle doit renvoyer quelque chose au programme principal à partir duquel elle est appelée. Comme la fonction est booléenne, elle doit renvoyer une valeur booléenne. Où avez-vous une chaîne qui renvoie quelque chose au programme principal ? Cela signifie qu'au début du programme, puisque la fonction ne renvoie rien, les parenthèses de l'expression if(Fun_New_Bar()) seront toujours fausses et l'alerte n'apparaîtra jamais.

Allons plus loin. Pourquoi avez-vous déclaré la datetime New_Time=0 ; comme statique ? Quel est votre raisonnement ? Vous avez déclaré une variable et l'avez immédiatement initialisée avec zéro. Au tick suivant, la même chose se produira - la variable sera déclarée et initialisée par zéro à nouveau. If(New_Time!=Time[0]){ Cette ligne vérifie si la valeur de la variable n'est pas égale à l'heure actuelle. Eh bien, oui, la variable a zéro, mais le temps actuel n'est pas zéro. La condition est remplie, la valeur du temps actuel est écrite dans la variable, le paramètre New_Bar devient vrai. Au prochain tick , New_Time ne sera pas à nouveau égal à Time[0], il vérifiera à nouveau avec succès l'inégalité et les deux opérations suivantes seront exécutées. En d'autres termes, lors de la vérification de la condition if(New_Time!=Time[0]), l'expression entre parenthèses sera vraie à chaque tick. TOUJOURS. Ce qui amène à la question suivante : si c'est toujours vrai, pourquoi diable ce chèque devrait-il être là ? Peut-être qu'on devrait juste le supprimer ? Pourquoi devrions-nous affecter New_Time=Time[0] et New_Bar=true, si ces deux variables ne sont utilisées nulle part ? Pourquoi diable avons-nous besoin de ces deux affectations ? Tu veux jouer ? Ou êtes-vous trop paresseux pour réfléchir ?


Essayez ce code. Cela semble fonctionner, mais voyez si c'est bien ou mal. Si quelque chose ne va pas, corrigez-le :

//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------

 
kolyango:


Essayez ce code. Ça semble fonctionner, il faut voir si c'est bien ou mal :

Non, ça ne l'est pas. J'ai tout expliqué pour vous. Tu ne comprends rien ?
 

kolyango : Je vais vous montrer le bon code. Regardez.

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

int MyChandle;// количество свеч на графике
//+------------------------------------------------------------------+
//|                  Блок инициализации                                |
//+------------------------------------------------------------------+
int init(){
  MyChandle=0;// ну или можно вот так : MyChandle=Bars;

  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                              |
//+------------------------------------------------------------------+
int deinit(){
  if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                            |
//+------------------------------------------------------------------+
int start(){
  if(MyChandle<Bars){
   Alert("Было свеч = ", MyChandle," Стало свеч = ",Bars);

   MyChandle=Bars;
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                       |
//+------------------------------------------------------------------+
 
drknn:
Non, ce n'est pas ça - j'ai le code tout expliqué pour vous. Tu ne comprends rien ?


Mais regardez, cela semble fonctionner correctement ! Je l'ai vérifié sur l'échelle de temps M1 :

int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
{
Alert("Сформировался новый бар"); // Вывод на экран
}
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}

 
kolyango:


Mais regardez, cela semble fonctionner correctement ! Je l'ai vérifié sur l'échelle de temps M1 :



Regardez, pouvez-vous lire, ou non - je vous l'ai dit ci-dessus - ce n'est pas le bon code - il signalera à chaque tick, pas une fois sur une nouvelle bougie. Voir ci-dessus - je vous ai donné le bon code. De quoi d'autre n'avez-vous pas besoin pour être heureux ? Pour savoir pourquoi votre code est faux ? J'ai déjà expliqué, c'est faux parce que tout le temps la sous-routine retourne vrai et seulement vrai. L'alerte apparaîtra à chaque tic-tac ! La programmation n'est pas un jeu de devinettes - vous devez réfléchir.
 
drknn:

Encore une fois, c'est faux ! L'EA émettra un nouveau signal sonore à chaque tic-tac, puisque Fun_New_Bar() retournera toujours vrai. La question est de savoir pourquoi nous avons besoin de Fun_New_Bar() s'il retourne toujours vrai.
Il fonctionne correctement - je l'ai vérifié sur le graphique. Quand
New_Time=Time[0]

функция Fun_New_Bar() не будет возвращать истину
 
drknn:

kolyango : Je vais vous montrer le bon code. Regardez.

Et la variante utilisant les barres est moins préférable, car la valeur des barres peut changer non seulement en raison de l'apparition d'une nouvelle barre.
 

drknn:
... Программирование - это не игра в угадайки - тут думать надо...

... Eh bien, au moins parfois... :-)))

 
khorosh:
Et la variante utilisant les barres est moins préférable, car la valeur des barres peut changer non seulement en raison de l'apparition d'une nouvelle barre.


Éclairez-moi : le nombre de bougies sur le graphique peut-il changer en relation avec autre chose que l'apparition d'une nouvelle barre ? :)))))

Oh, oui, c'est vrai - chargement de l'histoire. :) Quoi qu'il en soit, sa fonction sera de sonner à chaque tic-tac - il ne se souvient pas correctement de l'heure.