Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 100

 
alexey1979621:
Bonjour à tous ! Voici la question. Comment mesurer la distance entre le haut et le bas de la première, deuxième et troisième bougie et prescrire la condition que cette distance de chaque bougie ne soit pas inférieure à, disons, 10 points. Merci d'avance.

Voici les variables d'environnement du marché pour vous aider https://docs.mql4.com/ru/predefined/variables.
 
artmedia70:
Le soulèvement des robots... :)


Aha ha ha. yosuf, Cyborg t'envoie... )))))))
 
artmedia70:

Voici un EA pour tester la fonction. Il contient la fonction elle-même et son appel. Avant de l'appeler, vous devez préparer un message, qui peut comporter jusqu'à quatre lignes. La longueur de chaque ligne, si je me souviens bien, ne doit pas dépasser 64 caractères. C'est pourquoi j'ai divisé un message en plusieurs lignes. Chaque ligne d'un message peut être éditée dans une couleur différente. C'est assez clair dans le code : nous préparons d'abord les lignes de messages, puis nous appelons la fonction. Je n'y ai pas fait beaucoup de commentaires - je l'ai écrit d'une traite il y a longtemps. Maintenant, j'ai déjà oublié à quoi ça sert. Si j'ai des questions, je m'en souviendrai, mais je ne me souviens que des choses nécessaires maintenant.

Et une dinde :

C'est comme ça... J'espère que vous y arriverez.

Bien sûr, je peux faire un underlay au lieu de l'afficher sur le graphique principal dans la fenêtre de l'indicateur, mais je suis trop paresseux ... :)



Artem, j'ai regardé votre code, la dinde est la bombe : )))). En substance, tout est clair avec plus, bien que j'aie vu quelques points dans la mise en œuvre, un peu différents de ce que j'aurais fait, mais c'est juste une petite chose.

Voilà ce qui est intéressant. Seul ce qui se trouve dans l'expert est imprimé dans la dinde. Mais comment l'utiliser à votre avantage ?

 
hoz:


Artem, j'ai regardé votre code, la dinde est la bombe : )))). En substance, tout est clair avec plus, bien que j'ai vu un couple de points dans la mise en œuvre, un peu différent de ce que j'aurais fait, mais ce ne sont que des bagatelles.

Voici ce qui est intéressant. Seul ce qui se trouve dans le conseiller expert est imprimé dans la platine. Mais comment l'utiliser à mon avantage ?

Je ne comprends pas la question. Elle remplace la fonction Print(). Affiche tous les messages dans la fenêtre de l'indicateur. Vous pouvez définir une couleur pour chaque ligne d'un message (comme la priorité du message). Plus pratique que l'impression. C'est tout ce qu'il faut.
 

Il s'agit d'une fonction. Cet expert est juste pour montrer ce que fait la fonction. Utilisez donc cette fonction pour afficher vos messages depuis votre EA.

Cet expert montre seulement comment l'utiliser.

 
artmedia70:

Il s'agit d'une fonction. Cet expert est juste pour montrer ce que fait la fonction. Utilisez donc cette fonction pour afficher vos messages depuis votre EA.

Cet expert montre seulement comment l'utiliser.


Bien que oui... C'est une fonction... J'ai raté la chose la plus importante pendant que je le calculais :(
 

Il y a un nouveau mal de tête. Voici ce qu'il faut faire pour y arriver :

1. Il y a un certain nombre d'ordres sur le marché, c'est-à-dire qu'il y a en permanence des ordres de marché et des ordres en attente sur le marché.

2. À un moment donné, lorsque le dernier ordre ouvert jusqu'à présent est fermé par un TP, nous devons fermer tous les ordres qui ont été ouverts et supprimer également tous les ordres en attente.

Je l'ai fait de cette façon (je l'ai mis dans la fonction start() ) :

for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)              
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

La fonction GetLastOrderState() vérifie si le dernier ordre est clôturé :

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
            lastOrderOpenTime = -1;                    // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
          lastOrderOpenTime = OrderOpenTime();
   }
   Comment("Время открытия последнего открытого ордера = ", lastOrderOpenTime);
   for (int h=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(h, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      
      if (OrderOpenPrice() == lastOrderOpenTime)
          lastOrderCloseTime = OrderCloseTime();
   }
  // Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}

Et ensuite les fonctions de suppression des ordres de marché en attente et de clôture. Je vois que ça ne fonctionne pas correctement d'une manière ou d'une autre. Ma fonction est-elle correcte ?

Je comprends que la fonction est classée par ordre d'idée. Mais la logique n'est pas bonne ici. Avez-vous des idées sur ce sujet ? Il s'avère que, dans tous les cas, même si aucun des ordres de l'EA n'a été fermé par TP, tout est fermé en un clin d'oeil après avoir été ouvert par le signal...

 
hoz:

Aha ha ha. yosuf, Cyborg t'envoie... )))))))
Quand même, un bon proger, réactif. Comme si tous les problèmes étaient les siens, pour que le destin rembourse, indiscutablement, ou, tombe sur le graal.
 
yosuf:
Quand même, un bon et sympathique proger. Comme si tous les problèmes étaient les siens, car le destin récompensera, incontestablement, ou, rencontrera le graal.


Mais il n'y avait pas de spécificité, et donc pas de question. Je ne sais pas quoi répondre.... Vous devez essayer d'expliquer la situation aussi clairement que possible pour obtenir une réponse.
 
hoz:

Il y a un nouveau mal de tête. Voici ce qu'il faut faire pour y arriver :

1. Il y a un certain nombre d'ordres sur le marché, c'est-à-dire qu'il y a en permanence des ordres de marché et des ordres en attente sur le marché.

2. À un moment donné, lorsque le dernier ordre ouvert jusqu'à présent est fermé par un TP, nous devons fermer tous les ordres qui ont été ouverts et supprimer également tous les ordres en attente.

Je l'ai fait de cette façon (je l'ai mis dans la fonction start() ) :

La fonction GetLastOrderState() vérifie si le dernier ordre est clôturé :

Et ensuite les fonctions de suppression des ordres de marché en attente et de clôture. Je vois que ça ne fonctionne pas correctement d'une manière ou d'une autre. Ma fonction est-elle correcte ?

Je comprends que la fonction est classée par ordre d'idée. Mais la logique n'est pas bonne ici. Avez-vous des idées sur ce sujet ? Il s'avère que, dans tous les cas, même si aucun des ordres de l'EA n'a été fermé au TP, tout est fermé en un clin d'oeil après avoir été ouvert par le signal...

Victor, prenez la fonction éprouvée de Kim qui vérifie si une position est fermée par TP :

isCloseLastPosByTake - Renvoie un indicateur permettant de fermer la dernière position sur la prise. Trouver dans Seules les fonctions utiles
Et ensuite tout fermer.

Raison: