Main logic - Condition 처리


자동 프로그램을 개발하려고 합니다.

저는 5년 정도 걸릴 것으로 예상합니다.

개발에 앞서 몇가지 정리할 것들을 정리하고 시작해야 개발 과정중에 어려움에 봉착하더라도

슬기롭게 넘길 수 있을 것같습니다.

 

우선 MQL 프로그램에 있어서 필요한 프로그램 구조에 대해서 생각해보았습니다.

 

프로그램 개발에서 가장 중요한 것은 가독성입니다.

프로그램이 아무리 복잡해지더라도 신경써야할 것들은 아래와 같습니다.

1. 항상 가독성이 좋아야한다.

2. 언제나 모듈단위 디버깅이 가능해야한다.

3. 모듈단위 결합, 해체가 쉬어야한다.

 

EA 프로그램은 몇가지 조건에 따라 프로그램이 수시로 수정 되어야 합니다.

여기서는 각종 조건에 대한 처리을 어떻게 할 것인가 구조적으로 생각해 보도록 하겠습니다.

 

EA프로그램에서 각종 조건들은 And 연산과 Or 연산 또는 이들의 결합으로 이루어집니다.

프로그램은 순서적으로 수행됩니다. 이런관점에서 본다면,

반복 수행, 특정루틴만 수행, 특정루틴 이하 무시 등으로 나눌 수 있습니다.

구현해야할 것을 나열하면 아래와 같습니다.

1. and연산 2. or연산

3. 반복수행 4. 특정루틴만수행

5.특정 루틴이하 무시 결과출력(처리) 6. 특정루틴이하 무시 종료

 

테스트 파일 첨부하였습니다.

 

1번부터 6번까지 구현하기 위한 기본 변수들입니다.

기본 변수; //bCondition이나 bResult는 다른 조건이나 변수로 대체 가능합니다.

아래와 같이 변수를 만든 것은 프로그램을 단순화하여 구조적인 면을 보기 위함입니다.

 

int i,n;

bool bCondition[10];

bool bResult[10];

for(i=0;i<10;i++){bCondition[i]=false; bResult[i]=false;}

 

3. 반복수행

우선 반복 수행을 가능하게 하려면 for문이나 while 문으로 작성해야합니다.

우선 여기서는 for문을 사용합니다.

 

 n = 1; //1회만 반복

for( i=0; i < n ; i++)

{

 

}

ResultPrint();

 

위 구조는 메인 구조가 되며 1번부터 6번까지 수용하기 위한 구조입니다.

 

6. 특정 루틴이하 모두 무시 종료

이것은 결과를 보지 않고 프로그램을 종료하겠다는 뜻입니다.

모두 아시겠지만 아래와 같이 하면 됩니다.

 

if(!bCondition[9])return;

 

4. 특정 루틴만 수행

 

if(bCondition[9])처리문장;

또는

if(bCondition[9])처리문장1;

else처리문자2

 

5.특정 루틴 이하 무시하고 결과출력(처리)

특정 루틴을 수행하고 이하 문장들을 수행하기 싫다면 아래와 같이 하면됩니다.

이것은 결과출력(처리)는 하겠다는 뜻을 포함합니다.

 

if(bCondition[9]){처리문장; continue;}//현재 수행루틴만 무시

또는

if(bCondition[9]){처리문장; break;}// 모든 반속 수행루틴 무시 및 정지

 

위와 같은 문장을 사용할 수 있는 이유는 메인 루틴을 for문으로 구성하였기 때문에 가능합니다.

 

1. and연산

and 연산을 구현해보겠습니다.

 

bResult[0] = bCondition[0] && bCondition[1] && bCondition[2];

 

이것은 문장이 아주 간단합니다.

이것은 runtime 용 문장이 될 수 있습니다.

이것의 단점은 각각의 조건을 검사할 수 없다는 문제가 있습니다.

같은 문장을 디버깅용으로 바꿔보겠습니다.


bResult[0]=true
if(bCondition[0]);else{ bResult[0]=false; Print("bCondition[0] false");}
if(bCondition[1]);else{ bResult[0]=false; Print("bCondition[1] false");}
if(bCondition[2]);else{ bResult[0]=false; Print("bCondition[2] false");}

 

하나라도 조건에 맞지 않으면 bResult[0] = false; 입니다.

위 문장에서 주의해서 볼것은 조건 만족시 아무것도 수행하지 않습니다.그래서 ";"세미콜론만 있습니다.

컴파일시 warning이 발생합니다. ';"만 있어서 좀 이상하지 않냐고 컴파일러가 개발자에게 가르쳐 주는 것입니다.
구동에는 아무 문제가 없지만 찝찝하다면 ";"앞에 아무 계산값이나 필요한 것을 넣으시면 warning이 없어집니다.

조건수행은 else다음 문장에만 포함 됩니다.

 

2. or연산

Or 연산을 구현해보겠습니다.

 

bResult[0] = bCondition[0] || bCondition[1] || bCondition[2];

 

마찮가지로 디버깅용으로 바꿔보겠습니다.

 

bResult[1]=false;
if(bCondition[3]){ bResult[1]=true; Print("bCondition[3] true");}

if(bCondition[4]){ bResult[1]=true; Print("bCondition[4] true");}

if(bCondition[5]){ bResult[1]=true; Print("bCondition[5] true");}

 

하나라도 조건만족을 하면 bResult[1]=true; 입니다

첨부파일

코멘트 (3)

배고픈딜러

MT의 약점이라면 약점이죠  Debug 관련 기능이 꽝이라는 거...

그리고 외부 디버깅 툴로 DLL 디버깅도 불가능.. 외부에서 디버깅이 안되게 락을 걸어 놓아서.. ㅋㅋ

 

그리고 문자열 출력으로 로그파일 분석을 좀 하려하면... 

EA나 인디별로 만들어낸 로그들을 그룹지어서 볼 수 없다는게 최대의 단점.. -_-;

모든 메세지가 다 짬뽕이 되어져 있어서.. 정말 불편하고 

Experts 창이랑 Journal 창의 메세지를 클리어 할 수 없어서 

 

후다닥 스크롤 되어져 버리면 찾기도 힘듬...

 


배고픈딜러

그래서 MQL 커뮤니티에는 마치 Java의 log4j 와 같이

MT의 부족한 로그 기능을 매꾸어 주기 위한 수 많은 라이브러리들이 공개되어져 있어요.. 

 


나무아래

링크 몇 개만 올려주셨으면 감사하겠습니다^^

아니면 그런 주제로 글 하나 올려주시면 저를 포함. 여러분들께 도움이 될듯 싶은데요^^