Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Penso che dovremmo cambiare il controllo del tempo di trading in questo modo:
{
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!
Leggi l'aiuto di TimeCurrent - dice che questo è il tempo del SERVER
Se non ci sono tick, fine settimana o tempo non di negoziazione, TimeCurrent non cambia.
ETimeTradeServernon funziona, mostra l'ora locale del tuo computer.
È facile verificarlo eseguendo l'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 l'ora del computer cambia, ancheTimeTradeServer cambia e mostra l'ora del computerTimeLocal.
Se non ci sono tick, fine settimana o orari non di negoziazione, TimeCurrent non cambia.
ETimeTradeServernon funziona, mostra l'ora locale del computer.
È facile verificarlo eseguendo l'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 l'ora del computer cambia, ancheTimeTradeServer cambia e mostra l'ora del computerTimeLocal.
Cosa vi impedisce di controllare prima l'ora del computer tramite TimeTradeServer, e poi (se l'ora è corretta) usare
la funzione che ho scritto sopra per controllarla più accuratamente?
Aggiunto da
Anche se, ovviamente, questa non è la soluzione, perché potrebbero non esserci citazioni per questo simbolo :(
Un po' un grattacapo e ha scritto questa opzione, chi pensa a questa implementazione .
//| 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);
}
//+------------------------------------------------------------------+
...
Voi siete gli sviluppatori!
Quando sincronizzerete l'ora del terminale con l'ora di Exchange?
Un po' più di armeggiare con il codice ha portato a questo risultato.
//| 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);
}
//+------------------------------------------------------------------+
Risultato
Un po' più di armeggiare con il codice ha portato a questo risultato.
Hai idea di cosa stiamo parlando?
Forse non ho capito bene, capisco come, ho bisogno di una soluzione per evitare la chiusura dei mercati al di fuori delle ore di scambio.
Le soluzioni non vengono dai programmatori, ma dagli sviluppatori (o dal broker, se loro, il broker, ne sono responsabili)
Il codice che hai citato non controlla l'ora attuale dello scambio.
Finora, ho optato per questa soluzione
{
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);
}
Prima prendoTimeTradeServer - ottengo il tempo corrente "sporco"
Controllo un fine settimana e un tempo (trading) che si "sovrappone" a tutte le sessioni,
e poi usandoTimeCurrent
Ora attuale del server, per controllare l'ora all'interno delle sessioni.
Aggiunto da
Ma questo controllo ha un grosso inconveniente.
Se l'ora del computer locale è superiore a quella del server, andrà bene, ma
Ma se l'ora locale è inferiore, allora abbiamo un grosso problema.
Se perdiamo l'inizio delle offerte per la differenza tra l'ora del server di trading e l'ora locale :(
Ecco perché abbiamo bisogno diTimeCurrent
restituisce sempre l'ora del server, non solo l'ora dell'ultima citazione conosciuta.
Aggiunto da
Un altro svantaggio
Le quotazioni non arrivano al clearing, quindi l'uso diTimeCurrent nel clearing (ad esempio per ritirare gli ordini pendenti) non ha senso :(