Como saber se o mercado está fechado? (mql4) - página 2

 
Alexey:

int Weekday = TimeDayOfWeek(TimeLocal());                                                          //Локальное время  |
int Weekdays = TimeDayOfWeek(TimeCurrent());                                                       //Серверное время  |

while(IsExpertEnabled())                                                                 //До тех пор пока запушенно  |

     {
     if(Weekday!=0||Weekday!=6){Exp=true;if(Weekday==1){Info(4,Weekday,0);}}       //Если не Сбб. Воск. то разрешено  |
     if(Weekdays==0||Weekdays==6)                                                  //Если Сбб. Воск. то не разрешено  |
       {
       Exp=false;Info(5,Weekdays,0);
       if(Weekdays==6){Sleep(86400000);}                                                //Если суббота пауза 24 часа  |
       if(Weekdays==0){Sleep(3600000);}                                               //Если воскресение пауза 1 час  |
       }

Foi mais ou menos assim que eu resolvi, através de pausas e loops, mas é um código antigo, antes da versão terminal ser atualizada. Há maneiras mais simples agora, basta ler um pouco a literatura.
Obrigado, é claro, mas é como dizem, subir pelo olho de um lugar) Eu também posso colocar uma pausa no euro a 5.0 servidor me permite fazê-lo e então a cada ciclo de tempo tentar mudar a pausa, se o erro 132 então o mercado está fechado, se normal então o comércio está lá, mas na hora do comércio este servidor inunda, eu quero resolver o problema humanamente, não através de "loops", mas cabe aos desenvolvedores MK.
 

IsTradeAllowed

Retorna informações sobre a capacidade de negociar com Expert Advisors.

boolIsTradeAllowed();

A segunda forma desta chamada retorna informações sobre a capacidade de negociar por um símbolo especificado em um determinado momento.

boolIsTradeAllowed(
símbolo const string// símbolo
data/hora testada_ hora// hora
);

Parâmetros

símbolo

símbolo [em].

tempo_teste

[em] Tempo.

Valor retornado

Retorna verdadeiro se a EA for permitida a comercialização e o fio estiver livre, caso contrário, retorna falso.

 
if(SymbolInfoInteger(NULL,SYMBOL_TIME)>60) return(0);
 
Kino:
Obrigado, é claro, mas é como dizem para entrar pelo olho de um lugar) Eu também posso colocar uma pausa no euro no servidor 5.0 permitirá isso, e então a cada ciclo de tempo tentar mudar a pausa, se o erro 132 então o mercado está fechado, se normal então o comércio está, mas na hora do comércio este servidor está inundando, eu gostaria de resolver o problema humanamente, não através de "loops", mas este é o MK dos desenvolvedores.
É necessário solicitar a permissão para negociar. Não tenho este pedido no meu exemplo porque há uma diferença de tempo de três horas entre o fechamento do mercado e 3 horas antes do fechamento do mercado, a maioria é plana. Por isso o fiz de forma diferente lá, mas também com pausas, mas com um intervalo muito menor.
 
offfline:

IsTradeAllowed

Retorna informações sobre a capacidade de negociar com Expert Advisors.

boolIsTradeAllowed();

A segunda forma desta chamada retorna informações sobre a capacidade de negociar por um símbolo especificado em um determinado momento.

boolIsTradeAllowed(
símbolo const string// símbolo
data/hora testada_ hora// hora
);

Parâmetros

símbolo

símbolo [em].

tempo_teste

[em] Tempo.

Valor retornado

Retorna verdadeiro se a EA for autorizada a negociar e o fio para realizar as negociações for livre, caso contrário, retorna falso.

Alexander, você está errado)


//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  if (IsTradeAllowed() == True) Print("---- Ура торгуем -----");
   {
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
      {
         if (ticket <0) Print("---- Уже не торгуем -----",GetLastError());
      }
   }

  }
//+------------------------------------------------------------------+
 

este funciona muito bem

//+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                                                   Sergey Gritcay |
//|                                               sergey1294@list.ru |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritcay"
#property link      "sergey1294@list.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(isNewTime())
     {
      Print("---- Ура торгуем -----");
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
        {
         if(ticket<0) Print("---- Уже не торгуем -----",GetLastError());
        }
     }
     else Print("---- функция isNewTime() = false, возможно торговля закрыта ");

  }
