Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 109

 
Taras Slobodyanik:

logico - è un colpo di stato.

Ha scritto le informazioni senza valutarne la logicità. Se è interessato, il PositionID dovrebbe essere cambiato allo stesso modo.

Non sta cambiando ora. Se questo è un bug, sarebbe fantastico!


Quindi una domanda. La transazione DEAL_ENTRY_INOUT deve cambiare il PositionID in DEAL_ORDER?

Penso che dovrebbe. Questo comportamento sarebbe molto comodo/giusto.
 
fxsaber:

Ha scritto le informazioni senza valutarne la logica. Se è interessato, tuttavia, il PositionID dovrebbe essere cambiato allo stesso modo.

Non sta cambiando ora. Se questo è un bug, sarebbe fantastico!


Quindi una domanda. La transazione DEAL_ENTRY_INOUT deve cambiare il PositionID in DEAL_ORDER?

Dice di no. https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

Anche se è stato scritto prima che sì, e il Position ID è stato cambiato.

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

Dice di no. https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

Forse c'è una buona ragione per questo. Dal mio punto di vista, non sembra affatto giusto.

Anche se prima era scritto che sì, e il Position ID è stato cambiato.

Chiedo agli sviluppatori di chiarire la situazione. Quando il PositionID cambia, dopo cinque lanci, la scheda Trading History nella vista Posizioni mostrerà cinque posizioni.

Ora (il PositionID non cambia durante un flip) solo una posizione è sempre mostrata. Questa è, a dir poco, una strana soluzione.

 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Nuova versione di MetaTrader 5 build 1930: Finestre grafiche fluttuanti e librerie .Net in MQL5

fxsaber, 2018.11.09 16:19

Nella modalità "per tick reali", il Tester genera barre in modo indipendente - all'arrivo dei tick. Per questo motivo, la storia delle barre di un simbolo personalizzato nel Terminale e nel Tester può essere molto diversa.

 
Succede spesso che dopo la compilazione dell'EA, le impostazioni del Tester vengono resettate, se questo EA è stato precedentemente selezionato in esso. Questo è a dir poco fastidioso. Dopo ogni compilazione, dobbiamo andare nell'albero degli Expert Advisors e cercare il nostro EA. Se qualcuno non lo sa, c'è una ricetta per non far resettare il Tester. Dovresti eseguire l'Expert Advisor una volta in modalità debug sulla cronologia - CTRL+F5. Dopo di che qualsiasi ricompilazione non influenzerà le impostazioni di Tester.
 
fxsaber:
Abbiamo notato che le impostazioni del tester vengono spesso resettate dopo la compilazione, se questo Expert Advisor è stato precedentemente selezionato in esso. Questo è a dir poco fastidioso. Dopo ogni compilazione, dobbiamo andare nell'albero degli Expert Advisors e cercare il nostro EA. Se qualcuno non lo sa, c'è una ricetta per non far resettare il Tester. Dovresti eseguire l'Expert Advisor una volta in modalità debug sulla cronologia - CTRL+F5. Dopo di che qualsiasi ricompilazione non influenzerà le impostazioni di Tester.


Stessa cosa, l'ho notato ieri!

Risolto in questo modo: dopo aver compilato la nuova versione (Nuovo nome del file) devi riavviare il terminale. - Forse non aggiorna mqlcache

Dopo di che, il tester non ripristina il file precedente durante la compilazione.


Questo problema è apparso diverse volte prima, poi è scomparso. Poi è riapparsa di nuovo....

Z.I. Non ha letto il significato delle sue parole, e lei stava consigliando piuttosto che chiedendo...

 
I commenti non relativi a questo argomento sono stati spostati in "Tutte le domande dei neofiti su MQL4, aiuto e discussione su algoritmi e codici".
 

C'è qualcuno qui? Controlla lo script di download della storia...

Sono l'unico che muore congelato? Lo script è preso dall'aiuto...

//+------------------------------------------------------------------+ 
//|                                              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 sul trading, sistemi di trading automatico e test di strategie di trading

Situazione poco chiara quando gli ordini pendenti si attivano.

fxsaber, 2018.11.26 13:37

C'è anche una situazione come questa:

  1. Un ordine a mercato è stato piazzato aprendo una posizione e OrdersTotal è aumentato di uno.
  2. È stato eseguito e OrdersTotal è diminuito di uno, ma PositionsTotal non è aumentato di uno. In altre parole, c'è una posizione, ma il terminale non lo sa.

Per esempio, non ci sono posizioni o ordini - PositionsTotal = 0, OrdersTotal = 0.

Hai impostato un ordine a mercato. PositionsTotal = 0, OrdersTotal = 1.

L'ordine a mercato viene eseguito - OrdersTotal = 0. Ma PositionsTotal = 0!

 
Durata dell'esecuzione
PositionSelectByTicket(OrderGetInteger(ORDER_TICKET));

tale che PositionsTotal può (non è difficile da riprodurre) cambiare.


Per esempio, PositionsTotal restituisce zero subito prima di PositionsSelectBytTicket, che restituisce true.

Motivazione: