[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 - 2. - page 294

 
CreAndr:
J'ai une question sur le chalut, qui peut me répondre. Ça semble être le bon chalut pour atteindre le seuil de rentabilité, mais ça ne marche pas.

Voici un aperçu : https://www.mql5.com/ru/forum/131859

Pour insérer le code dans le texte, appuyez sur le bouton SRC au-dessus du champ de saisie du texte.

 
DhP:

Voici un aperçu : https://www.mql5.com/ru/forum/131859

Pour insérer le code dans le texte, appuyez sur le bouton SRC au-dessus du champ de saisie du texte.


Merci.
 
CreAndr:
J'ai une question sur le chalut, qui peut me répondre. Il semble que le chalutage soit correct pour atteindre le seuil de rentabilité, mais cela ne fonctionne pas.


Liste des raisons par ordre décroissant d'importance :

1. L'ordinateur n'est pas allumé

2. Metatrader n'est pas allumé.

3. le script de la carte n'est pas installé

4. Les conseillers experts ne sont pas activés

5. Rien à traîner.

6. Quelque chose dans le code est faux.

 
Roger:


Lister les raisons par ordre décroissant d'importance :

1. L'ordinateur n'est pas allumé

2. Metatrader n'est pas allumé.

3. le script de la carte n'est pas installé

4. Les conseillers experts ne sont pas activés

5. Rien à traîner.

6. Quelque chose dans le code est faux.

Excellente réponse, Roger, mais l'ordinateur est allumé, Metatrader aussi, l'EA est attaché au graphique, les EA sont activés, les transactions s'ouvrent et il y a donc quelque chose à fouiller ! Mais qu'est-ce qui ne va pas avec le code, c'était la question.
 
artmedia70:
Utiliser OrderOpenTime()
Pour - pourquoi en avons-nous besoin alors ?


Donc, oui, mais par numéro de commande j'ai été assez court, mais avec OrderOpenTime je ne comprends pas ce qu'il faut faire, je dois mettre le temps ouvert quelque part, comparer avec la prochaine commande dans la liste, si le temps est plus long, réécrire la variable, etc. Je ne comprends pas encore l'algorithme.


bool DeleteOrders()
{
   for(int i=0 ; i <=OrdersTotal() ; i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(Symbol()==OrderSymbol())
            {
            if(OrderType()!= OP_SELL)
               {
               int ticket=OrderTicket();
               OrderDelete(ticket);
               return(true);
               }
            }
         }
      }
return(false);
} 
 
CreAndr:
Excellente réponse, Roger, mais l'ordinateur est activé, MetaTrader aussi, l'EA est attaché au graphique, les EA sont activés, les transactions sont ouvertes et il y a donc quelque chose à fouiller ! Mais qu'est-ce qui ne va pas avec le code, c'était la question.


Au début, il n'y avait pas de code, vous l'avez joint plus tard.

Probablement parce que vous avez mis du trailing dans la fonction d'ouverture de l'ordre, c'est-à-dire que les conditions d'ouverture d'un ordre sont réunies, l'ordre est ouvert, mais il peut ne pas aller plus loin.

 
Pyro:

Donc, oui, mais par numéro de commande j'ai été assez court, mais avec OrderOpenTime je ne comprends pas ce qu'il faut faire, je dois mettre le temps ouvert quelque part, comparer avec la prochaine commande dans la liste, si le temps est plus long, réécrire la variable, etc. Je ne comprends pas encore l'algorithme.


Le numéro de série n'est pas fiable, rien n'est garanti dans cette numérotation, seulement pour le testeur. Quelques pages plus tôt, j'avais écrit un code pour rechercher le dernier ordre fermé. C'est très simple, nous avons regardé le ticket, puis nous avons choisi l'ordre ou la position par le ticket, et c'est tout :

  int lastclosetime=-1;
  int lastcloseticket=-1;
  int lastdealtype=0;

  for (int i=0; i<OrdersHistoryTotal(); i++) 
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; 
    if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 
    {
      if (lastclosetime<OrderCloseTime()) 
      {
        lastclosetime=OrderCloseTime();
        lastcloseticket=OrderTicket();
      }
    }
  }

  if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 
  {
    if (OrderType()==OP_BUY) lastdealtype=1;
    if (OrderType()==OP_SELL) lastdealtype=-1;   
  }
 
Figar0:


Le numéro de commande n'est pas fiable, personne ne garantit rien dans cette numérotation, seulement pour le testeur. Quelques pages plus tôt, j'ai écrit un code pour trouver le dernier ordre fermé, de même pour les ordres ouverts. Tout est simple, nous l'avons parcouru, nous nous sommes souvenus du ticket, puis nous avons choisi l'ordre ou la position selon le ticket, et c'est tout :

Merci, c'est très simple. Je me pencherai sur la question.
 
Roger:


Au début, il n'y avait pas de code, vous l'avez ajouté plus tard.

C'est probablement parce que vous avez mis un suivi dans la fonction d'ouverture de l'ordre, c'est-à-dire que les conditions d'ouverture de l'ordre se produisent, l'ordre est ouvert, mais il peut ne pas aller plus loin.

Je vois, merci.
 
Figar0:


Le numéro de commande n'est pas fiable, personne ne garantit rien dans cette numérotation, seulement pour le testeur. Quelques pages plus tôt, j'ai écrit un code pour trouver le dernier ordre fermé, de même pour les ordres ouverts. C'est très simple, nous avons regardé le ticket, puis nous avons choisi un ordre ou une position par le ticket et c'est tout :

Le code est faux.

Tout d'abord, voici ceci :

if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 

Si le symbole de l'ordre est égal au symbole donné dans la variable symbole ou l'ordre magic est égal à magic... Ainsi, si un ordre comportant le symbole est sélectionné et que le magik est différent ou absent, la condition sera satisfaite. Parce que c'est soit ceci , soit cela. En conséquence, nous devrions remplacer soit par ou, ou, mieux, séparer les contrôles en chaînes distinctes - la boucle sera plus rapide, ce qui est crucial pour l'optimisation.

En outre... Pick by ticket : Le paramètre pool est ignoré, c'est-à-dire qu'il n'y a aucun sens à l'écrire ici.

if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 

Une fois que l'ordre a été sélectionné avec succès par le ticket, nous devons vérifier dans quelle liste d'ordres il a été sélectionné - ceux du marché ou ceux qui sont fermés. Pour ce faire, nous devons vérifier l'heure de clôture de l'ordre, et si elle est supérieure à zéro, alors l'ordre a définitivement été clôturé. Ce paramètre est toujours égal à zéro pour les positions ouvertes. IMHO, après que le dernier ordre est choisi, nous devrions vérifier son type immédiatement et l'écrire dans la variable.

La fonction ressemblera maintenant à ceci :

int   GetTypeLastClosePos(int symbol, int magic)   // Функция возвращает 0 если последний закрытый Бай, 1 - если Селл и -1 при ошибке
{
int   i, lastclosetime=0, 
         lastdealtype=-1;

   for (i=0; i<OrdersHistoryTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбрали ордер в истории
         if (OrderSymbol()!=symbol)          continue;   // Если его символ не равен переданному в функцию - идём к следующему
         if (OrderMagicNumber()!=magic)      continue;   // Если его магик не равен переданному в функцию - идём к следующему
         if (OrderType()>1)                  continue;   // Если ищем только Бай и Селл, значит если больше единицы - к следующему
         // ... теперь выбранный ордер соответствует критериям поиска по символу, магику и типу
         if (lastclosetime<OrderCloseTime()) {           // Посмотрим время его закрытия и если оно больше предыдущего, то...
            lastclosetime=OrderCloseTime();              // ... запишем его как предыдущее
            lastdealtype=OrderType();                    // Тип текущего закрытого ордера: 0 для Бай, 1 для Селл
            }
         }
      else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",GetLastError());  // Посмотрим номер ошибки
         break;                                                // Выходим из цикла перебора ордеров
         }
      }
   return(lastdealtype);
}

Maintenant, si nous voulons vérifier seulement les achats ou les ventes du graphique actuel et lequel d'entre eux a été le dernier fermé, nous devons appeler cette fonction de cette façon :

int LastPoseType=GetTypeLastClosePos(Symbol(), Magic);
if (LastPoseType==OP_BUY) {
   // ... код, если последний закрытый Buy ...
   }
if (LastPoseType==OP_SELL) {
   // ... код, если последний закрытый Sell ...
   }
else {// ... код обработки ошибки ... }

Pour la gestion des erreurs, nous pouvons, en principe, créer une variable globale, par exemple int err ; et dans le corps de la fonction elle-même, stocker le numéro d'erreur dans cette variable :

else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         err=GetLastError();                                                     // Посмотрим номер ошибки
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",err);       // Сообщим об ошибке и в какой ф-ции она произошла
         break;                                                                  // Выходим из цикла перебора ордеров
         }

Ensuite, pour traiter l'erreur après l'appel de la fonction ...

GetTypeLastClosePos(Symbol(), Magic);

... et une erreur se produit, son numéro sera stocké dans la variable err et dans le bloc de traitement, ce numéro sera traité.

else {
   if (err==???) {
      // обработка этой ошибки
      }
   if (err==???) {
      // обработка этой ошибки
      }
// ... и т.д. ...
   }

Mieux encore, utilisez le commutateur

Raison: