Caractéristiques du langage mql5, subtilités et techniques - page 109

 
Taras Slobodyanik:

logique - c'est un coup d'état.

Rédiger l'information sans en évaluer la logique. S'il est affecté, le PositionID devrait avoir changé de la même manière.

Ça ne change pas maintenant. Si c'est un bogue, ce serait génial !


D'où une question. La transaction DEAL_ENTRY_INOUT doit-elle changer le PositionID en DEAL_ORDER ?

Je pense que ça devrait. Ce comportement serait très pratique/droit.
 
fxsaber:

Rédiger l'information sans en évaluer la logique. S'il est affecté, cependant, le PositionID devrait avoir changé de la même manière.

Ça ne change pas maintenant. Si c'est un bogue, ce serait génial !


D'où une question. La transaction DEAL_ENTRY_INOUT doit-elle changer le PositionID en DEAL_ORDER ?

C'est écrit non. https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

Bien qu'il ait été écrit plus tôt que oui, et que l'ID de la position ait été changé.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
Andrey Barinov:

C'est écrit non. https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

Il y a peut-être une bonne raison à cela. De mon point de vue, ça ne semble pas correct du tout.

Bien qu'avant il ait été écrit que oui, et l'ID de la position a été changé.

Je demande aux développeurs de clarifier la situation. Lorsque l'ID de la position change, après cinq retournements, l'onglet Historique de la négociation dans la vue Positions affichera cinq positions.

Maintenant (le PositionID ne change pas pendant un flip), une seule position est toujours affichée. Il s'agit, pour le moins, d'une solution étrange.

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Nouvelle version de MetaTrader 5 build 1930 : fenêtres graphiques flottantes et bibliothèques .Net dans MQL5

fxsaber, 2018.11.09 16:19

En mode "par ticks réels", le Testeur génère les barres indépendamment - à l'arrivée des ticks. Pour cette raison, l'historique des barres d'un symbole personnalisé dans le Terminal et dans le Testeur peut être très différent.

 
Il arrive souvent qu'après la compilation de l'EA, les paramètres du Testeur soient réinitialisés, si cet EA y était précédemment sélectionné. C'est agaçant, c'est le moins qu'on puisse dire. Après chaque compilation, nous devons aller dans l'arbre des Expert Advisors et rechercher notre EA. Si quelqu'un ne le sait pas, il existe une recette pour que le Testeur ne se réinitialise pas. Vous devez exécuter le conseiller expert une fois en mode débogage sur l'historique - CTRL+F5. Après cela, toute recompilation n'affectera pas les paramètres de Tester.
 
fxsaber:
J'ai remarqué que les paramètres du Testeur sont souvent réinitialisés après la compilation, si ce Conseiller Expert a été précédemment sélectionné dans celui-ci. C'est agaçant, c'est le moins qu'on puisse dire. Après chaque compilation, nous devons aller dans l'arbre des Expert Advisors et rechercher notre EA. Si quelqu'un ne le sait pas, il existe une recette pour que le Testeur ne se réinitialise pas. Vous devez exécuter le conseiller expert une fois en mode débogage sur l'historique - CTRL+F5. Après cela, toute recompilation n'affectera pas les paramètres de Tester.


Même chose, je l'ai remarqué hier !

Corrigé de cette façon : Après avoir compilé la nouvelle version (Nouveau nom de fichier), vous devez redémarrer le terminal. - Peut-être qu'il ne met pas à jour mqlcache

Après cela, le testeur ne revient pas au fichier précédent pendant la compilation.


Ce problème est apparu plusieurs fois auparavant, puis a disparu. Puis elle est réapparue à nouveau....

P.S. Je n'ai pas lu le sens de vos mots, et vous donniez des conseils plutôt que de demander...

 
Les commentaires non liés à ce sujet ont été déplacés vers "Toutes les questions des débutants sur MQL4, aide et discussion sur les algorithmes et les codes".
 

Il y a quelqu'un ? Vérifiez le script de téléchargement de l'histoire...

Suis-je le seul à être gelé à mort ? Le script est tiré de l'aide...

//+------------------------------------------------------------------+ 
//|                                              TestLoadHistory.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.02" 
#property script_show_inputs 

//--- input parameters 

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart()
  {



   int      all_symbols=SymbolsTotal(false);   string  sym_name="";
   Print("Load symbols ",all_symbols);

   for(int k=0;k<all_symbols;k++)
      if((sym_name=SymbolName(k,false))!="")
        {
         SymbolSelect(sym_name,true);

         Print(k," Symbol name ",sym_name);

         int res=CheckLoadHistory(sym_name,PERIOD_M1,(TimeCurrent()-60*60*24*5));

         switch(res)
           {
            case -1 : Print("Unknown symbol ",sym_name);             break;
            case -2 : Print("Requested bars more than max bars in chart ",sym_name); break;
            case -3 : Print("Program was stopped ",sym_name);                        break;
            case -4 : Print("Indicator shouldn't load its own data ",sym_name);      break;
            case -5 : Print("Load failed ",sym_name);                                break;
            case  0 : Print("Loaded OK ",sym_name);                                  break;
            case  1 : Print("Loaded previously ",sym_name);                          break;
            case  2 : Print("Loaded previously and built ",sym_name);                break;
            default : Print("Unknown result ",sym_name);
           }

         datetime first_date;
         SeriesInfoInteger(sym_name,PERIOD_M1,SERIES_FIRSTDATE,first_date);
         int bars=Bars(sym_name,PERIOD_M1);
         Print("First date ",first_date," - ",bars," bars");
        }
//--- 

//--- 
  }
