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

 
Alexander_K2:

Il y a quelque chose qui ne va vraiment pas, cependant...

Je veux dire, je fais OrderSelect une fois et ensuite à partir de la fonction... C'est un sacré truc...

  1. Vous avez sélectionné une commande sur un ticket
  2. Vous allez dans la fonction qui vérifie le nombre de commandes. S'il y a plus d'une commande, toutes les commandes disponibles sont sélectionnées une par une dans le cycle.
  3. Lorsque vous revenez de la fonction, l'ordre sélectionné sera celui qui était le dernier dans la liste des ordres du terminal client (ce ne sera pas nécessairement l'ordre que vous avez sélectionné au point 1).
  4. Ensuite, vous vérifiez l'heure de clôture d'un nouvel ordre, et vous essayez de clôturer celui qui était censé être sélectionné par le ticket, mais sa sélection a déjà été perdue.

Simple logique...

Observez la séquence des opérations que vous effectuez.

Évidemment, vous devez d'abord vérifier la quantité, puis sélectionner l'ordre requis, et enfin effectuer les opérations nécessaires sur celui-ci.

 
Maxim Kuznetsov:

dans quel sens voyez-vous le tableau des commandes ?

s'il y a des fermetures/suppressions possibles pendant la "révision", il est préférable de regarder dans la direction opposée. De OrdersTotal()-1 à 0 inclus.

Sinon, vous risquez d'avoir des ennuis :-)


J'ai failli découvrir mon graal personnel de cette façon une fois :-)

Et le retrait d'anciennes commandes du "fond des âges" vers le présent (une fois de temps en temps, pas toutes) a fait grimper la rentabilité du testeur vers les cieux :-)

 
Artyom Trishkin:
  1. Vous avez sélectionné une commande par ticket
  2. Vous êtes entré dans la fonction pour vérifier le nombre de commandes. S'il y a plus d'une commande, toutes les commandes disponibles seront sélectionnées une par une pour être comptées dans le cycle.
  3. Lorsque vous revenez de la fonction, l'ordre sélectionné sera celui qui était le dernier dans la liste des ordres du terminal client (il ne s'agit pas nécessairement de l'ordre que vous avez sélectionné au point 1).
  4. Ensuite, vous vérifiez l'heure de clôture d'un nouvel ordre, et vous essayez de clôturer celui qui était censé être sélectionné par le ticket, mais sa sélection a déjà été perdue.

Simple logique...

Observez la séquence des opérations que vous effectuez.

Il est évident que vous devez d'abord vérifier la quantité, puis sélectionner la bonne commande, et enfin effectuer les opérations nécessaires sur celle-ci

Je l'ai fait de cette façon :

RefreshRates();
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         if(OrderSelect(ticket_sell_NZDUSD, SELECT_BY_TICKET)==true)
         {
         ctm_ticket_sell_NZDUSD=OrderCloseTime();
         order_type_NZDUSD=OrderType();
            if(total_orders_NZDUSD>0)
            {
               if(ctm_ticket_sell_NZDUSD==0)
               {
                  if(order_type_NZDUSD==OP_SELL)
                  {
                  double AskNorm=NormalizeDouble(Ask,Digits);
                  OrderClose(ticket_sell_NZDUSD,0.01,AskNorm,0);
                  }
               }
            }
         }

Mettez d'abord l'ordre de compter, et ensuite tout le reste.

Merci Artem. Je lui dois le graal. C'est cette erreur qui me tuait...

 

Comment calculer le nombre de décimales?

Par exemple, j'ai découvert que le lot minimum est de 0,01.

MarketInfo("EURUSD",MODE_MINLOT)

Comment puis-je déduire que le nombre de décimales est de 2 ?
pour normaliser le volume de la commande à deux décimales.

 
multiplicator:

Comment calculer le nombre de décimales?

Par exemple, j'ai découvert que le lot minimum est de 0,01.

Comment puis-je déduire que le nombre de décimales est de 2 ?
pour normaliser ultérieurement le volume de la commande à deux décimales.

Essaie celle-là.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}
 
Alekseu Fedotov:

Essaie celle-là.

Pourquoi proposer de si vieux trucs ?

multiplicateur:

Comment calculer le nombre de décimales?

Par exemple, j'ai appris que le lot minimum est de 0,01.

Comment puis-je savoir que le nombre de décimales est de 2 ?
Normaliser ensuite le volume de l'ordre à deux décimales.

Voici une fonction prête à l'emploi dans l'article.

//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   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("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }

Il ne reste plus qu'à ajouter une action en fonction du résultat renvoyé par cette fonction.

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
 
Je constate que lorsque je l'ouvre, le terminal normalise l'ordre au nombre de décimales requis.
Je mets beaucoup de choses comme ça
OrderSend(Symbol(),OP_BUY,1.11111111,Ask,3,0,0);
et la transaction s'ouvre avec un volume de 1.11.

Alors peut-être que vous n'avez pas besoin de normaliser quoi que ce soit ?
 
multiplicator:
Je constate que le terminal normalise l'ordre au nombre de décimales requis lorsque je l'ouvre.
Peut-être n'est-il pas nécessaire de normaliser quoi que ce soit ?

Si le rédacteur en chef fait de même, ce n'est pas nécessaire.

 
multiplicator:
Je constate que le terminal normalise l'ordre au nombre de décimales requis lors de son ouverture.
Peut-être que vous n'avez pas besoin de normaliser quoi que ce soit ?

Si vous voulez obtenir erreur après erreur, ne normalisez pas.

 
Artyom Trishkin:

Si vous voulez ensuite obtenir erreur après erreur, ne normalisez pas.

pour une raison quelconque, le terminal n'affiche pas les erreurs)