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

 
PolarSeaman:

Desculpe, não entendo porque você não pode.

você pode, mas não será exatamente um temporizador

if (IsTesting()) OnTimer();
 
PolarSeaman:

lá vai você... E se o carrapato não veio? Você precisa "começar" sem um carrapato.

o primeiro tick é para sincronização, e se o tick inicial não veio, o mercado está fechado, não há nada a fazer lá

 

Boa noite!

Mais uma vez, tenho que pedir ajuda:

Uma ordem tem que ser aberta em um determinado intervalo de tempo, se uma ordem já foi aberta nos últimos 30 minutos com este magik, nenhuma ordem tem que ser aberta. Escrever assim:

if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_MINUTES) <= TimeToStr(D'00:30',TIME_MINUTES))
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

Se você deixar apenas a primeira parte, o problema é que se uma posição de parada/tomada se fechar naquela meia hora, outra se abre. Então acrescentei a segunda parte para entrar no histórico de pedidos e se já houve um pedido nos últimos 30 minutos com este mag, então não o abra. Mas algo está errado com a segunda parte - ela ainda se abre.

Por favor, avise!

 

você tem que contar em segundos.

if ( TimeCurrent()-OrderOpenTime() <= 30*60 )
 
Taras Slobodyanik:

Você tem que contar em segundos.

Infelizmente, não funcionou.

Tentei isto novamente, também não:

  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_SECONDS) <= TimeToStr(30*60,TIME_SECONDS))
 
YanSay:

Infelizmente, não funcionou.

Tentei isso novamente, mas também não funcionou:

Por que você está comparando todas as linhas? Taras disse corretamente - contar em segundos. Sua versão não funcionou, porque você ainda não chegou ao histórico da conta:

//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)

Este é um ciclo de ordens de trabalho. Se olharmos para a história, o laço será o seguinte:

//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)

Então devemos tomar o tempo de fechamento do pedido ao invés de seu tempo de abertura no loop.

 
Ihor Herasko:

Por que você está comparando todas as linhas? Taras estava certo quando ele disse contar em segundos. Sua versão não coube, porque você nunca chegou ao histórico da conta:

Este é um ciclo de ordens de trabalho. Se olharmos para a história, o laço será o seguinte:

Então, no loop, devemos tomar o tempo de fechamento do pedido e não seu tempo aberto.


if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

Se entendi corretamente, você quis dizer TimeToStr, ou seja, você o traduziu em texto?

Corrigido, mas ainda assim:

Testador

Desculpe, se eu sou completamente estúpido.

 
YanSay:

Se eu entendi corretamente, você quer dizer TimeToStr - ou seja, traduzido em texto?

Corrigido, mas ainda assim:

Sinto muito se sou completamente estúpido.

Diga sua condição em voz alta e você verá o que está acontecendo).

if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
 

Se a um dos valores de reserva do indicador anterior for atribuído um valor vazio, ele será excluído do gráfico?

ou haverá um valor vazio no buffer e o desenho permanecerá na tabela?

 
YanSay:

Se eu entendi corretamente, você quer dizer TimeToStr - ou seja, traduzido em texto?

Sim. Não vale a pena converter o tempo em um fio, porque o tempo é um número de segundos. Este número é muito mais fácil e rápido de se trabalhar do que as cordas.

Corrigido, mas ainda assim:

Desculpe se eu sou completamente estúpido.

Você corrigiu uma coisa, e estragou outra).

Na segunda parte, em vez de:

if (!OrderSelect(i, SELECT_BY_POS))
     continue;

trazê-lo de volta:

if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     continue;

Em sua tentativa anterior, você tinha esta linha correta.

Razão: