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

 
Mikhail Mishanin:

Isso é engraçado) não deveria ser)

Se a batalha terminar - comércio com um spread normal, basta retirar seu 'limite' na entrada e ignorar o comércio se o spread estiver acima do limite.

As espátulas podem ser esticadas por endro sem capotamento.

Tenho bastantes oscilações, de 10 unidades para 45

Eu tenho que esperar para selecionar 45.

Ao mesmo tempo, a função conta com uma média de 17, o que é bastante satisfatório.

Vai até 100-140 por 1 hora após o capotamento, vou executar o código e ver como ele se comporta.

 
Vitaly Muzichenko:

Você poderia, no entanto, prescrevê-lo desta forma:

Deve funcionar corretamente.

Eu não gosto desta lógica.

A primeira entrada para a função:

res = 0;

Portanto, a condição

if(dt.hour==22 && res<_sp)

não está satisfeito.

E não quero entrar mais em detalhes. Qual é a condição para que de repente?

   if(tc>LONG_MAX-1)
Eu não entendo a lógica de tudo isso.
 
Alexey Viktorov:

Eu não gosto desta lógica.

A primeira entrada para a função:

res = 0;

Conseqüentemente, a condição

if(dt.hour==22 && res<_sp)

não é cumprida.

E não quero entrar mais nisso. Qual é a condição para que de repente?

   if(tc>LONG_MAX-1)
Eu não entendo a lógica de tudo isso.

Esta condição é apenas por 1 hora após o capotamento, quando o tempo é de 22 horas. Mas isto é apenas no primeiro início, enquanto o terminal sempre trabalha com o Expert Advisor, o que significa que ele está vazio apenas uma vez.

Talvez também deva ser declarado como estático em caso de mudança de cronograma

2. if(tc>LONG_MAX-1) = zeramos a variável tc se excedemos os limites permitidos de longo prazo. É pouco provável que isso aconteça, já que o terminal às vezes fica sobrecarregado, por exemplo, no fim de semana.

---

Código alterado, isto deve ser definitivo:

void OnTick()
{
 int sp = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
   if(CheckSpr(sp)) {
      // Здесь код отправки
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlDateTime dt;
bool CheckSpr(int _sp)
{
   static int ts=0;
   static ulong tc=0;
   static int res=0;
   TimeGMT(dt);
   if(res<_sp && (dt.hour==22||dt.hour==23)) { // Если 2 часа после Rollover спред упадёт до нормального - торгуем
      Comment("Rollover: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(false);
   }
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc<500) {
      Comment("Тиков менее 500: ",tc,", Спред: ",_sp,", Средний: ",res);
      return(false);
   }
   if(res>_sp) {
      Comment("Торгуем: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(true);
   }
   Comment("Не торгуем - спред завышен: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
   return(false);
}

P.S. Coloque-o à prova

P.S. Revisou o código

----

P.S.S. S. Eu acrescentei mais 1 hora após o capotamento, caso contrário, tenho um spread muito alto em alguns revendedores.

A variante final funcionou 20 horas e o resultado é surpreendente

O spread médio diário é de 10-45 pps, mas na maioria das vezes é de 10-17 pps, o spread médio foi calculado como 19

Obrigado a todos por sua participação, se você tem algo a acrescentar - escreva!

 
Vitaly Muzichenko:

Talvez também deva ser declarado estático, em caso de mudança de cronograma

Eu entendi, parece funcionar, retiro "não deveria"), agora eu realmente só preciso descobrir os momentos de zeragem/atribuição.

 

Eu vi uma discussão no fórum, mas não consigo encontrá-la.

Precisa ser limitado a uma posição em um bar que pode ser aberto a qualquer minuto, esta é a opção agora, mas é "pesada" na minha opinião

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

Como substituir isto para torná-lo mais leve?

 
Vitaly Muzichenko:

Eu vi uma discussão no fórum, mas não consigo encontrá-la.

Precisa ser limitado a uma posição em um bar que pode ser aberto a qualquer minuto, esta é uma opção agora, mas é "pesada" na minha opinião

Como substituir isto para torná-lo mais leve?

"Você precisa se limitar a uma posição na barra, que pode ser aberta a qualquer minuto..."

palavras muito gerais, você quer dizer que uma vez na barra deste símbolo você pode enviar OrderSend?

 
Mikhail Mishanin:

"Você tem que se limitar a uma posição na barra, que pode ser aberta a qualquer minuto..."

o texto é muito geral, você quer dizer que uma vez por barra neste símbolo você pode enviar OrderSend?

Sim. O Expert Advisor está trabalhando no cronograma H1 e pode abrir uma posição às 10:17, não precisa abrir outra antes das 11:00, ou seja, no bar atual.

 
Vitaly Muzichenko:

Sim. A EA está trabalhando no horário H1 e pode abrir uma posição às 10:17, você precisa ter certeza de que antes das 11:00, ou seja, na barra atual - ela não abre mais.

Sim, mais uma vez, eu acho que o diabo está nos detalhes.

abrir uma posição - colocar uma "bandeira de proibição" e/ou salvar o "tempo" (não importa qual, desde que seja a mesma (fonte) para comparação)

uma nova barra é aberta - a "bandeira de proibição" é hasteada.

Pergunta: E se a posição mudou de alguma forma?

Exemplo de como eu defino uma nova barra - divisor doTB em segundos, para H1 é 3600.0

BARii[].tempo - tempo de barras com M1, mas pode ser arbitrário e com qualquer divisão, se for mais ou igual a 1 significa o "tempo" de diferentes "barras

if(MathFloor(BARii[0].time/doTB)-MathFloor(BARii[1].time/doTB)>=1.0)//если бар закрылся
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Mikhail Mishanin:

Sim, novamente condições incompletas em minha opinião, "o diabo está nos detalhes", em termos simples se o texto

abriu uma posição - colocar uma "bandeira de proibição" e/ou salvar o "tempo" (não importa qual, desde que seja a mesma (fonte) para comparação)

uma nova barra é aberta - a "bandeira de proibição" é hasteada.

Pergunta: E se a posição mudou de alguma forma?

Exemplo de como eu defino uma nova barra - divisor doTB em segundos, para H1 é 3600.0

BARii[].tempo - tempo de barras com M1, mas pode ser arbitrário e com qualquer divisão, se for mais ou igual a 1, significa o "tempo" de diferentes "barras

Eu não estava satisfeito com a opção de usar bandeiras naquele momento; não me lembro por quê, mas a substituí por

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

OK, vou pensar em outra implementação

 
Vitaly Muzichenko:

Eu não estava feliz com a opção das bandeiras na época, não me lembro por que, mas a substituí por

Está bem, vou pensar em outra implementação.

E o que esta implementação retarda? Semelhante ao meu código determina duas vezes em uma "barra" ou em outra diferente. Apenas na minha variante "verdadeiro" quando em diferentes "barras", na sua variante "verdadeiro" quando em uma barra, basta contornar a comparação == com "0" especialmente inteiro, wo, e provavelmente posso mudar a condição para >0,0 ou >0,9, preciso pensar...

Razão: