Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1534

 
Eugen8519:

É assim que o pedido é encerrado

Faça como eu escrevi acima...

Ou afixar o código OnTick()

 
Eugen8519:

É assim que o pedido é encerrado

Esta estrutura deve ser

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeToStruct(TimeCurrent() , str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
   if(YesStop==false)
     {
      if(EMA0...)
        {
         .....
         OPENORDER("Sell");
        }
   
      if(EMA0...)
        {
         .....
         OPENORDER("Buy");
        }
     }
//---
   if(EMA0...)
     {
      .....
      CLOSEORDER("Sell");
     }

   if(EMA0...) 
     {
      .....
      CLOSEORDER("Buy");
     }
  }
//+------------------------------------------------------------------+
void CLOSEORDER(string ord)
  {
   .....
  }
//---
void OPENORDER(string ord)
  {
   .....
  }
 
Obrigado pela dica, vou dar uma olhada hoje à noite e me comunicarei mais tarde.
 
MakarFX:

Esta estrutura deve ser

Se não estou enganado, pode ser escrito da seguinte forma

   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeCurrent(str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
 
Eugen8519:
Bem, obrigado pelo conselho, vou dar uma olhada hoje à noite e me reportarei mais tarde.

se o UseTimeLimit estiver definido nas configurações ao iniciar a coruja, então

esta função é melhor no OnInit() do que no OnTick()

 
Vitaly Muzichenko:

Se eu não estou enganado, você pode escrever assim

Na verdade, eu escrevo assim.

if(TimeHour(time[i])>=Time_Start&&TimeHour(time[i])<TimeFinish)

ou ainda mais simples

if(Hour()>=Time_Start&&Hour()<TimeFinish)
 

Boa tarde, você poderia me dizer como calcular corretamente a média da linha indicadora? A curva básica com período Per_1 é desenhada normalmente (Buffer_1[]), até acrescentar um bloco de média simples com Buffer_2[] com período de média Per_2.

int OnCalculate(parâmetros padrão)

{

int i, j, limit;

if(rates_total <= Per_1)

retorno(0);

// A última barra calculada será recalculada

limite = taxas_total - pré_calculadas - Per_1;

if(prev_calculated > 0)

limite++;

//calcule e preencha buffers indicadores

para(i=0; i < limite; i++)

{

//Calcule a linha principal do indicador

Buffer_1[i] = Fórmula da curva

soma dupla = 0;

for(j = i; j < Per_2 + i; j++)

{

//Calcule a linha de média

Soma += Buffer_1[j];

Buffer_2[i] = Soma / Per_2;

}

}

retorno(taxas_total);

}

 
 
Eugen8519:
Esse é o problema, ele só abre e fecha ordens de Starthour->stophour
E os pedidos abertos não são fechados após o horário de atendimento

Porque você não pode negociar após o estofamento

Há muito tempo venho escrevendo a lógica de abertura antes de fechar, arrasto e outras manutenções de posição. Na maioria das vezes é verdade, antes de abrir alguma outra coisa, é preciso verificar o que já está aberto.

Sua lógica está correta, você só precisa trocar os blocos:

MqlDateTime str;
void OnTick()
 {
 // Close Positions
 TrailingStop();

 if(условие_закрытия)
  {
   ClosePos();
  }

 // Open Positions
 if(UseTimeLimit)
  {
    TimeCurrent(str);
    if(str.hour > startHour && str.hour < stopHour)
     {
      OpesPos(...);
      ...
     }
  }
// end
}
 
Razão: