커뮤니티

예스랭귀지 Q&A

글쓰기
답변완료

수식요청

오랜만입니다. 종전에 수식요청드린 건인데 아래 중간의 a1=sonar(150)*100;이하부분이 누락된 거라 새로이 수식을 작성하여, 30분봉에서 검색-->예스스팟에서 자동매매를 걸어놓으려고 합니다. 귀찮더라도 한번 수식요청을 드려봅니다. a=bbandsup(17,2); b=bbandsup(40,2); m=envelopeup(20,6); (c>ma(h,5) and crossup(a,m))or (c>ma(h,5) and b>m and crossup(a,b)) or(a>b and b > m and crossup(c,a)) or(crossup(c,a) and crossup(c,b) and crossup(c,m)); a1=sonar(150)*100; a2=(c-avg(C,200)) / stdev(C,200); a3=a2>0 or crossup(a2,0); a4=crossup(a1,0); a5=a3 && a4 && c>tavg(c,180); a5 and c>dayopen()*1.005
프로필 이미지
ksks
2025-06-06
272
글번호 191472
종목검색

어떤하루 님에 의해서 삭제되었습니다.

프로필 이미지
어떤하루
2025-06-05
1
글번호 191471
지표
답변완료

부탁드립니다.

그림과 같이 30분단위 선이 그려집니다. 첫번째 수정 첫봉 종가 기준으로 노란선이 연결되는데 초록색 선처럼 첫봉 시가로 선이 생기면 좋겠습니다. 두번째는 노랑색 초록색 둘다 같이 생기도록 부탁드립니다. var : cnt1(0), cnt2(0); var : S1(0),D1(0),TM(0),TF(0); if Bdate != Bdate[1] Then { S1 = TimeToMinutes(stime); D1 = sdate; } if D1 > 0 then { if sdate == D1 Then TM = TimeToMinutes(stime)-S1; Else TM = TimeToMinutes(stime)+1440-S1; TF = TM%60; if TF >= 0 and TF < 30 Then { cnt2 = 0; cnt1 = cnt1+1; } if TF >= 30 Then { cnt1 = 0; cnt2 = cnt2+1; } if cnt1 == 1 or cnt2 == 1 Then Var3 = C; plot2(Var3); }
프로필 이미지
어떤하루
2025-06-18
256
글번호 191470
지표

부활 님에 의해서 삭제되었습니다.

프로필 이미지
부활
2025-06-05
34
글번호 191469
지표
답변완료

원 글(91906) 시스템 (수정) 추가 문의 드립니다.

