기고글 토론 "MQL5 Cookbook: MetaTrader 5 전략 테스터의 포지션 속성 분석"

 

새로운 기고글 MQL5 Cookbook: MetaTrader 5 전략 테스터의 포지션 속성 분석 가 게재되었습니다:

이전 글 "MQL5 Cookbook: 사용자 지정 정보 패널의 포지션 속성"에서 수정된 버전의 Expert Advisor를 소개합니다. 우리가 다룰 문제 중 일부는 바에서 데이터 가져오기, 파일에 대한 표준 라이브러리의 거래 클래스를 포함하여 현재 기호에 대한 새로운 바 이벤트 확인, 거래 신호를 검색하는 기능 및 거래 작업을 실행하는 기능 만들기를 포함합니다. OnTrade() 함수에서 거래 이벤트를 결정하는 것 외에도 말이죠.

기본적으로 모든 것이 준비되었으며 테스트를 진행할 수 있습니다. Strategy Tester를 사용하면 시각화 모드에서 테스트를 빠르게 실행하고 오류가 있는 경우 오류를 찾을 수 있습니다. 전략 테스터를 사용하면 시장이 닫히는 주말에도 프로그램을 계속 개발할 수 있기 때문에 유익한 것으로 볼 수 있습니다.

전략 테스터를 설정하고 시각화 모드를 활성화한 다음 시작을 클릭하세요. Expert Advisor가 전략 테스터에서 거래를 시작하고 아래와 유사한 그림을 볼 수 있습니다.

그림 2. MetaTrader 5 전략 테스터의 시각화 모드.


작성자: Anatoli Kazharski

 

안녕하세요, 제발 도와주세요, 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);
  }
 
Sergey Voytsekhovsky:

안녕하세요, 제발 도와주세요, CheckNewBar 함수에서 정적 변수 new_bar가 첫 번째 줄에서 0이 된 다음 함수의 논리는 0과 같은지 여부에 따라 결정됩니다. 제가 이해하지 못하는 부분을 알려주시겠습니까?!?!!!!!

도움말에는 이렇게 나와 있습니다:

정적 키워드로 선언된지역 변수는 함수가 존재하는 전체 시간 동안 해당 값을 유지합니다. 함수를 다음에 호출할 때마다 이러한 지역 변수는 이전 호출 시점의 값을 포함합니다.

즉, CheckNewBar() 함수를 새로 호출하면 new_bar 변수는 이전 함수 호출에서받은 값을 유지하지만 첫 번째 줄에는 새 값 NULL......이 할당되며이 모든 이유와 작동 방식이 명확하지 않습니다. 내 혼란을 없애주세요, 아마도 내가 어딘가 어리석은 곳에있을 가능성이 높지만 어디 ?????

 
Sergey Voytsekhovsky:

안녕하세요, 제발 도와주세요, CheckNewBar 함수에서 정적 변수 new_bar가 첫 번째 줄에서 0이 된 다음 함수의 논리는 0과 같은지 여부에 따라 결정됩니다. 제가 이해하지 못하는 부분을 알려주시겠습니까?!?!!!!!

내가 도움말을 올바르게 이해했다면,정적 datetimenew_bar=NULL; " 초기값이 지정되지 않으면 정적 메모리 클래스의 변수는 초기값이 0을 취합니다"라는 줄에서. 따라서 null로 초기화해서는 안 되며 논리에 결함이 없어야 합니다. 아니면 ????

 
Sergey Voytsekhovsky:

제가 도움말을 올바르게 이해했다면," 초기값을 지정하지 않으면 정적 메모리 클래스 변수는 초기값이 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
파일:
Test_EA.mq5  4 kb
 
Vladimir Karputov:

변수는 항상 초기화해야 합니다. 이것은 불문율입니다. 이를 지키지 않는 사람은 조만간 발견하기 어려운 오류가 발생합니다 :)


정적 변수의 작동 원리:


전문가 탭으로 출력합니다. OnTick()의 첫 번째 입력은 정적 변수인 새 막대의 초기화입니다.

네, 알겠습니다. 간결하고 명쾌한 답변 감사합니다.