iClose/iOpen 시계열 등에 대한 액세스 작업 시 MQL5 버그 - 페이지 5

 
Renat Fatkhullin :

항상 Market Watch에서 각 기호의 실제 마지막 2000틱을 유지하는 표시기의 참조 코드를 표시하십시오.

그리고 운세는 한편으로는 얻고 다른 한편으로는 단어 형태의 추천 만 얻습니다.

 
Renat Fatkhullin :

우리는 코드를 살펴볼 필요가 있습니다.

여기 위의 코드에서 논리적 및 리소스 문제의 꽃다발이 분명히 있습니다.

나는 이와 같은 일을 하는데 필요한 경우 수정 방법과 수정 사항을 알려주십시오.

 bool flag = true ;

//+————————————————————————————————————————————————————————————————————————————+
int OnInit ()
{
  /*
  тут определены и настроены буферы
  */
  

  flag = true ;

   //---
   return ( INIT_SUCCEEDED );
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
void OnDeinit ( const int reason)
{
   //--- destroy timer
   EventKillTimer ();
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
int OnCalculate ( const int        rates_total,
                 const int        prev_calculated,
                 const datetime &time        [],
                 const double    &open        [],
                 const double    &high        [],
                 const double    &low         [],
                 const double    &close       [],
                 const long      &tick_volume [],
                 const long      &volume      [],
                 const int       &spread      [])
{
   //Print ("---");
   //Print (rates_total, " ", prev_calculated);
   //Print ("---");

   if (flag)
  {
     if ( SeriesInfoInteger ( Symbol (), Period (), SERIES_SYNCHRONIZED ))
    {
       Print ( "1 История синхронизирована" );
       int bars = Bars ( Symbol (), Period ());
       Print ( "Баров в истории " , bars);


       MqlTick ticks_array [];

       datetime from = TimeByNumberOfCandles ( Symbol (), PERIOD_M1 , ParentCandles_P);
       MqlDateTime sdt;
       ulong from_msc = (( ulong )from) * 1000 ;

       ResetLastError ();
       int count = CopyTicksRange ( Symbol (), ticks_array, COPY_TICKS_INFO , from_msc); //, to_msc);
       Print ( "Скопировано " , count, " тиков" );

       int error = GetLastError ();
       Print (error);

       if (count <= 0 || error != 0 )
      {
         Print ( "Ошибка при получении данных" );
         return (rates_total);
      }

       Print (ticks_array [ 0 ].time_msc, " " , ticks_array [count - 1 ].time_msc); // 0-й самый старый

       for ( int i = 0 ; i < count; i++)
      {
        // тут вычисления и операции с тиками
      }

      /*
      тут заполнение индикаторных буферов значениями полученными после работы с тиками
      */
      }
      
      flag = false ;
    }
     else
    {
       Print ( "2 История НЕ синхронизирована!" );
       return (rates_total);
    }
  }


   return (rates_total);
}
//+————————————————————————————————————————————————————————————————————————————+
 
Renat Fatkhullin :

우리는 코드를 살펴볼 필요가 있습니다.

여기 위의 코드에서 논리적 및 리소스 문제의 꽃다발이 분명히 있습니다.

이 코드에 논리적인 문제가 있습니까? 아니면 제가 놓치고 있는 것이 있습니까?

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

iClose/iOpen 시계열 등에 대한 액세스 작업 시 MQL5 버그

스타니슬라프 드레이 , 2018.11.14 16:28

버그 보고서와 이상한 관계가 있습니다. 그들은 뭔가를 증명하기 위해 나에게 돈을 지불하지 않는 것과 같습니다. 나는 가능한 한 상황을 설명했다.

문제는 나에게만 있는 것이 아니라 30번째 업데이트 이후에 문제가 나타났지만 여전히 당신은 내가 바보이고 일부 느린 지표가 탓임을 암시하고 있습니다.

그리고 그 전에는 일년 내내 브레이크를 밟지 않았습니까?

다음은 M30에서 실행된 후 25분 후에 정지되는 코드의 예입니다.

 //+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link        "https://www.mql5.com/ru/users/fan9"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
     datetime CM1_T[ 1 ];
     if ( CopyTime ( _Symbol , PERIOD_M1 , 0 , 1 ,CM1_T)==- 1 ){
       Comment ( "\n\n CopyTime return -1" );
       return ;
    }
     Comment ( "\n\n CopyTime : " + TimeToString (CM1_T[ 0 ], TIME_DATE | TIME_SECONDS ));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade ()
  {
//---
   
  }
//+------------------------------------------------------------------+

 
Renat Fatkhullin :

즉시 모든 것을 얻을 수는 없다는 점을 분명히 이해하고 지표를 작성해야 합니다.

OnInit에서 CopyXXX에 대한 단일 호출로 필요한 기기의 기록 로드를 자극해야 하지만 OnCalculate에서 완전한 초기화를 기다려야 합니다.

오류가 있는 초기화 단계에서 데이터를 잘못 기다리다가 차단됩니다.

그렇게 해볼게

이제 OnCalculate에서 쿼리를 만들고 거기에서 기다립니다(물론 모든 틱 은 아니지만 계산할 때 처음에만).

 
fxsaber :

항상 Market Watch에서 각 기호의 실제 마지막 2000틱을 유지하는 표시기의 참조 코드를 표시하십시오.

그리고 운세는 한편으로는 얻고 다른 한편으로는 단어 형태의 추천 만 얻습니다.

나는 합류! 틱이 아니라 바가 더 좋습니다.

승인된 진정한 다중 통화 코드의 예가 필요합니다.

그렇지 않으면 우리는 어둠 속에서...

 

오류를 현지화하고 발견하면 구독을 취소하겠습니다.

 
transcendreamer :

나는 합류! 틱이 아니라 바가 더 좋습니다.

승인된 진정한 다중 통화 코드의 예가 필요합니다.

그렇지 않으면 우리는 어둠 속에...

막대와 틱은 MT5에서 독립적으로 사는 다른 epostase입니다. 둘 다 필요합니다.
 
Vladimir Karputov :

또한 다른 사람의 시간 프레임으로 작업하는 경우 1분에 한 번 이 시간 프레임(모든 CopyXXXX 기능)에서 OHLC를 수신해야 한다는 것이 항상 권장되었습니다. 항상 그래왔다.

여기에서 일어나는 모든 일에 대해 이미 침을 뱉고 싶었지만 불행히도 MQ 제품에 약 10년을 보냈습니다.

이제 모든 것이 비즈니스에 달려 있습니다. Vladimir, CopyXXXX 기능 사용에 대한 귀하의 조언은 제가 비전문적으로 작성한 코드의 관점에서 볼 때 어떠한 어려움도 나타내지 않았기 때문에 제가 사용한 것입니다.

솔직히 비뚤어진 손에만 문제가 있기를 바랐는데 아니요, 문제는 그 손에만 있는 것이 아닙니다. 아래와 같은 화면이 나오는데, 기술지원팀의 이상한 설명을 예상하며 코드가 제대로 작성되지 않았고 100500개의 다른 지표와 원하는 것이 문제가 될 것이라고 합니다. 테스트 중인 하나를 제외하고 100500 지표가 없습니다. 단일 Expert Advisor가 없으며 터미널에 두 개의 상품만 열려 있으며 표시기는 EURUSD 1M 쌍에서 테스트되며 표시기는 동일한 상품의 M15 시간 프레임에서 데이터를 로드합니다. , 즉. 다른 악기에서 데이터를 다운로드하려는 것이 아니라 Market Watch에 몇 개만 있습니다.

부하 측면에서 터미널의 작동을 위해 일반적으로 이상적인 상황은 물론 작동 조건이 아니지만 이 경우에도 문제가 있고 제 생각에는 이 문제를 "BUG"라고 합니다. .

표시기에서 iClose 및 iBars 함수는 Commet()의 상태를 반영하기 위해서만 호출됩니다. 마켓리뷰에서는 화면이 생성되는 순간, 터미널 창에서는 현재 iClose, iBars 함수를 호출한 상태, 인디케이터의 계산 부분에서는 CopyXXXX 함수를 사용합니다.

가방

보시다시피 표시기는 16:31에 다시 로드되어 성공적으로 작동했지만(심지어 기뻤습니다) iClose 데이터 업데이트는 각각 00:15 이후에 중지되었으며 CopyXXXX 함수도 업데이트되지 않은 데이터를 반환합니다. 오류는 MT의 창자 어딘가에서 발생합니다.

제 생각에는 서버에서 데이터를 읽을 때 오류가 나는데, 여러가지 이유(인터넷 부족, 서버 붐비는 등)가 있을 수 있지만 어떤 이유에서인지 원인을 제거한 후 작업을 재개합니다. 접속이 안 되니 유저들의 소스코드는 얼마든지 테스트해볼 수 있다는 결론을 내렸지만, 근처에 서버가 있다면 절대 이 문제를 식별할 수 없을 텐데, 존재하고 비뚤어진 이유 때문만이 아니라 인코더의 핸들.

 

나는 또한 어제 Stanislav의 코드를 테스트하기로 결정했습니다. 몇 시간 후 시간 업데이트가 중지되었습니다. 시간대를 바꾸지 않고 차트의 컨텍스트 메뉴를 통해 간단히 업데이트하고 시간이 계속되었습니다.

오늘은 시간과 현재 TF를 보기 위해 코드를 약간 수정했습니다.

 void OnTick ()
{
 datetime CM1_T[ 1 ];
 datetime CM2_T[ 1 ];
 CopyTime ( _Symbol , PERIOD_M1 , 0 , 1 ,CM1_T);
 CopyTime ( _Symbol , PERIOD_CURRENT , 0 , 1 ,CM2_T);
 Comment (" CopyTime PERIOD_CURRENT : "+ TimeToString (CM2_T[ 0 ], TIME_DATE | TIME_SECONDS )+"\nCopyTime PERIOD_M1 : "+ TimeToString (CM1_T[ 0 ], TIME_DATE | TIME_SECONDS ));   
}

그리고 말 그대로 15분 후 "비네이티브" TF에 대한 업데이트가 중지되었지만 현재의 TF에서는 정상적으로 업데이트되었습니다. 일정을 업데이트하고 나니 시간이 다시 흘렀습니다.

단말기는 휴대용 모드에서 작동합니다. 시스템과 터미널 자체는 SSD 드라이브에 있습니다.


 

무슨 일이 일어 났는지 모르겠지만 MQL5에서 지난 MQ 챔피언십에 대한 봇을 작성할 때 다중 통화였으며 다른 악기에서 데이터를로드하는 데 문제가 있음을 알지 못했습니다.

왜냐하면 일부 lakhmat 연도에 MQL5는 문제 없이 작동할 정도로 완벽하지 않았습니다(최적화되지 않음). 예, 아마도 많은 리소스를 흡수했지만 예상한 결과를 얻었고 지금처럼 룰렛은 아닙니다. 운이 좋든 그렇지 않든.

예를 들어 이 문제는 MQL5용 상용 제품을 개발하는 사람으로서 저를 잘 특징지을 수 없고, 시장에서 구매한 제품을 사람이 지불하면 두 배로 즐겁지 않을 것이며, 이러한 문제로 인해 단순히 버그가 발생할 것입니다. "버그".