//+------------------------------------------------------------------+ 
//|                                                                  | 
//+------------------------------------------------------------------+ 
int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
  {
   datetime first_date=0;
   datetime times[100];
//--- check symbol & period 
   if(symbol==NULL || symbol=="") symbol=Symbol();
   if(period==PERIOD_CURRENT)     period=Period();
//--- check if symbol is selected in the MarketWatch 
   if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
     {
      if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);

      SymbolSelect(symbol,true);
     }
//--- check if data is present 
   SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
   if(first_date>0 && first_date<=start_date) return(1);
//--- don't ask for load of its own data if it is an indicator 
   if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol)
      return(-4);
//--- second attempt 
   if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
     {
      //--- there is loaded data to build timeseries 
      if(first_date>0)
        {
         //--- force timeseries build 
         CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
         //--- check date 
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
            if(first_date>0 && first_date<=start_date) return(2);
        }
     }
//--- max bars in chart from terminal options 
   int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- load symbol history info 
   datetime first_server_date=0;
   while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped())
      Sleep(5);
//--- fix start date for loading 
   if(first_server_date>start_date) start_date=first_server_date;
   if(first_date>0 && first_date<first_server_date)
      Print("Warning: first server date ",first_server_date," for ",symbol,
            " does not match to first series date ",first_date);
//--- load data step by step 
   int fail_cnt=0;
   while(!IsStopped())
     {
      //--- wait for timeseries build 
      while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
         Sleep(5);
      //--- ask for built bars 
      int bars=Bars(symbol,period);
      if(bars>0)
        {
         if(bars>=max_bars) return(-2);
         //--- ask for first date 
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
            if(first_date>0 && first_date<=start_date) return(0);
        }
      //--- copying of next part forces data loading 
      int copied=CopyTime(symbol,period,bars,100,times);
      if(copied>0)
        {
         //--- check for data 
         if(times[0]<=start_date)  return(0);
         if(bars+copied>=max_bars) return(-2);
         fail_cnt=0;
        }
      else
        {
         //--- no more than 100 failed attempts 
         fail_cnt++;
         if(fail_cnt>=100) return(-5);
         Sleep(10);
        }
     }
//--- stopped 
   return(-3);
  }
//+------------------------------------------------------------------+ 
//| Возвращает строкое значение периода                              | 
//+------------------------------------------------------------------+ 
string GetPeriodName(ENUM_TIMEFRAMES period)
  {
   if(period==PERIOD_CURRENT) period=Period();
//--- 
   switch(period)
     {
      case PERIOD_M1:  return("M1");
      case PERIOD_M2:  return("M2");
      case PERIOD_M3:  return("M3");
      case PERIOD_M4:  return("M4");
      case PERIOD_M5:  return("M5");
      case PERIOD_M6:  return("M6");
      case PERIOD_M10: return("M10");
      case PERIOD_M12: return("M12");
      case PERIOD_M15: return("M15");
      case PERIOD_M20: return("M20");
      case PERIOD_M30: return("M30");
      case PERIOD_H1:  return("H1");
      case PERIOD_H2:  return("H2");
      case PERIOD_H3:  return("H3");
      case PERIOD_H4:  return("H4");
      case PERIOD_H6:  return("H6");
      case PERIOD_H8:  return("H8");
      case PERIOD_H12: return("H12");
      case PERIOD_D1:  return("Daily");
      case PERIOD_W1:  return("Weekly");
      case PERIOD_MN1: return("Monthly");
     }
//--- 
   return("unknown period");
  }
//+------------------------------------------------------------------+
 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Situation peu claire lorsque les ordres en attente se déclenchent.

fxsaber, 2018.11.26 13:37

Il y a aussi une situation comme celle-ci :

  1. Un ordre au marché a été placé pour ouvrir une position et le total des ordres a augmenté de un.
  2. Elle a été exécutée et le total des commandes a diminué de un, mais le total des positions n'a pas augmenté de un. En d'autres termes, il existe une position, mais le terminal ne la connaît pas.

Par exemple, il n'y a pas de positions ou d'ordres - PositionsTotal = 0, OrdersTotal = 0.

Vous placez un ordre au marché. PositionsTotal = 0, CommandesTotal = 1.

L'ordre au marché est exécuté - OrdersTotal = 0. Mais PositionsTotal = 0!

 
Durée de l'exécution
PositionSelectByTicket(OrderGetInteger(ORDER_TICKET));

de sorte que PositionsTotal puisse changer (ce qui n'est pas difficile à reproduire).


Par exemple, PositionsTotal renvoie zéro juste avant PositionsSelectBytTicket, qui renvoie vrai.

Raison: