Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1853

 
EVGENII SHELIPOV #:

J'ai compris, Rostislav.

Je ne comprends pas pourquoi, si je bloque le drapeau dans cette fonction, le conseiller expert commence à ouvrir et fermer 100 à 200 ordres à la fois.

Parce que si le drapeau n'est pas égal à "0", il appelle constamment la fonction ClosseAll()
 
EVGENII SHELIPOV #:

Je ne comprends pas pourquoi, si je bloque le drapeau dans cette fonction, l'EA ouvre et ferme 100-200 ordres à la fois.

Laissez-moi vous expliquer en utilisant votre code :

Initialement, l'indicateur est activé.

int flag_close=0;
//+------------------------------------------------------------------+

Puis il ouvre des commandes

//-------------------------------------------------------------------+  Команда на открытие первых ордеров в сетке
   if((UseHour==1 && Hour() >= StartTime && Hour()<=StopTime)||UseHour==0)
     {

Si une condition d'ordre rapproché se présente (vous en avez trois)

//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров при условии (Суммарный профит сетки >=0 и Просадка больше заданного уровня)
   if(CalculiteProfit() >= 0 && Drawdown > DrawdownClosingTakeprofitZero)
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров
   if((CountTrade(0) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==0)||(CountTrade(1) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==1))
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие первых ордеров
   if((CountTrade(0) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==0)||(CountTrade(1) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==1))
     {
      flag_close=1;

Ce drapeau prend la valeur "1" et commence à fermer les ordres.

//-------------------------------------------------------------------+  Команда на закрытие ордеров
      if(flag_close==1)ClosseAll();

Et une fois que tous les ordres sont fermés, le drapeau obtient "0".

   if(CountTrade() == 0)
     {
      flag_close=0;
 
Tretyakov Rostyslav #:
Parce que si le drapeau n'est pas "0", il appelle constamment la fonction ClosseAll()

Cela peut être le cas si l'ordre d'ouverture est donné. Il s'agit donc d'une sorte de "VÉRIFICATION".

 
EVGENII SHELIPOV #:

Cela peut être le cas si l'ordre d'ouverture est donné. Il s'agit donc d'une sorte de "CALCUL".

Vous avez une carte de crédit ?

Vous entrez dans un magasin et achetez une bière, une bouteille à la fois, et vous payez chaque fois avec la carte jusqu'à ce que vous obteniez "0" sur la carte,

puis va remplir la carte et va chercher une autre bière.

 
Mihail Matkovskij #:

Oui. Mais la serrure s'ouvre avec le même lot. Et deux ordres dirigés différemment sont ouverts simultanément. Et le hedging, c'est lorsqu'une transaction est entrée dans une phase de drawdown, et que le trader ouvre une position avec un lot plus grand dans la même direction (avec des directions différentes, j'ai confondu) impliquant que le prix va s'inverser pour faire un profit sur une transaction avec un lot plus grand et couvrir la perte d'une transaction avec un lot plus petit ou une moyenne à 0. Si j'ai quelque chose de faux, alors corrigez-moi.

La couverture n'est absolument pas un verrouillage, ou un verrouillage partiel, mais un système complètement différent.

 
Vitaly Muzichenko #:

La couverture n'est absolument pas un verrouillage, ou un verrouillage partiel, mais un système complètement différent.

Mais je ne dis pas que c'est nul. Je me suis trompé hier (j'ai dit : vous devriez ouvrir une position opposée au lieu d'une position unidirectionnelle). L'heure était tardive. Et aujourd'hui, j'ai compris où je m'étais trompé.

 
Mihail Matkovskij #:

Mais je ne dis pas que c'est nul. Je me suis trompé hier (j'ai dit : vous devriez ouvrir une position opposée au lieu d'une position unidirectionnelle). L'heure était déjà tardive. Et aujourd'hui, j'ai réalisé où j'avais tort.

C'est logique alors, ça arrive :)

 
EVGENII SHELIPOV #:

Cela peut être le cas si l'ordre d'ouverture est donné. Il y a donc une sorte de "CLIC" qui se produit.

Nous devons créer une liste d'ordres, avec des ticks, à fermer (comme beaucoup l'ont déjà dit ici). Si le robot a détecté un signal de sortie, les ordres (tickets) correspondants doivent être ajoutés à la liste à clôturer. La liste est transmise par un cycle qui envoie des demandes de clôture (OrderClose). Ensuite, vous devez constamment vérifier s'il existe des ordres ouverts avec les tickets qui ont été ajoutés à la liste. Si un ou plusieurs billets ne sont pas trouvés, nous devons les supprimer de la liste. De cette façon, la fonction n'enverra pas de demande de clôture d'ordres qui n'existent pas.

Que faire des nouveaux signaux et ordres, qui sont apparus pendant la période de la liste remplie ? Vous pouvez également les ajouter à la liste à clôturer par un signal de sortie. De cette façon, ils seront également fermés à leur tour. C'est tout. Créez une telle liste et fermez les commandes par le ticket de façon cyclique. Vous pouvez le faire avec un intervalle d'une seconde ou de quelques secondes par passage du cycle. Il suffit de réaliser cet algorithme, et tout fonctionnera.

 
Mihail Matkovskij #:

Nous devons créer une liste de commandes à clôturer (comme beaucoup l'ont déjà dit ici) avec des tickets. Si le robot détecte un signal de sortie, il ajoute les ordres (tickets) correspondants à la liste de clôture. La liste est transmise par une boucle qui envoie une demande de fermeture (OrderClose). Ensuite, nous devons constamment vérifier s'il existe des ordres ouverts avec les tickets qui ont été ajoutés à la liste. Si un ou plusieurs billets ne sont pas trouvés, nous devons les supprimer de la liste. De cette façon, la fonction n'enverra pas de demande de clôture d'ordres qui n'existent pas.

Que faire des nouvelles commandes, qui sont apparues pendant la période de la liste remplie ? Vous pouvez également les ajouter à la liste des personnes à fermer. De cette façon, ils seront également fermés à leur tour. C'est tout. Créez une telle liste et fermez les commandes sur l'étiquette de manière cyclique. Vous pouvez le faire avec un intervalle d'une seconde ou de quelques secondes par passage du cycle. Il suffit de réaliser cet algorithme et tout fonctionnera.

Est-ce qu'il va fermer chacun d'eux à tour de rôle ? Quand la grille est si longue, il va fermer les bons.
Lorsque le dernier ordre se ferme, il peut arriver qu'il y ait 10 ordres à fermer et il les fermera tous un par un, ce qui prendra un temps infini.

 
Alexander Avksentyev #:

Si la grille prend autant de temps, elle fermera les bonnes à tour de rôle.
Lorsque vous fermez le dernier, il peut arriver qu'il y ait 10 ordres à fermer, alors il les ferme tous un par un et cela prend un temps infini.

Ce n'est pas exactement le cas. Tous les ordres sont fermés par le terminal un par un. Dans le cycle OrderSend, il peut se déclencher plusieurs fois par seconde (en fonction de votre matériel). Mais OrderSend ajoute seulement les commandes appropriées à la file d'attente de fermeture. Leterminal envoie ensuite ces commandes au serveur à un intervalle spécifié ou après avoir reçu la réponse du serveur à la demande précédente, mais pas immédiatement. Ainsi, un grand nombre d'ordres (positions) sont fermés beaucoup plus lentement qu'un seul ordre, de toute façon.

Raison: