1485 derlemesinden sonra CopyTicks() ve CopyTicksRange()'i geliştirmeye yönelik hatalar ve öneriler. - sayfa 4

 
Yury Kirillov :
EA, OnTisk ve CopyTicks'te tik almanın tüm olası yollarını kullanmayı deneyin ve ardından sonuçları karşılaştırın ve en uygun olanı kullanın.
Ve OnTick()'in bununla ne ilgisi var? Tüm keneleri almak için değil, bir kene gelişi gerçeğini işlemek için tasarlanmıştır. Burada hiçbir şeyi karşılaştırmanıza bile gerek yok, OnTick() her tikte çağrılmayacak ve MqlTick yapısının tüm verilerini almanıza izin vermeyecek.
 
Servis masası, yeni bir yapı olan 1545'te denemeyi teklif etti. Ancak sonuç daha önce olduğu gibi değişmedi, bazı menkul kıymetler için sabah 10'dan 11'e kadar olan kene isteği sıfır dizi döndürür ve ardından veriler bir nedenden dolayı gelmeye başlar. 11.00'den itibaren. Belki ondan sonra, istendiğinde keneler zaten "normal"dir, ancak alaka yoktur.
 
Genel olarak, bu onların tek mesajıdır. Uzun zaman oldu, servis masası yanıt vermiyor. Mesajlarımı görmezden gelmek doğru mu?
 
antru :
Genel olarak, bu onların tek mesajıdır. Uzun zaman oldu, servis masası yanıt vermiyor. Mesajlarımı görmezden gelmek doğru mu?
Mesajlarınızı görmezden gelmekle ilgili olarak - şubede bir hata yaptınız. SD ile ilgili ayrı bir konu var. Genel olarak, uygulamada bir yorum yazarak onlara hatırlatın. Kodu ve diğer kanıtları SD'ye eklediniz mi?
 
Alexey Kozitsyn :
Mesajlarınızı görmezden gelmekle ilgili olarak - şubede bir hata yaptınız. SD ile ilgili ayrı bir konu var. Genel olarak, uygulamada bir yorum yazarak onlara hatırlatın. Kodu ve diğer kanıtları SD'ye eklediniz mi?

evet, tabi ki, kodu bile açıkladım... sessizlik... bahşiş için teşekkürler, ayrı bir başlıkta yazacağım
 

CopyTicksRange'ı test etmek için hata ayıklama kodu yapıldı. Servis masasında kalıcı bir sessizlik varken , kodda bir hata olabilir mi diye düşündüm. Görünüşe göre gözlerim şimdiden bulanık... Lütfen yeni bir bakışla bakın.

Aşağıda kod, ekte çalışmanın sonuçları bulunmaktadır. İlk zip - ticaretten önce metatrader'ın başlatılması, ikinci zip - Moskova saatiyle 10.30'da lansman (hata ayıklama dosyalarında süre 3 saat daha azdır).

İlk zipte neden hiçbir kene döndürülmediğini anlamıyorum ..

Genel olarak. Arkadaşlar canlı yayını nasıl alıyorsunuz? Belki tekerleği yeniden icat ediyorum ve yanlış bir şey yapıyorum, belki bir kod örneği verebilirsin, kağıt üzerinde gerçek zamanlı olarak keneler nasıl alınır?

 //+------------------------------------------------------------------+
//|                                                     Smelchak.mq5 |
//|                                                      Pavel&Antru |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Pavel&Antru"
#property link        ""
#property version    "1.00"

bool g_bEnterInfoSent = false ;

datetime g_dEndOfTheDay;
datetime g_dDayBegin;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
   EventSetTimer ( 3 );
   
   MqlDateTime startTime;
   TimeGMT (startTime);
   startTime.hour = 7 ;
   startTime.min = 0 ;
   startTime.sec = 0 ;
   g_dDayBegin = StructToTime (startTime);
   
   startTime.hour = 17 ;
   startTime.min = 0 ;
   startTime.sec = 0 ;
   g_dEndOfTheDay = StructToTime (startTime);
   
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
{
}
//+------------------------------------------------------------------+

void OnTimer ()
{
   MqlDateTime mdt;
   datetime dCurrent = TimeCurrent (mdt);
   
   if (!g_bEnterInfoSent && mdt.hour + 3 == 9 )
   {
       MqlDateTime startTime;
       TimeGMT (startTime);
      startTime.hour = 7 ;
      startTime.min = 0 ;
      startTime.sec = 0 ;
      g_dDayBegin = StructToTime (startTime);
      
      startTime.hour = 17 ;
      startTime.min = 0 ;
      startTime.sec = 0 ;
      g_dEndOfTheDay = StructToTime (startTime);
      
      g_bEnterInfoSent = true ;
   }
   
   if (g_bEnterInfoSent && mdt.hour + 3 == 22 )
   {
      g_bEnterInfoSent = false ;
   }
   
   datetime lastTime = TimeCurrent ();
   
   MqlDateTime dayBegin;
   TimeToStruct (g_dDayBegin, dayBegin);

   MqlDateTime dayEnd;
   TimeToStruct (g_dEndOfTheDay, dayEnd);
   
   MqlDateTime curTime;
   TimeToStruct (lastTime, curTime);
   
   if ( true ) //(lastTime >= g_dDayBegin && lastTime < g_dEndOfTheDay)
   {
       MqlTick tick[];
       int nResult = CopyTicksRange( Symbol (), tick, COPY_TICKS_ALL , ( ulong )g_dDayBegin* 1000 , ( ulong )g_dEndOfTheDay* 1000 );
       int nLastError = GetLastError ();
      
       string sDebugFileName = StringFormat ( "%s.debug.%.04d.%.02d.%.02d.csv" , Symbol (), dayBegin.year, dayBegin.mon, dayBegin.day);
   
       int nDebugOutputFile = FileOpen (sDebugFileName, FILE_READ | FILE_WRITE | FILE_CSV , ',' );
       if (nDebugOutputFile == INVALID_HANDLE ) nDebugOutputFile = FileOpen (sDebugFileName, FILE_WRITE | FILE_CSV , ',' );
      
       if (nDebugOutputFile != INVALID_HANDLE )
      {
         FileSeek (nDebugOutputFile, 0 , SEEK_END );

         MqlDateTime tickTime;
         
         if ( ArraySize (tick))
         {
             TimeToStruct (tick[ 0 ].time, tickTime);
            
             FileWrite (nDebugOutputFile, StringFormat ( "%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000" , dayBegin.year, dayBegin.mon, dayBegin.day,
                                                                                                dayBegin.hour, dayBegin.min, dayBegin.sec),
                                         StringFormat ( "%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000" , dayEnd.year, dayEnd.mon, dayEnd.day,
                                                                                                dayEnd.hour, dayEnd.min, dayEnd.sec),                                                        
                                         StringFormat ( "%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000" , curTime.year, curTime.mon, curTime.day,
                                                                                                curTime.hour, curTime.min, curTime.sec),
                                         StringFormat ( "%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000" , tickTime.year, tickTime.mon, tickTime.day,
                                                                                                tickTime.hour, tickTime.min, tickTime.sec),
                                         ArraySize (tick),
                                        nResult,
                                        nLastError);
                                        
             /////////////////////////////////////////////////////////
             string sTicksFileName = StringFormat ( "%s.ticks.%.04d.%.02d.%.02d.csv" , Symbol (), dayBegin.year, dayBegin.mon, dayBegin.day);
         
             int nTicksOutputFile = FileOpen (sTicksFileName, FILE_READ | FILE_WRITE | FILE_CSV , ',' );
             if (nTicksOutputFile == INVALID_HANDLE ) nTicksOutputFile = FileOpen (sTicksFileName, FILE_WRITE | FILE_CSV , ',' );
            
             if (nTicksOutputFile != INVALID_HANDLE )
            {
               FileSeek (nDebugOutputFile, 0 , SEEK_END );
      
               MqlDateTime tickTime;
            
               for ( int i = 0 ; i< ArraySize (tick); i++)
               {
                   TimeToStruct (tick[i].time, tickTime);
                  
                   FileWrite (nTicksOutputFile, StringFormat ( "%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000" , tickTime.year, tickTime.mon, tickTime.day,
                                                                                                      tickTime.hour, tickTime.min, tickTime.sec),
                                              tick[i].bid,
                                              tick[i].ask,
                                              tick[i].last,
                                              tick[i].volume,
                                              ((tick[i].flags & TICK_FLAG_BUY ) ? "Buy" : "" ) + 
                                              ((tick[i].flags & TICK_FLAG_SELL ) ? "Sell" : "" ));
               }
               
               FileClose (nTicksOutputFile);
            }
             /////////////////////////////////////////////////////////                                        
                                        
            g_dDayBegin = dCurrent;                                   
         }
         else
         {
             FileWrite (nDebugOutputFile, StringFormat ( "%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000" , dayBegin.year, dayBegin.mon, dayBegin.day,
                                                                                                dayBegin.hour, dayBegin.min, dayBegin.sec),
                                         StringFormat ( "%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000" , dayEnd.year, dayEnd.mon, dayEnd.day,
                                                                                                dayEnd.hour, dayEnd.min, dayEnd.sec),
                                         StringFormat ( "%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000" , curTime.year, curTime.mon, curTime.day,
                                                                                                curTime.hour, curTime.min, curTime.sec),
                                         "No ticks" ,
                                         ArraySize (tick),
                                        nResult,
                                        nLastError);
               
         }
         FileClose (nDebugOutputFile);
      }
   }
}

Dosyalar:
backup.01.zip  292 kb
backup.02.zip  271 kb
 
antru :

Arkadaşlar canlı yayını nasıl alıyorsunuz?

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Gizemli hisse senedi göstergesi

fxsaber , 2016.10.04 11:28

 long LastTime = 0 ; // time_msc-время последнего тика (самого свежего), полученного из истории
int Count = 0 ;     // Количество тиков в последенем запросе, у которых time_msc == LastTime

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_TRADE , const uint count = 100000 )
{
   int Res = 0 ;

   MqlTick NewTicks[];
   const int NewAmount = CopyTicks ( Symbol (), NewTicks, flags, LastTime, count);

   if ((NewAmount > 0 ) && (Count < NewAmount))
  {
    Res = ArrayCopy (Ticks, NewTicks, 0 , Count);

     // Взяли крайнее время из текущей истории
    LastTime = NewTicks[NewAmount - 1 ].time_msc;
    Count = 1 ;

     // Находим (Count) в текущей истории количество тиков со временем LastTime
     for ( int i = NewAmount - 2 ; i >= 0 ; i--)
    {
       if (NewTicks[i].time_msc < LastTime)
         break ;

      Count++;
    }
  }

   return (Res);
}
 
fxsaber :

nedense, mevcut gün için keneler, hem eski algoritmaya göre hem de yenisine göre genel olarak görüntülenmeyi bıraktı. ve penceredeki şeridin açık olup olmadığına bakılmaksızın ...

İşte işlevinizi eklediğim kod ...

 //+------------------------------------------------------------------+
//|                                                     Smelchak.mq5 |
//|                                                      Pavel&Antru |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Pavel&Antru"
#property link        ""
#property version    "1.00"

bool g_bEnterInfoSent = false ;

datetime g_dEndOfTheDay;
datetime g_dDayBegin;

long LastTime = 0 ; // time_msc-время последнего тика (самого свежего), полученного из истории
int Count = 0 ;     // Количество тиков в последенем запросе, у которых time_msc == LastTime

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_TRADE , const uint count = 100000 )
{
   int Res = 0 ;

   MqlTick NewTicks[];
   const int NewAmount = CopyTicks ( Symbol (), NewTicks, flags, LastTime, count);

   if ((NewAmount > 0 ) && (Count < NewAmount))
  {
    Res = ArrayCopy (Ticks, NewTicks, 0 , Count);

     // Взяли крайнее время из текущей истории
    LastTime = NewTicks[NewAmount - 1 ].time_msc;
    Count = 1 ;

     // Находим (Count) в текущей истории количество тиков со временем LastTime
     for ( int i = NewAmount - 2 ; i >= 0 ; i--)
    {
       if (NewTicks[i].time_msc < LastTime)
         break ;

      Count++;
    }
  }

   return (Res);
}
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
   EventSetTimer ( 3 );
   
   MqlDateTime startTime;
   TimeGMT (startTime);
   startTime.hour = 7 ;
   startTime.min = 0 ;
   startTime.sec = 0 ;
   g_dDayBegin = StructToTime (startTime);
   
   startTime.hour = 17 ;
   startTime.min = 0 ;
   startTime.sec = 0 ;
   g_dEndOfTheDay = StructToTime (startTime);
   
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
{
}
//+------------------------------------------------------------------+

void OnTimer ()
{
   MqlDateTime mdt;
   datetime dCurrent = TimeCurrent (mdt);
   
   if (!g_bEnterInfoSent && mdt.hour + 3 == 9 )
   {
       MqlDateTime startTime;
       TimeGMT (startTime);
      startTime.hour = 7 ;
      startTime.min = 0 ;
      startTime.sec = 0 ;
      g_dDayBegin = StructToTime (startTime);
      
      startTime.hour = 17 ;
      startTime.min = 0 ;
      startTime.sec = 0 ;
      g_dEndOfTheDay = StructToTime (startTime);

      g_bEnterInfoSent = true ;
   }
   
   if (g_bEnterInfoSent && mdt.hour + 3 == 22 )
   {
      g_bEnterInfoSent = false ;
   }
   
   datetime lastTime = TimeCurrent ();
   
   if ( true )
   {
       MqlTick tick[];
       int nResult = GetFreshTicks(tick);
      
       MqlDateTime tickTime;
      
       if ( ArraySize (tick))
      {
         TimeToStruct (tick[ 0 ].time, tickTime);
         
         string sTicksFileName = StringFormat ( "%s.ticks.%.04d.%.02d.%.02d.csv" , Symbol (), tickTime.year, tickTime.mon, tickTime.day);
      
         int nTicksOutputFile = FileOpen (sTicksFileName, FILE_READ | FILE_WRITE | FILE_CSV , ',' );
         if (nTicksOutputFile == INVALID_HANDLE ) nTicksOutputFile = FileOpen (sTicksFileName, FILE_WRITE | FILE_CSV , ',' );
         
         if (nTicksOutputFile != INVALID_HANDLE )
         {
             FileSeek (nTicksOutputFile, 0 , SEEK_END );
   
             MqlDateTime tickTime;
         
             for ( int i = 0 ; i< ArraySize (tick); i++)
            {
               TimeToStruct (tick[i].time, tickTime);
               
               FileWrite (nTicksOutputFile, StringFormat ( "%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000" , tickTime.year, tickTime.mon, tickTime.day,
                                                                                                   tickTime.hour, tickTime.min, tickTime.sec),
                                           tick[i].bid,
                                           tick[i].ask,
                                           tick[i].last,
                                           tick[i].volume,
                                           ((tick[i].flags & TICK_FLAG_BUY ) ? "Buy" : "" ) + 
                                           ((tick[i].flags & TICK_FLAG_SELL ) ? "Sell" : "" ));
            }
            
             FileClose (nTicksOutputFile);
         }
                                     
         g_dDayBegin = dCurrent;                                   
      }
   }
}

Sonuç olarak, ALRS ve AFLT olmak üzere iki kağıt üzerinde piyasaya sürüldü. Tikler sadece son birkaç gün içinde geri döndü. Bugün için - değildi. Ne yanlış olabilir?

Dosyalar:
Files.zip  843 kb
 
antru :

nedense, mevcut gün için keneler, hem eski algoritmaya göre hem de yenisine göre genel olarak görüntülenmeyi bıraktı. ve penceredeki şeridin açık olup olmadığına bakılmaksızın ...

İşte işlevinizi eklediğim kod ...

Sonuç olarak, ALRS ve AFLT olmak üzere iki kağıt üzerinde piyasaya sürüldü. Tikler sadece son birkaç gün içinde geri döndü. Bugün için - değildi. Ne yanlış olabilir?

beslemedeki pencerelerde keneler var, son 100.000 keneyi kaydediyorum - bugün için kene yok

Dosyalar:
Documents.zip  812 kb
 
Ve şimdi tikler var. Ne yanlış olabilir? Kim suçlu? Komisyoncu? Meta tüccar mı?