빌드 1485 이후 CopyTicks() 및 CopyTicksRange() 개선을 위한 버그 및 제안. - 페이지 4

 
Yury Kirillov :
EA에서 틱과 OnTisk 및 CopyTicks를 얻는 가능한 모든 방법을 사용하고 결과를 비교하고 가장 적절한 것을 사용하십시오.
그리고 OnTick()은 무엇과 관련이 있습니까? 모든 틱을 수신하는 것이 아니라 틱이 도착했다는 사실을 처리하기 위한 것입니다. 여기서 아무 것도 비교할 필요가 없습니다. OnTick()은 모든 틱에서 호출되지 않으며 MqlTick 구조의 모든 데이터를 가져올 수 없습니다.
 
서비스 데스크는 새 빌드, 1545에서 시도할 것을 제안했습니다. 그러나 결과는 이전과 같이 변경되지 않았습니다. 일부 증권에 대해 오전 10시부터 오전 11시까지의 틱 요청은 0 어레이를 반환한 다음 어떤 이유로 데이터가 오기 시작합니다. 11시부터. 아마도 그 후에 요청했을 때 틱은 이미 "정상"이지만 관련성은 없습니다.
 
일반적으로 이것이 유일한 메시지입니다. 꽤 오랜 시간이 지났지만 서비스 데스크는 응답하지 않습니다. 내 메시지를 무시해도 됩니까?
 
antru :
일반적으로 이것이 유일한 메시지입니다. 꽤 오랜 시간이 지났지만 서비스 데스크는 응답하지 않습니다. 내 메시지를 무시해도 됩니까?
메시지 무시와 관련하여 - 지점에 실수를 저질렀습니다. SD에 대한 별도의 스레드가 있습니다. 일반적으로 응용 프로그램에 의견을 작성하여 상기시키십시오. 코드 및 기타 증거를 SD에 첨부했습니까?
 
Alexey Kozitsyn :
메시지 무시와 관련하여 - 지점에 실수를 저질렀습니다. SD에 대한 별도의 스레드가 있습니다. 일반적으로 응용 프로그램에 의견을 작성하여 상기시키십시오. 코드 및 기타 증거를 SD에 첨부했습니까?

네, 물론 코드까지 설명했습니다... 침묵... 팁 감사합니다. 별도의 스레드로 작성하겠습니다.
 

CopyTicksRange를 테스트하기 위해 디버그 코드를 만들었습니다. 서비스 데스크에는 영구적인 침묵이 있지만 코드에 오류가 있는 것은 아닐까? 아무래도 내 눈은 이미 흐릿해진 것 같은데... 신선한 시선으로 봐주세요.

아래는 작업 결과의 첨부 파일에 있는 코드입니다. 첫 번째 zip - 거래 전 메타 트레이더 시작, 두 번째 zip - 모스크바 시간 10.30에 시작(디버그 파일에서 시간은 3시간 적음).

첫 번째 zip에서 진드기가 반환되지 않은 이유를 이해하지 못합니다.

일반적으로. 여러분, 라이브 피드는 어떻게 얻나요? 내가 바퀴를 재발명하고 뭔가 잘못하고 있는 것일 수도 있습니다. 실시간으로 종이에 눈금을 표시하는 방법에 대한 코드의 예를 들어주실 수 있습니까?

 //+------------------------------------------------------------------+
//|                                                     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);
      }
   }
}

파일:
backup.01.zip  292 kb
backup.02.zip  271 kb
 
antru :

여러분, 라이브 피드는 어떻게 얻나요?

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

신비한 주식 표시기

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 :

어떤 이유로, 어떤 이유로 인해 현재 날짜의 눈금은 이전 알고리즘과 새 알고리즘 모두에 따라 더 이상 표시되지 않습니다. 그리고 창의 리본이 켜져 있는지 여부에 관계없이 ...

다음은 귀하의 기능을 삽입한 코드입니다...

 //+------------------------------------------------------------------+
//|                                                     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;                                   
      }
   }
}

그 결과, ALRS와 AFLT의 두 가지 논문에 착수했습니다. 틱은 지난 며칠 만에 돌아왔습니다. 오늘은 - 그렇지 않았습니다. 무엇이 잘못될 수 있습니까?

파일:
Files.zip  843 kb
 
antru :

어떤 이유로, 어떤 이유로 인해 현재 날짜의 눈금은 이전 알고리즘과 새 알고리즘 모두에 따라 더 이상 표시되지 않습니다. 그리고 창의 리본이 켜져 있는지 여부에 관계없이 ...

다음은 귀하의 기능을 삽입한 코드입니다...

그 결과, ALRS와 AFLT의 두 가지 논문에 착수했습니다. 틱은 지난 며칠 만에 돌아왔습니다. 오늘은 - 그렇지 않았습니다. 무엇이 잘못될 수 있습니까?

피드의 창에 틱이 있습니다. 마지막 100000 틱을 저장합니다. 오늘은 틱이 없습니다.

파일:
Documents.zip  812 kb
 
그리고 이제 틱이 있습니다. 무엇이 잘못될 수 있습니까? 누가 유죄입니까? 브로커? 메타 트레이더?
사유: