커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4488
글번호 230811
푸른 님에 의해서 삭제되었습니다.
2019-02-12
19
글번호 126073
답변완료
수식 문의
다음은 지그재그 차트를 구하는 수식입니다.
n봉의 최고, 최저가를 넘어가면 새로운 파동선을 구하는 조건인데요,
질문 1.
이 조건을
현재 형성된 최고점, 최저점에서 부터 n틱 변화하면
새로운 파동선을 긋는 조건으로 바꾸고 싶습니다.
질문 2.
1. 을 구한 뒤,
다음지표와 1지표를 합하여
이 둘을 모두 만족할 때에만 파동선을 긋는 수식을 구하고 싶습니다.
항상 친절한 답변 감사드립니다.
++++++++++++ 다음 +++++++++++++++++
input:length(6);
Var:j(0),jj(0),HH(0),LL(0),최종고가(0),최종저가(0),최종꼭지점(""),처리구분(""),
TL1(0),Text1(0),TL2(0),TL3(0),TL4(0),TL5(0),TL12(0),TL13(0),TL14(0),TL15(0),T(0);
Array:고[10,4](0),저[10,4](0); // 1:가격,2:Index,3:sDate,4:sTime
#==========================================#
HH = IFF(0==1,C,H);
LL = IFF(0==1,C,L);
If Index == 0 Then
{
고[1,1] = HH;
저[1,1] = LL;
}
Condition1 = Highest(HH,length) == HH and 최종고가 <> HH;
Condition2 = Lowest (LL,length) == LL and 최종저가 <> LL;
처리구분 = "";
If Condition1 and Condition2 Then // 기간고점과 기간저점 동시 발생
{
If 최종꼭지점 == "저점" Then
{
If 저[1,1] > LL Then 처리구분 = "저점처리";
Else 처리구분 = "고점처리";
}
Else If 최종꼭지점 == "고점" Then
{
If 고[1,1] < HH Then 처리구분 = "고점처리";
Else 처리구분 = "저점처리";
}
}
Else If Condition1 Then 처리구분 = "고점처리";
Else If Condition2 Then 처리구분 = "저점처리";
#==========================================#
If 처리구분 == "고점처리" Then
{
T = 1;
최종고가 = HH; // 신규고점을 체크하기 위해 저장
If 최종꼭지점 == "저점" Then
{
For j = 10 DownTo 2
{
For jj = 1 To 4
{
고[j,jj] = 고[j-1,jj];
}
}
고[1,1] = HH;
고[1,2] = Index;
고[1,3] = sDate;
고[1,4] = sTime;
TL1 = TL_New(저[1,3],저[1,4],저[1,1],고[1,3],고[1,4],고[1,1]);
If 1 == 1 Then
{
Text1 = Text_New(고[1,3],고[1,4],고[1,1],NumToStr(고[1,1],2));
Text_SetStyle(Text1, 0, 1);
Text_SetColor(Text1,BLACK);
}
TL_SetSize(TL1,1);
TL_SetColor(TL1,RED);
}
Else If 고[1,1] < HH Then // 1번 고점보다 높은 고가 출현
{
고[1,1] = HH;
고[1,2] = Index;
고[1,3] = sDate;
고[1,4] = sTime;
TL_SetEnd(TL1,고[1,3],고[1,4],고[1,1]);
// 시작점은 변동없고 끝점의 위치가 현재 봉으로 연장된 것임
If 1 == 1 Then
{
Text_SetLocation(Text1,고[1,3],고[1,4],고[1,1]);
Text_SetString(Text1,NumToStr(고[1,1],2));
}
}
최종꼭지점 = "고점";
}
#==========================================#
If 처리구분 == "저점처리" Then
{
T = -1;
최종저가 = LL;
If 최종꼭지점 == "고점" then
{
For j = 10 DownTo 2
{
For jj = 1 To 4
{
저[j,jj] = 저[j-1,jj];
}
}
저[1,1] = LL;
저[1,2] = Index;
저[1,3] = sDate;
저[1,4] = sTime;
TL1 = TL_New(고[1,3],고[1,4],고[1,1],저[1,3],저[1,4],저[1,1]);
If 1 == 1 Then
{
Text1 = Text_New(저[1,3],저[1,4],저[1,1],NumToStr(저[1,1],2));
Text_SetStyle(Text1, 0, 0);
Text_SetColor(Text1,BLACK);
}
TL_SetSize(TL1,1);
TL_SetColor(TL1,GREEN);
}
Else If 저[1,1] > LL then
{
저[1,1] = LL;
저[1,2] = Index;
저[1,3] = sDate;
저[1,4] = sTime;
TL_SetEnd(TL1,저[1,3],저[1,4],저[1,1]);
If 1 == 1 Then
{
Text_SetLocation(Text1,저[1,3],저[1,4],저[1,1]);
Text_SetString(Text1,NumToStr(저[1,1],2));
}
}
최종꼭지점 = "저점";
}
2019-02-12
189
글번호 126072
답변완료
수식 요청
input으로 설정한 특정시간 구간대에만 적용되는
스토캐스틱과 볼린저밴드를 구하고 싶습니다.
그림으로 표현하면 위와 같이 될 것입니다.
물론 위의 그림은 거래 시간대가 다른 data2를 넣어서
억지로 늘린 겁니다만,
예스글로벌에서 해선 본장만 보는 기능이 제공되지 않기에,
이런 생각을 하게 되었습니다.
다른 지표들에도 적용가능하도록 쉽게 부탁드립니다.
항상 친절한 답변 감사드립니다.
2019-02-12
194
글번호 126071
답변완료
수식 문의
아래 수식을 osc 지표로 만들고 싶습니다.
--- 아래 ---
input:인타발(15);
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),
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);
if CodeCategoryEX() == 11 then //Kospi 주식
{
if C >= 500000 then tick = 1000;
else if C >= 100000 then tick = 500;
else if C >= 50000 then tick = 100;
else if C >= 10000 then tick = 50;
else if C >= 5000 then tick = 10;
else tick = 5;
}
if CodeCategoryEX() == 12 then //Kosdaq 주식
{
if C >= 50000 then tick = 100;
else if C >= 10000 then tick = 50;
else if C >= 5000 then tick = 10;
else tick = 5;
}
if CodeCategoryEX() == 21 then //Kospi200 선물
tick = 0.05;
if CodeCategoryEX() == 31 or CodeCategoryEX() == 32 then //Kospi200 콜옵션,풋옵션
{
if C >= 3.0 then tick = 0.05;
else tick = 0.01;
}
if dayindex()==0 then
{
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;
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;
}
}
ttm = TimeToMinutes(stime);
t_val = int((ttm-540)/인타발) + 1;
for arr = 0 to 99 {
if l <= price_u[arr] and price_u[arr] <= h then
{
if status_u[arr] < t_val then
{
status_u[arr] = t_val;
tpo_u[arr] = tpo_u[arr] + 1;
tot_tpo = tot_tpo + 1;
if max_tpo < tpo_u[arr] then
{
max_tpo = tpo_u[arr];
sum = 0;
acc = 0;
}
if max_tpo == tpo_u[arr] then
{
sum = sum + price_u[arr];
acc = acc + 1;
}
}
}
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);
range_u = mdl_arr;
range_d = mdl_arr;
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 {
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;
if tpo_u[0] == 1 then up_tail_u = 0;
else up_tail_u = 299;
up_tail_d = 0;
for arr = 0 to mdl_arr-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;
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 = arr;
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;
dn_tail_u = 299;
if tpo_d[99] == 1 then dn_tail_d = 299;
else dn_tail_d = 0;
for arr = 299 downto mdl_arr+1 {
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]));
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;
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;
}
plot1(mdl_prc);
plot2(base-(range_u*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));
}
----------------------------
macd는 장기이평을 0으로 긋고 장기이평(0선)과 단기이평의 이격을
확인하는 지표라고 할 수 있겠습니다. 이와 같은 원리로,
위 수식에서
plot1을 수평선 0값으로 만들고
plot2~7을 plot1과의 비율에 맞추어 (plot1에 대한 이격만큼)
지표에 뿌려줍니다.
data1 과
data1에 대한 지수이평값도
마찬가지로 plot1의 이격만큼 뿌려줍니다.
항상친절한 답변 감사드립니다.
2019-02-12
184
글번호 126070
답변완료
수식 문의드립니다.
if bdate != bdate[1] Then
plot1(O);
이 수식이 3% 이상 오른봉에만 표시할 수는 없나요?
2019-02-11
173
글번호 126069
haha1122 님에 의해서 삭제되었습니다.
2019-02-11
0
글번호 126068
답변완료
문의드립니다 !
안녕하세여 !!!
1, 아래수식에서 "추세선"이 봉과같이 진행되다가 멈추는 경우...
그 "멈춘봉"에서 "세로"로 "선"이 발생되도록 부탁드립니다
"상승추세선"이 멈춘경우는 "파란색 세로선"
"하락추세선"이 멈춘경우는 "붉은색 세로선"
2, 위와는 반대로,
멈춰있던 "추세선"이 얼마간의 봉이 진행후 다시 봉과 연결되면서 새롭게 진행이 될경우
이 "연결봉"에도 "세로선이 발생되었으면합니다
"상승추세선"이 연결된 경우는 "붉은색 세로선"
"하락추세선"이 연결된 경우는 "파란색 세로선"으로 부탁드립니다
*** 특히 이경우에는 가능하면 음성신호도 같이 나올수있으면 더 좋겠습니다
3,"선두께"는 경우에 따라서 조정이 가능하도록 부탁드립니다
감사합니다 ^^
==========================================================================
input : len(11), period(200);
var : Lbar1(0), Lbar2(0), Lval1(0), Lval2(0), Hbar1(0), Hbar2(0), Hval1(0), Hval2(0);
var : UpTrend(0), DnTrend(0),TL1(0),TL2(0),TL3(0);
Lbar1 = swinglowbar(1, low, len, len, period);
Lbar2 = swinglowbar(2, low, len, len, period);
Lval1 = swinglow(1, low, len, len, period);
Lval2 = swinglow(2, low, len, len, period);
Hbar1 = swinghighbar(1, high, len, len, period);
Hbar2 = swinghighbar(2, high, len, len, period);
Hval1 = swinghigh(1, high, len, len, period);
Hval2 = swinghigh(2, high, len, len, period);
If Lval1 > Lval2 Then
{
var1 = 1;
UpTrend = (Lval1 - Lval2)/(Lbar2 - Lbar1)*Lbar1 + Lval1;
plot1(UpTrend, "상승추세선");
}
Else
var1 = 0;
If Hval1 < Hval2 Then
{
var2 = 1;
DnTrend = (Hval1 - Hval2)/(Hbar2 - Hbar1)*Hbar1 + Hval1 ;
plot2(DnTrend, "하락추세선");
}
Else
var2 = 0;
if var1 == 1 and var1[1] != 1 or (Lbar1 < Lbar1[1]) Then
{
var11 = sdate;
var12 = stime;
var13 = H;
Condition1 = false;
}
if var1 == 1 then
{
if H > var13 Then
var13 = H;
if var1[1] == 1 and Condition1 == false and CrossDown(L,UpTrend) Then
{
Condition1 = true;
var14 = UpTrend;
var15 = var14-(var13-var14);
TL1 = TL_New(var11,var12,var15,sdate,stime,var15);
TL_SetColor(TL1,CYAN);
}
if Condition1 == true then
{
TL_SetEnd(TL1,sdate,stime,var15);
}
}
if var2 == 1 and var2[1] != 1 or (Hbar1 < Hbar1[1]) Then
{
var21 = sdate;
var22 = stime;
var23 = L;
Condition2 = false;
}
if var2 == 1 then
{
if L < var23 Then
var23 = L;
if var2[1] == 1 and Condition2 == false and CrossDown(H,DnTrend) Then
{
Condition2 = true;
var24 = DnTrend;
var25 = var24+(var24-var23);
TL2 = TL_New(var21,var22,var25,sdate,stime,var25);
TL_SetColor(TL2,MAGENTA);
}
if Condition2 == true then
{
TL_SetEnd(TL2,sdate,stime,var25);
}
}
2019-02-12
189
글번호 126067
답변완료
부탁 드립니다.
도움 주심에 감사 드립니다.
어제 변환 부탁 드렸사오나
barssince(m(1)>m,a1=m);
barssince(m(1)<=m,a1=m);
위 내용이 어떤 의미인지 모르겠습니다
또한 수식에 알수없는 변수 m1이 있습니다.
위와 같은 답변에 대하여 그림과 같이 참고 자료를 첨부 합니다.
m1 값은 임의로 처리 부탁 합니다.
1)변환해야할 수식
m=ma(c,p);
valuewhen(1,m(1)>m,m);
valuewhen(1,m(1)<=m,m);
barssince(m(1)>m,a1=m);
barssince(m(1)<=m,a1=m);
atan((m1-a1)/b1/10000)*180/3.14;
2019-02-11
228
글번호 126066
답변완료
수식부탁드립니다.
5일선이 20일선위에 있으며, 종가가 5일선 아래일 경우 매수,
5일선이 20일선밑에 있으며, 종가가 5일선 위일 경우 매도
감사드립니다. ^^
2019-02-11
198
글번호 126065