원 글(91906) 시스템 (수정) 추가 문의 드립니다. 아래 수식에서 선물의 추세를 추가로 반영하고자 합니다. 즉 전날의 추세가 상승추세면서 매도신호가 뜨면 이 신호는 따라가지 않고 추후에 매수신호가 나오면 다시 따라가는 식으로 변경하고자 합니다. 즉 하락추세나 중립추세의 경우는 모든 신호를 따라가고, 상승추세에 매도신호만 건너뛰는 식으로 변경하고자 합니다. 추세를 상승, 하락, 중립 등으로 구분하여 외부변수 처리해주실 수 있는지요. 케이스를 설명해보겠습니다. 개장전에 외부변수로 추세를 입력한 후, 전일의 추세가 상승추세라면, 1. 당일 첫 신호가 매도가 뜨면 진입하지 않고, 추후 매수신호가 뜰 때 첫 진입을 하고, 이후 다시 매도신호가 뜨면, 매수분 청산하고 매도는 진입하지 않습니다. 일중최대진입회수가 3회라면 이상으로 첫 신호(매도)와 둘째 매수신호, 셋째 매도 신호로 3회가 충족되어 일중 거래를 끝냅니다. 2. 당일 첫 신호가 매수라면 즉시 진입하고, 추후 매도신호가 나오면 매수 청산만 하고 매도 진입은 하지 않으며, 이후 매수신호가 다시 나오면 포지션이 없는 상태에서 매수진입하면서 총 3회의 일중최대진입회수라면 이후에 매도신호가 나오더라도 청산하고 거래를 끝내며, 이후 매도신호가 나오지 않으면 마감 시간에 청산합니다. 답변에 미리 감사드립니다. ================================================== 안녕하세요 예스스탁입니다. 정산가는 별도로 제공되지 않아 외부변수 처리해드립니다. input : 기준(1),일중최대진입횟수(2),당일손실틱수(100); input : C1정산가(17000),C2정산가(5100); var : ST(0,Data1),ET(0,Data1); var : C1(0,Data1),C2(0,Data2); var : R1(0,Data1),R2(0,Data2),나에차(0,Data1); var : Tcond(False),count(0,Data1); var : TT(0,Data1),N1(0,Data1),dayPL(0,Data1),Xcond(False),당일손실(0,Data1); TT = TotalTrades; if ET > 0 and Data1(sDate != sDate[1]) Then SetStopEndofday(ET); if data1(Bdate != Bdate[1]) Then { SetStopEndofday(0); if sTime >= 80000 Then { ST = 233000; ET = 060000; } Else { ST = 223000; ET = 050000; } Xcond = False; N1 = TT[1]; C1 = Data1(c[1]); } daypl = NetProfit-N1; 당일손실 = data1(PriceScale)*당일손실틱수; if TotalTrades > TotalTrades[1] then { if daypl <= -당일손실 Then Xcond = true; if (IsExitName("dbl",1) == true or IsExitName("dsl",1) == true) then Xcond = true; } if Data2(Bdate != Bdate[1]) Then C2 = Data2(c[1]); R1 = Data1((C-C1정산가)/C1정산가*100); R2 = Data2((C-C2정산가)/C2정산가*100); 나에차 = R1-R2; if data1(ET > 0 and ((sdate != sdate[1] and stime >= ET) or (sdate == sdate[1] and stime >= ET and stime[1] < ET))) Then { Tcond = False; } if data1(ST > 0 and ((sdate != sdate[1] and stime >= ST) or (sdate == sdate[1] and stime >= ST and stime[1] < ST))) Then { Tcond = true; count = 0; if MarketPosition == 0 and 나에차 >= 기준 then { count = count+1; Buy(); } if MarketPosition == 0 and 나에차 <= 기준 Then { count = count+1; Sell(); } } Else { if Tcond == true and Xcond == False Then { if MarketPosition == 1 and 나에차 < 0 and 나에차[1] < 0 and count < 일중최대진입횟수 Then { count = count+1; Sell("bs"); } if MarketPosition == -1 and 나에차 > 0 and 나에차[1] > 0 and count < 일중최대진입횟수 Then { count = count+1; Buy("sb"); } if MarketPosition == 1 and 나에차 < 0 and 나에차[1] < 0 and count == 일중최대진입횟수 Then { ExitLong("bx"); } if MarketPosition == -1 and 나에차 > 0 and 나에차[1] > 0 and count == 일중최대진입횟수 Then { ExitShort("sx"); } } } if MarketPosition == 1 then { ExitLong("dbl",AtStop,EntryPrice-((당일손실+daypl)/CurrentContracts)); } if MarketPosition == -1 then{ ExitShort("dsl",AtStop,EntryPrice+((당일손실+daypl)/CurrentContracts)); } 즐거운 하루되세요 > 나스닥에센피 님이 쓴 글입니다. > 제목 : 원 글(91906) 시스템 (수정) 다시 문의 드립니다. > 원 글(91906) 시스템 (수정) 다시 문의 드립니다. 아래 수식에서 나에차 계산시, 나에차 = 나스닥100선물% - S&P500선물% 에서 각 선물 등락률이 전일종가 대비로 계산되는 것으로 알고 있는데요. 각각의 선물 등락률을 전일 종가가 아니라 전일 정산가 대비로 계산해 적용하고 싶은데, 각각의 정산가를 외부 변수로 빼서 매일 입력하더라도 변경하고 싶은데 이 시스템을 변경 가능할까요? 아래 시스템 식에서 input : 기준(1),일중최대진입횟수(2),당일손실틱수(100); var : ST(0,Data1),ET(0,Data1); var : C1(0,Data1),C2(0,Data2); var : R1(0,Data1),R2(0,Data2),나에차(0,Data1); (중략) R1 = Data1((C-C1)/C1*100); R2 = Data2((C-C2)/C2*100); 나에차 = R1-R2; (이하 생략) 즉, 위 시스템의 C1, C2를 "input"변수로 추가하여 매일 수기로 입력하는 방식을 통하더라도 등락률을 정산가 대비로 변경할 수 있을지요? 답변에 미리 감사드립니다. 즐거운 휴일 되시기 바랍니다. > 예스스탁 님이 쓴 글(2025.03.17)입니다. > 제목 : Re : 시스템 문의 드립니다 > 안녕하세요 예스스탁입니다. 나스닥100선물을 기본차트로 S&P500선물을 참조데이터로 추가하고 식 적용하시면 됩니다. 차트주기는 수식에서 설정할 수 없습니다. 3분봉으로 직접 설정하셔야 합니다. 실계좌의 손익은 랭귀지에서 알수 없습니다. 아래 식에서는 당일 신호상 당일손익기준으로 지정한 틱수 누적손실이면 청산됩니다. input : 기준(1),일중최대진입횟수(2),당일손실틱수(100); var : ST(0,Data1),ET(0,Data1); var : C1(0,Data1),C2(0,Data2); var : R1(0,Data1),R2(0,Data2),나에차(0,Data1); var : Tcond(False),count(0,Data1); var : TT(0,Data1),N1(0,Data1),dayPL(0,Data1),Xcond(False),당일손실(0,Data1); TT = TotalTrades; if ET > 0 and Data1(sDate != sDate[1]) Then SetStopEndofday(ET); if data1(Bdate != Bdate[1]) Then { SetStopEndofday(0); if sTime >= 80000 Then { ST = 233000; ET = 060000; } Else { ST = 223000; ET = 050000; } Xcond = False; N1 = TT[1]; C1 = Data1(c[1]); } daypl = NetProfit-N1; 당일손실 = data1(PriceScale)*당일손실틱수; if TotalTrades > TotalTrades[1] then { if daypl <= -당일손실 Then Xcond = true; if (IsExitName("dbl",1) == true or IsExitName("dsl",1) == true) then Xcond = true; } if Data2(Bdate != Bdate[1]) Then C2 = Data2(c[1]); R1 = Data1((C-C1)/C1*100); R2 = Data2((C-C2)/C2*100); 나에차 = R1-R2; if data1(ET > 0 and ((sdate != sdate[1] and stime >= ET) or (sdate == sdate[1] and stime >= ET and stime[1] < ET))) Then { Tcond = False; } if data1(ST > 0 and ((sdate != sdate[1] and stime >= ST) or (sdate == sdate[1] and stime >= ST and stime[1] < ST))) Then { Tcond = true; count = 0; if MarketPosition == 0 and 나에차 >= 기준 then { count = count+1; Buy(); } if MarketPosition == 0 and 나에차 <= 기준 Then { count = count+1; Sell(); } } Else { if Tcond == true and Xcond == False Then { if MarketPosition == 1 and 나에차 < 0 and 나에차[1] < 0 and count < 일중최대진입횟수 Then { count = count+1; Sell("bs"); } if MarketPosition == -1 and 나에차 > 0 and 나에차[1] > 0 and count < 일중최대진입횟수 Then { count = count+1; Buy("sb"); } if MarketPosition == 1 and 나에차 < 0 and 나에차[1] < 0 and count == 일중최대진입횟수 Then { ExitLong("bx"); } if MarketPosition == -1 and 나에차 > 0 and 나에차[1] > 0 and count == 일중최대진입횟수 Then { ExitShort("sx"); } } } if MarketPosition == 1 then { ExitLong("dbl",AtStop,EntryPrice-((당일손실+daypl)/CurrentContracts)); } if MarketPosition == -1 then{ ExitShort("dsl",AtStop,EntryPrice+((당일손실+daypl)/CurrentContracts)); } 즐거운 하루되세요 > 나스닥에센피 님이 쓴 글입니다. > 제목 : 시스템 문의 드립니다 > 미국 지수 선물로 아래와 같이 자동매매 프로그램을 만들고자 합니다. 시스템 수식을 부탁드립니다. 자동매매 프로그램 수식 설명: ①차트 표시 주기는 3분 단위로 하며, 첫 진입은 장 개시 첫 3분 경과 후인 22:33분(미국 서머타임 기준 한국 시간)에 나스닥100선물과 S&P500선물 등락률 차(=나스닥100선물% - S&P500선물%, "나에차"라고 한다)가 '+기준'이상이면 당해 3분봉 종가로 매수로, '-기준'이하이면 당해 3분봉 종가로 매도로.(여기서 '외부변수'="나에차", '첫 진입 시간', '손절금액') ②반대 진입은 "나에차"가 기존과 반대 방향으로 '±기준'이상으로 두번 지속되면 한다. ③일중 반대 신호가 두번 나오면 청산만 하고 반대 진입을 더 이상 하지 않는다. 결국 일일 최대 진입 회수는 2회로 한다. ④일중 반대 신호가 두번 나오지 않으면 현물 지수가 마감되는 시간(서머타임 기준 한국 시간 새벽 05시)에 청산하고 거래를 끝낸다. 자동매매 프로그램 로직으로 다시 설명하면, 1. 기본 변수 설정 - `기준`: 매매 신호를 결정하는 기준값. - `나에차`: 나스닥 100선물과 S&P 500선물의 등락률 차. - `진입횟수`: 일중 최대 진입 횟수 (최대 2회). - `진입시간`: 첫 진입 시간 (22:33, 서머타임 기준). - `청산시간`: 마감 시간 (05:00, 서머타임 기준). - '손절금액': 일중 계좌 손실 금액 2. 차트 표시 주기 설정 - 차트 주기를 3분으로 설정합니다. 3. 첫 진입 조건 if 현재시간 >= 진입시간 then 나에차 = 나스닥100선물% - S&P500선물% if 나에차 >= 기준 then 매수(현재 3분봉 종가) 진입횟수 += 1 else if 나에차 <= -기준 then 매도(현재 3분봉 종가) 진입횟수 += 1 ``` 4. 반대 진입 조건 - 반대 방향 신호가 두 번 지속되는지 체크합니다. if 나에차의 변화가 기존 방향과 반대이고 |나에차| >= 기준 then 반대신호카운트 += 1 if 반대신호카운트 >= 2 then if 현재 포지션이 매수이면 매도(현재 3분봉 종가) else if 현재 포지션이 매도이면 매수(현재 3분봉 종가) 반대신호카운트 = 0 진입횟수 += 1 ``` 5. 청산 조건 - 일중 반대 신호가 두 번 나왔는지 체크 후, 두 번 나오면 청산만 합니다. if 반대신호카운트 >= 2 then 청산(현재 포지션) 진입횟수 = 0 ``` 6. 마감 시간 청산 - 마감 시간에 청산합니다. if 현재시간 >= 청산시간 then 청산(현재 포지션) ``` 답변에 미리 감사드립니다. 행복한 주말 보내세요.
프로필 이미지
나스닥에센피
2025-06-05
240
글번호 191468
시스템
답변완료

