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);
또 다른
반품;
- www.mql5.com
static int BARS; //+------------------------------------------------------------------+ //| NewBar function | //+------------------------------------------------------------------+ bool IsNewBar() { if (BARS!= Bars ( _Symbol , _Period )) { BARS= Bars ( _Symbol , _Period ); return ( true ); } return ( false ); }
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
다음을 시도할 수도 있습니다.
// 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. }
나는 이것을 사용...
안녕 모두,
저는 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이면 가서 내 처리를 수행하고, 그렇지 않으면 반환합니까? 내가 뭔가를 놓치고 있습니까?
감사해요,
이안