막대 및 볼륨은 새 막대를 감지할 수 없습니다.
컴퓨터는 나노초 안에 작동하므로 잘 코딩된 EA는 20ms 안에 많은 일을 할 수 있습니다.
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
- www.mql5.com
Alain님, 감사합니다.
매우 흥미로운 ... 정확히 내가 추측하는 것입니다. . . 10배 더 빠릅니다. .. 흠.
의미: TimeCurrent()는 빠르고 막대 테두리와 동기화되어 있습니까?
왜 .... 흠 ...
그것에 대해 얘기할 시간이 필요합니다.
윌버
Ok - 이와 같은 것을 좋아하는 사람들을 위해: 이 문제에 대한 나의 연구.
모든 "OnTick" 이벤트에서 파일에 문장을 썼습니다.
TimeLocal(PC CLock), TimeCurrent(), SymbolInfoTick()을 사용하여 마지막 틱에 대한 일부 정보 및 - CopyRates()를 사용하여 - 현재 막대에 대한 일부 정보.
"USD/JPY"의 예 - 기간은 "M1"입니다.
PC 시계의 19시 43분 1초, 43분의 첫 번째 틱이 들어왔을 때, 동시에 새로운 막대가 생겼습니다.
사실 외에는 tick-volume이 1이 아닙니다. 이것은 정상적인 사물의 흐름입니다.
때로는 그렇게 쉽지 않습니다 - 이 경우와 같이:
PC는 41분 막대의 틱이 세 번 더 들어왔을 때 이미 19:42:00을 표시합니다. 여전히 19:41:59의 타임스탬프가 있습니다.
이제 세상은 심호흡을 합니다. 8.150밀리초의 완전한 고요함입니다.
그런 다음 - PC는 이미 19:42:09를 표시합니다. - 새 막대의 첫 번째 눈금인 42분 막대가 들어왔습니다.
눈금은 19:42:07로 표시되고 - 함께 제공된 19:42 막대이기 때문에 막대 타임스탬프는 19:42:00입니다.
이제 .... 흠 ....
1. TimeCurrent()는 항상 틱의 타임스탬프와 같습니까?
나는 40.000 레코드를 확인했고 마지막 틱의 타임 스탬프가 아닌 동안 TimeCurrent가 이미 전환된 5개의 경우만 발견했습니다.
2. last_tick은 항상 새 막대가 열리기 전에 있습니까?
(계속)
TimeCurrent()는 서버의 마지막 틱 시간이며 차트 기호에서 가져온 것인지 여부는 코드에 따라 다릅니다.
귀하의 "마지막 틱" 문제를 이해할 수 없습니다. 이 출력을 생성한 코드를 표시해야 합니다.
안녕 알랭
OnTick()에서 TimeCurrent()를 확인 하여 내가 처리하는 기호에 속하는지 확인합니다.
글쎄, 이것은 작고 빠른 내 "새 막대 식별자"여야 합니다. 어떻게 생각하세요?
//--- New Bar
bool NewBar = false;
long currPeriodSeconds;
double currPeriodProgress = 0;
int OnInit(void) //-----------------------------------------------
{
currPeriodSeconds = PeriodSeconds();
return(INIT_SUCCEEDED);
}
void OnTick() //--------------------------------------------------
{
if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
NewBar = true;
else NewBar = false;
currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);
이 시퀀스로 확인하겠습니다.
//--- Just for testing
int ExtHdlFile1=0;
MqlRates rates[1];
//--- New Bar
bool NewBar = false;
long currPeriodSeconds;
double currPeriodProgress = 0;
int OnInit(void) // -------------------------------------------------------
{
currPeriodSeconds = PeriodSeconds();
ExtHdlFile1=FileOpen("NewBarTest.csv",FILE_READ|FILE_WRITE|FILE_CSV);
FileSeek (ExtHdlFile1,0,SEEK_END);
FileWrite(ExtHdlFile1, "TimeLocal",
"TimeCurrent",
"rates[0].time",
"rates[0].tick");
return(INIT_SUCCEEDED);
}
void OnTick() // -----------------------------------------------------------
{
if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
NewBar = true;
else NewBar = false;
currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);
//--- lets check this
if(NewBar)
{
// last Time Stamp of old Bar
FileWrite(ExtHdlFile1, " ",
" ",
TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
IntegerToString(rates[0].tick_volume));
// get the new bar
if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return;
// first Time Stamp of new Bar
FileWrite(ExtHdlFile1,TimeToString(TimeLocal(),TIME_MINUTES|TIME_SECONDS),
TimeToString(TimeCurrent(), TIME_MINUTES|TIME_SECONDS),
TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
IntegerToString(rates[0].tick_volume));
}
if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return; // != clean code - just a test
}
void OnDeinit(const int reason)
{
FileClose(ExtHdlFile1);
return;
}
여기 내 최종 버전 이 있습니다.
사실 너무 쉬워서 조금 걱정입니다.
Alain: 축복을 내려주면 좋을 텐데.
// -----------------------------------------------------------------------
bool NewBar(void)
{
bool iNewBar = false;
static double currPeriodProgress = 0;
currPeriodProgress = MathMod(TimeCurrent(),PeriodSeconds());
return(iNewBar);
}
// ------------------------------------------------------------------------
void OnTick()
{
if(NewBar()) PlaySound("tick.wav");
쾰른에서 인사드립니다
윌버
가장 쉬운 방법:
정적 날짜/시간 tlastbar=0;
날짜 시간 tnewbar=iTime(NULL,PERIOD_CURRENT,0);
bool isnewbar=tnewbar!=tlastbar;
tlastbar=tnewbar;
나는 새로운 막대가 하루의 빛을 볼 때 표시하는 방법에 상처를 입었습니다.
저는 주로 성능에 대해 걱정합니다. 일부 기호에서는 20ms마다 틱을 보았습니다. 대응할 시간이 많지 않습니다.
한 가지 아이디어는 Rates.tick_volume입니다.
Mqlrates rates[1];
OnInit()
{
if(CopyRates(_Symbol,_Period,0,1,rates) < 1)
if(rates[0].tick_volume == 1)
{
... deal with new bar ...
}
또 다른 아이디어 는 막대 수가 증가했는지 확인하는 것입니다.
OnInit()
{
if(BarsOld < Bars ( _Symbol , _Period ))
{
BarsOld = Bars ( _Symbol , _Period );
... deal with new bar ...
}
OnChartEvent도 확인했지만 새 막대를 다른 것과 구별할 방법을 찾지 못했습니다.
평가해주셔서 감사합니다.
윌버