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

 
Denis Diakonov:

pas, par exemple, passer d'abord le cas 1, puis le cas 2, etc.

Les cas exécutent un ordre d'ouverture

La commande est ouverte à plusieurs endroits. Tu dois penser exactement comme tu penses dans ce code, et c'est difficile.

 
S'il y a un cycle à l'intérieur du OnTick d'un EA qui prend un temps décent, est-ce qu'il s'exécutera complètement, ou est-ce que l'arrivée d'un nouveau tick interrompra tout ?
 
Alexey Viktorov:

Il y a plus d'une ouverture. Dans un tel code, vous devez penser exactement comme vous pensez, et c'est difficile.

      case 2 : // кейс для открытия Sell по AUD/USD
               if(TimeServer() == true)                                     
               {
                  if(Symbol() == AUDUSD)
                  {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_SELL,lot,Bid,0,0,0); 
                  Alert("Тикет открытого ордера ", Open_Order, GetLastError());
//-------------------------------------------------------------------------------------------------------------
// другая функция
//-------------------------------------------------------------------------------------------------------------

int AUDUSD_Analizing()
{    
   if(AUDUSD_Prices_new > AUDUSD_Prices_old)
   {
      s1 = AUDUSD_Prices1;
      s2 = AUDUSD_Prices2;
      s3 = s1 - s2;    
      if(raznica > s5)
      {
         Alert("--- ВРЕМЯ ОТКРЫВАТЬ ОРДЕР НА ПОКУПКУ ---");
вот в этом месте мне необходимо обратиться к case 2 - вызвать его запуск на исполнение, затем
отсюда же необходимо обратиться к case 5 (к примеру), case 9, case 16 и т.д.

и только потом завершить исполнение данной функции и вернуться в старт
 
Yevhenii Levchenko:
S'il y a une boucle dans l'EA OnTick qui prend un certain temps, sera-t-elle exécutée complètement ou l'arrivée d'un nouveau tick interrompra-t-elle tout cela ?

Je ne comprends pas non plus, dans mon cas, la boucle est ouverte et tous les ordres ne sont pas ouverts, certains sont ouverts deux fois et d'autres sont ignorés, je comprends qu'un nouveau tick déclenche le démarrage et le code suspend son exécution et recommence à travailler.

 
Denis Diakonov:

Je comprends qu'un nouveau tick déclenche un démarrage et que le code met en pause son exécution et recommence à s'exécuter.

n'inventez pas ça.

lisez l'aide, il est clairement écrit que s'il y a des calculs complexes dans l'EA, le nouveau tick sera sauté.

quelque part dans l'article sur les fonctions de gestion des événements ou peut-être dans les opérations commerciales ou dans RefreshRates

cherchez une erreur de logique dans votre code


HH : switch() - la casse n'est pas utilisée pour les conditions logiques complexes, les meilleures combinaisons de if() else - ce qui permet d'obtenir des branches logiques plus claires.

 
Igor Makanu:

ne l'invente pas.

lisez l'aide, il est clairement indiqué que s'il y a des calculs complexes dans EA, le nouveau tick sera sauté.

quelque part dans l'article sur les fonctions de gestion des événements ou peut-être dans les opérations commerciales ou dans RefreshRates

cherchez une erreur de logique dans votre code


SZY : switch() - la casse n'est pas utilisée pour les conditions logiques complexes, de meilleures combinaisons de if() else - on obtient ainsi des branches logiques plus univoques.

oui, merci, j'ai déjà décidé de tout écrire par if-else également

 
Denis Diakonov:

Pourquoi avez-vous ajouté l'interrupteur ici ? Il est plus facile d'entrer la direction de la transaction et le nombre d'ouvertures requises dans la fonction et d'ouvrir autant d'ouvertures que spécifié dans la boucle.

C'est pourquoi je dis que comprendre votre logique est au-delà de mon esprit. Pourquoi un tel gâchis ?

 
Alexey Viktorov:

Pourquoi avez-vous ajouté l'interrupteur ici ? Il est plus facile d'entrer la direction de la transaction et le nombre d'ouvertures requises dans la fonction et d'ouvrir autant d'ouvertures que spécifié dans la boucle.

C'est pourquoi je dis que comprendre votre logique est au-delà de mon esprit. Pourquoi un tel gâchis ?

Eh bien, mon code vient d'augmenter en taille, et je pensais que ce serait beaucoup plus facile.

En fait, ce serait plus simple et plus compact si case pouvait être appelé autant de fois que je le souhaite pendant l'exécution d'une fonction.

Je n'ai pas besoin d'ouvrir des transactions similaires en boucle et elles sont ouvertes pour différents symboles simultanément (dans la mesure du possible) à l'apparition d'un signal.

cas 1 - achat d'audusd

cas 5 - achat de gbpusd

cas 9 - achat d'eurusd

etc.

Dans le premier cas, j'ai une feuille avec le cas et la seconde avec l'analyse, si elles interagissaient, cela ferait 500 lignes.

La deuxième variante implique de prescrire une ouverture d'ordre spécifique à l'intérieur de la fonction avec analyse et le total des lignes serait de 1200+, ce qui affecterait éventuellement la vitesse d'exécution du programme

 

Pouvez-vous m'aider, s'il vous plaît ! L'Expert Advisor utilise l'indicateur Enveloppes avec un calcul dynamique de la déviation. Mais lorsqu'il est affiché sur le graphique, il montre toute la dynamique de la déviation de l'indicateur sur toutes les barres précédentes.

enveloppes dynamiques

1. Existe-t-il un moyen de faire en sorte que l'indicateur s'affiche correctement ? C'est-à-dire qu'il dessinerait l'indicateur avec sa déviation uniquement sur sa propre barre.

2. Comment désactiver le dessin de l'indicateur dans un Expert Advisor, en ne laissant que ses calculs ? Je veux activer ou désactiver le dessin de l'indicateur dans les paramètres de l'expert.)

 
Denis Diakonov:

Au final, mon code n'a fait qu'augmenter en taille, alors que je pensais qu'il serait plus simple.

De toute façon, s'il était possible d'appeler case autant de fois que je le souhaite pendant l'exécution d'une fonction, ce serait plus facile et le code serait plus compact.

Je n'ai pas besoin d'ouvrir des transactions similaires en boucle et elles sont ouvertes pour différents symboles simultanément (autant que possible) lors de l'apparition d'un signal.

cas 1 - achat d'audusd

cas 5 - achat de gbpusd

cas 9 - achat d'eurusd

etc.

Dans le premier cas, j'ai une feuille avec le cas et la seconde avec l'analyse, si elles interagissaient, elles auraient 500 lignes.

La deuxième variante implique de prescrire une ouverture d'ordre spécifique à l'intérieur de la fonction avec analyse, qui serait étirée en une couche et le total des lignes serait de 1200+, ce qui affecterait éventuellement la vitesse d'exécution du programme

Avec quoi tapez-vous tant de lignes de code ? Voici l'un de mes derniers EA, il fonctionne avec un ensemble de titres sur FORTS

sinput  string            Symbols           = "GAZP,LKOH,CHMF,MVID";  //  Символы для торговли через запятую

Autant de titres seront cotés, autant de titres seront négociés. Et cet EA avec contrôle de deux délais de négociation, avec trailing et bien sûr avec analyse, seulement 326 lignes.

Si vous voulez utiliser le switch, vous ne devez pas ajouter l'ouverture de position dans chaque variante. Il suffit de spécifier le nom du symbole, le type d'opération commerciale et le numéro d'identification de l'opération.

string symb;
ENUM_ORDER_TYPE ordType;
switch(???)
{
 case 1
  symb = "audusd";
  ordType = OP_BUY;
 break;
 case 5
  symb = "gbpusd";
  ordType = OP_BUY;
 break;
 case 9
  symb = "eurusd";
  ordType = OP_BUY;
 break;
}
// И дальше получение цен, определение СЛ и ТП с последующем открытием ордера.

Mais il serait préférable, à mon avis, de tout regrouper dans une fonction définie par l'utilisateur.

void openOrder(string symb, ENUM_ORDER_TYPE ordType)
 {
  // Символ и тип ордера передаётся при вызове функции. Здесь достаточно получить соответствующие цены и открыть ордер.
 }