Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Acho que deveríamos mudar a verificação do tempo de negociação desta forma:
{
MqlTick cur_tick[1];
MqlDateTime cur_time;
if(CopyTicks(Symbol(), cur_tick, COPY_TICKS_INFO, 0, 1)==1)
{
TimeToStruct(cur_tick[0].time, cur_time);
ulong trade_time = cur_time.hour * 3600 + cur_time.min * 60 + cur_time.sec;
if(((trade_time >= time_st_mon) && (trade_time < 50370)) ||
((trade_time >= time_st_day) && (trade_time < 67470)) ||
((trade_time >= time_st_evn) && (trade_time < 85770)))
{
return(true);
}
}
return(false);
}
Sergei!
Leia a ajuda da TimeCurrent - ela diz que este é o tempo SERVIDOR
Se não houver carrapatos, fins de semana ou tempo não comercial, o TimeCurrent não muda.
E oTimeTradeServernão funciona, ele mostra a hora local em seu computador.
É fácil verificar isto, executando o Expert Advisor:
int OnInit()
{
//--- create timer
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
Comment(
"\n TimeCurrent: ",TimeCurrent(),
"\n TimeTradeServer: ",TimeTradeServer(),
"\n TimeLocal: ",TimeLocal(),
"");
}
//+------------------------------------------------------------------+
Quando o tempo do computador muda, oTimeTradeServer também muda e mostra o tempo do computadorTimeLocal.
Se não houver carrapatos, fins de semana ou horários não comerciais, o TimeCurrent não muda.
E oTimeTradeServernão funciona, ele mostra o horário do computador local.
É fácil verificar isto, executando a EA:
int OnInit()
{
//--- create timer
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
Comment(
"\n TimeCurrent: ",TimeCurrent(),
"\n TimeTradeServer: ",TimeTradeServer(),
"\n TimeLocal: ",TimeLocal(),
"");
}
//+------------------------------------------------------------------+
Quando o tempo do computador muda, oTimeTradeServer também muda e mostra o tempo do computadorTimeLocal.
O que o impede de verificar o tempo do computador através do TimeTradeServer primeiro, e depois (se o tempo estiver correto) usar
função que escrevi acima para verificá-la com mais precisão?
Adicionado por
Embora, naturalmente, esta não seja a solução, pois pode não haver citações para este símbolo :(
Um pouco de um golpe de cabeça e escreveu esta opção, quem pensa sobre esta implementação .
//| test03.mq5 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
if(CheckExchTime())Print("Торговля разрешена");
else Print("Торговля запрещена");
}
//+------------------------------------------------------------------+
bool CheckExchTime()
{
MqlTick last_tick;
MqlDateTime last_time;
MqlDateTime start_time;
MqlDateTime end_time;
datetime trade_time_start=0;
datetime trade_time_end=0;
datetime start=0;
datetime end=0;
ResetLastError();
if(SymbolInfoTick(_Symbol,last_tick))
{
TimeToStruct(last_tick.time,last_time);
Print(last_tick.time,": Bid = ",last_tick.bid," Ask = ",last_tick.ask," Last = ",last_tick.last," Volume = ",last_tick.volume);
if(SymbolInfoSessionTrade(_Symbol,(ENUM_DAY_OF_WEEK)last_time.day_of_week,0,trade_time_start,trade_time_end))
{
TimeToStruct(trade_time_start,start_time);
TimeToStruct(trade_time_end,end_time);
start=__DATE__+(start_time.hour*60+start_time.min)*60;
end=__DATE__+(end_time.hour*60+end_time.min)*60;
Print("trade_time_start = ",trade_time_start," trade_time_end = ",trade_time_end);
Print(start," - ",end);
if(start==end)return(true);
if(last_tick.time>start && last_tick.time<end)return(true);
}
else Print("SymbolInfoSessionTrade(0) failed, error = ",GetLastError());
if(SymbolInfoSessionTrade(_Symbol,(ENUM_DAY_OF_WEEK)last_time.day_of_week,1,trade_time_start,trade_time_end))
{
TimeToStruct(trade_time_start,start_time);
TimeToStruct(trade_time_end,end_time);
start=__DATE__+(start_time.hour*60+start_time.min)*60;
end=__DATE__+(end_time.hour*60+end_time.min)*60;
Print("trade_time_start = ",trade_time_start," trade_time_end = ",trade_time_end);
Print(start," - ",end);
if(start==end)return(true);
if(last_tick.time>start && last_tick.time<end)return(true);
}
else Print("SymbolInfoSessionTrade(1) failed, error = ",GetLastError());
}
else Print("SymbolInfoTick() failed, error = ",GetLastError());
return(false);
}
//+------------------------------------------------------------------+
...
Vocês são os desenvolvedores!
Quando você vai sincronizar o tempo do terminal com o tempo de troca?
Um pouco mais de ajuste com o código resultou nisto.
//| test06.mq5 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetMillisecondTimer(1);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
string text=NULL;
int symbol_total=SymbolsTotal(true);
for(int i=0; i<symbol_total; i++)
{
string symbol=SymbolName(i,true);
if(CheckExchTime(symbol,TimeCurrent()))text+="\n"+symbol+": Торговля разрешена";
else text+="\n"+symbol+": Торговля запрещена";
}
Comment(text);
}
//+------------------------------------------------------------------+
bool CheckExchTime(string symbol,datetime times)
{
MqlDateTime last_time;
MqlDateTime start_time;
MqlDateTime end_time;
datetime trade_time_start=0;
datetime trade_time_end=0;
datetime start=0;
datetime end=0;
ResetLastError();
datetime expiration=(datetime)SymbolInfoInteger(symbol,SYMBOL_EXPIRATION_TIME);
if(expiration!=0 && times>=expiration)return(false);
TimeToStruct(times,last_time);
if(SymbolInfoSessionTrade(symbol,(ENUM_DAY_OF_WEEK)last_time.day_of_week,0,trade_time_start,trade_time_end))
{
TimeToStruct(trade_time_start,start_time);
TimeToStruct(trade_time_end,end_time);
start=StringToTime((string)last_time.year+"."+(string)last_time.mon+"."+(string)last_time.day+" "+(string)start_time.hour+":"+(string)start_time.min+":00");
end=StringToTime((string)last_time.year+"."+(string)last_time.mon+"."+(string)last_time.day+" "+(string)end_time.hour+":"+(string)end_time.min+":00");
if(start==end)return(true);
if(times>start && times<end)return(true);
}
//else Print("SymbolInfoSessionTrade(0) failed, error = ",GetLastError());
if(SymbolInfoSessionTrade(symbol,(ENUM_DAY_OF_WEEK)last_time.day_of_week,1,trade_time_start,trade_time_end))
{
TimeToStruct(trade_time_start,start_time);
TimeToStruct(trade_time_end,end_time);
start=StringToTime((string)last_time.year+"."+(string)last_time.mon+"."+(string)last_time.day+" "+(string)start_time.hour+":"+(string)start_time.min+":00");
end=StringToTime((string)last_time.year+"."+(string)last_time.mon+"."+(string)last_time.day+" "+(string)end_time.hour+":"+(string)end_time.min+":00");
if(start==end)return(true);
if(times>start && times<end)return(true);
}
//else Print("SymbolInfoSessionTrade(1) failed, error = ",GetLastError());
return(false);
}
//+------------------------------------------------------------------+
Resultado
Um pouco mais de ajuste com o código resultou nisto.
Você tem alguma idéia do que estamos falando?
Talvez eu não entenda bem, eu entendo como, eu preciso de uma solução para evitar o fechamento do mercado fora do horário de negociação da bolsa.
As soluções não são dos programadores, mas dos desenvolvedores (ou corretores, se eles, o corretor, são responsáveis por isso)
O código que você citou não verifica o horário atual da Bolsa.
Até agora, resolvido sobre esta solução
{
datetime lk_time = TimeTradeServer(tick_time);
if ( ( tick_time.day_of_week == int(FirstDay)) ||
( tick_time.day_of_week == int(SecondDay)))//выходные
{
return(false);
}
#ifdef DEBUG
if ((tick_time.hour >= 0) && (tick_time.hour < 6)) // DEBUG 6-00
{
return(false);
}
#else
if ((tick_time.hour >= 0) && (tick_time.hour < 10))
{
return(false);
}
#endif
// 13 * 3600 + 59 * 60 + 30 = 50370 - 13:59:30
// 14 * 3600 = 50400 - 14:00:00
// 14 * 3600 + 30 = 50430 - 14:00:30
// 14 * 3600 + 60 = 50460 - 14:01:00
// 18 * 3600 + 44 * 60 + 30 = 67470 - 18:44:30
// 18 * 3600 + 45 * 60 = 67500 - 18:45:00
// 18 * 3600 + 45 * 60 + 30 = 67530 - 18:45:30
// 18 * 3600 + 46 * 60 = 67560 - 18:46:00
// 19 * 3600 = 68400 - 19:00:00
// 19 * 3600 + 60 = 68460 - 19:01:00
// 23 * 3600 + 49 * 60 + 30 = 85770 - 23:49:30
// 23 * 3600 + 50 * 60 = 85800 - 23:50:00
// 23 * 3600 + 50 * 60 + 30 = 85830 - 23:50:30
// 23 * 3600 + 51 * 60 = 85860 - 23:51:00
//---
lk_time = TimeCurrent(tick_time);
ulong trade_time = tick_time.hour * 3600 + tick_time.min * 60 + tick_time.sec;
//--- //10:00:02
if(((trade_time >= time_st_mon) && (trade_time < 50370)) ||
((trade_time >= time_st_day) && (trade_time < 67470)) ||
((trade_time >= time_st_evn) && (trade_time < 85770)))
{
return(true);
}
return(false);
}
Primeiro eu tomo oTimeTradeServer - eu recebo o tempo "sujo" atual
Verifico por um fim de semana e um horário (negociação) que "se sobrepõe" a todas as sessões,
e depois usando oTimeCurrent
Tempo atual do servidor, para verificar o tempo dentro das sessões.
Adicionado por
Mas este cheque tem uma grande desvantagem.
Se o tempo do computador local for maior que o tempo do servidor, tudo estará bem, mas
Mas se a hora local é menor, então temos um grande problema.
Se perdermos o início da licitação pela diferença entre a hora do servidor comercial e a hora local :(
É por isso que precisamos daTimeCurrent
sempre retorna o tempo do servidor, não apenas o tempo da última cotação conhecida.
Adicionado por
Outro inconveniente
As cotações não estão chegando à compensação, então usar oTimeCurrent na compensação (por exemplo, para retirar ordens pendentes) é insensato :(