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

 
Dennis Kirichenko:
E posso perguntar porquê estática?

Porque tirado do contexto - ver post original.
 

recurso não documentado da função OnInit(), esta função pode ser executada em qualquer parte do programa. Código de teste.

//+------------------------------------------------------------------+
//|                                                       test10.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private:
   datetime          curbar;
   datetime          lastbar;
public:
                     CNevBar();
                    ~CNevBar();
   bool              bar(string symbol,ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar(void)
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: bar(string symbol,ENUM_TIMEFRAMES period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }

int test=0;
CNevBar newbar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   test=5;
   Print(__FUNCTION__,": test = ",test);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(newbar.bar(_Symbol,PERIOD_CURRENT))
     {
      test=10;
      Print(__FUNCTION__,": test = ",test);
      OnInit();
     }
  }
//+------------------------------------------------------------------+

Resultado

2017.03.10 19:26:02.977 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:27:03.041 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:27:03.042 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnInit: test = 5


...

 
Sergey Gritsay:

uma característica não documentada da função OnInit(), esta função pode ser executada em qualquer parte do programa. Código de teste.


Todas as funções On-funções são funções normais e por isso podem ser chamadas sempre que quiser. OnCalculate ou OnTradeTransaction.
 
fxsaber:

Todas as funções On-funções são funções normais e, portanto, podem ser chamadas quando você quiser. Seja OnCalculate ou OnTradeTransaction.


Mas não está escrito na documentação...

OnInit

A função OnInit() é o manipulador de eventos OnInit. Pode ser de tipo ovóide ou não, e não tem parâmetros:

vazioOnInit();

O evento Init é gerado imediatamente após o carregamento de um Expert Advisor ou indicador, este evento não é gerado para scripts. A função OnInit() é utilizada para inicialização. Se OnInit() tiver o valor int de retorno, o código de retorno não zero significa inicialização sem sucesso, e gera o eventoDeinit com o código do motivo de inicializaçãoREASON_INITFAILED.

A fim de otimizar os parâmetros de entrada de um especialista, recomenda-se utilizar os valores da enumeraçãoENUM_INIT_RETCODE como códigos de retorno. Estes valores são usados para controlar o curso da otimização, incluindo a seleção dos agentes deteste mais apropriados. Durante a inicialização de um Expert Advisor antes do início dos testes você pode solicitar informações sobre a configuração e recursos de um agente (o número de núcleos, quantidade de memória livre, etc.) usando a funçãoTerminalInfoInteger(). Com base nas informações obtidas, você pode permitir o uso deste agente de teste, ou rejeitá-lo durante a otimização deste Expert Advisor.

ENUM_INIT_RETCODE

Identificador

Descrição

INIT_SUCCEED

Inicialização bem sucedida, o teste do Expert Advisor pode ser continuado.

Este código significa o mesmo que zero - a inicialização do Expert Advisor no testador foi bem sucedida.

INIT_FAILED

A inicialização falhou, os testes não têm sentido devido a erros irrecuperáveis. Por exemplo, não conseguiu criar um indicador que seja necessário para o trabalho do Expert Advisor.

O retorno deste valor significa o mesmo que um retorno de um valor diferente de zero - a inicialização do Expert Advisor no testador falhou.

INIT_PARAMETERS_INCORRECTOS

Concebido para indicar ao programador um conjunto incorrecto de parâmetros de entrada. A sequência de resultados contendo este código de retorno será destacada a vermelho na tabela de optimização geral.

Os testes para este conjunto de parâmetros do Expert Advisor não serão executados e o agente está livre para receber uma nova tarefa.

Ao receber este valor, o testador de estratégia tem a garantia de não passar este trabalho a outros agentes para execução repetida.

INIT_AGENT_NOT_SUITABLE

Sem erros durante a inicialização, mas por alguma razão o agente em questão não é adequado para testes. Por exemplo, RAM insuficiente, suporteOpenCL e assim por diante.

Após o retorno deste código, o agente não receberá tarefas até o final destaotimização.