수식변환 부탁드립니다.

안녕하세요 수식변환 부탁드립니다. //@version=6 indicator("카르마RSI", overlay=true, max_bars_back = 500) // 채널 설정 int length = input.int(150, "채널 길이", group = "CHANNEL") float channel_width = input.float(1.5, "채널 폭", step = 0.1, group = "CHANNEL") bool mid_disp = input.bool(true, "50선", inline = "s", group = "CHANNEL") bool fill_band = input.bool(true, "백그라운드", inline = "s", group = "CHANNEL") color col_up = input.color(#a7abb9, "라인 색상:ㅤㅤ상단", group = "CHANNEL", inline = "Col") color col_mid = input.color(color.gray, "중앙", group = "CHANNEL", inline = "Col") color col_low = input.color(#a7abb9, "하단", group = "CHANNEL", inline = "Col") // RSI 설정 int lengtht = input.int(14, "길이", inline = "rsi", group = "RSI") color osc_col_base = input.color(color.rgb(161, 0, 182), "", inline = "rsi", group = "RSI") int rsiOpacity = input.int(70, "RSI 선 투명도 (0~100)", minval=0, maxval=100, group="RSI") int upper_threshold = input.int(70, "Scale", group = "RSI", inline = "rsi1") bool show_threshold_labels = input.bool(true, "기준선 라벨 표시", group = "RSI") bool sig_disp = input.bool(true, "Signal Line", inline = "sig") int length_sig = input.int(14, "", inline = "sig") color sig_line = input.color(color.rgb(255, 0, 0), "", inline = "sig") // 채널 구조 f_log_regression(src, length) => float sumX = 0.0, sumY = 0.0, sumXSqr = 0.0, sumXY = 0.0 for i = 0 to length - 1 val = math.log(src[i]) per = i + 1.0 sumX += per sumY += val sumXSqr += per * per sumXY += val * per slope = (length * sumXY - sumX * sumY) / (length * sumXSqr - sumX * sumX) intercept = (sumY - slope * sumX) / length [slope, intercept] [slope, intercept] = f_log_regression(close, length) reg_start = math.exp(intercept + slope * length) reg_end = math.exp(intercept) deviation = ta.stdev(close, length) upper_start = reg_start + deviation * channel_width upper_end = reg_end + deviation * channel_width lower_start = reg_start - deviation * channel_width lower_end = reg_end - deviation * channel_width var line mid_line = na var line upper_line = na var line lower_line = na if na(mid_line) and mid_disp mid_line := line.new(bar_index[length], reg_start, bar_index, reg_end, color=col_mid, style=line.style_dashed) else line.set_xy1(mid_line, bar_index[length], reg_start) line.set_xy2(mid_line, bar_index, reg_end) if na(upper_line) upper_line := line.new(bar_index[length], upper_start, bar_index, upper_end, width=2, color=col_up) else line.set_xy1(upper_line, bar_index[length], upper_start) line.set_xy2(upper_line, bar_index, upper_end) if na(lower_line) lower_line := line.new(bar_index[length], lower_start, bar_index, lower_end, width=2, color=col_low) else line.set_xy1(lower_line, bar_index[length], lower_start) line.set_xy2(lower_line, bar_index, lower_end) // RSI 계산 lower_threshold = 100 - upper_threshold slope_ = (reg_start - reg_end) / length step = (upper_end - lower_end) / (upper_threshold - lower_threshold) rsi = ta.rsi(close, lengtht) sma_osc = ta.sma(rsi, length_sig) osc_col = color.new(osc_col_base, 100 - rsiOpacity) // 시각화 polyline_disp(float src, bool display, bool shadow = true, color_, width = 1) => if barstate.islast and display points = array.new<chart.point>() for i = 0 to length - 1 val = src[i] - lower_threshold lower = lower_end + slope_ * i cp = chart.point.from_index(bar_index[i], lower + step * val) array.push(points, cp) p1 = polyline.new(points, line_color=color_, closed=false, force_overlay=true, line_width=width) polyline.delete(p1[1]) if shadow label.delete(label.new(bar_index, lower_end + step * (src - lower_threshold), "&#2325;&#2352;&#2381;&#2350; RSI: " + str.tostring(src, "#.##"), style=label.style_label_left, color=color(na), textcolor=chart.fg_color)[1]) if show_threshold_labels label.delete(label.new(bar_index, lower_end, str.tostring(lower_threshold, " ##.#"), style=label.style_label_left, color=color(na), textcolor=chart.fg_color)[1]) label.delete(label.new(bar_index, upper_end, str.tostring(upper_threshold, " ##.#"), style=label.style_label_left, color=color(na), textcolor=chart.fg_color)[1]) // 배경 if fill_band linefill.new(upper_line, lower_line, color.new(osc_col, 95)) // Plot polyline_disp(rsi, true, true, osc_col, 4) polyline_disp(sma_osc, sig_disp, false, sig_line, 2)
프로필 이미지
이글루
2025-06-05
312
글번호 191467
지표

고도산 님에 의해서 삭제되었습니다.

프로필 이미지
고도산
2025-06-07
141
글번호 191466
지표
답변완료

질문 부탁드립니다

수고하십니다 몇 가지 여쭤보겠습니다 질문1) aa[cnt]<h*1.15 and aa[cnt]>l*0.85 조건에 해당되는 aa[ ] 배열값을 ab[ ] 배열에 순서대로 넣으려고 하는데요 값이 제대로 안들어가는거 같네요 예를들어 aa[3], aa[5] 가 조건에 해당되면 ab[0] 에 aa[3] 값이, ab[1] 에 aa[5] 값이 들어가게 하려고 합니다 혹시 첫번째 for 문에서 aa[cnt] 에 사용됐던 cnt 변수가 이후에 중복 사용되면서 발생하는 문제일까요? cnt 대신 다른 변수를 사용했는데도 배열에 값이 안들어가긴 합니다 For cnt = 49 DownTo 1 { aa[cnt] = aa[cnt-1]; } aa[0] = value1; For cnt=0 to 15 { ab[cnt]=0; } For cnt=0 to 5 { if aa[cnt]<h*1.15 and aa[cnt]>l*0.85 Then { For cns= 0 to 15 { ab[cns]=aa[cnt];} } } 질문2) 질문2번 3번 수식은 가장 아래에 첨부했습니다 (작성한 식이 x가 0~3일때 각 경우의 갯수를 구하고 그 중에서 최대값을 구하는 식이 맞죠?) 수식에서 aa[x] 값 (value4) 을 배열 ac[] 에 넣으려고 합니다 아래와 같이 작성하면 될까요?? value4 에 aa[x] 값을 저장한다음에 배열에 넣기 때문에 For cnt = 49 DownTo 1 { ac[cnt] = ac[cnt-1]; } ac[0]=value4; 를 가장 아래에 다시 작성하는게 맞을까요? 그리고 aa[cnt]=aa[cnt-1]; 할때 cnt 를 썼기 때문에 밑에서 x 를 사용한것 처럼 cnt와는 다른 변수를 사용해야되는게 맞나요?? 밑에서도 aa[] 에 cnt 를 쓰면 충돌을 하게 되나요? 질문3) 혹시 아래와 같이 작성해도 같은 의미가 되나요? For cnt = 49 DownTo 1 { For x = 0 to 3 { For y = 1 to (id[0]-id[1]) { if h[y]>aa[x] and l[y]<aa[x] then value2 = value2+1; } if Value3 == 0 or (Value3 > 0 and Value2 > Value3) Then { Value3 = Value2; Value4 = aa[x]; } } ac[cnt] = ac[cnt-1]; } ac[0]=value4; 감사합니다 아래는 수식입니다 For cnt = 49 DownTo 1 { aa[cnt] = aa[cnt-1]; ac[cnt] = ac[cnt-1]; } aa[0] = value1; ac[0]=value4; Value2 = 0; Value3 = 0; Value4 = 0; For x = 0 to 3 { For y = 1 to (id[0]-id[1]) { if h[y]>aa[x] and l[y]<aa[x] then value2 = value2+1; } if Value3 == 0 or (Value3 > 0 and Value2 > Value3) Then { Value3 = Value2; Value4 = aa[x]; } }
프로필 이미지
yamu
2025-06-09
232
글번호 191465
지표

yamu 님에 의해서 삭제되었습니다.

프로필 이미지
yamu
2025-06-05
1
글번호 191464
지표
답변완료

조건검색식 문의드립니다.

input : 기간(200),a(70),b(11); var : hull(0); hull = WMa(WMa(c,기간/2)*2 - WMa(c, 기간), floor(sqrt(기간))); if CrossUp(C,EnvelopeDown(a,b)) Then var1 = O; if sDate != sDate[1] Then var2 = 0; if CrossDown(hull,var1) Then var2 = var2+1; if var2 >= 1 and c > var1 and C <= var1*1.15 Then Find(1); 위 수식은 일전에 만들어준 수식인데, 위 수식에서 b=ValueWhen(1,(crossup(c,envelopedown(a,b))),L); 위 지표라인으로 해당 부분을 변경(대체) 해주시면 감사드리겠습니다(___)
프로필 이미지
살빼고싶다
2025-06-05
222
글번호 191456
검색