[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 470

 
tol64:

Comment optimiser les paramètres multidevises ? Dans le testeur MT4, il n'y a pas de possibilité de tester plusieurs symboles à la fois... Je réfléchis à l'EA multidevises et je suis arrivé à la conclusion que ses paramètres sont optimisés pour chaque symbole séparément, puis je transfère tous ces paramètres à mon Expert Advisor conçu pour le mode multidevises pour le trading.

Est-ce que je vais dans la bonne direction ou c'est plus facile en fait ?)

Dans mql5 tout peut être mis en œuvre dans un EA pour les tests et le trading, mais pour l'instant j'ai décidé d'étudier mql4.

Je me suis dit que si l'on ne peut pas tester plusieurs symboles à la fois, pourquoi s'embêter avec un EA si l'on peut simplement définir sa propre copie du graphique de chaque symbole et qu'il sera identique. J'aimerais connaître l'avis des membres de la communauté))))

Je n'ai pas de multidevise, j'accroche juste le même EA sur chaque instrument.
 
Roman.:

réponse
Désolé, je n'ai pas compris la réponse.
 
demlin:
Désolé, je ne comprends pas la réponse.

Cherchez sur google "comment optimiser un site:mql4.com" : Le livre suivant est également disponible ici: "comment optimiser un Expert Advisor site:mql4.com", également ici.

Je vous recommande un bon livre sur ce sujet : "Development, Testing and Optimization of Trading Systems for the Stock Trader" par Ralph Vince - tout en détails.

 

Problème : La figure montre une courbe (par exemple MA). Les points A, C, E sont des maxima locaux, et les points B, D sont des minima locaux. Question : comment les calculer si la distance entre le maximum et le minimum les plus proches est supérieure à N points ? J'ai essayé de le faire, mais cela semble être trop lourd. Peut-être existe-t-il un algorithme prêt à l'emploi pour résoudre un tel problème ? Veuillez me conseiller, si quelqu'un en a l'expérience.

 
Elenn:

Problème : La figure montre une courbe (par exemple MA). Les points A, C, E sont des maxima locaux, et les points B, D sont des minima locaux. Question : comment les calculer si la distance entre le maximum et le minimum les plus proches est supérieure à N points ? J'ai essayé de le faire, mais cela semble être trop lourd. Peut-être existe-t-il un algorithme prêt à l'emploi pour résoudre un tel problème ? Veuillez me conseiller, si quelqu'un en a l'expérience.


Détermination de la direction du glissement.

S'il est en haut et que les variables B, C, D et E sont vides, alors nous entrons la valeur actuelle de l'angle de déplacement dans la variable A.

Si la variable A n'est pas vide, que la direction du glissement est vers le bas et que les variables C, D, E sont vides, la valeur actuelle de l'indicateur de glissement est inscrite dans la variable B. Si les variables A et B ne sont pas vides, que la moyenne mobile est orientée vers le haut et que les variables D et E sont vides, la variable C est remplie avec la valeur actuelle de la moyenne mobile.

Et ainsi de suite, nous remplissons les valeurs des variables avec des valeurs.

Maintenant, si les variables A et C ne sont pas vides, et si le module de la différence entre A et C est supérieur ou égal à un nombre de points prédéfini, alors l'action que vous avez en tête sera exécutée.

Dans l'ensemble, le code est tout à fait possible. Il nous suffit de déterminer le point de l'algorithme auquel nous allons réinitialiser les variables, afin que l'EA se rende compte qu'il est arrivé à un nouveau point de départ. Le code peut être écrit par le biais d'une boucle et de tableaux, et il peut être moins complexe, mais il est préférable d'écrire l'algorithme par le biais de variables afin d'éviter toute confusion avec les index des tableaux et les numéros des chandeliers dans la boucle.

 

