Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
İşlem süresi kontrolünü şu şekilde değiştirmeniz gerektiğini öneririm:
{
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 );
}
Serezha!
TimeCurrent yardımını okuyun - bunun SUNUCU zamanı olduğunu söylüyor
Kene, hafta sonu veya işlem dışı zaman yoksa, TimeCurrent değişmez.
Ve TimeTradeServer çalışmıyor , bilgisayarın yerel saatini gösteriyor.
Danışmanı çalıştırarak kontrol etmek kolaydır:
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 (),
"" );
}
//+------------------------------------------------------------------+
Bilgisayardaki saat değiştiğinde, TimeTradeServer da değişir ve bilgisayarın TimeLocal saatini gösterir.
Kene, hafta sonu veya işlem dışı zaman yoksa, TimeCurrent değişmez.
Ve TimeTradeServer çalışmıyor , bilgisayarın yerel saatini gösteriyor.
Danışmanı çalıştırarak kontrol etmek kolaydır:
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 (),
"" );
}
//+------------------------------------------------------------------+
Bilgisayardaki saat değiştiğinde, TimeTradeServer da değişir ve bilgisayarın TimeLocal saatini gösterir.
Ve önce TimeTradeServer aracılığıyla işlem süresini kontrol etmenizi ve ardından (zaman işlem yapıyorsa) daha doğru bir kontrol için,
yukarıda yazdığım fonksiyon?
Katma
Tabii ki, bu bir seçenek olmasa da, çünkü bu sembol için tırnak işareti olmayabilir :(
Biraz kafamı kırdım ve böyle bir seçenek yazdım, kimin aklına bu uygulama.
//| 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 );
}
//+------------------------------------------------------------------+
...
Arkadaşlar geliştiriciler!
Peki, terminalin saatini Borsa saatiyle ne zaman senkronize ediyorsunuz?
Kod üzerinde biraz daha büyü, olan buydu.
//| 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 );
}
//+------------------------------------------------------------------+
sonuç
Kod üzerinde biraz daha büyü, olan buydu.
Ne hakkında konuştuğumuzu bile anlıyor musun?
Belki de tam olarak anlamadım, nasıl olduğunu anladım, borsanın işlem saatleri dışında piyasaya çıkmamak için bir çözüme ihtiyaç var.
Çözümler programcılardan değil, geliştiricilerden (veya ona bağlıysa bir komisyoncu, Broker)
Sağladığınız kod, GÜNCEL DEĞİŞİM saatini kontrol etmiyor
Şimdilik, bu çözümle sıkışıp kaldım
{
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 );
}
İlk önce TimeTradeServer'ı alıyorum - mevcut "kirli" zamanı alıyorum
Tüm oturumları "örtüşen" hafta sonlarını ve zamanı (işlem) kontrol ediyorum,
ve sonra TimeCurrent'ı kullanın
oturumlar içindeki zamanı kontrol etmek için sunucunun geçerli saati.
Katma
Ancak bu kontrolün önemli bir dezavantajı vardır .
Bilgisayarın yerel saati sunucunun saatinden büyükse, her şey yolunda gidecektir, ancak
yerel alan daha küçükse, o zaman büyük bir sorun ortaya çıkar - biz
alım satım sunucusu saati ile yerel saat arasındaki fark için alım satım başlangıcını atlayın :(
Bu nedenle, TimeCurrent
yalnızca bilinen son alıntının zamanını değil, her zaman sunucu zamanını döndürür.
Katma
Başka bir dezavantaj
Fiyat teklifleri takasa gelmez, bu nedenle takasta TimeCurrent kullanmak (örneğin, bekleyen emirleri kaldırmak için) anlamsızdır :(