Doğruysa, yukarıdaki yöntemlerden hiçbiri, çünkü her komisyoncu için (her birinin kendi düzenlemeleri vardır) farklı semboller için kod yapmak uygun değildir.
Açıkça şu şekilde tanımlanmıştır:
1. Herhangi bir ticaret işlemi gerçekleştirilir.
2. İşleme yanıt olarak 132 hata kodu (ERR_MARKET_CLOSED) alıyoruz.
Ayrıca piyasanın açılışını kaçırmamak için belirli bir sıklıkta alım satım işlemlerini tekrarlayabilirsiniz.
Örneğin, birçok sembolle çalışan bir Expert Advisor'da şunu yaptım:
bool DoTrade(ENUM_TRADE_TYPE tradeType, TradeParam &tradeParam) { // Проверка возможности проведения торговой операции по символу if (!IsSymbolTradeAllowed(tradeParam.symbol)) return false ; bool res = true ; int ticket = 0 ; switch (tradeType) { case TRADE_TYPE_DELETE: res = OrderDelete(tradeParam.orderTicket); break ; case TRADE_TYPE_CLOSE: res = OrderClose(tradeParam.orderTicket, tradeParam.orderVolume, tradeParam.orderCP, i_slippage); break ; case TRADE_TYPE_CLOSEBY: res = OrderCloseBy(tradeParam.orderTicket, tradeParam.orderTicketCounter); break ; case TRADE_TYPE_MODIFY: res = OrderModify(tradeParam.orderTicket, tradeParam.orderOP, tradeParam.orderSL, tradeParam.orderTP, 0 ); break ; case TRADE_TYPE_OPEN: { tradeParam.orderTicket = OrderSend (tradeParam.symbol, tradeParam.orderType, tradeParam.orderVolume, tradeParam.orderOP, i_slippage, tradeParam.orderSL, tradeParam.orderTP, "" , tradeParam.orderMN); res = (tradeParam.orderTicket > 0 ); break ; } } int error = GetLastError (); if (!res) { ... // обработка других ошибок if (error == ERR_MARKET_CLOSED || error == ERR_OFF_QUOTES) AddSymbolToMarketClosedList(tradeParam.symbol); } return res; }
Sembolle ticaret olasılığını kontrol etme işlevi:
bool IsSymbolTradeAllowed( string symbol) { if ( SymbolInfoInteger (symbol, SYMBOL_TRADE_MODE ) != SYMBOL_TRADE_MODE_FULL ) { Alert (WindowExpertName(), ": невозможно совершить торговую операцию по символу " , symbol, ", т. к. по нему торговля запрещена!" ); AddSymbolToMarketClosedList(symbol, true ); return false ; } for ( int i = g_marketSymbolsCnt - 1 ; i >= 0 ; i--) if (g_marketClosedSymbols[i].symbol == symbol) return ( TimeCurrent () - g_marketClosedSymbols[i].lastRequest) > 60 ; return true ; }
Takas edilemeyen bir sembol yazma işlevi:
void AddSymbolToMarketClosedList( string symbol, bool isStopTrade = false ) { datetime time = TimeCurrent (); if (isStopTrade) time = StringToTime ( "3000.01.01" ); for ( int i = g_marketSymbolsCnt - 1 ; i >= 0 ; i--) if (g_marketClosedSymbols[i].symbol == symbol) { g_marketClosedSymbols[i].lastRequest = time; return ; } if (g_marketSymbolsCnt >= MAX_SYMBOLS_AMOUNT) return ; g_marketClosedSymbols[g_marketSymbolsCnt].symbol = symbol; g_marketClosedSymbols[g_marketSymbolsCnt].lastRequest = time; g_marketSymbolsCnt++; }
Tahmin edebileceğiniz gibi, g_marketClosedSymbols dizisi bir dizi yapıdır.
Danışmanı OnTimer() çalışma moduna geçirdi, şimdi piyasa kapalıyken bunu anlamıyor ve ticaret yapmaya çalışıyor, genel olarak sunucuyla bağlantı kuruyor ve doğal olarak hatalar alıyor ve günlük günlüklerini tıkıyor. GetLastError() = Piyasa kapalı. Bir izin günü veya kapalı bir piyasayı kontrol etmek için başka hangi koşulları düşünebilirsiniz?
tikler gelmiyor
sunucu saati değişmiyor
if (DayOfWeek()== 0 || DayOfWeek()== 6 ) bilgisayar saatine göre +/- sunucu saatine göre
böyle bir hata varsa, muhtemelen hafta sonu
input int Timer_Sleep_After = 3600; // Если тиков нет уже час, знач рынок закрыт datetime gt_Last_Tick_Time = 0; void OnTimer() { if(TimeLocal() - gt_Last_Tick_Time > Timer_Sleep_After) return; } void OnTick() { gt_Last_Tick_Time = TimeLocal(); }
Doğruysa, yukarıdaki yöntemlerden hiçbiri, çünkü her komisyoncu için (her birinin kendi düzenlemeleri vardır) farklı semboller için kod yapmak uygun değildir.
Açıkça şu şekilde tanımlanmıştır:
1. Herhangi bir ticaret işlemi gerçekleştirilir.
2. İşleme yanıt olarak 132 hata kodu (ERR_MARKET_CLOSED) alıyoruz.
Ayrıca piyasanın açılışını kaçırmamak için belirli bir sıklıkta alım satım işlemlerini tekrarlayabilirsiniz.
Örneğin, birçok sembolle çalışan bir Expert Advisor'da şunu yaptım:
Sembolle ticaret olasılığını kontrol etme işlevi:
Takas edilemeyen bir sembol yazma işlevi:
Tahmin edebileceğiniz gibi, g_marketClosedSymbols dizisi bir dizi yapıdır.
Şimdi MK geliştiricilerine soru, neden asla işe yaramayacak bir olay yapsın? https://docs.mql4.com/ru/dateandtime/dayofweek
if ( DayOfWeek ()==0 || DayOfWeek ()==6) return (0);
tik ile çalışırsam tik olmaz ve event olmaz, timer ile çalışırsam server en son nickin geldiği saati yani cumanın son dakikalarını verir ve event asla olmaz ya olur. Bir zamanlayıcı konusunda bir danışmanım olduğu ve tiklerdeki sunucunun eskisi gibi çalıştığı ortaya çıktı, ancak sunucu çevrimiçi çünkü bir istek gönderirken 132 hatası veriyor. Lütfen onu düzeltin, böylece sunucudaki saat buna göre değişir. zamanlayıcıya da, ya da bir ticaret emri göndermeden piyasanın kapalı olup olmadığını kontrol edebilmem için. Bu şiddetli bir hata, umarım sorunu anlayıp çözeriz.
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 час |
}
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Danışmanı OnTimer() çalışma moduna geçirdi, şimdi piyasa kapalıyken bunu anlamıyor ve ticaret yapmaya çalışıyor, genel olarak sunucuyla bağlantı kuruyor ve doğal olarak hatalar alıyor ve günlük günlüklerini tıkıyor. GetLastError() = Piyasa kapalı. Bir izin günü veya kapalı bir piyasayı kontrol etmek için başka hangi koşulları düşünebilirsiniz?
MarketInfo (symbol,MODE_TRADEALLOWED) // не помогает, всегда возвращает True