Les gars, j'ai récemment rencontré ce problème. Qui est dans le coup - commentez-le. J'ai trouvé l'erreur moi-même - Dieu merci - rapidement... Lors de l'écriture du code - tout se compile sans erreurs, mais le chalutage ne fonctionne pas... C'est-à-dire qu'on ne va pas plus loin dans la boucle de commande. Voici les fragments de code... Le bug était le suivant - nous donnions des ordres magiques dans des variables externes, mais lors de la recherche d'ordres dans la boucle - avec une petite lettre, la recherche via CTRL + F - la demande "magique" était suivie de "magique"... Le compilateur ne donnait aucune erreur, mais dans la boucle, le programme ne se transformait pas en chalut... la boucle s'interromprait sur "magic"... C'est censé être comme ça ? J'ai toujours pensé que la "magie" et "l'enchantement" étaient des variables différentes... et donc le compilateur aurait dû indiquer cette erreur que la variable "magique" est indéfinie... Dans le code, tel qu'il est maintenant exécuté avant de sélectionner le chalut et Printa () ne vient plus - la sortie de la boucle par cette condition - à cause de la magie - c'est-à-dire cette condition - ne sera jamais remplie, à cause de noms différents - "magic" et "Magic".

if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))
      {
         continue;
      }

// глоб переменные
...
...
extern int  Magic = 10;     // MagicNumber

//----------------------------------------------------------------------------
int start()                            // Спец. функция start
  {
  
   
   int orderCount = 0; 
  
   //---------------------------ТРАЛ ОРДЕРОВ---------------------------------------------------------------------------------------
   int orderType;
    for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
    {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))
      {
         continue;
      }

      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))
      {
         continue;
      }

      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))
      {
         continue;
      }
                ticket = OrderTicket( );                         // Номер ордера
       double   orderLots = OrderLots();                         // Lots   
       double   orderProfit = OrderProfit() + OrderSwap();       // Profit
       double   Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
       double   SL =  OrderStopLoss();                           // Значение StopLoss ордера
       double   TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }
                 
         
      orderCount++;                     // считаем ордера (не больше 10)
     
            
       while (!IsTradeAllowed() || !IsConnected()) Sleep(5000); RefreshRates();
       
      //----------------------------Тралим последовательно все наши ордера по виду трала------------------
      if (UseTrailing && orderCount > 0 && type ==0)   // простой трал по аналогии учебнику - в зависимости от параметра trlinloss (тралить ли в зоне лоссов)
          {     
           if (orderType == OP_BUY)  SampleTrailing_texbook (0);          // если бай
           if (orderType == OP_SELL) SampleTrailing_texbook (1);          // если селл
          }      
      ...
      ...
      ...   
     Print( "Эксперт база: Всего наших ордеров = " ,orderCount);
     }   
//--------------------------------------------------------------------------------------------------------------------------------------     
   
   
  
//----------------------------------------------------------------  
   return;                             // Выход из start()
  }

P.S. Qui n'est pas au courant - soyez-en conscient, sinon ce n'est pas clair ce que vous pouvez faire avec le code...

 
Roman.:

Les gars, j'ai récemment rencontré ce problème. Qui est dans le coup - commentez-le. J'ai trouvé l'erreur moi-même - Dieu merci - rapidement... Lors de l'écriture du code - tout se compile sans erreurs, mais le chalutage ne fonctionne pas... C'est-à-dire qu'on ne va pas plus loin dans la boucle de commande. Voici les fragments de code... Le bug était le suivant - nous donnions des ordres magiques dans des variables externes, mais lors de la recherche d'ordres dans la boucle - avec une petite lettre, la recherche via CTRL + F - la demande "magique" était suivie de "magique"... Le compilateur ne donnait aucune erreur, mais le programme ne passait pas en mode chalut dans la boucle... la boucle s'interromprait sur "magic"... C'est censé être comme ça ? J'ai toujours pensé que la "magie" et "l'enchantement" étaient des variables différentes... et donc le compilateur aurait dû indiquer cette erreur que la variable "magique" est indéfinie... Dans le code, tel qu'il s'exécute maintenant avant de sélectionner le chalut et que Printa () ne s'affiche plus - la sortie de la boucle sur cette condition - à cause de lamagie - c'est-à-dire cette condition - ne sera jamais exécutée, en raison des différents noms - "magic" et "Magic".

