[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 276

 
rid >> :

En utilisant (appelant) les fonctions de ces fichiers (déjà implémentées dans mt4), en cas de fonctionnement incorrect de l'EA, nous pouvons voir dans le log le numéro de l'erreur que nous avons faite dans le code.

Par exemple, nous appelons la fonction GetLastError() :

Dans ce cas, si nous avons fait une erreur dans le code ou défini des paramètres externes incorrects, nous verrons le numéro de cette erreur dans le journal.

Par exemple, 130.

Et le décodage du numéro se trouve sur la page -https://book.mql4.com/ru/appendix/errors.

Et nous n'aurons pas à chercher dans tous les codes, car nous savons déjà, grâce à ce numéro, où se trouve exactement l'erreur !

Permettez-moi de corriger un peu : la fonction GetLastError peut être appelée sans le fichier d'en-tête mais pour obtenir la description de l'erreur sans naviguer sur les sites, vous devez lier la bibliothèque :

#include <stderr.mqh>
#include <stdlib.mqh>

...
Print("Ошибка открытия ордера BUY #", ErrorDescription(GetLastError()));
...
 
rid писал(а) >>

Vous n'avez pas appelé la fonction correctement.

Votre fonction est appelée comme suit : si (NumberOfPositions(NULL,Magic)> 1)

Il devrait ressembler à ceci :


Sentez la différence (vous avez manqué le "-1") ! et CHANGEZ VOTRE CODE.

Pour le contrôler, vous pouvez imprimer un commentaire sur le graphique. Par exemple, comme ceci (au début de la fonction START).

Quant à votre deuxième condition, je mettrais ("sans réfléchir intelligemment") un magicien différent et une fonction distincte Open_Buy_2() pour ouvrir les positions par la deuxième condition !

Le code de la deuxième condition ressemblerait à ceci

rid,

Je comprends également pourquoi la deuxième condition ne fonctionne pas, peut-être ai-je mal expliqué le problème :

Je veux que mon EA soit capable de vérifier si les ordres ont été ouverts par lui ou non, même s'ils ont été fermés il y a longtemps. NumberOfPositions fonctionne, mais il ne compte que le nombre de positions ouvertes. (c'est pourquoi cela ne fonctionne pas)

Dans le code de mon EA, il y a un script qui ouvre chaque position suivante en tenant compte des données de la position précédente et s'il n'y avait pas de position précédente, le premier ordre doit être ouvert sans cette condition (sinon, l'EA ne démarrera pas). Par conséquent, il devrait y avoir une fonction qui comprend si au moins un ordre de cet EA a été ouvert ou non (même si l'ordre a ensuite été fermé). S'il n'y a pas encore eu de commande (début du travail), la première commande est ouverte sans tenir compte de la deuxième condition, et toutes les commandes suivantes sont ouvertes en tenant compte de la deuxième condition, c'est-à-dire en utilisant les données des commandes précédentes.

Est-il possible de modifier la fonction de cette manière ?

 

Veuillez me dire ce que la fonction iTime indique.

Quel est ce charabia de 10 chiffres ? Des secondes ?

Comment cela se traduirait-il en année-mois-jour-heure-minute ?

 

Je vois. Vous pouvez déterminer si les positions ont été sur l'historique comme ceci :

  for (int i=0; i< OrdersTotal(); i++)                          {
    if (!(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ))) continue;
//выбираем из истории счета
    if (OrderSymbol() != Symbol()) continue;    
     if ( OrderMagicNumber()== Magic)                            {
              позиции = true;
                                                             }}
                  



Mais alors votre code ne fonctionnera que dans le testeur. Parce que sinon, vous devrez changer la magie à chaque fois que vous allumerez l'EA en ligne.

Apparemment, vous devez définir la période pour laquelle l'historique du compte est pris.

C'est-à-dire quand a été ouverte/fermée la dernière transaction avec la magie donnée ? C'était il y a six mois ou il y a 24 heures ?

Il existe des fonctions qui renvoient le numéro de la barre (en comptant de la barre actuelle à la fin de l'historique) de la dernière transaction ouverte ou fermée.


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if ( sy=="" || sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()== sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderOpenTime()) t=OrderOpenTime();
            }}}}} }  return(iBarShift( sy, tf, t, True));}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара закрытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal();

  if ( sy=="" || sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) t=OrderCloseTime();
            } } }} }  }  return(iBarShift( sy, tf, t, True));}

Pour vous donner un exemple. J'ai utilisé ces fonctions dans mon code comme ceci :
//======================================================================
// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 1440,-1, Magic)==0 
     ||  NumberOfBarCloseLastPos(NULL, 1440,-1, Magic)==0 )
    Trade=false;       else Trade=true;
//================================================================

Ou comme ça :
//======================================================================
// запрет торговли  , если за последние 85 баров графика Н1
//т.е. за посл.85 часов)уже были открыты   позиции  или
// закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 60,-1, Magic)<=85 
     ||  NumberOfBarCloseLastPos(NULL,60,-1, Magic)<=85 )
    Trade=false;       else Trade=true;
 
Messieurs, à l'aide ! Comment écrire correctement le code pour afficher un message indiquant que la dernière bougie fermée est blanche (hausse) ou noire (baisse). Je sais que cela n'a pas de sens, mais quand même ......

 

Hmm.je me débats avec le même problème simple...ouvre une mer de positions mais n'en a besoin que d'une seule au maximum et quand l'achat se ferme et qu'un signal vient ouvrir la vente.... Grande demande indice et de corriger ce qui est faux.dans le code ci-dessous ... Où dois-je prescrire un magik ? Si cela ne vous dérange pas, faites un exemple stupide, lorsque l'achat croise vers le haut (pas plus d'un ordre) et la vente vers le bas également pas plus d'un ordre. Je pense que cela résoudra immédiatement les questions de nombreux débutants. Merci d'avance.

//---- input parameters
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   
   int ticket;
  if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
   if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
   return(0);
  }

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}
 

Une autre question stupide :

- Comment déclarer un tableau dont le nombre d'éléments est donné par une variable externe.

 
chaynik_1 >> :
Messieurs, à l'aide ! Comment écrire correctement le code pour afficher un message indiquant que la dernière bougie fermée est blanche (hausse) ou noire (baisse). Je sais que ça n'a pas de sens, mais quand même ......

C'est comme ça.

if ((Open[1]-Close[1])<0  ) Comment ("1 свеча =  бычья");
 
alderru >> :

Une autre question stupide :

- Comment déclarer un tableau dont le nombre d'éléments est donné par une variable externe.

https://docs.mql4.com/ru/array/ArrayResize

 
morok >> :

Hmm.je me débats avec le même problème simple...ouvre une mer de positions mais n'en a besoin que d'une seule au maximum et quand l'achat se ferme et qu'un signal pour ouvrir la vente arrive.... Grande demande indice et de corriger ce qui est faux.dans le code ci-dessous ... Où dois-je prescrire un magik ? Si cela ne vous dérange pas, faites un exemple stupide, lorsque l'achat croise vers le haut (pas plus d'un ordre) et la vente vers le bas également pas plus d'un ordre. Je pense que cela résoudra immédiatement les questions de nombreux débutants. Merci d'avance.

Essayez comme ça :

(vous devez être plus attentif avec NumberOfPositions(), il est écrit dans l'en-tête pour une raison :

/| Description : | Description : Renvoie le nombre de positions.
//| Paramètres : |
//| sy - nom de l'instrument ("" ou NULL - symbole courant) |
|| op - opération ( -1 - toute position) |
//| mn - MagicNumber ( -1 - tout nombre magique) |
//+----------------------------------------------------------------------------+

extern int       Magic=5675;
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);   
   int ticket;
//------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   if ( NumberOfPositions(NULL,OP_SELL, Magic)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}