안녕하세요, 제발 도와주세요, CheckNewBar 함수에서 정적 변수 new_bar가 첫 번째 줄에서 0이 된 다음 함수의 논리는 0과 같은지 여부에 따라 결정됩니다. 제가 이해하지 못하는 부분을 알려주시겠습니까?!?!!!!!
bool CheckNewBar() { //--- 현재 막대 열기 시간에 대한 변수 static datetime new_bar=NULL; //--- 현재 막대 열기 시간을 얻기 위한 배열 static datetime time_last_bar[1]={0}; //--- 현재 막대의 시작 시간 가져오기 // 수신 중 오류가 발생하면 신고하겠습니다. if(CopyTime(_Symbol,Period(),0,1,time_last_bar)==-1) { Print(__FUNCTION__,": 막대 열기 시간 복사 오류: "+IntegerToString(GetLastError())+""); } //--- 이것이 첫 번째 함수 호출인 경우 if(new_bar==NULL) { // 시간 설정 new_bar=time_last_bar[0]; Print(__FUNCTION__,": 초기화 ["+_Symbol+"][TF: "+TimeframeToString(Period())+"][" +TimeToString(time_last_bar[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]"); return(false); // false를 반환하고 종료 } //--- 시간이 다른 경우 if(new_bar!=time_last_bar[0]) { new_bar=time_last_bar[0]; // 시간을 설정하고 종료 return(true); // 시간을 기억하고 참을 반환합니다. } //--- 여기까지 왔으니 바가 새 것이 아니므로 false를 반환하겠습니다. return(false); }
안녕하세요, 제발 도와주세요, CheckNewBar 함수에서 정적 변수 new_bar가 첫 번째 줄에서 0이 된 다음 함수의 논리는 0과 같은지 여부에 따라 결정됩니다. 제가 이해하지 못하는 부분을 알려주시겠습니까?!?!!!!!
도움말에는 이렇게 나와 있습니다:
정적 키워드로 선언된지역 변수는 함수가 존재하는 전체 시간 동안 해당 값을 유지합니다. 함수를 다음에 호출할 때마다 이러한 지역 변수는 이전 호출 시점의 값을 포함합니다.
즉, CheckNewBar() 함수를 새로 호출하면 new_bar 변수는 이전 함수 호출에서받은 값을 유지하지만 첫 번째 줄에는 새 값 NULL......이 할당되며이 모든 이유와 작동 방식이 명확하지 않습니다. 내 혼란을 없애주세요, 아마도 내가 어딘가 어리석은 곳에있을 가능성이 높지만 어디 ?????
제가 도움말을 올바르게 이해했다면," 초기값을 지정하지 않으면 정적 메모리 클래스 변수는 초기값이 0이 됩니다."라는 줄이정적 datetimenew_bar=NULL; " 초기값을 지정하지 않으면 정적 메모리 클래스 변수는 초기값이 0이 됩니다."입니다. 따라서 null로 초기화되어서는 안 되며 논리에 결함이 없어야 합니다. 그렇지 않나요?
변수는 항상 초기화되어야 합니다. 이것은 불문율입니다. 이를 지키지 않는 사람은 조만간 발견하기 어려운 오류가 발생합니다 :)
정적 변수의 작동 방식
//+------------------------------------------------------------------+ //|테스트 EA.mq5 | //|저작권 © 2018, 블라디미르 카르푸토프 | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "저작권 © 2018, 블라디미르 카르푸토프" #property link "http://wmua.ru/slesar/" #property version "1.000" //+------------------------------------------------------------------+ //| 전문가 초기화 기능| //+------------------------------------------------------------------+ int OnInit() { //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 전문가 초기화 기능| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| 전문가 틱 기능| //+------------------------------------------------------------------+ void OnTick() { //--- 우리는 새로운 바가 탄생할 때만 일합니다. static datetime PrevBars=0; Print("PrevBars ",PrevBars); datetime time_0=iTime(Symbol(),Period(),0); if(time_0==PrevBars) return; PrevBars=time_0; Print("New bar. PrevBars ",PrevBars); } //+------------------------------------------------------------------+
전문가 탭으로 인쇄합니다. OnTick()의 첫 번째 입력은 정적 변수인 새 막대를 초기화하는 것입니다.
2018.01.08 00:00:00 PrevBars 1970.01.01 00:00:00 2018.01.08 00:00:00 New bar. PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:30 PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:59 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 New bar. PrevBars 2018.01.08 00:01:00 2018.01.08 00:01:30 PrevBars 2018.01.08 00:01:00 2018.01.08 00:02:00 PrevBars 2018.01.08 00:01:00
새로운 기고글 MQL5 Cookbook: MetaTrader 5 전략 테스터의 포지션 속성 분석 가 게재되었습니다:
이전 글 "MQL5 Cookbook: 사용자 지정 정보 패널의 포지션 속성"에서 수정된 버전의 Expert Advisor를 소개합니다. 우리가 다룰 문제 중 일부는 바에서 데이터 가져오기, 파일에 대한 표준 라이브러리의 거래 클래스를 포함하여 현재 기호에 대한 새로운 바 이벤트 확인, 거래 신호를 검색하는 기능 및 거래 작업을 실행하는 기능 만들기를 포함합니다. OnTrade() 함수에서 거래 이벤트를 결정하는 것 외에도 말이죠.
기본적으로 모든 것이 준비되었으며 테스트를 진행할 수 있습니다. Strategy Tester를 사용하면 시각화 모드에서 테스트를 빠르게 실행하고 오류가 있는 경우 오류를 찾을 수 있습니다. 전략 테스터를 사용하면 시장이 닫히는 주말에도 프로그램을 계속 개발할 수 있기 때문에 유익한 것으로 볼 수 있습니다.
전략 테스터를 설정하고 시각화 모드를 활성화한 다음 시작을 클릭하세요. Expert Advisor가 전략 테스터에서 거래를 시작하고 아래와 유사한 그림을 볼 수 있습니다.
작성자: Anatoli Kazharski