Discussion de l'article "Comment publier un produit sur le Marché" - page 48

 

Mon EA renvoie une erreur lors de l'enregistrement d'un nouveau produit :

test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl : 1.08929, tp : 1.08599 -> sl : 1.08919, tp : 1.08599 [Modification failed due to order or position being close to market].

Mais mon EA est conçu pour fonctionner sur WIN$, pas sur le forex. Pourquoi le testeur ne vous indique-t-il pas quel actif exécuter ?

Maintenant, comment puis-je corriger quelque chose qui n'a pas d'erreur, parce que l'EA fonctionne parfaitement, je ne peux juste pas enregistrer le produit pour la vente.

 
Adriano De Mello Moura #:

Mon EA renvoie une erreur lors de l'enregistrement d'un nouveau produit :

test sur EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl : 1.08929, tp : 1.08599 -> sl : 1.08919, tp : 1.08599 [Modification failed due to order or position being close to market]

Mais mon EA est conçu pour fonctionner sur WIN$, pas sur le forex. Pourquoi le testeur ne vous indique-t-il pas quel actif exécuter ?

Maintenant, comment puis-je corriger quelque chose qui n'a pas d'erreur, parce que l'EA fonctionne parfaitement, je ne peux juste pas enregistrer le produit pour la vente.

Le robot doit être prêt à travailler sur n'importe quel actif....


Pour corriger l'erreur mentionnée ci-dessus, vous devez effectuer le contrôle ci-dessous avant de modifier la position :

//+--------------------------------------------------------------------------------------------------------------------+
//| Vérifie si la distance entre le TakeProfit/StopLoss et le prix de clôture est supérieure à SYMBOL_TRADE_STOPS_LEVEL |
//+--------------------------------------------------------------------------------------------------------------------+
bool Check_SL_TP(ENUM_ORDER_TYPE type, double SL, double TP)
  {
//--- Variables locales
   bool SL_check = false, TP_check = false;

//--- Détermine le dernier prix pour le symbole actuel
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- obtenir le niveau SYMBOL_TRADE_STOPS_LEVEL
   int stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
   if(stops_level != 0)
     {
      PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
     }

//--- ne vérifier que deux types de commandes
   switch(type)
     {
      //--- Opération d'achat
      case  ORDER_TYPE_BUY:
        {
         //--- vérifier le StopLoss
         SL_check = (BID - SL > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
           }
         //--- vérifier le TakeProfit
         TP_check = (TP - BID > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
           }
         //--- renvoie le résultat de la vérification
         return(SL_check && TP_check);
        }
      //--- Opération de vente
      case  ORDER_TYPE_SELL:
        {
         //--- vérifier le StopLoss
         SL_check = (SL - ASK > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
           }
         //--- vérifier le TakeProfit
         TP_check = (ASK - TP > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
           }
         //--- renvoie le résultat de la vérification
         return(TP_check && SL_check);
        }
      break;
     }

//--- Vérification réussie
   return(false);
  }



Voir les autres contrôles qui doivent être effectués par le robot dans l'article ci-dessous :

Quels tests doit passer un robot de trading avant d'être publié sur le marché - Articles MQL5

 

Bonjour, je n'arrive pas à modifier la description d' un de mes anciens produits.

J'ai suivi les instructions sur les différents forums, y compris la rédaction d'une nouvelle description, le masquage du marché, etc. mais la description revient toujours à la version originale.

Je ne peux plus restaurer le produit sur le marché ni le modifier. J'ai demandé de l'aide sur les forums concernant ce problème, mais aucune aide n'a encore été apportée.

Comment puis-je résoudre ce problème d'impossibilité de modifier la description du produit ? Merci de m'aider

 

En chargeant l'Expert Advisor et en le testant, il écrit une erreur, je ne comprends pas comment la corriger.

test sur EURUSD,H1 (netting)

2020.04.14 00:24:42 failed instant buy 0.01 EURUSD at 1.09044 [Invalid volume]

2020.04.14 00:24:45 failed instant buy 0.01 EURUSD at 1.09044 [Invalid volume]

2020.04.14 00:24:48 échec de l'achat instantané de 0,01 EURUSD à 1,09037 [Volume non valide]

2020.04.21 00:01:34 échec de l'achat instantané de 0,01 EURUSD à 1,08626 [Volume non valide]

2020.04.21 00:01:37 échec de l'achat instantané de 0,01 EURUSD à 1,08626 [Volume non valide]

2020.04.21 00:01:40 échec de l'achat instantané de 0,01 EURUSD à 1,08626 [Volume non valide]

2020.04.27 16:08:24 échec de la vente instantanée de 0,01 EURUSD à 1,08546 [Volume non valide]

2020.04.27 16:08:27 Vente instantanée ratée de 0,01 EURUSD à 1,08548 [Volume non valide]

2020.04.27 16:08:30 Vente instantanée ratée de 0,01 EURUSD à 1,08547 [Volume non valide]

2020.04.29 20:15:52 échec de la vente instantanée de 0,01 EURUSD à 1,08565 [Volume non valide]

2020.04.29 20:15:55 Vente instantanée ratée de 0,01 EURUSD à 1,08566 [Volume non valide]

2020.04.29 20:15:58 échec de la vente instantanée de 0,01 EURUSD à 1,08566 [Volume non valide]

2020.05.18 00:12:09 échec de l'achat instantané de 0,01 EURUSD à 1,08134 [Volume non valide]

2020.05.18 00:12:12 échec de l'achat instantané de 0,01 EURUSD à 1,08134 [Volume non valide]

2020.05.18 00:12:15 échec de l'achat instantané de 0,01 EURUSD à 1,08143 [Volume non valide]

2020.05.21 15:50:25 Vente instantanée ratée de 0,01 EURUSD à 1,10031 [Volume non valide]

2020.05.21 15:50:28 échec de la vente instantanée de 0,01 EURUSD à 1,10034 [Volume non valide]

2020.05.21 15:50:31 échec de la vente instantanée de 0,01 EURUSD à 1,10036 [Volume non valide]

2020.05.25 19:00:05 échec de l'achat instantané de 0,01 EURUSD à 1,08950 [Volume non valide]

2020.05.25 19:00:08 échec de l'achat instantané de 0,01 EURUSD à 1,08951 [Volume non valide]

2020.05.25 19:00:11 échec de l'achat instantané de 0,01 EURUSD à 1,08952 [Volume non valide]

il n'y a pas d'opérations de trading

 
Kirill Voytseshchuk #:

Lors du chargement de l'Expert Advisor et des tests, une erreur s'affiche et la manière de la corriger n'est pas claire.

test sur EURUSD,H1 (netting)

2020.04.14 00:24:42 failed instant buy 0.01 EURUSD at 1.09044 [Invalid volume]

***

Veuillez lire le message d'erreur complet - il y aura un lien vers l'article, "Quelles vérifications devraient passer ...".
 

Lisez-le, mettez-le dans le code

Volumes incorrects dans les opérations commerciales

Avant d'envoyer des ordres de transaction, il est également nécessaire de vérifier si les volumes spécifiés dans l'ordre sont corrects. Le nombre de lots que le conseiller expert va spécifier dans l'ordre doit être vérifié avant d'appeler la fonction OrderSend(). Pour les instruments financiers, laspécification précise les volumes minimum et maximum autorisés pour les transactions, ainsi que l'échelonnement des volumes. Vous pouvez obtenir ces valeurs dans MQL5à partir de l'énumération ENUM_SYMBOL_INFO_DOUBLE en utilisant la fonctionSymbolInfoDouble().

//+------------------------------------------------------------------+
//| Vérifie que le volume de commande est correct ||
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- volume minimum autorisé pour les opérations de négociation
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Volume inférieur au minimum autorisé SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- volume maximal autorisé pour les opérations de négociation
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Volume supérieur au maximum autorisé SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- obtenir la gradation minimale du volume
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Le volume n'est pas un multiple du classement minimum SYMBOL_VOLUME_STEP=%.2f, le volume correct le plus proche est %.2f".,
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Valeur de volume correcte;
   return(true);
  }

Cela n'a pas aidé, puis-je corriger un autre code ?

Pouvez-vous me dire comment affiner le script ?

Обзор рынка - Торговые операции - Справка по MetaTrader 5
Обзор рынка - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь...
 
Kirill Voytseshchuk #:

Lisez-le, mettez-le dans le code

Volumes incorrects dans les opérations commerciales

Avant d'envoyer des ordres de transaction, il est également nécessaire de vérifier si les volumes spécifiés dans l'ordre sont corrects. Le nombre de lots que le conseiller expert va spécifier dans l'ordre doit être vérifié avant d'appeler la fonction OrderSend(). Pour les instruments financiers, laspécification précise les volumes minimum et maximum autorisés pour les transactions, ainsi que l'échelonnement des volumes. Ces valeurs peuvent être obtenues dans MQL5à partir de l'énumération ENUM_SYMBOL_INFO_DOUBLE en utilisant la fonctionSymbolInfoDouble().

Cela n'a pas aidé, puis-je corriger un autre code ?

Pouvez-vous me dire comment affiner le script ?

Lisez complètement l'article, 'CheckVolumeValue' est une vérification de l'exactitude des paramètres d'entrée.

Il y a également une vérification de l'arrondi correct des lots...

 

En tenant compte du volume de la position ouverte et du volume des ordres en attente, le contrôle final se présentera comme suit :

//+------------------------------------------------------------------+
//| Renvoie le volume maximal autorisé pour l'ordre par symbole |
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- obtenir la limite maximale de volume dans l'ordre
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- obtenir la limite de caractères sur le volume
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- obtenir le volume de la position ouverte par symbole
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- si nous avons déjà épuisé le volume
      if(max_volume-opened_volume<=0)
         return(0);

      //--- le volume de la position ouverte ne dépasse pas le volume maximal
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

add ?

checkvolumevalue.mq5 tel qu'il est écrit ici


//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)/2.0;
   double volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)-step;
   double finish=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)+step;

//--- trouver le nombre de décimales contenues dans la gradation du volume
   int digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
   if(digits<0) digits=-digits;
   else digits=0;

//--- vérifier plusieurs valeurs de volume différentes dans la boucle
   while(volume<finish+4*step)
     {
      string descr;
      if(!CheckVolumeValue(volume,descr))
        {
         Print("Résultat de l'inspection ",volume,": ",descr);
        }
        else PrintFormat("Le volume en %G est correct.,volume);
      volume+=3*step;
      volume=NormalizeDouble(volume,digits+1);
     }
//---
  }
//+------------------------------------------------------------------+
//| Vérifie que le volume de commande est correct ||
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- volume minimum autorisé pour les opérations de négociation
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Volume inférieur au minimum autorisé SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- volume maximal autorisé pour les opérations de négociation
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Volume supérieur au maximum autorisé SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- obtenir la gradation minimale du volume
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Le volume n'est pas un multiple du classement minimum SYMBOL_VOLUME_STEP=%.2f, le volume correct le plus proche est %.2f".,
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Valeur de volume correcte;
   return(true);
  }
//+------------------------------------------------------------------+
 
Kirill Voytseshchuk ordres en attente, le contrôle final se présente comme suit :

ajouter ?

checkvolumevalue.mq5 tel qu'il est écrit ici


Tous les contrôles nécessaires sont dans l'article Presque un constructeur pour créer un EA

Почти конструктор для создания советника
Почти конструктор для создания советника
  • www.mql5.com
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
 

Le code demandé plus haut est-il approprié ?

Vous pourriez écrire les lignes nécessaires à partir de l'article.