P.S. Qui n'est pas au courant - soyez-en conscient, sinon vous ne saurez pas combien vous aurez à faire avec le code...


Si la magie est déclarée et que la magie est utilisée, le compilateur dit que la variable magique n'est pas déclarée.

MetaEditor 4 401.

 
Roman.:

Les gars, j'ai récemment rencontré ce problème. Qui est dans le coup - commentez-le. J'ai trouvé l'erreur moi-même - Dieu merci - rapidement... Lors de l'écriture du code - tout se compile sans erreurs, mais le chalutage ne fonctionne pas... C'est-à-dire qu'on ne va pas plus loin dans la boucle de commande. Voici les fragments de code... Le bug était le suivant - nous donnions des ordres magiques dans des variables externes, mais lors de la recherche d'ordres dans la boucle - avec une petite lettre, la recherche via CTRL + F - la demande "magique" était suivie de "magique"... Le compilateur ne donnait aucune erreur, mais le programme ne passait pas en mode chalut dans la boucle... la boucle s'interromprait sur "magic"... C'est censé être comme ça ? J'ai toujours pensé que la "magie" et "l'enchantement" étaient des variables différentes... et donc le compilateur aurait dû indiquer cette erreur que la variable "magique" est indéfinie... Dans le code, tel qu'il s'exécute maintenant avant de sélectionner le chalut et que Printa () ne s'affiche plus - la sortie de la boucle par cette condition - à cause de lamagie - c'est-à-dire cette condition - ne sera jamais exécutée, en raison des différents noms - "magic" et "Magic".

P.S. Qui n'est pas au courant - soyez-en conscient, sinon vous ne comprendrez pas à quel point vous devrez vous occuper du code...

Comparez-le avec mon simple chalutage. En particulier, il s'agit d'une boucle d'ordres de recherche :

   // В глоб. переменных
   string sy=Symbol();
   // ...................................................................
   color  cl;
   double sl, StopLevel;
   for (int i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderSymbol()!=sy)           continue;
         if (OrderMagicNumber()!=Magic)   continue;
         if (OrderType()>1)               continue;
         sl=OrderStopLoss();
         if (OrderType()==OP_BUY) {
            cl=clModifyBuy;
            StopLevel=NormalizeDouble(strG-DeltaStop*PointX, dg);
            if (sl<StopLevel) ModifyOrder(-1, StopLevel, -1, -1, cl);
            }
         if (OrderType()==OP_SELL) {
            cl=clModifySell;
            StopLevel=NormalizeDouble(strR+DeltaStop*PointX, dg);
            if (sl>StopLevel) ModifyOrder(-1, StopLevel, -1, -1, cl);
            }
         }
      }

Je pense que le principe sera clair pour vous.

Et la magie et les variables magiques sont vraiment différentes. Lorsque vous les recherchez avec Ctrl+F, cochez "sensible à la casse".

Quelque part dans le code, vous les avez déclarés tous les deux.

 
artmedia70:

Et la magie et les variables magiques sont vraiment différentes. Lorsque vous les recherchez avec Ctrl+F, cochez la case "sensible à la casse".

Quelque part dans le code, vous les avez déclarés tous les deux après tout
.

Exactement. Je viens de le trouver grâce à vous... :-))) Au bas de Variables en plus de la variable extern int Magic = 10 ; j'ai déclaré une variable -
int magic = 12345;

:-)))

Il s'est avéré que je prenais en compte la Magie dans le fie d'ouverture des commandes et la Magie dans la boucle, c'est pourquoi la boucle des commandes pour les chaluter ne fonctionnait pas....:-)))

Merci du fond du cœur - j'ai résolu le problème. J'ai coché "Utiliser le registre" - je l'ai mis là et tout fonctionne bien.

P.S. Comment ça se passe !!! (Quand la chance va sur le code - prêt et pas seulement quelques majiks à déclarer....:-))))

 
artmedia70:

Comparez cela avec mon chalutage le plus simple. En particulier le cycle de recherche des commandes :

Je pense que le principe sera clair.

Merci pour l'option chalut. Le principe est clair.