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

 
TYRBO:
problème résolu en comparant les prix
Dans le testeur ? Dans un marché réel sur un compte de spread flottant, le prix d'équilibre changera après un tick.
 
Artyom Trishkin:

Dans ce contexte, mon point de vue est le suivant :

  1. Nous devons obtenir le moins de cycles possible par tic.
  2. Nous avons besoin d'avoir un tableau constant avec les données des ordres et des positions sur le marché et un tableau avec les données des ordres et des positions supprimés/fermés.
  3. Si nous avons le tableau localement dans une fonction, l'appeler à plusieurs reprises nécessite de le remplir à nouveau. Je suggère qu'il ne soit rempli qu'une seule fois à chaque nouveau tick - ainsi le tableau est global, sinon nous le perdrions en quittant la fonction.
  4. Pour y trouver quelque chose (dans le tableau), nous avons besoin d'un tableau rempli et de fonctions qui renverront les données trouvées. Dans les fonctions, nous pouvons déclarer des tableaux auxiliaires pour les calculs nécessaires.

Pour cette raison, il serait préférable d'avoir des tableaux globaux - pour les ordres et les positions fermés et ouverts. Lors d'un nouveau tick, nous passons une fois la quantité nécessaire d'ordres/positions, en remplissant les deux tableaux avec eux. Et ensuite, nous obtenons d'eux toutes les données nécessaires sur le même tic-tac. Notez que non seulement le dernier ordre/position fermé/ouvert et toutes ses données sont calculés, mais aussi tous les ticks parents et enfants de toutes les positions sont recherchés en cas de clôture partielle. Ainsi, à tout moment, je peux voir de quel ticket provient telle ou telle position, si elle a été partiellement fermée plus d'une fois - tout cela fonctionne déjà dans une classe qui tourne dans un timer. J'ai besoin de nombreuses autres données avec un petit nombre total de cycles. La profondeur d'historique nécessaire pour les tableaux est définie pour le testeur.

Et ainsi de suite...

Désolé. Un autre ajout (pas pour contrebalancer, mais comme un ajout), j'aimerais ajouter que les tableaux locaux avecstatic ne sont pas perdus. C'est-à-dire, si les conditions vous permettent de ne pas les déclarer globalement.

 
P./S. : Je complète ceci, bien sûr, sur la base de mon propre intérêt "direct"))). Parce que je peux appliquer la statique locale dans les cas autorisés.
 
Vitaly Muzichenko:

Je suis en train de le réécrire lentement pour 5. Je veux dire que le prix peut changer très rapidement et que le niveau peut être inférieur à la valeur stop-loss, ce qui entraînera une erreur. Je veux dire que le prix peut changer très rapidement et que le niveau sera inférieur au niveau d'arrêt autorisé, ce qui entraînera une erreur.

Je comprends que ce"SymbolInfoTick" est nécessaire pour obtenir le prix actuel ?

Donc, pour obtenir l'offre et la demande réelles dans mql4, le rafraîchissement aurait dû être appelé de toute façon. Et il s'avère que la charge est peu susceptible de changer par rapport à l'appel de SymbolInfoTick().

Mais voici un autre ajout : j'écris SymbolInfoTick() dans la boucle suivante pour obtenir des prix précis

        do
         while(!SymbolInfoTick(_Symbol, mqlTick));

Si nous obtenons des prix normaux dès la première fois, cette boucle n'augmentera pas le temps d'exécution. Et s'il y a un échec, il vaut mieux répéter que d'obtenir le même prix au lieu du prix actuel.

 
Alexey Viktorov:

Donc, pour obtenir l'offre et la demande réelles dans mql4, vous devez appeler refresh de toute façon. Et il s'avère que la charge est peu susceptible de changer par rapport à l'appel de SymbolInfoTick().

Mais voici un autre ajout : pour obtenir sans erreur les prix réels, je mets SymbolInfoTick() dans cette boucle

        do
         while(!SymbolInfoTick(_Symbol, mqlTick));

Si nous obtenons des prix normaux dès la première fois, cette boucle n'augmentera pas le temps d'exécution. Et s'il y a un échec, il vaut mieux répéter que d'obtenir le même prix au lieu du prix actuel.

Je vois, où doit-on le mettre, dans ou avant la boucle ?
 
Vitaly Muzichenko:
Je vois, mais où dois-je le mettre, à l'intérieur du cycle, ou avant ?
Eh bien, c'est un cycle séparé jusqu'à ce que nous obtenions les prix actuels. Nous avons déjà discuté de l'endroit où le mettre. S'il y a une embuscade avec des prix non réels, nous devrions la mettre dans la boucle d'évaluation des ordres.
 
Alexey Viktorov:

Donc, pour obtenir l'offre et la demande réelles dans mql4, vous devez appeler refresh de toute façon. Et il s'avère que la charge est peu susceptible de changer par rapport à l'appel de SymbolInfoTick().

Mais voici un autre ajout : pour obtenir sans erreur les prix réels, je mets SymbolInfoTick() dans cette boucle

        do
         while(!SymbolInfoTick(_Symbol, mqlTick));

Si nous obtenons des prix normaux dès la première fois, cette boucle n'augmentera pas le temps d'exécution. Et s'il y a un échec, il vaut mieux répéter que d'obtenir le même prix au lieu du prix actuel.

Et si vous ne les recevez pas du tout ? Comment ralentir la boucle ?
 
Artyom Trishkin:
Et si elle ne le reçoit pas du tout ? Comment ralentir le cycle ?

Oui, logiquement, cela pourrait être, par exemple, que le terminal a perdu la connexion - il y a beaucoup de raisons pour cela, j'ai eu des pertes de connexion 50 fois par jour.

Quel est le meilleur moyen d'obtenir des prix actualisés, tout en étant moins gourmand en ressources, remarquez - pour la recherche sur le réseau.

 
Vitaly Muzichenko:

Oui, logiquement, cela pourrait être, par exemple, que le terminal a perdu la connexion - il y a beaucoup de raisons pour cela, j'ai eu des pertes de connexion 50 fois par jour.

Quel est le meilleur moyen d'obtenir des prix actualisés, tout en étant moins gourmand en ressources, rappelez-vous - pour le chalutage du réseau.

Revenez 10 pages en arrière, il y a un bon plan là.
 
trader781:
Retournez 10 pages en arrière, il y a un très bon schéma.
Je ne l'ai pas trouvé, et je ne m'en souviens pas ici.