RefreshRates() 함수는 무엇을 업데이트합니까? - 페이지 3

 
Artyom Trishkin :

iXXXXX 기능의 오류가 의심되는 경우 SymbolInfoXXXX 기능을 사용하십시오.

iXXXXX를 SymbolInfoXXXX 로 바꾸는 예가 있습니다.

 
Mikhail Nazarenko :

내 코드는 비슷합니다. OnTick 오류

필요한

현재 시간 프레임이 M5인 경우 M5를 H1 및 M1과 비교해야 합니다.

현재 시간 프레임, 즉 M5가 나에게 올바르게 표시되었습니다. 문제는 H1과 M1에 있었습니다.

Alpari에서 실제 EURCHF M5를 확인했지만 Print 대신 각 레벨에서 가로 세그먼트를 그렸습니다.

네, 처음에는 H1을 그렇게 넣었는데 나중에 비교가 너무 드뭅니다. 그래서 M5로 바꿨습니다.

마이클 나사렌코 :

iXXXXX를 SymbolInfoXXXX 로 바꾸는 예가 있습니다.

Artyom이 실수했습니다...

iClose 대신 사용할 수 있습니다.

 int    CopyClose ( 
   string            symbol_name,       // имя символа 
   ENUM_TIMEFRAMES   timeframe,         // период 
   int               start_pos,         // откуда начнем  
   int               count,             // сколько копируем 
   double            close_array[]       // массив для копирования цен закрытия 
   );

이 정도

 double close_M5[];
     CopyClose ( _Symbol , PERIOD_M5 , 1 , 1 , close_M5);

따라서 요술봉을 한 번 움직여 여러 막대의 값을 얻을 수 있습니다.

이 함수는 true 또는 false를 반환하지만 이 예제에서는 확인하지 않았습니다. 스스로 추측할 수 있습니다...

 
Alexey Viktorov :
네, 처음에는 H1을 그렇게 넣었는데 나중에 비교가 너무 드뭅니다. 그래서 M5로 바꿨습니다.

거기에 코드를 추가하고 위에 게시했습니다. 나는 당신의 버전을 집에 두고, 결과는 동일합니다. 거의 모든 M5 양초에는 불일치가 있습니다. 당신의 결과는 무엇입니까?

 
Mikhail Nazarenko :

거기에 코드를 추가하고 위에 게시했습니다. 나는 당신의 버전을 집에 두고, 결과는 동일합니다. 거의 모든 M5 양초에는 불일치가 있습니다. 당신의 결과는 무엇입니까?

여기서 변경해야 합니다.

 if (NewBar( PERIOD_M5 ))

 if (NewBar( PERIOD_H1 ))
 
Alexey Viktorov :

여기서 변경해야 합니다.

아니요, _Period가 더 좋습니다. 우리는 H1에서 0 인용이 나타날 때까지 강제로 기다릴 것이고 현재 기간은 정기적으로 업데이트됩니다 . 시간이 업데이트될 때가 아니라 시간의 첫 번째 초에 데이터를 수신해야 합니다.

예제를 추가하고 확인하고 싶습니다.
double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);
    
    double ARRAY_M1[];
    CopyClose(_Symbol, PERIOD_M1, 1, 1, ARRAY_M1);
    double ARRAY_H1[];
    CopyClose(_Symbol, PERIOD_H1, 1, 1, ARRAY_H1);
    
    if(ARRAY_H1[0] != close_M5)
      Print(ARRAY_H1[0], " CopyClose H1 != M5 ", close_M5);
    if(ARRAY_M1[0] != close_M5)
      Print(ARRAY_M1[0], " CopyClose M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n",
               ARRAY_H1[0], " CopyCloseH1\n",
               ARRAY_M1[0], " CopyCloseM1\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 

 
Alexey Viktorov :

여기서 변경해야 합니다.

결과는 iClose() 와 동일합니다. 나중에 iClose와 CopyClose는 같은 위치에서 데이터를 가져옵니다.

Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
  • www.mql5.com
iClose - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko :

아니요, _Period가 더 좋습니다. 우리는 H1에서 0 인용이 나타날 때까지 강제로 기다릴 것이고 현재 기간은 정기적으로 업데이트됩니다 . 시간이 업데이트될 때가 아니라 시간의 첫 번째 초에 데이터를 수신해야 합니다.

예제를 추가하고 확인하고 싶습니다.

새 막대 모양의 기능이 어떻게 작동하는지 이해하지 못하는 것 같습니다.

 bool NewBar( ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0 ;
   datetime tm = iTime ( _Symbol , tf, 0 );
   if (tm == 0 )
       return false ;
   if (tm != nt)
     {
      nt = tm;
       return true ;
     }
   return false ;
 } /******************************************************************/ 

따라서

마이클 나사렌코 :

결과는 iClose() 와 동일합니다. 나중에 iClose와 CopyClose는 같은 위치에서 데이터를 가져옵니다.

새로운 TICK 값이 도착했을 때 OHLC로부터 바 마감 값 및/또는 다른 값을 수신할 때 값은 항상 문제가 없습니다.
 
Alexey Viktorov :

새 막대 모양의 기능이 어떻게 작동하는지 이해하지 못하는 것 같습니다.

따라서

새로운 TICK 값이 도착했을 때 OHLC로부터 바 마감 값 및/또는 다른 값을 수신할 때 값은 항상 문제가 없습니다.

질문에 답하세요. iClose(1) 함수가 새 양초에 대해 오래된 정보를 반환 하고 업데이트된 정보나 오류가 아닌 정보를 반환하는 이유는 무엇입니까? 이것은 버그입니다.

 
Mikhail Nazarenko :

질문에 답하세요. iClose(1) 함수가 새 양초에 대해 오래된 정보를 반환 하고 업데이트된 정보나 오류가 아닌 정보를 반환하는 이유는 무엇입니까? 이것은 버그입니다.

이것이 버그라면 모든 사람 또는 거의 모든 사람이 버그를 가지고 있어야 합니다. 당신뿐이라면 코드의 문제입니다.

이제 새로운 막대 H1의 정의와 함께 M15에 대한 전문가 고문이 있습니다.

 /************************Expert tick function************************/
void OnTick ()
 {
   if (NewBar( PERIOD_H1 ))
   {
    close_H1 = iClose ( _Symbol , PERIOD_H1 , 1 );
     CopyClose ( _Symbol , PERIOD_M5 , 1 , 1 , close_M5);
    close_M1 = iClose ( _Symbol , PERIOD_M1 , 1 );
     if (close_H1 != close_M1)
       Print (close_H1, " != " , close_M1);
   }
   Comment (close_H1, "\n" ,
          close_M5[ 0 ], "\n" ,
          close_M1, "\n"
         );
 } /******************************************************************/

그리고 댓글에 있는 내용은

불일치가 없습니다.

 
좋아요, 관심을 가져주신 모든 개발자 덕분에 NewBar와 같은 목발을 만들러 갔습니다.))) 주제가 종료되었습니다.