//+------------------------------------------------------------------+
bool isNewTime()
  {
//--- в статической переменной будем помнить время 
   static datetime last_time=0;
//--- текущее время
   datetime time=TimeCurrent();

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем 
      last_time=time;
      return(false);
     }

//--- если время отличается
   if(last_time!=time)
     {
      //--- запомним время и вернем true
      last_time=time;
      return(true);
     }
//--- дошли до этого места - значит время сервера не обновилось, вернем false
   return(false);
  }
 
sergey1294:

este funciona muito bem

Obrigado, vou tentar.
 
Kino:
Obrigado pela dica, mas quando o mercado está aberto, não é correto tentar determinar a possibilidade de trabalhar com pedidos, mas funcionará.

De minha parte, meu raciocínio é o seguinte.

Se for necessário negociar com o símbolo atual, um sinal indireto de que o mercado está aberto é a chegada de novos carrapatos. Assim, o evento OnTick é suficiente e o assunto está encerrado.

Se precisarmos trabalhar com outros símbolos que não o atual, o fato da abertura de negócios no símbolo atual não garante que os negócios sejam executados em algum outro símbolo. Por exemplo, o Expert Advisor foi executado em EURUSD, o horário é 09:00 UTC, e queremos negociar ações americanas, cujo mercado só abrirá às 13:00 UTC. Portanto, a OnTick não vai ajudar. Precisaremos determinar se o mercado se abre por outros símbolos através de tentativas de enviar ordens ao servidor em certos intervalos. O envio de uma ordem uma vez por minuto não é de forma alguma um bombardeio ao servidor, mas uma abordagem bastante normal. O que há de errado com isso?

 

não tem carrapato, como me foi dito uma vez por servicedesk sobre este problema do dia da semana,

eles sugeriram uma solução como.

TimeDayOfWeek(TimeLocal());

embora não seja totalmente correto, porque o dia da semana pode não ser o mesmo que o dia do terminal.

 
Em um projeto recente, a tarefa era detectar o fato de que o comércio com um símbolo arbitrário estava aberto e disponível.
Uma condição importante era não tentar abrir pedidos, embora eu tivesse recorrido a ela muitas vezes em outros projetos. Para ser honesto, me parece que este é o método mais fácil e mais confiável até agora.

Até agora encontrei a melhor maneira de fazer isto (mas ainda estou procurando, veja abaixo):
1) Determinar se a negociação é permitida "cara a cara" - segunda forma da função IsTradeAllowed() (mencionei-a acima). Se não, então não é permitido :)
2) Compare o tempo da última cotação usando SymbolInfoInteger(<símbolo>, SYMBOL_TIME) com o tempo de uma das sessões de negociação(SymbolInfoSessionTrade()), se o tempo da cotação cair em uma das faixas de sessão, então a negociação é permitida.
3) Verifique se o tempo da cotação não está muito "desatualizado": se há mais de xx minutos (compare SymbolInfoInteger(<symbol>, SYMBOL_TIME) e TimeCurrent(), então pensamos que a cotação está desatualizada e, portanto, não podemos negociar por ela (se eu estiver certo, foi cerca de três minutos)

A desvantagem desta abordagem é a seguinte: pode haver condições quando o comércio do símbolo é impossível, enquanto os carrapatos passam.
Eu não entrei no mecanismo; o desenvolvimento foi feito para um corretor e durante os testes eles ligaram tal modo - carrapatos vão, mas a negociação é impossível. Até agora, ainda não conseguimos superar esta variante.

É justo dizer que eu não encontrei isto no comércio real. Portanto, em condições "normais" a solução parece tolerável. Mas eu ainda estou procurando :)

P.S. Os passos 1 e 2 podem ser combinados (para transferir SymbolInfoInteger(<symbol>, SYMBOL_TIME) para a função IsTradeAllowed), mas eu ainda não fiz testes de tal variante e não vou dizer isso.

SymbolInfoSessionTrade - Документация на MQL4
  • docs.mql4.com
SymbolInfoSessionTrade - Документация на MQL4