커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
1542
글번호 230811
답변완료
왜 60이평선을 재돌파할 때 강조봉이 나타나지를 않는걸까요?
Var : S(0),X1(0);
X1 = ma(c,60);
If CrossDown(C,X1) Then
S = -1;
If CrossUp(C,X1) Then
S = 1;
If S == -1 and CrossUp(C,X1) Then {
Plotpaintbar(O,C,"60이평선위아래로돌파",Red);
}
If S == 1 and CrossDown(C,X1) Then {
Plotpaintbar(O,C,"60이평선위아래로돌파",Black);
}
2023-04-02
1057
글번호 167809
답변완료
메뉴얼의 배열 예제 설명
안녕하세요! 메뉴얼에 나온 것에 대해 이해가 안 가서 질문 드립니다.
배열에 대한 설명 부분인데요,
Hval이라는 배열에 for 루프로 하는 예시가 있는데
이해가 안 가는 두가지 포인트가 있습니다.
1. 메뉴얼에는
Hval[0] =H을 한 후에
For 루프 안에서
Hval[cnt+1] = Hval[cnt][1]였나요?
그런식으로 하는데
예스트레이더를 처음 봤지만 그냥 일반 코더인 사람을
가정하면
예로 Hval[0]에는 H라는, 1분봉이 메뉴얼의 가정이니
현재 1분봉의 고가값, 값 즉 그냥 "숫자"가 있을 거라고
생각하는데
저 위의 식에서는
cnt가 1인 경우 가정을 해보면
Hval[0][1]을 다시 Hval[1]에 대입합니다.
근데 우리같은 범용 프로그래밍 랭귀지에 익숙한 사고에서는
Hval[0]은 "데이터 타입"은 숫자인데 다시 [0]뒤에 [1]을 붙였습니다.이에 대해 예스트레이더 메뉴얼에
설명이 필요한데 없네요..
추론을 하면 저 H라는 것의 특성이 사실은 그럼 배열이기도 하고 어떤 때는 그냥 숫자값이 대입되기도 한다 를
우리는 추론이 가능한데 정확한 설명이 메뉴얼에 없으니
상당히 혼란스럽습니다...
즉 Hval[0]에 다시 [1]을 붙이는 것으로 보아 애초에 Hval에 대입한 H라는 놈의 정체는
어떤 때는 숫자값, 다시 저렇게 assign 즉 대입연산 시에는 다시 배열처럼 다룰수도 있다는 건데요..
설명을 자세히 해주실수 있는지요? 그리고
관계자분들께 이를 메뉴얼에 반영해주셨으면 합니다.
사실 다른 분들도 이는 헷갈릴만하다고 생각이 드네요.
이는 데이터 타입에 대한 궁금증이고 또한
[1]을 붙인 것도 이유가 헷갈립니다.
이렇기 되면 60분이 지난 시점에 현재 설정 분봉을 1분봉으로 가정한다면 1분이 지났을 때 현재 1분 전 고가봉인데
Hval에는 60분이라는 시간 단위의 최고가를 저장하는 게 용도로 쓰려고 만든 것인데 정작 저장되는 것은 1분 전의 고가이니 1시간 전의 60분 최고가가 저장되는게 아닌 1분 전 고가가 저장되는게 아닌가요? 헷갈려서 제가 논리적으로 건너 뛰어 생각못한 것이 있는 듯한데 설명 도움주시면 감사하겠습니다 ^^
2. 또한 궁금한 것은
저 예제에서 한칸씩 밀리기 한다는 말에 for loop로직이
상식적으로 납득이 안되는 점입니다.
그런 모양의 for loop는
당연히 맨 처음 넣은 값이 x라면
N+1번째 인덱스의 요소에 N번째 값 x를 넣으면
그냥 모든 값이 그 x값으로 되는 로직이고
예스트레이더는 어떤 다른 메커니즘이있어 이걸 막는듯한데
그런 설명이 없네요..
상식적으로 c언어나 파이썬등의 array나 list를 생각하면.예시의 for loop은 좀 이해가 더 안갑니다.
예시의 for 루프는 단지 한칸씩 새로운 고가 갱신때마다
한칸씩만 밀리게 하는게 목적 아닌지요?(제가 잘 맞게 판단한 건지요?)
그렇다면 하나씩 그 전 데이터를 한칸씩 뒤로 미는
알고리즘일텐데
저 for 루프를 돌리면
일반 프로그래밍 상식상으로는 인덱스 1부터 9까지
순서로 하면
1부터 9가 다 같은 값이 되지 않나요?
근데 예스트레이더가 인덱스 숫자가 작은 순서가 맨 마지막이니 for loop의 인덱스를 반대로 한 셈이 되어
맞는 건지요 ㅠㅠ?
예스트레이더의 인덱스가 역순(인덱스가 숫자가 크면 더 그 전 봉값인)이기에 많이 헷갈립니다
언제나 예스트레이더 잘 쓰고 있으며 더욱 잘 쓰고 싶어
미뤄온 질문 심화해서 드립니다:)
긴 글 읽어주셔서 감사드립니다.
예스트레이더 초보 코더에게 도움 잘 부탁드립니다
2023-04-02
1486
글번호 167808
답변완료
수식변경
늘 감사합니다.
아래의 수식은 일봉용입니다.
1.주봉용으로 변경.
2.월봉용으로 변경 - 매달1일부터 시작이 아니라
매달15일부터 시작하는 월봉으로 만들어 주세요.
주봉, 월봉 각각으로 해 주세요.
-----------------------------------------------
input : 시간1(090000), Price1(100);
value1 = TimeToMinutes(stime);
if stime == 시간1 Then
var : cnt(0);
Array : O1[20](0), H1[20](0),L1[20](0),C1[20](0),
O2[20](0), H2[20](0),L2[20](0),C2[20](0),
O3[20](0), H3[20](0),L3[20](0),C3[20](0),
O4[20](0), H4[20](0),L4[20](0),C4[20](0),
O5[20](0), H5[20](0),L5[20](0),C5[20](0),
O6[20](0), H6[20](0),L6[20](0),C6[20](0),
O7[20](0), H7[20](0),L7[20](0),C7[20](0);
if stime == 시간1 Then{
O1[0] = data1(O);
H1[0] = data1(H);
L1[0] = data1(L);
for cnt = 1 to 19{
O1[cnt] = O1[cnt-1][1];
H1[cnt] = H1[cnt-1][1];
L1[cnt] = L1[cnt-1][1];
C1[cnt] = C1[cnt-1][1];
}
}
if data1(H) > H1[0] Then
H1[0] = data1(H);
if data1(L) < L1[0] Then
L1[0] = data1(L);
C1[0] = data1(C);
var1 = data1(H1[0]);
var2 = data1(L1[0]);
var3 = data1(O1[0]);
var4 = data1(C1[0]);
var5 = (var4-var3)/data1(PriceScale);
plot1(var5, "111");
if stime == 시간1 Then{
O2[0] = data2(O);
H2[0] = data2(H);
L2[0] = data2(L);
for cnt = 1 to 19{
O2[cnt] = O2[cnt-1][1];
H2[cnt] = H2[cnt-1][1];
L2[cnt] = L2[cnt-1][1];
C2[cnt] = C2[cnt-1][1];
}
}
if data2(H) > H2[0] Then
H2[0] = data2(H);
if data2(L) < L2[0] Then
L2[0] = data2(L);
C2[0] = data2(C);
var11 = data2(H2[0]);
var12 = data2(L2[0]);
var13 = data2(O2[0]);
var14 = data2(C2[0]);
var15 = (var14-var13)/data2(PriceScale);
plot2(var15, "222");
if stime == 시간1 Then{
O3[0] = data3(O);
H3[0] = data3(H);
L3[0] = data3(L);
for cnt = 1 to 19{
O3[cnt] = O3[cnt-1][1];
H3[cnt] = H3[cnt-1][1];
L3[cnt] = L3[cnt-1][1];
C3[cnt] = C3[cnt-1][1];
}
}
if data3(H) > H3[0] Then
H3[0] = data3(H);
if data3(L) < L3[0] Then
L3[0] = data3(L);
C3[0] = data3(C);
var21 = data3(H3[0]);
var22 = data3(L3[0]);
var23 = data3(O3[0]);
var24 = data3(C3[0]);
var25 = (var24-var23)/data3(PriceScale);
plot3(var25, "333");
if stime == 시간1 Then{
O4[0] = data4(O);
H4[0] = data4(H);
L4[0] = data4(L);
for cnt = 1 to 19{
O4[cnt] = O4[cnt-1][1];
H4[cnt] = H4[cnt-1][1];
L4[cnt] = L4[cnt-1][1];
C4[cnt] = C4[cnt-1][1];
}
}
if data4(H) > H4[0] Then
H4[0] = data4(H);
if data4(L) < L4[0] Then
L4[0] = data4(L);
C4[0] = data4(C);
var31 = data4(H4[0]);
var32 = data4(L4[0]);
var33 = data4(O4[0]);
var34 = data4(C4[0]);
var35 = (var34-var33)/data4(PriceScale);
plot4(var35, "444");
if stime == 시간1 Then{
O5[0] = data5(O);
H5[0] = data5(H);
L5[0] = data5(L);
for cnt = 1 to 19{
O5[cnt] = O5[cnt-1][1];
H5[cnt] = H5[cnt-1][1];
L5[cnt] = L5[cnt-1][1];
C5[cnt] = C5[cnt-1][1];
}
}
if data5(H) > H5[0] Then
H5[0] = data5(H);
if data5(L) < L5[0] Then
L5[0] = data5(L);
C5[0] = data5(C);
var41 = data5(H5[0]);
var42 = data5(L5[0]);
var43 = data5(O5[0]);
var44 = data5(C5[0]);
var45 = (var44-var43)/data5(PriceScale);
plot5(var45, "555");
if stime == 시간1 Then{
O6[0] = data6(O);
H6[0] = data6(H);
L6[0] = data6(L);
for cnt = 1 to 19{
O6[cnt] = O6[cnt-1][1];
H6[cnt] = H6[cnt-1][1];
L6[cnt] = L6[cnt-1][1];
C6[cnt] = C6[cnt-1][1];
}
}
if data6(H) > H6[0] Then
H6[0] = data6(H);
if data6(L) < L6[0] Then
L6[0] = data6(L);
C6[0] = data6(C);
var51 = data6(H6[0]);
var52 = data6(L6[0]);
var53 = data6(O6[0]);
var54 = data6(C6[0]);
var55 = (var54-var53)/data6(PriceScale);
plot6(var55, "666");
if stime == 시간1 Then{
O7[0] = data7(O);
H7[0] = data7(H);
L7[0] = data7(L);
for cnt = 1 to 19{
O7[cnt] = O7[cnt-1][1];
H7[cnt] = H7[cnt-1][1];
L7[cnt] = L7[cnt-1][1];
C7[cnt] = C7[cnt-1][1];
}
}
if data7(H) > H7[0] Then
H7[0] = data7(H);
if data7(L) < L7[0] Then
L7[0] = data7(L);
C7[0] = data7(C);
var61 = data7(H7[0]);
var62 = data7(L7[0]);
var63 = data7(O7[0]);
var64 = data7(C7[0]);
var65 = (var64-var63)/data7(PriceScale);
plot7(var65, "777");
감사합니다
2023-04-02
1554
글번호 167807
답변완료
수식 변경 부탁드립니다
★ 함수 지정
함수명 : Ttsf
LinearRegressionvalue(가격,기간,0)
+
LinearRegressionSlope(가격,기간)
★ TSF,ma20,ma60(일목균형표)
수식1 - TSF
TT=Ttsf(c,20);
수식2 - 기준선 %miperiod%
(highest(high,midperiod)+lowest(low,midperiod))/2
수식3 - 후행스팬 %midperiod%
shift(close,-midperiod+1)
수식4 - 20선
ma(c,20)
수식5 - 60선
ma(c,60)
지표조건 설정
shortPeriod 9
midPeriod 26
longPeriod 52
라인설정
TSF 밝은 초록
기준선 검정
후행스팬 보라
20선 황금색
60선 가벼운 초록
키움 수식입니다
예스챠트로 수식 변경 부탁 드립니다
행복한 하루 되세요
감사합니다
2023-04-01
2646
글번호 167806
답변완료
문의드립니다.
1. 매수신호가 나온후 매도신호가 나오기전에 손익절등으로 청산되었다가 다시 매수조건을 만족해도 같은 신호는 매도신호가 나와 청산되기 전까지 다시 안나오게 하는 수식을 알고 싶습니다. 반대인 매도인 경우도 동일합니다.
2. 5, 60 이평선 골든/데드 크로스 매매에 있어서 2계약을 동시 매수후 1계약은 5, 20이평이 데드크로스가 나거나 진입가에서 50틱 상승후 30틱 밀리면 익절되고 나머지 한 계약은 100틱 상승한 후 50틱 밀리거나 진입가에서 10틱 밀리면 손절되게 부탁드립니다.
그리고 2계약 진입했는데 바로 진입가에서 50틱이 밀리면 모두 청산입니다.
3. 매수신호가 청산되었을때 해당봉에서 바로 매도신호가 나오지않게 하고 싶습니다. 즉, 매수신호후 매도신호는 매수신호가 청산된 이후 10개 봉이 지나서 나올 수 있게 하고 싶습니다. 매도신호도 마찬가지입니다.
3가지나 문의드려 죄송합니다. 노고에 미 감사드립니다.
2023-04-02
1009
글번호 167805
신대륙발견 님에 의해서 삭제되었습니다.
2023-04-02
18
글번호 167804
답변완료
식 수정부탁드립니다.
안녕하세요, 아래식 수정 부탁드립니다.
1. 매수
a. 지정한 날짜(20230302) 23년3월2일 이후로만 매수작동
매수되면 더이상 매수하지않고 매도만 작동
매수발생 안되면 다음날 매수진행
b. 지정한가격보다 낮은가격에서 돌파시 매수
c.시초가(900원)가 지정한 매수가격(1000원)보다 낮을때 매수가격에서 매수작동
d.시초가(1000원)가 지정한 매수가격(1000원)보다 같을때 매수가격에서 매수작동
e.시초가(1100원)가 지정한 매수가격(1000원)보다 높으면 해당일 매수 작동 안함
2. 매도,손절
a.매도,손절 지정가격이 되었거나 그 이상으로 갭상승이나 갭하락시 시장가 청산작동
b.매도,손절 작동되면 그이후로 작동하지않음
(분봉적용)확인부탁드립니다.
-------------
안녕하세요
예스스탁입니다.
input : 날짜(20230302),매수가격(1000),익절가격(1200),손절가격(800);
if NextBarSdate >= 20230302 Then
{
if NextBarSdate != sDate Then
{
if MarketPosition == 0 and TotalTrades == 0 and NextBarOpen <= 매수가격 Then
Buy("b1",AtStop,매수가격);
}
Else
{
if MarketPosition == 0 and TotalTrades == 0 and DayHigh < 매수가격 Then
Buy("b",AtStop,매수가격);
}
if MarketPosition == 1 Then
{
ExitLong("bp",AtLimit,익절가격);
ExitLong("bl",AtStop,손절가격);
}
}
즐거운 하루되세요
> 스누피독 님이 쓴 글입니다.
> 제목 : 식 수정부탁드립니다.
> 안녕하세요, 아래 식 수정부탁드립니다.
지정한 날짜(20230302) 23년3월2일 이후로만 매수작동
매수되면 더이상 매수하지않고 매도만 작동
매도,손절 작동되면 그이후로 작동하지않음
부탁드립니다.
2023-04-02
1451
글번호 167803
답변완료
지표식 부탁드립니다.
수고하십니다.
일봉수치와 분수치가 같은 임의의 var1 지표가 있습니다.
이지표의 일간 단순이평수치를 분차트에서도 같은 수치로 볼수있도록
부탁드립니다.
감사합니다.
input : 일단기(5), 일중기(20), 일장기(60);
var2 = ma(var1,일단기);
var3 = ma(var1,일중기);
var4 = ma(var1,일장기);
plot1(var2 ,"단기", IFf(var2 >var2 [1],Red,Blue));
plot2(var3 ,"중기", IFf(var3 >var3 [1],Red,Blue));
plot3(var4 ,"장기", IFf(var3 >var3 [1],Red,Blue));
2023-04-01
1026
글번호 167802
답변완료
복수의 챠트
해외선물 1개챠트에서 진입신호가 나왔을 때 복수의 배수챠트에서도 진입신호가
나온경우에만 진입하는 매매기준(3개의 진입신호)을 갖고있습니다. 이를 예스트레이더에서 구현할 수 있나요?
기존의 문의를 살펴보니 불가능하다는 생각이 듭니다.
2023-04-01
1165
글번호 167801