커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4318
글번호 230811
답변완료
질문드립니다.
if 매매조건 then 이후
a라는 조건이면 매매중단, a조건이후 b조건이 만족하면 다시 매매시작. 수식으로 나타낼려면 어떻게 해야할까요?
2017-10-26
143
글번호 113652
답변완료
청산 수식 문의
이미지 처럼 매도 주문이후 장대 양봉이 나오면서 손절이 나는 경우가 있는데, 이때 매도진입이후 수익이 확보될때 손절라인을 조절해서 이익을 확보할 수 있나요?
예를 들어 '캔들생성 도중이라도 이익이 10틱이상이 될때 손절라인을 5틱으로 잡는다(5틱이익 확보)' 수식표현이 가능할까요?
참고로 시그널 메이커에서는
SetStopTrailing( Maxcontractprofit - TickSize * 5, TickSize * 10, pointstop);
명령이 가능하더군요. 예스에서도 가능할까요?
이전캔들의 최고가를 참고하는 방식이 아니라 현재캔들(봉생성 도중) 내에서 조건에 닿으면 청산할 수 있는가 하는 거죠.
2017-10-26
163
글번호 113648
답변완료
이것 저것 문의드립니다.
도움주시는 덕분에 도전하고 있습니다. 언제 우상향 그래프만드나 싶기도 하지만 파이썬 배울 때보다는 진도가 빠르네요. 매번 감사합니다.
1. 시스템
비고: 기준은 일봉으로 매매는 30분봉으로
var1 = 주첫째날부터 셋째날까지의 고가
진입
-주넷째날의 고가가 var1을 상향돌파하면
1차진입, 수량 100(변수)
-1차진입가격으로부터 3%이상 가격이 바뀌면(-3%이상 떨어지거나 +3% 이상 오르거나) 2차 진입, 수량 100(변수)
-2차진입가격으로부터 3%이상 가격이 바뀌면 3차진입, 수량 100(변수)
주마지막날 모두 청산.
2. 시스템
변수: 설정가, 금액a, 금액b, 금액c, n%
1차진입
-설정가에서 금액a만큼 즉시 진입(상향돌파, 하향돌파, =)
2차진입
1차진입가에서 n% 이상 하락했을 때 그 가격에서 금액b만큼 2차진입
1차진입가에서 n% 이상 상승했을 때 그 가격에서 금액d만큼 2차진입
3차진입
2차진입가에서 n% 이상 하락했을 때 그 가격에서 금액 c만큼 3차진입
2차진입가에서 n% 이상 상승했을 때 그 가격에서 금액 e만큼 3차진입
청산
-3차진입이후 포지션이 6%의 수익률을 기록하거나
-3차진입이후 포지션의 손실률이 3%를 기록하면 모두 청산
3. 시스템
진입
종가가 20개봉 고가 돌파
청산
-저점이 n개봉 이전 최저점(5봉 이전 봉의 20봉내 최저점)을 3%이상 하회하거나.
-10봉이내에 저점이 높아지지 않으면 청산
4. 시스템
진입
-40개봉 최고가 돌파
-10개봉 이내에 돌파시점가격에서 가격이 n% 이상 떨어지지 않았거나
-10개봉 이내에 돌파시점 가격대비 b% 이상 올랐으면 진입
청산
-진입 후 가격이 고가대비 n%이상 떨어지는 순간 청산
5. 시스템
변수: 설정자금, 투입자금(설정자금을 타임프레임 기준로 나눈 것)
30분봉 시가마다 투입자금 진입(30분봉이면 장종료까지의 봉갯수(13개로 나눔)로 설정자금을 나눈 금액이 투입자금)
청산
당일 오후 3시 15분이 되면 일괄청산
손실금액이 설정자금의 2%에 도달하는 순간 더이상 진입하지 않음.
비고
봉갯수 계산이 어려운 수식이면 그냥 외부변수로 설정해주셔도 됩니다.
2017-10-26
156
글번호 113642
답변완료
질문입니다.
지표를 작성하고자 합니다.
X값이 있습니다.
만약 X값을 3이라고 가정해본다면,
1. 종가와 Ma1값을 비교해 종가가 크거나 같으면 1, 아니면 -1
2. 종가와 Ma2값을 비교해 종가가 크거나 같으면 1, 아니면 -1
3. 종가와 Ma3값을 비교해 종가가 크거나 같으면 1, 아니면 -1
4. Ma1값과 Ma2값을 비교해 Ma1값이 크거나 같으면 1, 아니면 -1
5. Ma1값과 Ma3값을 비교해 Ma1값이 크거나 같으면 1, 아니면 -1
6. Ma2값과 Ma3값을 비교해 Ma2값이 크거나 같으면 1, 아니면 -1
7. 1~6값의 합을 표시
위의 순서에 따르는 지표를 만들고 싶습니다.
여기서 X값을 조절할 수 있게 만들고 싶습니다.
수식으로 부탁드립니다.
감사합니다.
2017-10-26
139
글번호 113641
답변완료
트레이딩 시작시간 변경
아래 수식에 트레이딩 시작 시간을 조절하고 싶습니다.
input에서 시간을 입력하면
090000부터 계산은 초기화하고
입력한 시간부터 장시작으로 인식하는 수식으로 변경 바랍니다.
고맙습니다.
**********************
input : HighLine(300.50),LowLine(300.00),n(3);
var : HH(0),LL(0),gap(0),T(0),T1(0),Entry(0);
gap = HighLine-LowLine;
if Bdate != Bdate[1] Then{
T = 0;
T1 = TotalTrades;
if O > highLine Then{
var1 = Ceiling(abs(O-HighLine)/Gap);
HH = HighLine+gap*var1;
LL = HH-gap;
}
else{
var1 = Floor(abs(O-HighLine)/Gap);
HH = HighLine-gap*var1;
LL = HH-gap;
}
}
if MarketPosition == 0 Then
entry = TotalTrades-T1;
Else
entry = TotalTrades-T1+1;
if T == 0 and crossup(C,HH) Then{
T = 1;
var2 = HH;
HH = var2+gap;
LL = var2-Gap;
}
if T == 0 and CrossDown(C,LL) Then{
T = -1;
var2= LL;
HH = var2+Gap;
LL = var2-Gap;
}
if T != 0 and crossup(C,HH) Then{
T = 1;
var2 = HH;
LL = var2-Gap;
HH = var2+gap;
if entry < n then
buy();
}
if T != 0 and CrossDown(C,LL) Then{
T = -1;
var2 = LL;
HH = var2+Gap;
LL = var2-Gap;
if entry < n then
sell();
}
2017-10-26
150
글번호 113640
답변완료
지표문의
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.그럼 수고하세요
2017-10-26
173
글번호 113639
답변완료
행복; 시스템식 작성 바랍니다
한국의 금융산업 발전을 위해 불철주야 애쓰시는 귀하의 노고를 높이 평가합니다
시스템식 관련입니다
<< 지표식 조건 >>
- 종목; SK하이닉스
- 주기; 일봉
- swinghigh/swinglow/swinghighbar/swinglowbar 관련입니다
- 2016년 1월 1일 이후에
- 첫번째 발생한 SwingHigh(1, H, 25, 25, 51)의 값 var1은 (H == 32,250)
- 첫번째 발생한 SwingHighbar(1, H, 25, 25, 51)의 발생일자 value1는 (sDate == 20160307)
- 두번째 발생한 SwingHigh(1, H, 25, 25, 51)의 값 var2은 (H == 54,900)
- 두번째 발생한 SwingHighbar(1, H, 25, 25, 51)의 발생일자 value2는 (sDate == 20170201)
- 세번째 발생한 SwingHigh(1, H, 25, 25, 51)의 값 var3은 (H == 73,000)
- 세번째 발생한 SwingHighbar(1, H, 25, 25, 51)의 발생일자 value3는 (sDate == 20170725)
입니다
지표식은 << 아래 >>와 같습니다
=========<< 아래 >>===================================
input : Left(25),Right(25);
var : TL1(0),TL2(0),TL3(0),TL4(0);
var : DD(0),Didx(0),hh(0) ;
if sdate != sdate[1] Then
Didx = Didx+1;
if sdate[right] >= 20160101 then{
if SwingHigh(1,H,Left,right,Left+right+1) != -1 Then{
DD = Didx;
HH = H[right];
TL1 = TL_New(sdate[Left+right],stime[left+right],H[right],sdate,stime,H[right]);
TL2 = TL1[1];
TL3 = TL2[1];
TL4 = TL3[1];
TL_Delete(TL4);
TL_SetColor(TL1,BLUE);
TL_SetColor(TL2,RED);
TL_SetColor(TL3,BLACK);
}
}
if Didx >= DD and Didx <= DD+100 Then
TL_SetEnd(TL1,sdate,stime,HH);
=========<< 아래 >>===================================
<< 시스템식 조건 >>
- 첫번째 발생한 SwingHigh(1, H, 25, 25, 51)의 값 var1(H == 32,250)을
첫번째 발생한 SwingHighbar(1, H, 25, 25, 51)의 발생일자 value1(sDate == 20160307)로부터
100일 이내에 종가로 상향돌파한 날이 20160630 입니다
상향돌파한 날 종가로 1차 매수 합니다
- 두번째 발생한 SwingHigh(1, H, 25, 25, 51)의 값 Var2(H == 54,900)을
두번째 발생한 SwingHighbar(1, H, 25, 25, 51)의 발생일자 value2(sDate == 20170201)로부터
100일 이내에 종가로 상향돌파한 날이 20170502 입니다
상향돌파한 날 종가로 2차 매수 합니다
- 세번째 발생한 SwingHigh(1, H, 25, 25, 51)의 값 Var3(H == 73,000)을
세번째 발생한 SwingHighbar(1, H, 25, 25, 51)의 발생일자 value3(sDate == 20170725)로부터
100일 이내에 종가로 상향돌파한 날이 20170911 입니다
상향돌파한 날 종가로 3차 매수 합니다
- 3차 매수한 날인 20170911 일로부터 11일 후인 20170926 일 종가에 전량 매도합니다
시스템식 부탁드립니다
수고하십시요^^
2017-10-26
148
글번호 113638
답변완료
수식질문드립니다.. ㅠㅜ
고생많으십니다~~~ 문의드릴것이 있어 글남깁니다.~
질문이 쉽게 이해가 되셨으면 좋겠는데..
1.상승으로 마감한 캔들만, 현재종가부터 n개 간의 종가 이동평균선(음봉일경우 포함하지 않음)
2. 1번에서 n개의 범위에 국한되는것이 아니라
양봉인 캔들 n개가 나올때까지 이전봉을 참조하여 n개의 양봉의 종가만 더한값을 이동평균선으로 하고싶습니다.
3. 5일선 > 20일선 정배열일때 5일선의 색상을 빨강색,
20일선 < 5일선 역배열일때 5일선의 색상을 파란색 으로 할수있을까요?...
고생많으시겠지만 도움부탁드립니다. ㅠㅜ
감사합니다.
2017-10-26
148
글번호 113637
답변완료
문의드립니다.
안녕하세요
주식관련 시스템수식 문의드립니다.
1분봉 종가기준>
매수 : 9시 5분이후 "매도잔량 < 매수잔량"에서 "매도잔량 > 매수잔량"이 될때 매수
(3시 18분이후에는 매수 금지)
매도 : "매도잔량 > 매수잔량"에서 "매도잔량 < 매수잔량"이 될때, 또는 3시 18분이면 매도.
* 매수는 계좌에 있는 금액으로 살수 있는 최대금액.
* 매수/매도 모두 시장가 거래
감사드립니다.
2017-10-26
144
글번호 113636