Piyasanın kapalı olduğunu doğru bir şekilde nasıl bilebilirim? (mql4)

 

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?

   if (DayOfWeek()== 0 || DayOfWeek()== 6 ) // Не помогает, последнее время сервера 21:54 ПЯТНИЦА хотя реально сейчас суббота!
      {
         TradeEnabled = 0 ;
      }
   else
      {
         TradeEnabled = 1 ;
      } 
MarketInfo (symbol,MODE_TRADEALLOWED) // не помогает, всегда возвращает True
 
belirli bir zamanda bir duraklama ekleyin veya ticari emirleri yasaklayın
 
mql4 altında buna ihtiyacım var ve evet, uzman bugünün Cuma olduğunu görüyor, ancak aslında Cumartesi.
 

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.

 
Kino :

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

yazı dizisi  

2. İşleme yanıt olarak 132 hata kodu (ERR_MARKET_CLOSED) alıyoruz.

 
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();
}
 
Scriptong :

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.

Doğru yoldaki ipucu için teşekkürler, ancak piyasa açıkken, emirlerle çalışma olasılığını belirlemeye çalışmak bir şekilde doğru değil, ama işe yarayacak.
 
f2011 :
Ben de teşekkürler, ilginç fikir.
 

Ş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.

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

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 час  |
       }

Duraklamalar ve döngüler yoluyla kabaca bu şekilde karar verdim, ancak bu eski bir kod, terminal sürümünü güncellemeden önce. Şimdi daha kolay yollar var, sadece biraz literatür okumanız gerekiyor.
 
MK'ye geri dön! Sunucu piyasanın kapalı olduğunu biliyorsa ve 132 hatası veriyorsa yani emirlerle çalışmaya başvurmadan piyasanın açık olup olmadığını kontrol etmek için istekte bulunuyorsa Cumartesi ve Pazar tanımı olmadığı için bu önemlidir. tamamen doğru, tatiller ve ticaret seansının erken kapanması var ve her DC farklıdır.