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

 
Artyom Trishkin:

Então, já havia uma espécie de solução no KB:

Mas não para o guião. E é bastante difícil para a EA, porque sugere que se despenhe do OnTick no caso de uma situação indefinida. E esta situação pode acontecer algures no interior do Expert Advisor. E não só teremos que sair de lá, para sair do OnTick, mas pode haver necessidade de abrir, por exemplo, duas posições ao mesmo tempo (a la cart). Mas o segundo só deve ser aberto se o primeiro tiver sido aberto com sucesso. Neste caso, ser expulso da OnTick após o primeiro OrderSend, para dizer de forma branda, não é bom.

 
fxsaber:

Mas não para o guião. E é bastante difícil para a EA, porque é sugerido que se despenhe do OnTick em uma situação indefinida. E esta situação pode acontecer algures nas entranhas do Expert Advisor. E não só teremos que sair de lá, para sair do OnTick, mas pode haver necessidade de abrir, por exemplo, duas posições ao mesmo tempo (a la cart). Mas a segunda só deve ser aberta se a primeira tiver sido concluída com sucesso. Neste caso, ser expulso da OnTick após o primeiro OrderSend, para dizer de forma branda, não é bom.

O script pode abrandar para o número explícito de posições.

Conselheiro especializado... Numa EA, temos de considerar isto na lógica das funções de abertura de posição - elas são chamadas da EA com o retorno do resultado do seu trabalho. O resultado da ordem do mercado volta a ser falso. E então a EA vai trabalhar com a lógica inerente a ela. Sim, eu concordo que é mais difícil implementar em alguns EAs já prontos do que considerar imediatamente tais probabilidades. Mas é por isso que o ramo está aqui - para que outros conheçam e usem o conhecimento.

 
Artyom Trishkin:

O script pode ser desacelerado até que um número explícito de posições seja recebido.

Você também pode abrandar o Expert Advisor.

O Conselheiro Especialista... No Expert Advisor, teremos que considerar isto na lógica da função de abertura de posição - eles são chamados da EA com o retorno do resultado do seu trabalho. O resultado é devolvido falso se houver uma ordem do mercado. E então a EA vai trabalhar com a lógica inerente a ela. Sim, eu concordo que é mais difícil implementar em alguns EAs já prontos do que considerar imediatamente tais probabilidades. Mas é para isto que serve o ramo - para que os outros saibam e usem o conhecimento.

Só tens de esperar um pouco até que a troca passe. Sair do TS até o próximo tick é uma decisão terrível.

 
fxsaber:

Você também pode atrasar o conselheiro.

Só tens de esperar um pouco até que a troca tenha passado. Sair do TS até o próximo tick é uma decisão assustadora.

Bem, nesse código, a espera pelo tempo definido está feita. Mas você não pode esperar horas - ele espera algum tempo por um determinado número de tentativas para obter um ambiente válido, depois sai com o resultado. Caso contrário, se você esperar muito tempo, o ambiente de negociação pode mudar muito, e é tarde demais para beber o borjomi :)

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---
 
Artyom Trishkin:

Bem, esse código espera por um determinado período de tempo, mas você não pode esperar por horas - ele espera por um determinado número de tentativas para obter um ambiente válido. Mas você não pode esperar horas - ele espera por algum tempo por um número especificado de tentativas para obter um ambiente válido, depois sai com o resultado. Caso contrário, se você esperar muito tempo, o ambiente de negociação pode mudar muito, e é tarde demais para beber o borjomi :)

Sim, eu não reparei na espera. Isso serve. Eu estava muito mais atento então.

 

Imho, focar emPositionsTotal() é a decisão errada em qualquer caso. Durante o processamento do seu pedido, outra posição poderia abrir/fechar na conta, por exemplo, se vários EAs estiverem funcionando. O que o impede de verificar a resposta do servidor, uma vez que ela é projetada pelos desenvolvedores?

Na verdade, não vejo muito sentido em PosiçõesTotal, exceto no controle geral. Uma EA deve claramente controlar os carrapatos de suas posições e trabalhar apenas nelas.

 

Após usar ChartIndicatorGet() a função IndicatorRelease(handle) deve necessariamente ser chamada. Está escrito sobre isso no exemplo da função ChartIndicatorGet(), mas não na nota de função! Os desenvolvedores queriam corrigir a documentação, mas não o fizeram. Devido ao encerramento do SD, isto provavelmente nunca será feito.

Pessoalmente, encontrei o problema de um indicador de "enforcamento". De falar com o SD:

Ah, ou seja, quando eu executei o indicador X no gráfico, ele procurou em todos os indicadores e detectou uma cópia usando afunçãoChartIndicatorGet()- ele incrementava o contador. Apaguei o primeiro indicador X - contador decrescente, mas esqueci-me do segundo - tem o indicador "pendurado", porque o seu cabo não foi limpo?

Sim. É exactamente assim que funciona. Portanto, o OnDeinit não funciona.

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Como importar dados históricos para o csv para simbolizar o costume usando CustomRatesUpdate?

fxsaber, 2018.08.19 12:01

// Sets the maximum size of an array.
template <typename T>
int ArrayResize( T &Array[] )
{
  int MinSize = ArraySize(Array);
  int MaxSize = INT_MAX;
  int AvgSize;
  
  while ((MinSize < MaxSize - 1) && !IsStopped())
  {
    AvgSize = (int)((MinSize + (long)MaxSize) >> 1);        
    
//    ArrayFree(Array);
    
    if (ArrayResize(Array, (int)AvgSize) == AvgSize)
      MinSize = AvgSize;
    else
      MaxSize = AvgSize;
  }
  
  return(ArrayResize(Array, MinSize));
}
 
A parte inglesa do fórum mostrou
// Обмен значениями между двумя числовыми переменными
#define  SWAP(A, B) { A += B; B = A - B; A -= B; }
 
fxsaber:
A parte inglesa do fórum mostrou

Para quê? Para salvar alguns bytes de memória? Além disso, com o dobro você obtém números diferentes (== será falso) e os inteiros podem transbordar.

Razão: