커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4746
글번호 230811
답변완료
역방향 지표를 이용한 수식관련 문의사항
안녕하세요???
오랫만에 다시 Q&A를 올립니다.
예전에 보조지표로 잡은 연결선물지수를 시초가 기준으로 Y축을 뒤집어 보는 로직을 가이드 받은 적이 있습니다.(차트설정 Y축 뒤집기를 수식으로 구현하고자 하였음)
그동안은 이 정보를 풋의 지표로 사용했었는데 이를 이용한 시스템으로 구현해보려고 합니다.
아래 정보는 이전에 가이드 받은 종가기준 Y축 뒤집기 식입니다.
// 아래 식의 Data2의 보조차트는 연결선물지수입니다.
// 가격을 뒤집어서 구해놓는다.
보종가 = Data2(DayOpen - (C[0] - DayOpen)); #종가
보고가 = Data2(DayOpen - (H[0] - DayOpen)); #고가
보저가 = Data2(DayOpen - (L[0] - DayOpen)); #저가
보시가 = Data2(DayOpen - (O[0] - DayOpen)); #시가
현재 예스트레이더 기준으로 뒤집기를 제대로 구현한 것이 맞는지 확인 부탁 드립니다.
그리고 위 지표정보를 이용해서 풋에 대응하는 로직이 제대로 나올 수 있는지 한가지
샘플을 요청 드립니다.
ex. 역지표의 5일선과 20일선의 골든크로스시 매수 실행(진입횟수는 상관없고) 누적수익이 일정(한 20%정도) 정도 수익이나면 일일청산
가능한지 여부와 가능하지 않다면 어떤 문제점이 있어 불가능한지를 가이드 받고자 합니다.
항상 도움에 감사드립니다~!
2015-10-18
130
글번호 91395
가락국수 님에 의해서 삭제되었습니다.
2015-10-18
3
글번호 91394
답변완료
수식수정 부탁드림니다
아래 수식2의 rsi 대신에 수식1의 rm(모멘텀)선을 넣고 싶슴니다.
수식1:
input:p21(21),p05(0.5);
var:ae(0),re(0),rm(0);
ae=2/(p21+1);
if accum(1)>2 then {
re=(re[1]*(1+2*p05)+ae*(c-re[1])-p05*re[2])/(1+p05);
rm=(re-re[1])/re*10000; }
plot1(rm,"모멘텀");
수식2:
#==========================================#
# 지표명 : RSI다이버전스 주가파동선
#==========================================#
Input:Period(16),Rsi변동폭(7);
Var:j(0),상승(100),하락(-100),양방향(2),추세(0),
파동선(0),Rsi파동선(0),방향(0),RsiV(0),추세선(0);
Array:고[20](0),저[20](0),고Bar[20](0),저Bar[20](0),
Rsi고[20](0),Rsi저[20](0),Rsi고Bar[20](0),Rsi저Bar[20](0);
RsiV = RSI(Period);
#==========================================#
# 전고점,전저점 index 증가
#==========================================#
For j = 1 To 19
{
Rsi고Bar[j] = Rsi고Bar[j] + 1;
Rsi저Bar[j] = Rsi저Bar[j] + 1;
저Bar[j] = 저Bar[j] + 1;
고Bar[j] = 고Bar[j] + 1;
}
#==========================================#
# 최근 고,저 갱신
#==========================================#
If Rsi고[0] <= RsiV || Rsi고[0] == 0 || IsNaN(Rsi고[0]) == True Then
{
Rsi고[0] = RsiV;
Rsi고Bar[0] = 0;
}
Else
Rsi고Bar[0] = Rsi고Bar[0] + 1;
If Rsi저[0] >= RsiV || Rsi저[0] == 0 || IsNaN(Rsi저[0]) == True Then
{
Rsi저[0] = RsiV;
Rsi저Bar[0] = 0;
}
Else
Rsi저Bar[0] = Rsi저Bar[0] + 1;
If 고[0] <= H || 고[0] == 0 || IsNaN(고[0]) == True Then
{
고[0] = H;
고Bar[0] = 0;
}
Else
고Bar[0] = 고Bar[0] + 1;
If 저[0] >= L || 저[0] == 0 || IsNaN(저[0]) == True Then
{
저[0] = L;
저Bar[0] = 0;
}
Else
저Bar[0] = 저Bar[0] + 1;
#==========================================#
# 추세방향 결정
#==========================================#
If Rsi저[0][1] + Rsi변동폭 > RsiV[1] &&
Rsi저[0][1] + Rsi변동폭 <= RsiV Then 방향 = 상승;
If Rsi고[0][1] - Rsi변동폭 < RsiV[1] &&
Rsi고[0][1] - Rsi변동폭 >= RsiV Then 방향 = 하락;
#==========================================#
# 추세변화에 따른 변곡점 처리
#==========================================#
If 방향[1] == 하락 && 방향 == 상승 Then
{
For j = 18 DownTo 1
{
Rsi저[j+1] = Rsi저[j];
Rsi저Bar[j+1] = Rsi저Bar[j];
저[j+1] = 저[j];
저Bar[j+1] = 저Bar[j];
}
Rsi저[1] = Rsi저[0];
Rsi저Bar[1] = Rsi저Bar[0];
Rsi파동선 = Rsi저[0];
Rsi저[0] = RsiV;
Rsi저Bar[0] = 0;
Rsi고[0] = RsiV;
Rsi고Bar[0] = 0;
저[1] = 저[0];
저Bar[1] = 저Bar[0];
파동선 = 저[0];
저[0] = L;
저Bar[0] = 0;
고[0] = H;
고Bar[0] = 0;
}
Else If 방향[1] == 상승 && 방향 == 하락 Then
{
For j = 18 DownTo 1
{
Rsi고[j+1] = Rsi고[j];
Rsi고Bar[j+1] = Rsi고Bar[j];
고[j+1] = 고[j];
고Bar[j+1] = 고Bar[j];
}
Rsi고[1] = Rsi고[0];
Rsi고Bar[1] = Rsi고Bar[0];
Rsi파동선 = Rsi고[0];
Rsi고[0] = RsiV;
Rsi고Bar[0] = 0;
Rsi저[0] = RsiV;
Rsi저Bar[0] = 0;
고[1] = 고[0];
고Bar[1] = 고Bar[0];
파동선 = 고[0];
고[0] = H;
고Bar[0] = 0;
저[0] = L;
저Bar[0] = 0;
}
Else If 방향[1] == 하락 && 방향 == 하락 Then
{
If Rsi고[1] < Rsi고[0] &&
Rsi고[0][1] - Rsi변동폭 <= RsiV[1] &&
Rsi고[0][1] - Rsi변동폭 > RsiV Then
{
Rsi고[1] = Rsi고[0];
Rsi고Bar[1] = Rsi고Bar[0];
Rsi파동선 = Rsi고[0];
Rsi고[0] = RsiV;
Rsi고Bar[0] = 0;
}
If 고[1] < 고[0] &&
고[0] > H Then
{
고[1] = 고[0];
고Bar[1] = 고Bar[0];
파동선 = 고[0];
고[0] = H;
고Bar[0] = 0;
}
}
Else If 방향[1] == 상승 && 방향 == 상승 Then
{
If Rsi저[1] > Rsi저[0] &&
Rsi저[0][1] + Rsi변동폭 >= RsiV[1] &&
Rsi저[0][1] + Rsi변동폭 < RsiV Then
{
Rsi저[1] = Rsi저[0];
Rsi저Bar[1] = Rsi저Bar[0];
Rsi파동선 = Rsi저[0];
Rsi저[0] = RsiV;
Rsi저Bar[0] = 0;
}
If 저[1] > 저[0] &&
저[0] < L Then
{
저[1] = 저[0];
저Bar[1] = 저Bar[0];
파동선 = 저[0];
저[0] = L;
저Bar[0] = 0;
}
}
#==========================================#
# 지표식 출력
#==========================================#
If Rsi파동선[1] != Rsi파동선 Then Plot1(파동선,"파동선",red); //적당껏 수평이동
Else If LastBarOnChart == 1 Then plot1(Iff(방향 == 상승,고[0],저[0]),"파동선",GREEN);
iff( rsi파동선>Rsi파동선[1],magenta,blue);
/*If Rsi파동선[1] != Rsi파동선 Then Plot1(파동선); //적당껏 수평이동
Else If LastBarOnChart == 1 Then plot1(Iff(방향 == 상승,고[0],저[0]));
iff( rsi파동선>Rsi파동선[1],magenta,blue); */
#상승 다이버전스 : 주가의 저점 하락 + 지표의 저점 상승
If 저[2] > 저[1] &&
Rsi저[2] < Rsi저[1] Then
{
추세선 = (저[1]-저[2])/(저Bar[2]-저Bar[1])*저Bar[2] + 저[2];
Plot3(추세선);
}
#하락 다이버전스 : 주가의 고점 상승 + 지표의 고점 하락
if 고[2] < 고[1] &&
Rsi고[2] > Rsi고[1] Then
{
추세선 = (고[1]-고[2])/(고Bar[2]-고Bar[1])*고Bar[2] + 고[2];
Plot2(추세선);
}
2015-10-18
188
글번호 91393
답변완료
수식 수정요청 드립니다.
아래 당일진입횟수제한 수식을 기존수식에 적용 당일 1번 매매로 제한할경우,
한개의봉에 2개의 이상의 신호가 발생할 경우에는 진입횟수 제한이 안되네요.
한개의봉에 2개 신호가 나올경우에도 1번째 신호만 진입, 당일진입횟수제한이
될수 있도록 수정요청 드립니다.
감사합니다.
input :N(1),당일손실(-2.2);
var : cnt(0),BCount(0),SCount(0);
var : NP(0),PreNP(0),DayPL(0),loss(0),v1(0);
NP = NetProfit;
if date != date[1] Then{
preNP = NP[1];
Condition1 = false;
v1 = 0;
}
dayPL = NP-PreNP;
BCount = 0 ;
SCount = 0 ;
for cnt = 0 to 10 {
if EntryDate(cnt) == sdate and MarketPosition(cnt) == 1 then
BCount = BCount + 1;
if EntryDate(cnt) == sdate and MarketPosition(cnt) == -1 then
SCount = SCount + 1;
}
if Condition1 == false and TotalTrades > TotalTrades[1] Then{
Condition1 = true;
if PositionProfit(1) > 0 Then
v1 = PositionProfit(1);
}
//------------------------------------------------------------------------
#당일손실제한
if MarketPosition == 1 Then{
ExitLong("당일손실제한bx3",AtStop,EntryPrice+당일손실-(dayPL-v1));
}
if MarketPosition == -1 Then{
ExitShort("당일손실제한sx3",AtStop,EntryPrice-당일손실+(dayPL-v1));
}
//--------------------------------------------------------------------------------------
#손실손절1
if MarketPosition == -1 and crossup(H,EntryPrice+2.2) and BCount+SCount < N and dayPL > 당일손실 Then
buy("1BX");
if MarketPosition == 1 and CrossDown(L,EntryPrice-2.2) and BCount+SCount < N and dayPL > 당일손실 Then
sell("1SX");
//--------------------------------------------------------------------------------------
2015-10-18
108
글번호 91392
답변완료
문의 드립니다.
안녕하세요
아래 수식에서 매봉 종가와 거래량을 곱한 것에서
당일거래량을 나눈 것이 아닌 매30분간 또는 매60분간 거래량으로
나눈 지표를 만들고 싶습니다.
input : N(5);
var : cnt(0);
Array : sumCV[100](0),sumV[100](0);
if Bdate != Bdate[1] Then{
sumCv[0] = 0;
sumv[0] = 0;
for cnt = 1 to 99{
sumCV[cnt] = sumCV[cnt-1][1];
sumV[cnt] = sumV[cnt-1][1];
}
}
var1 = C*V;
sumCv[0] = sumCv[0]+var1;
sumv[0] = sumv[0]+V;
value1 = 0;
value2 = 0;
for cnt = 0 to N{
value1 = value1+sumCV[cnt];
value2 = value2+sumV[cnt];
}
value3 = value1/value2;
if crossup(c,value3) Then
find(1);
올려주신 식 자체가 분봉이하에서 유효한 식입니다.
분봉에서 매봉의 종가와 거래량을 곱하고 당일거래량으로 나누는 식인데
2015-10-18
118
글번호 91391
나전사 님에 의해서 삭제되었습니다.
2015-10-17
11
글번호 91390
답변완료
문의드립니다..
안녕하십니까...
아래 스토케스틱신호로 3개 진입..
+- 0.3 +- 0.5 +- 0.7에 각각 한개씩 익절 또는 손절하는 식 부탁합니다.
감사합니다.
Input : Period(12), Period1(5);
Var : value(0);
value = StochasticsK(Period,Period1);
# 매수/매도청산
If CrossUP(value, 20) Then
{
Buy();
}
# 매도/매수청산
If CrossDown(value, 80) Then
{
Sell();
}
2015-10-17
106
글번호 91389
답변완료
문의드립니다.
안녕하세요
당일 최고거래량 발생봉의 고가 저가 중간가 25%선,75%선 4등분선과
전일 최고거래량 발생봉의 고가 저가 중간가, 25%선,75%선 4등분선을
나타내고 싶습니다.
아래식을 적용하니 당일 첫봉이 최고 거래량일때 25%선과 75%이
나타나지 않는군요. 그리고 장중에 최고거래량이 변경되면 그때부터
4등분선이 생깁니다.왜 그런지 궁금합니다.
감사합니다.
if stime == 090000 Then{
var1 = V;
value1 = h;
value2 = l;
value3 = (h+l)/2;
value13 = value1[1];
value14 = value2[1];
value15 = value3[1];
value16 = value13-value14;
value17 = value14+value16*0.25;
value18 = value14+value16*0.75;
}
if stime > 090000 and stime < 150000 Then{
if V > var1 Then{
var1 = V;
value1 = h;
value2 = l;
value3 = (h+l)/2;
value4 = value1-value2;
value5 = value2+value4*0.25;
value6 = value2+value4*0.75;
}
}
plot1(value13,"전일정규장최고거래량의 고가");
plot2(value14,"전일정규장최고거래량의 저가");
plot3(value15,"전일정규장최고거래량의 중간값");
plot4(value17,"전일정규장최고거래량의 25");
plot5(value18,"전일정규장최고거래량의 75");
plot6(value1,"당일최고거래량의 고가");
plot7(value2,"당일최고거래량의 저가");
plot8(value3,"당일최고거래량의 중간값");
plot9(value5,"당일최고거래량의 25");
plot10(value6,"당일최고거래량의 75");
2015-10-17
192
글번호 91388
답변완료
부탁 드립니다.
언제나 만족한 수식 답변에
깊히 감사 드립니다.
질문1)
아래 수식에서 종료시간에서
수평선이(적색 별표)
나오지 않게 부탁 드립니다.
질문2) 예를 들어 RSI(14)가
시작 시간에서
지표값을 0으로 하고
그 이후에만 지표를 만들고
종료일, 종료시간에 지표를 마치고 싶습니다.
미리 감사 드립니다.
input : 시작일(20151015),시작시간(190000);
input : 종료일(20151015),종료시간(230000);
var : cond(false);
if sdate == 시작일 and (stime == 시작시간 or (stime >시작시간 and stime[1] < 시작시간)) then
Cond = true;
if sdate == 종료일 and (time == 종료시간 or (time > 종료시간 and time[1] < 종료시간)) then
Cond = false;
if sdate > 종료일 then
Cond = false;
if cond == true then{
var1 = var1+(IFF(C>=O,V,0));
var2 = var2+(ifF(C<O,V,0));
VAR3 = VAR1 - VAR2;
}
plot10(var3,"var3");
PlotBaseLine1(0,"0");
2015-10-17
177
글번호 91387