Características da linguagem mql5, subtilezas e técnicas - página 109

 
Taras Slobodyanik:

lógico - é um golpe de estado.

Escreveu a informação sem avaliar a sua lógica. Se for afectado, o PositionID deveria ter mudado da mesma forma.

Não está a mudar agora. Se isto é um insecto, isso seria óptimo!


Por conseguinte, uma questão. A transacção DEAL_ENTRY_INOUT deve alterar o PositionID para DEAL_ORDER?

Penso que deveria. Este comportamento seria muito conveniente/direito.
 
fxsaber:

Escreveu a informação sem avaliar a lógica. No entanto, se for afectado, o PositionID deveria ter mudado da mesma forma.

Não está a mudar agora. Se isto é um insecto, isso seria óptimo!


Por conseguinte, uma questão. A transacção DEAL_ENTRY_INOUT deve alterar o PositionID para DEAL_ORDER?

Diz que não. https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

Embora tenha sido escrito anteriormente que sim, e o ID do cargo tenha sido alterado.

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

Diz que não. https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

Talvez haja uma boa razão para isso. Do meu ponto de vista, não me parece nada correcto.

Embora antes de ser escrito que sim, e o ID do cargo foi alterado.

Peço aos criadores que esclareçam a situação. Quando a PositionID muda, depois de cinco inversões, o separador Histórico de Negociação na vista Posições mostrará cinco posições.

Agora (o PositionID não muda durante uma mudança de posição) é sempre mostrada apenas uma posição. Isto é, para o dizer de forma suave, uma solução estranha.

 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Nova versão do MetaTrader 5 build 1930: janelas de gráficos flutuantes e bibliotecas .Net em MQL5

fxsaber, 2018.11.09 16:19

No modo "por carraças reais", o Testador gera as barras independentemente - na chegada das carraças. Por esta razão, o histórico de um símbolo personalizado no Terminal e no Testador pode ser bastante diferente.

 
Acontece frequentemente que, após a compilação da EA, as definições do Testador são reiniciadas, se esta EA tiver sido previamente seleccionada na mesma. Isto é, no mínimo, irritante. Após cada compilação, temos de ir à árvore dos Conselheiros Peritos e procurar a nossa EA. Se alguém não souber, há uma receita para o Testador não reiniciar. Deve executar o Expert Advisor uma vez em modo de depuração no histórico - CTRL+F5. Depois disso, qualquer recompilação não afectará as definições do Testador.
 
fxsaber:
A situação ocorre frequentemente quando, após a compilação do Consultor Especialista, as definições do Testador são repostas, se este Consultor Especialista tiver sido previamente seleccionado no mesmo. Isto é, no mínimo, irritante. Após cada compilação, temos de ir à árvore dos Conselheiros Peritos e procurar a nossa EA. Se alguém não souber, há uma receita para o Testador não reiniciar. Deve executar o Expert Advisor uma vez em modo de depuração no histórico - CTRL+F5. Depois disso, qualquer recompilação não afectará as definições do Testador.


A mesma coisa, ontem reparei nisso!

Corrigido desta forma: Após compilar a nova versão (Novo nome de ficheiro), tem de reiniciar o terminal. - Talvez não actualize o mqlcache

Depois disso, o testador não faz o reset ao ficheiro anterior durante a compilação.


Este problema apareceu várias vezes antes, depois desapareceu. Depois reapareceu novamente....

Z.I. Não leu o significado das suas palavras e estava a aconselhar em vez de perguntar...

 
Comentários não relacionados com este tópico foram movidos para"Quaisquer perguntas de novatos sobre MQL4, ajuda e discussão sobre algoritmos e códigos".
 

Alguém aqui? Veja o guião de download do histórico...

Serei eu o único que morre congelado? O guião é retirado da ajuda...

//+------------------------------------------------------------------+ 
//|                                              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");
  }
//+------------------------------------------------------------------+
 

Fórum sobre comércio, sistemas comerciais automatizados e teste de estratégias comerciais

Situação pouco clara quando as ordens pendentes são desencadeadas.

fxsaber, 2018.11.26 13:37

Há também uma situação como esta:

  1. Uma ordem de mercado foi colocada abrindo uma posição e as OrdensTotal aumentaram em uma.
  2. Foi executado e as OrdensTotal diminuíram em um, mas as PosiçõesTotal não aumentaram em um. Por outras palavras, existe uma posição, mas o terminal não a conhece.

Por exemplo, não há posições ou ordens - PositionsTotal = 0, OrdersTotal = 0.

Estabelece-se uma ordem de mercado. PosiçõesTotal = 0, EncomendasTotal = 1.

A ordem de mercado é executada - OrdersTotal = 0. Mas PosiçõesTotal = 0!

 
Duração da execução
PositionSelectByTicket(OrderGetInteger(ORDER_TICKET));

de tal forma que PositionsTotal pode (não é difícil de reproduzir) mudar.


Por exemplo, PositionsTotal retorna zero imediatamente antes de PositionsSelectBytTicket, o que retorna verdadeiro.