Search
📕

1. 반복문(for / While)

반복문(Loop)은 특정 작업을 연속적으로 반복 수행할 필요가 있는 경우에 사용하는 제어문이며 For문과 While문 두가지 종류가 있습니다. For문은 가장 많이 사용되는 반복문으로 특정 작업을 일정한 횟수만큼 반복시키는 제어문이고 while문은 횟수의 지정이 없이 특정한 조건이 만족하지 않을때 까지 반복실행을 하는 제어문입니다. 따라서 반복실행이 필요한데 횟수를 지정할 수 있는 경우에는 For문을 사용하고 횟수를 지정할 수 없는 경우에는 While문을 사용하면 됩니다.
1.
For 반복문
구조
For문을 흐름을 그림으로 표현하면 위와 같습니다. 최초에 초기값이 할당되고 실행문을 수행 후 값을 증감시키고 증감시킨 값이 최종값 이내이면 다시 실행문을 수행하는 작업을 반복합니다. 반복 수행하다가 증감한 값이 최종값을 벋어나면 for문에서 빠져나가게 됩니다. 예스랭귀지에서 For문은 아래 구조입니다.
For 변수 = 초기값 To(DownTo) 최종값 Step 증감값 { 실행문 }
C
복사
for문은 초기값부터 최종값까지 값을 증감시키면서 변수에 값을 저장하고 저장이 발생할 때마다 실행문을 수행하는 제어문입니다. 초기값부터 최종값까지 오름차순으로 실행할 때는 To, 내림차순으로 실행할 때는 DownTo로 지정하며 값의 증감값은 Step과 함께 지정하며 증감값은 지정하지 않으면 1씩 증감합니다. 변수에 저장할 값이 값범위를 벋어나면 for문에서 나가게 됩니다.
For문을 사용했을 때의 장점 For문을 이용했을 때의 장점은 크게 2가지 입니다. 수식을 간결화해서 가독성을 높일 수 있고 조건을 체크할 대상이 늘거나 줄어도 수식의 작성량에는 변동이 없다는 점입니다. 아래 예제1 수식은 과거 10개봉 종가 중에 현재봉 고가와 저가 사이에 위치하는 종가가 몇개인지를 카운트 하는 수식입니다.
//예제1 var : count(0); count = 0; if H[0]>= C[1] and C[1] >= L[0] Then count = Count + C; if H[0]>= C[2] and C[2] >= L[0] Then count = count + C; if H[0]>= C[3] and C[3] >= L[0] Then count = count + C; if H[0]>= C[4] and C[4] >= L[0] Then count = count + C; if H[0]>= C[5] and C[5] >= L[0] Then count = count + C; if H[0]>= C[6] and C[6] >= L[0] Then count = count + C; if H[0]>= C[7] and C[7] >= L[0] Then count = count + C; if H[0]>= C[8] and C[8] >= L[0] Then count = count + C; if H[0]>= C[9] and C[9] >= L[0] Then count = count + C; if H[0]>= C[10] and C[10] >= L[0] Then count = count + C;
C
복사
일반 제어문을 사용해서 작성하면 위와 같이 케이스 별로 나열해서 작성 할 수 있습니다. 10개의 if문은 종가의 이전값 참조만 다를 뿐 차이가 없는 문장입니다. 만약 과거 60개봉을 대상으로 한다면 그에 따라 작성량이 늘어나고 5개봉으로 줄이면 수식의 내용을 삭제해 주어야 하므로 대상봉이 늘거나 줄어들면 그에 따라 수식을 계속 수정해 주어야 합니다. 위 수식을 For문을 이용해서 작성하면 아래와 같이 작성됩니다. 식이 상대적으로 간결해 지므로 가독성이 좋아지게 됩니다.
//예제2 var : ii(0),count(0); count = 0; For ii = 1 to 10 Step 1 { if H[0] >= C[ii] and C[ii] >= L[0] Then count = count+1; }
C
복사
ii에 값이 저장되면 C[ii]에 적용됩니다. 최초 ii에 1저장 → H[0] >= C[1] and C[1] >= L[0] 체크 → 만족하면 Count 에 1추가→ 값 1 증가 ii에 2저장 → H[0] >= C[2] and C[2] >= L[0] 체크 → 만족하면 Count 에 1추가→ 값 1 증가 ii에 3저장 → H[0] >= C[3] and C[3] >= L[0] 체크 → 만족하면 Count 에 1추가→ 값 1 증가 ………………… ii에 9저장 → H[0] >= C[9] and C[9] >= L[0] 체크 → 만족하면 Count 에 1추가→ 값 1 증가 ii에 10저장 → H[0] >= C[10] and C[10] >= L[0] 체크 → 만족하면 Count 에 1추가→ 값 1 증가 ii에 11저장 → 최종값 10보다 크므로 For문에서 빠져나가게 됩니다.
또한 과거 대상 봉수를 줄이거나 늘리면 예제1은 수식의 내용을 줄이거나 늘려주어야 하지만 예제2와 같이 For문으로 처리된 내용은 최종값만 변경하면 되므로 수식 내용이 늘어나는 부분은 없습니다. For ii = 1 to 10 Step 1 → For ii = 1 to 5 Step 1 For ii = 1 to 10 Step 1 → For ii = 1 to 60 Step 1
For문 빠져나가기 For문은 횟수를 지정해서 반복실행하지만 실제 지정된 횟수만큼 루프를 돌리지 않고 중간에 값을 찾으면 루프를 그만두고 빠져 나와야 할 경우가 있습니다. 랭귀지에서는 별도의 Break 함수가 없으므로 값이나 조건을 찾았다면 변수에 최종값 이상의 값을 할당하게 되면 루프를 빠져 나오게 됩니다.
//최근 20개 봉 중 15%이상 상승한 양봉이 있으면 종가를 저장 var : ii(0),value(0); value = 0; For ii = 1 to 20 Step 1 { //이전봉 종가가 시가보다 15이상 크면 if C[ii] >= O[ii]*1.15 Then { //value에 종가 저장 value = C[ii]; //ii값에 최종값보다 큰값을 저장하고(for문을 빠져나감) ii = 20+1; } }
C
복사
2.
While 반복문
구조
While문의 흐름을 그림으로 표현하면 위와 같습니다. For문은 실행횟수가 중심인 루프문이지만 While문은 조건 중심의 루프문입니다. 예스랭귀지에서 While문은 아래 구조입니다.
While 조건 { 실행문 }
C
복사
지정한 조건이 참이면 실행문을 수행하고 거짓이면 Loop를 빠져나가게 됩니다. 조건문이 만족하는 한 계속적으로 실행문을 수행하게 되므로 조건지정에 오류가 있으면 무한히 루프를 돌게 되어 프로그램 다운이 발생 되므로 주의해서 사용해야 합니다.
While문을 사용했을 때의 장점 While문도 반복 작업을 하기 위해 사용되고 수식을 간결화해서 가독성을 높일 때 사용합니다. 다만 반복횟수를 지정하기 어려운 상황일 때 사용하게 됩니다. 아래는 현재봉의 종가보다 큰 종가가 몇 봉 전에 발생했었는지를 체크하기 위한 문장입니다.
var : ii(0),nPrevBar(0); nPrevBar = 0; While C[nPrevBar] <= C { nPrevBar = nPrevBar+1; } if Index < nPrevBar Then nPrevBar = 0; Plot1(nPrevBar);
C
복사
For문은 반복횟수를 지정하는 타입이라 위와 경우에는 반복 횟수를 지정하기에는 모호합니다. 물론 루프횟수를 적당히 크게 하여 for문으로 작성할 수는 있겠지만 그 횟수로도 부족할 경우가 있을 수 있습니다. 그러므로 루프 횟수를 지정하기 어려운 조건들은 While문을 사용하게 됩니다.
nPrevBar는 최초값 0 → C[0] ≤ C[0] 체크 → 만족하면 nPrevBar는 1 → C[1] C[0] 체크 → 만족하면 nPrevBar는 2 → C[2] C[0] 체크 → 만족하면 nPrevBar는 3 → C[3] ≤ C[0] 체크 → 만족하면 nPrevBar는 4 → C[4] ≤ C[0] 체크 → 만족하면 nPrevBar는 5 ……….
위 수식은 이전봉의 종가를 순차적으로 가져와 현재봉 종가와 비교하는 내용입니다. 비교해서 이전봉의 종가가 현재봉 종가 이하이면 nPrevBar의 값을 1씩 증가시키고 이전봉의 종가가 현재봉 종가보다 크면 While문을 빠져나가게 됩니다. 이때 최종 nPrevBar에 저장된 값이 현재봉 종가보다 큰 봉이 몇봉전에 있는지 위치가 됩니다. 차트 첫봉의 값까지 가져온 후에도 없으면 0으로 출력해 현재봉이 제일 큰 값임을 나타나게 됩니다.
While문 사용빈도가 낮은 이유 반복문 중에 For문에 비해 While문의 사용빈도는 낮은 편입니다. 무한루프의 위험성도 있고 전략에서 사용되는 조건을 현재시점에서 많이 떨어진 과거까지 무한정 찾지 않는 이유도 있지만 가장 큰 이유는 차트의 조회된 봉의 갯수가 한정적인 이기 때문입니다. 과거봉을 참조해 조건을 찾거나 값을 누적할 경우 For문을 이용해 차트 첫봉까지 루프를 수행하면 되고 조건을 만족하면 for문에서 빠져 나가게 작성하면 되므로 많이 사용되는 편은 아닙니다.
var : ii(0),nPrevBar(0); nPrevBar = 0; For ii = 0 to Index { if C[ii] > C Then { nPrevBar = ii; ii = Index+1; } } Plot1(nPrevBar);
C
복사
뒤로가기는 좌측상단의 목차 버튼을 눌러주세요.