A função OnInit() do tipo void significa sempre uma inicialização bem sucedida.

Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Quando escrevo código no fim-de-semana, inseri o OnTick no OnInit. E está tudo bem, mesmo que não haja carrapatos novos a chegar.
 
Sergey Gritsay:


Mas não está escrito na documentação.

OnInit

A função OnInit() é o manipulador de eventos OnInit. Pode ser de tipo ovóide ou não, e não tem parâmetros:

vazioOnInit();

O evento Init é gerado imediatamente após o carregamento de um Expert Advisor ou indicador

Diz que é uma função.

Antes do OnInit e depois do OnDeinit há chamadas de construtores/destructores de objectos globais (inexactidão na Ajuda). É por isso que, por exemplo, nos indicadores você pode declarar buffers de indicadores sem o OnInit. Os rudimentos são os seguintes.

 
Procurar FullOnCalculate leva imediatamente a uma série de características completamente não documentadas de trabalhar com amortecedores indicadores em MT4/MT5 - em locais onde estes diferem seriamente.
 
Eis a minha visão final da solução para o problema:
iCustom(... inputs, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );

iAlligator(... params, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );
Digamos que um indicador tem estes parâmetros:
#property indicator_plots 5
#property  indicator_color1 clrAquamarine, clrBeige, clrBurlyWood
#property  indicator_color2 clrRed, clrGreen

#property  indicator_color5 clrGold, clrCrimson, clrCadetBlue
então a matriz de cores para ele será a seguinte:
color colors[] = {
   clrAquamarine, clrBeige, clrBurlyWood,  // 1 plot
   clrRed, clrGreen,                       // 2 plot
   clrBlack,                               // 3 plot
   clrWhite,                               // 4 plot
   clrGold, clrCrimson, clrCadetBlue,      // 5 plot
   clrBurlyWood, clrBlue                   // ignore
};

Se a matriz for menor, apenas parte das cores são transferidas. Se o conjunto for maior, é aparado.

Para as matrizes de largura e estilo, o princípio é o mesmo.

 
fxsaber:

Em OrderSendSync é chamado o HistoryDealSelect (ver acima).

Como posso determinar a hora de abertura da última posição e a hora de fechamento da última posição?

E em geral, eu gostaria de conhecer os princípios gerais e algoritmos para obter informações sobre posições abertas/fechadas no mql5.

O que precisa ser levado em conta, quais são as especificidades existentes no momento?

 
Artyom Trishkin:

Como posso determinar a hora de abertura da última posição e a hora de fechamento da última posição?

Em geral, gostaria de conhecer os princípios gerais e algoritmos para obter informações sobre posições abertas/fechadas em mql5.

O que deve ser considerado, quais são as peculiaridades no momento?


Tudo isso é determinado pela seleção do histórico da ordem e da negociação e, em seguida, a leitura das propriedades das ordens.

bool  HistorySelectByPosition( 
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );

POSITION_IDENTIFIER

O identificador de posição é um número único, que é atribuído a cada posição recém-aberta e não muda durante toda a sua vida útil. Corresponde ao bilhete da ordem com que a posição foi aberta.

O identificador da posição é especificado em cada ordem (ORDER_POSITION_ID) e cada negociação (DEAL_POSITION_ID) que a abriu, alterou ou fechou. Use esta propriedade para procurar ordens e negociações relacionadas com a posição.

Quando uma posição é revertida em modo de compensação (uma única operação de entrada/saída), o identificador POSITION_IDENTIFIER da posição não é modificado. No entanto, POSITION_TICKET é alterado para o bilhete de encomenda, o que resultou no estorno. No modo de cobertura, não há inversão de posição.

longo


E usando as propriedades da enumeração ENUM_DEAL_ENTRY

DEAL_ENTRY_IN

Entrada no mercado

DEAL_ENTRY_OUT

Saída do mercado

DEAL_ENTRY_INOUT

Inversão de marcha

DEAL_ENTRY_OUT_BY

Fechar posição do contador