커뮤니티

지표문의

프로필 이미지
성공예견
2017-10-26 08:44:55
174
글번호 113639
답변완료
1.아래는 수식지님이 작성한 수식입니다 지표출력 부분에 가치영역이라는게 있어요 지표소개를보니 가치영역"상"은 70% 로 표시하구 가치영역"하"는30%로 표시했다. 지표에 아무리 찾아두 모르겠네요. 가치영역"상"은 80% 로 표시하구 가치영역"하"은 20% 로 표시하구 싶습니다 좀 수정 해주세요 2.var:arr(0),k(0),tick(0),chk_cnt(0),ttm(0),t_val(0),max_tpo(0),tot_tpo(0), sum(0),acc(0),mdl_prc(0),mdl_arr(0),range_u(0),range_d(0),base(0),Start(420), cal_tpo(0),up_tpo(0),dn_tpo(0),up_tail_u(0),up_tail_d(0),dn_tail_u(0),dn_tail_d(0); array:price_u[100](0),price_m[100](0),price_d[100](0), status_u[100](0),status_m[100](0),status_d[100](0), tpo_u[100](0),tpo_m[100](0),tpo_d[100](0); tick = PriceScale; if Bdate != Bdate[1] then //매일 첫번째 봉에서 해당 변수들의 값을 0으로 초기화 { Start = TimeToMinutes(stime); for arr = 0 to 99 { price_u[arr] = 0; price_m[arr] = 0; price_d[arr] = 0; status_u[arr] = 0; status_m[arr] = 0; status_d[arr] = 0; tpo_u[arr] = 0; tpo_m[arr] = 0; tpo_d[arr] = 0; } max_tpo = 0; tot_tpo = 0; sum = 0; acc = 0; mdl_prc = 0; mdl_arr = 0; range_u = 0; range_d = 0; base = dayopen() + tick * 149; //300개 가격대중 최상단에 해당하는 가격 price_u[0] = base; //지수 배열 상단 for arr = 1 to 99 { price_u[arr] = price_u[arr-1] - tick; } price_m[0] = price_u[99] - tick; //지수 배열 중단 for arr = 1 to 99 { price_m[arr] = price_m[arr-1] - tick; } price_d[0] = price_m[99] - tick; //지수 배열 하단 for arr = 1 to 99 { price_d[arr] = price_d[arr-1] - tick; } } if stime >= 0 and stime < 080000 then ttm = timetominutes(stime)+1440-Start; else ttm = timetominutes(stime)-Start; #ttm = TimeToMinutes(stime); //시간을 30분,15분,10분등으로 나누기 쉽도록 환산 t_val = int((ttm)/interval) + 1; //540은 09:00. 9시를 빼고 나서 원하는 시간단위로 나눈다 for arr = 0 to 99 { if l <= price_u[arr] and price_u[arr] <= h then { if status_u[arr] < t_val then //A가 찍혔는데 또 A를 찍을 필요가 없음. 그걸 확인 { status_u[arr] = t_val; //중복을 막기 위해 마지막 time value 저장 tpo_u[arr] = tpo_u[arr] + 1; //현재 가격대의 TPO 누적 tot_tpo = tot_tpo + 1; //전체 TPO 누적 if max_tpo < tpo_u[arr] then //TPO 최빈값 { max_tpo = tpo_u[arr]; sum = 0; //TPO가 동일한 가격대가 여러가격일 경우 acc = 0; //평균값을 구하기 위해 가격 누적변수와 가격대 수 초기화 } if max_tpo == tpo_u[arr] then //최빈값과 동일하면 { sum = sum + price_u[arr]; //해당 가격을 누적 acc = acc + 1; //가격대 개수 누적 } } } //3개의 동일 성격을 지닌 배열에 대해 한꺼번에 처리 못하므로 동일 루틴으로 3회 처리 if l <= price_m[arr] and price_m[arr] <= h then { if status_m[arr] < t_val then { status_m[arr] = t_val; tpo_m[arr] = tpo_m[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_m[arr] then { max_tpo = tpo_m[arr]; sum = 0; acc = 0; } if max_tpo == tpo_m[arr] then { sum = sum + price_m[arr]; acc = acc + 1; } } } if l <= price_d[arr] and price_d[arr] <= h then { if status_d[arr] < t_val then { status_d[arr] = t_val; tpo_d[arr] = tpo_d[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_d[arr] then { max_tpo = tpo_d[arr]; sum = 0; acc = 0; } if max_tpo == tpo_d[arr] then { sum = sum + price_d[arr]; acc = acc + 1; } } } } mdl_prc = round(sum/acc/tick,0)*tick; //평균하여 중심가격으로 삼음 mdl_arr = int((base-mdl_prc)/tick); //배열변수의 첨자는 정수이어야 함 //처음부터 int()를 생각해 냈던 것은 아니고 디버그 과정에서 알게 됨 range_u = mdl_arr; range_d = mdl_arr; // 전체 TPO의 70%가 될 때까지 상하값을 비교하면서 누적 cal_tpo = iff(mdl_arr<100,tpo_u[mdl_arr],iff(mdl_arr<200,tpo_m[mdl_arr-100],tpo_d[mdl_arr-200])); for k = 0 to 150 { // range_u는 한단위씩 위로(-1), range_d는 한단위씩 아래로(+1) // TPO가 많은 쪽의 TPO를 먼저 누적한다 var2 = iff(range_u-1<100,tpo_u[range_u-1],iff(range_u-1<200,tpo_m[range_u-1-100],tpo_d[range_u-1-200])); var3 = iff(range_d+1<100,tpo_u[range_d+1],iff(range_d+1<200,tpo_m[range_d+1-100],tpo_d[range_d+1-200])); if var2 > var3 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } else if var2 < var3 then { cal_tpo = cal_tpo + var3; range_d = range_d + 1; } else if var2 == var3 and var2 > 0 and var3 > 0 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } if cal_tpo >= tot_tpo * 0.7 or var2 + var3 == 0 then k = 150; } up_tpo = 0; //중심가격의 상위 TPO if tpo_u[0] == 1 then up_tail_u = 0; //윗꼬리 상단 경계선, 0행부터 1이면 윗꼬리 상단은 0행이 됨 else up_tail_u = 299; //윗꼬리를 못 찾을 경우를 대비해서 상단과 하단의 관계를 역으로 만듬 //꼬리 경계값을 찾는 루틴을 성공적으로 마치면 상단값 < 하단값 성립 up_tail_d = 0; //윗꼬리 하단 경계선 //0행부터 중심가격 이전행까지 아래로 내려가면서 for arr = 0 to mdl_arr-1 { //현재 행의 tpo 값이 0이고 다음 행의 tpo값이 1이면 1의 시작으로 보고 다음 행의 행번호를 윗꼬리 상단으로 봄 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) == 1 then up_tail_u = arr + 1; //윗꼬리 상단 경계선 array //현재 행의 tpo 값이 1이고 다음 행의 tpo값이 1보다 크면 현재 행의 행번호를 윗꼬리 하단으로 봄 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) > 1 and up_tail_d == 0 then //조건을 만족하는 경우가 여러번 발생하는데 up_tail_d가 0일때만 //즉, 처음에 찾아진 값만 유효한 것로 봄 up_tail_d = arr; //윗꼬리 하단 경계선 array //TPO가 1보다 큰 상위 TPO 누적 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) > 1 then up_tpo = up_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); } dn_tpo = 0; //중심가격의 하위 TPO dn_tail_u = 299; //아래꼬리 상단 경계선 if tpo_d[99] == 1 then dn_tail_d = 299; else dn_tail_d = 0; //아래꼬리 하단 경계선 //299행부터 중심가격 이전행까지 위로 올라가면서 for arr = 299 downto mdl_arr+1 { //TPO가 1보다 큰 하위 TPO 누적 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_u[arr-100],tpo_d[arr-200])) > 1 then dn_tpo = dn_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); //현재 행의 tpo 값이 1이고 윗행의 tpo값이 1보다 크면 현재 행의 행번호를 아랫꼬리 상단으로 봄 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) > 1 and dn_tail_u == 299 then dn_tail_u = arr; //아래꼬리 상단 경계선 array //현재 행의 tpo 값이 0이고 윗행의 tpo값이 1이면 1의 시작으로 보고 윗행의 행번호를 아랫꼬리 하단으로 봄 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) == 1 then dn_tail_d = arr - 1; //아래꼬리 하단 경계선 array } plot1(mdl_prc,"중심가격"); plot2(base-(range_u*tick),"가치영역(상)"); //0행의 값 base가 가장 큰 값이므로 해당 행(row)에 //단위(tick)을 곱해서 차감 plot3(base-(range_d*tick),"가치영역(하)"); if up_tail_u <= up_tail_d then //꼬리의 경계값이 정상적으로 찾아졌다면 { plot4(base-(up_tail_u*tick),"윗꼬리상단"); //점그래프로 표현 plot5(base-(up_tail_d*tick),"윗꼬리하단"); } if dn_tail_u <= dn_tail_d then { plot6(base-(dn_tail_u*tick),"아랫꼬리상단"); plot7(base-(dn_tail_d*tick),"아랫꼬리하단"); } //plot8(up_tpo,"상위TPO"); //plot9(dn_tpo,"하위TPO"); 3.그럼 수고하세요
지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2017-10-26 17:08:25

안녕하세요 예스스탁입니다. for k = 0 to 150 { // range_u는 한단위씩 위로(-1), range_d는 한단위씩 아래로(+1) // TPO가 많은 쪽의 TPO를 먼저 누적한다 var2 = iff(range_u-1<100,tpo_u[range_u-1],iff(range_u-1<200,tpo_m[range_u-1-100],tpo_d[range_u-1-200])); var3 = iff(range_d+1<100,tpo_u[range_d+1],iff(range_d+1<200,tpo_m[range_d+1-100],tpo_d[range_d+1-200])); if var2 > var3 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } else if var2 < var3 then { cal_tpo = cal_tpo + var3; range_d = range_d + 1; } else if var2 == var3 and var2 > 0 and var3 > 0 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } if cal_tpo >= tot_tpo * 0.7 or var2 + var3 == 0 then k = 150; } 수식 내용 중 위내용에서 cal_tpo >= tot_tpo * 0.7가 70%(역으로는 30%)를 지정하는 부분인 것 같습니다. 해당 부분은 0.8로 변경하시면 될것 같습니다. 즐거운 하루되세요 > 성공예견 님이 쓴 글입니다. > 제목 : 지표문의 > 1.아래는 수식지님이 작성한 수식입니다 지표출력 부분에 가치영역이라는게 있어요 지표소개를보니 가치영역"상"은 70% 로 표시하구 가치영역"하"는30%로 표시했다. 지표에 아무리 찾아두 모르겠네요. 가치영역"상"은 80% 로 표시하구 가치영역"하"은 20% 로 표시하구 싶습니다 좀 수정 해주세요 2.var:arr(0),k(0),tick(0),chk_cnt(0),ttm(0),t_val(0),max_tpo(0),tot_tpo(0), sum(0),acc(0),mdl_prc(0),mdl_arr(0),range_u(0),range_d(0),base(0),Start(420), cal_tpo(0),up_tpo(0),dn_tpo(0),up_tail_u(0),up_tail_d(0),dn_tail_u(0),dn_tail_d(0); array:price_u[100](0),price_m[100](0),price_d[100](0), status_u[100](0),status_m[100](0),status_d[100](0), tpo_u[100](0),tpo_m[100](0),tpo_d[100](0); tick = PriceScale; if Bdate != Bdate[1] then //매일 첫번째 봉에서 해당 변수들의 값을 0으로 초기화 { Start = TimeToMinutes(stime); for arr = 0 to 99 { price_u[arr] = 0; price_m[arr] = 0; price_d[arr] = 0; status_u[arr] = 0; status_m[arr] = 0; status_d[arr] = 0; tpo_u[arr] = 0; tpo_m[arr] = 0; tpo_d[arr] = 0; } max_tpo = 0; tot_tpo = 0; sum = 0; acc = 0; mdl_prc = 0; mdl_arr = 0; range_u = 0; range_d = 0; base = dayopen() + tick * 149; //300개 가격대중 최상단에 해당하는 가격 price_u[0] = base; //지수 배열 상단 for arr = 1 to 99 { price_u[arr] = price_u[arr-1] - tick; } price_m[0] = price_u[99] - tick; //지수 배열 중단 for arr = 1 to 99 { price_m[arr] = price_m[arr-1] - tick; } price_d[0] = price_m[99] - tick; //지수 배열 하단 for arr = 1 to 99 { price_d[arr] = price_d[arr-1] - tick; } } if stime >= 0 and stime < 080000 then ttm = timetominutes(stime)+1440-Start; else ttm = timetominutes(stime)-Start; #ttm = TimeToMinutes(stime); //시간을 30분,15분,10분등으로 나누기 쉽도록 환산 t_val = int((ttm)/interval) + 1; //540은 09:00. 9시를 빼고 나서 원하는 시간단위로 나눈다 for arr = 0 to 99 { if l <= price_u[arr] and price_u[arr] <= h then { if status_u[arr] < t_val then //A가 찍혔는데 또 A를 찍을 필요가 없음. 그걸 확인 { status_u[arr] = t_val; //중복을 막기 위해 마지막 time value 저장 tpo_u[arr] = tpo_u[arr] + 1; //현재 가격대의 TPO 누적 tot_tpo = tot_tpo + 1; //전체 TPO 누적 if max_tpo < tpo_u[arr] then //TPO 최빈값 { max_tpo = tpo_u[arr]; sum = 0; //TPO가 동일한 가격대가 여러가격일 경우 acc = 0; //평균값을 구하기 위해 가격 누적변수와 가격대 수 초기화 } if max_tpo == tpo_u[arr] then //최빈값과 동일하면 { sum = sum + price_u[arr]; //해당 가격을 누적 acc = acc + 1; //가격대 개수 누적 } } } //3개의 동일 성격을 지닌 배열에 대해 한꺼번에 처리 못하므로 동일 루틴으로 3회 처리 if l <= price_m[arr] and price_m[arr] <= h then { if status_m[arr] < t_val then { status_m[arr] = t_val; tpo_m[arr] = tpo_m[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_m[arr] then { max_tpo = tpo_m[arr]; sum = 0; acc = 0; } if max_tpo == tpo_m[arr] then { sum = sum + price_m[arr]; acc = acc + 1; } } } if l <= price_d[arr] and price_d[arr] <= h then { if status_d[arr] < t_val then { status_d[arr] = t_val; tpo_d[arr] = tpo_d[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_d[arr] then { max_tpo = tpo_d[arr]; sum = 0; acc = 0; } if max_tpo == tpo_d[arr] then { sum = sum + price_d[arr]; acc = acc + 1; } } } } mdl_prc = round(sum/acc/tick,0)*tick; //평균하여 중심가격으로 삼음 mdl_arr = int((base-mdl_prc)/tick); //배열변수의 첨자는 정수이어야 함 //처음부터 int()를 생각해 냈던 것은 아니고 디버그 과정에서 알게 됨 range_u = mdl_arr; range_d = mdl_arr; // 전체 TPO의 70%가 될 때까지 상하값을 비교하면서 누적 cal_tpo = iff(mdl_arr<100,tpo_u[mdl_arr],iff(mdl_arr<200,tpo_m[mdl_arr-100],tpo_d[mdl_arr-200])); for k = 0 to 150 { // range_u는 한단위씩 위로(-1), range_d는 한단위씩 아래로(+1) // TPO가 많은 쪽의 TPO를 먼저 누적한다 var2 = iff(range_u-1<100,tpo_u[range_u-1],iff(range_u-1<200,tpo_m[range_u-1-100],tpo_d[range_u-1-200])); var3 = iff(range_d+1<100,tpo_u[range_d+1],iff(range_d+1<200,tpo_m[range_d+1-100],tpo_d[range_d+1-200])); if var2 > var3 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } else if var2 < var3 then { cal_tpo = cal_tpo + var3; range_d = range_d + 1; } else if var2 == var3 and var2 > 0 and var3 > 0 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } if cal_tpo >= tot_tpo * 0.7 or var2 + var3 == 0 then k = 150; } up_tpo = 0; //중심가격의 상위 TPO if tpo_u[0] == 1 then up_tail_u = 0; //윗꼬리 상단 경계선, 0행부터 1이면 윗꼬리 상단은 0행이 됨 else up_tail_u = 299; //윗꼬리를 못 찾을 경우를 대비해서 상단과 하단의 관계를 역으로 만듬 //꼬리 경계값을 찾는 루틴을 성공적으로 마치면 상단값 < 하단값 성립 up_tail_d = 0; //윗꼬리 하단 경계선 //0행부터 중심가격 이전행까지 아래로 내려가면서 for arr = 0 to mdl_arr-1 { //현재 행의 tpo 값이 0이고 다음 행의 tpo값이 1이면 1의 시작으로 보고 다음 행의 행번호를 윗꼬리 상단으로 봄 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) == 1 then up_tail_u = arr + 1; //윗꼬리 상단 경계선 array //현재 행의 tpo 값이 1이고 다음 행의 tpo값이 1보다 크면 현재 행의 행번호를 윗꼬리 하단으로 봄 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) > 1 and up_tail_d == 0 then //조건을 만족하는 경우가 여러번 발생하는데 up_tail_d가 0일때만 //즉, 처음에 찾아진 값만 유효한 것로 봄 up_tail_d = arr; //윗꼬리 하단 경계선 array //TPO가 1보다 큰 상위 TPO 누적 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) > 1 then up_tpo = up_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); } dn_tpo = 0; //중심가격의 하위 TPO dn_tail_u = 299; //아래꼬리 상단 경계선 if tpo_d[99] == 1 then dn_tail_d = 299; else dn_tail_d = 0; //아래꼬리 하단 경계선 //299행부터 중심가격 이전행까지 위로 올라가면서 for arr = 299 downto mdl_arr+1 { //TPO가 1보다 큰 하위 TPO 누적 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_u[arr-100],tpo_d[arr-200])) > 1 then dn_tpo = dn_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); //현재 행의 tpo 값이 1이고 윗행의 tpo값이 1보다 크면 현재 행의 행번호를 아랫꼬리 상단으로 봄 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) > 1 and dn_tail_u == 299 then dn_tail_u = arr; //아래꼬리 상단 경계선 array //현재 행의 tpo 값이 0이고 윗행의 tpo값이 1이면 1의 시작으로 보고 윗행의 행번호를 아랫꼬리 하단으로 봄 if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) == 1 then dn_tail_d = arr - 1; //아래꼬리 하단 경계선 array } plot1(mdl_prc,"중심가격"); plot2(base-(range_u*tick),"가치영역(상)"); //0행의 값 base가 가장 큰 값이므로 해당 행(row)에 //단위(tick)을 곱해서 차감 plot3(base-(range_d*tick),"가치영역(하)"); if up_tail_u <= up_tail_d then //꼬리의 경계값이 정상적으로 찾아졌다면 { plot4(base-(up_tail_u*tick),"윗꼬리상단"); //점그래프로 표현 plot5(base-(up_tail_d*tick),"윗꼬리하단"); } if dn_tail_u <= dn_tail_d then { plot6(base-(dn_tail_u*tick),"아랫꼬리상단"); plot7(base-(dn_tail_d*tick),"아랫꼬리하단"); } //plot8(up_tpo,"상위TPO"); //plot9(dn_tpo,"하위TPO"); 3.그럼 수고하세요