새 막대를 감지하는 방법

 

안녕 모두,

저는 MQL5에 대한 완전한 초보자이지만 다른 플랫폼에 대해 상당한 양의 코딩을 수행했습니다.

EA가 새로운 바에서만 실행하는 것이 왜 그렇게 어려운지 궁금합니다. "new bar" 이벤트 핸들러를 포함하여 일부 기사를 본 적이 있는데 매우 어려운 것 같습니다.  

작동하지 않고 "new bar" 이벤트 핸들러를 사용해야 하는 경우 관련 파일을 다운로드하여 Files(?) 폴더에 복사한 다음 #include할 수 있습니까? 기본적으로 자신이하는 일을 전혀 모르는 나와 같은 사람들을 위해 이것이 문서화 된 곳이 있습니까?

저는 https://www.mql5.com/en/articles/100의 튜토리얼을 진행 중이며, 가장 먼저 "바" 기능을 사용하여 계산을 수행하기에 충분한 바가 있는지 확인했습니다. 그러나 다음 코드 조각은 분명히 새로운 막대를 감지하도록 설계되었으며 (어쨌든 내가 이해하기로는) 매우 복잡한 코드 조각입니다. Bars 기능 을 사용하여 새로운 Bar를 감지할 수 없습니까? if(Bars > int LastBarCount ) {bool IsNewBar = true; LastBarCount = 막대;} else {IsNewBar = false;}. 그런 것이 효과가 있을까요? .

위시리스트에 하나. OnTick 대신 재정의할 수 있는 OnNewBar 이벤트가 있으면 좋지 않을까요? 내가 본 모든 지표는 진드기가 아니라 막대에서 작동하기 때문에 모든 사람의 삶을 훨씬 더 쉽게 만들 것이라고 생각합니다.

방금 또 다른 가능성을 찾았습니다: "BarsCalculated". 설명에서 이것이 무엇을 의미하는지 완전히 확신할 수 없지만 EA가 이미 처리한 막대의 수처럼 보입니다. 그것이 사실이라면 내가 확인해야 할 모든 것은 if(Bars > BarsCalculated), true이면 가서 내 처리를 수행하고, 그렇지 않으면 반환합니까? 내가 뭔가를 놓치고 있습니까?

감사해요,

이안

Step-By-Step Guide to writing an Expert Advisor in MQL5 for Beginners
  • 2010.06.09
  • Samuel
  • www.mql5.com
The Expert Advisors programming in MQL5 is simple, and you can learn it easy. In this step by step guide, you will see the basic steps required in writing a simple Expert Advisor based on a developed trading strategy. The structure of an Expert Advisor, the use of built-in technical indicators and trading functions, the details of the Debug mode and use of the Strategy Tester are presented.
 


OnTick 기능의 시작 부분에서 EA에서 이것을 시도하십시오.

// 정적 Old_Time 변수를 사용하여 막대 시간을 제공합니다.

// OnTick을 실행할 때마다 저장된 시간으로 현재 막대 시간을 확인합니다.

// 막대 시간이 저장된 시간과 같지 않으면 새 눈금이 있음을 나타냅니다.


정적 날짜 시간 Old_Time;

날짜 시간 New_Time[1];

부울 IsNewBar=거짓;


// 마지막 막대 시간을 요소 New_Time[0]에 복사

정수 복사 = CopyTime(_Symbol,_Period,0,1,New_Time);

if(copyed>0) // ok, 데이터가 성공적으로 복사되었습니다.

{

if(Old_Time!=New_Time[0]) // 이전 시간이 새 막대 시간과 같지 않은 경우

{

IsNewBar=참; // 첫 번째 호출이 아닌 경우 새 막대가 나타납니다.

if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("여기에 새 막대가 있습니다. ",New_Time[0]," 이전 시간은 ",Old_Time);

Old_Time=New_Time[0]; // 바 시간 절약

}

}

또 다른

{

Alert("이력 시간 데이터를 복사하는 중 오류가 발생했습니다. error =",GetLastError());

재설정 마지막 오류();

반품;

}


//--- EA는 새로운 바가 있는 경우에만 새로운 거래를 확인해야 합니다.

if(IsNewBar==거짓)

{

반품;

}

//--- 작업할 막대가 충분합니까?

int Mybars=바(_Symbol,_Period);

if(Mybars<60) // 전체 막대가 60개 미만인 경우

{

Alert("60개 미만의 바가 있습니다. 이제 EA가 종료됩니다!!");

반품;

}


 

안녕하세요 oneillj님

이미 답장을 한 줄 알았는데 인터넷 에테르 속으로 사라진 것 같다.

당신이 제공한 코드 조각은 내가 처음에 불평했던 것과 거의 비슷합니다. 왜 그렇게 복잡합니까? 더 쉬운 방법이 있어야 한다고 생각했습니다. 나는 이것이 효과가있는 것 같습니다. 내가 틀렸다면 저를 수정하십시오. (저도 BarsCalculated를 사용해 보았지만 항상 Bars와 같기 때문에 테스트는 항상 false로 평가되었습니다.)

정적 정수 LastBarCount = 0;
if (바(_Symbol, _Period) > LastBarCount)
LastBarCount = 막대(_Symbol, _Period);
또 다른
반품;

;-) 이안
Documentation on MQL5: Timeseries and Indicators Access / BarsCalculated
  • www.mql5.com
Timeseries and Indicators Access / BarsCalculated - Documentation on MQL5
 
나는 이것을 사용...
 static int BARS;
//+------------------------------------------------------------------+
//| NewBar function                                                  |
//+------------------------------------------------------------------+
bool IsNewBar()
   {
       if (BARS!= Bars ( _Symbol , _Period ))
        {
            BARS= Bars ( _Symbol , _Period );
             return ( true );
        }
       return ( false );
   }
 
"New Bar" Event Handler
  • 2010.10.11
  • Konstantin Gruzdev
  • www.mql5.com
MQL5 programming language is capable of solving problems on a brand new level. Even those tasks, that already have such solutions, thanks to object oriented programming can rise to a higher level. In this article we take a specially simple example of checking new bar on a chart, that was transformed into rather powerful and versatile tool. What tool? Find out in this article.
 
ssn :
나는 이것을 사용...
이 방법의 위험은 기호에 대한 가격 데이터가 1971년 1월 4일부터 시작되지 않으면 전문가가 차트에 첨부된 동안 로드된 모든 과거 데이터가 새 막대로 읽힐 것이라는 것입니다...
 
이 주제와 관련이 없는 주석은 " mql5를 MT4에서 사용할 수 있습니까? "로 이동했습니다.
 

iTime 기능 은 막대의 시간을 제공합니다.

변경되면 새 막대입니다.

 
Nathan5 :

iTime 기능은 막대의 시간을 제공합니다.

변경되면 새 막대입니다.

이 주제는 mql5에 관한 것입니다. iTime() 함수 가 없습니다.
 

다음을 시도할 수도 있습니다.


 // Rates structure array for last two bars 
   MqlRates mrate[ 2 ];                 
   CopyRates ( Symbol (), Period (), 0 , 2 , mrate);

// NEW BAR CHECK.
//---------------
   static double    dBar_Open;     
   static double    dBar_High;
   static double    dBar_Low;
   static double    dBar_Close;
   static long      lBar_Volume;
   static datetime nBar_Time;

// Boolean for new BAR confirmation. 
   bool bStart_NewBar = false ;

// Check if the price data has changed tov the previous bar.   
   if (mrate[ 0 ].open != dBar_Open || mrate[ 0 ].high != dBar_High || mrate[ 0 ].low != dBar_Low || mrate[ 0 ].close != dBar_Close || mrate[ 0 ].tick_volume != lBar_Volume || mrate[ 0 ].time != nBar_Time)
         {
         bStart_NewBar = true ; // A new BAR has appeared!        

// Update the new BAR data.     
         dBar_Open   = mrate[ 0 ].open;      
         dBar_High   = mrate[ 0 ].high;
         dBar_Low    = mrate[ 0 ].low;
         dBar_Close  = mrate[ 0 ].close;                 
         lBar_Volume = mrate[ 0 ].tick_volume;
         nBar_Time   = mrate[ 0 ].time;
         }

// Check if a new bar has formed.   
   if (bStart_NewBar == true )
         {
         
// Your code.          
         
         }
 
Stephen Njuki :
나는 이것을 사용...
슬프게도 이것은 MQL5에서 작동하지 않는 것 같습니다.
사유: