커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
5560
글번호 230811
답변완료
함수요청
안녕하세요?
아래 작성주신 스크립트를 응용하여 수정요청드립니다.
-주종목: 크루드오일
-참조종목: 천연가스
-주기: 1분봉
-전략: 참조종목 당일 시가(O)와 참조종목 16:00분(써머타임 해지시 17:00) (C) 완성봉을 기준으로
O > C 인 경우 상방으로 O 를 터치한 경우 주종목 매도
O < C 인 경우 하방으로 O 를 터치한 경우 주종목 매수
참조종목의 시가와 특정시간의 가격을 비교하여 진입하고자 합니다.
따라서 특정시간의 가격이 돌파되는 시점에 1번(일중) 나오게 하고자 합니다.
if bdate != bdate[1] Then
var1 = 0;
if (sdate != sdate[1] and stime >= 160000) or
(sdate == sdate[1] and stime >= 160000 and stime[1] < 160000) Then
{
if C > dayopen Then
var1 = 1;
if C < dayopen Then
var1 = 1;
}
if var1 == 1 and L > dayopen Then
buy("b",atlimit,dayopen);
if var1 == -1 and H < dayopen Then
sell("s",atlimit,dayopen);
2019-04-05
221
글번호 127636
요타 님에 의해서 삭제되었습니다.
2019-04-05
1
글번호 127635
답변완료
수식 부탁드립니다.
data1에 5분봉
data2에 일봉 으로 셋팅하고
당일 제외 이전 20일 평균레인지(data2의 20일 평균)을 구하려고 합니다.
여기까진 별 문제가 없는데
이전 20일 레인지 중에 가장 큰 2개와 가장 작은 2개를 제외한 16일치의 평균레인지를 산출하고 싶습니다.
간혹 ETF 중에 오더에러성으로 이상한 가격에 체결되어서 평균레인지가 왜곡되는 경우가 있어서 이런 부분 제외하려는 의도입니다.
부탁드립니다.
감사합니다.
2019-04-04
190
글번호 127634
답변완료
수식 문의
시뮬레이션을 위해 시간을 조절할 수 있는 수식으로 변경해주시기 바랍니다.
input:만기청산시간(151840), 만기외 청산시간(153340)
*******************************************************************
var : nday(0),Week(0);
nday = date - int(date/100)*100;
Week = DayOfWeek(date);
if nday >= 8 and nday <= 14 and
Week == 4 then
SetStopEndofday(151840);
Else
SetStopEndofday(153340);
2019-04-04
191
글번호 127633
답변완료
함수변환요청
안녕하세요?
아래의 스크립트는 시그널랭귀지로 작성된 것입니다.
함수변환 요청드립니다.
Vars : st(0), et(0), vTIME_Close(0);
V1 = Dayofweek((10000 * Year(D)) + (100 * 3) + 1);
If V1 = 0 Then Value2 = 8
Else Value2 = 15 - V1; // 3월 두번째 일요일 날짜
V2 = Dayofweek((10000 * Year(D)) + (100 * 11) + 1);
If V2 = 0 Then Value4 = 1
Else value4 = 8 - V2; // 11월 첫번째 일요일 날짜
If date > (10000 * Year(D)) + (100 * 3) + value2
And date < (10000 * Year(D)) + (100 * 11) + value4 Then
Begin
st = 070000; // 써머타임 적용 시, 장시작 시간
et = 060000; // 써머타임 적용 시, 장종료 시간
vTIME_Close = 160000;
End
Else
Begin
st = 080000; // 장 시작 시간
et = 070000; // 장 종료 시간
vTIME_close = 170000;
End;
condition1 = (IntPortion(time/10000) > IntPortion(et/10000)
And IntPortion(time[1]/10000) <= IntPortion(et/10000)) Or st <> st[1];
/////////////////////////////////////////////////////////////////
Vars : vDayOpen(0), vDayC(0);
If condition1 Then vDayOpen = O;
If TIME[1] < vTIME_Close And TIME >= vTIME_Close Then v99 = C;
Vars : TCOND(False);
IF vTIME_Close < et Then
Begin
If vTIME_close < TIME And TIME < et Then TCOND = True
Else TCOND = False;
End
Else
Begin
If vTIME_Close < TIMe Or TIME < et Then TCONd = True
Else TCOND = False;
End;
If TCOND Then
Begin
if O > C Then Sell("S", Atlimit, O);
If O < C Then Buy("B", Atlimit, O);
End;
2019-04-04
226
글번호 127632
답변완료
진입제한2
일전에 주신 답변 감사합니다.
보내주신 코딩은 Currentcontracts에서 3개의 진입수를 합산하여 처리하는 것 같습니다.
각 진입별로 계약수를 관리하다가 매도 조건에서 매도할수 없는지요?
그리고 Daytrading말고 매수조건 이후 매도조건 발생할때까지 길게 가져가는 것으로 하고 싶습니다.
아래와 같이 작성했는데, 시작 조건일의 첫번째 조건의 진입매수와 매도 3번을 정상적으로 작동하지만, 그 이후 여러개 진입이 동시에 일어날 경우, 매도가 1,2번은 생략되고 3번 매도만 발생하는 등의 문제가 있습니다.
아마도 B1, V1, i1, M1, E1,X1,z1 등을 언제 초기화하는가에 문제가 있는 것 같습니다. 아마도 M과 E에 대한 다른 접근이 필요한 것 같기도 합니다.
var : B1(0),B2(0),B3(0);
var : I1(0),I2(0),I3(0);
var : V1(0),V2(0),V3(0);
var : M1(0),M2(0),M3(0);
var : E1(0),E2(0),E3(0);
var : X1(0),X2(0),X3(0);
IF SDate > 20160901 then Begin
# 조건변수 처리
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "DP_B" Then{
B1 = B1+1;
i1 = index;
V1 = V1+CurrentContracts-CurrentContracts[1]; #지정이름진입 수량 누적
M1 = M1+(CurrentContracts-CurrentContracts[1])*LatestEntryPrice(0);
E1 = M1/V1;#평단가
}
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "CC_B" Then{
B2 = B2+1;
i2 = index;
V2 = V2+CurrentContracts-CurrentContracts[1];
M2 = M2+(CurrentContracts-CurrentContracts[1])*LatestEntryPrice(0);
E2 = M2/V2;
}
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "GS_B" Then{
B3 = B3+1;
i3 = index;
V3 = V3+CurrentContracts-CurrentContracts[1];
M3 = M3+(CurrentContracts-CurrentContracts[1])*LatestEntryPrice(0);
E3 = M3/V3;
}
#### 매수조건
if DispBuy==1 and B1 < 2 Then{
if MarketPosition == 0 or LatestEntryName(0) != "DP_B" or
(MarketPosition == 1 and LatestEntryName(0) == "DP_B" and index >= I1+20) Then
buy("DP_B");
}
if M_CCI == 1 and B2 < 2 Then{
if MarketPosition == 0 or LatestEntryName(0) != "CC_B" or
(MarketPosition == 1 and LatestEntryName(0) == "CC_B" and index >= I2+20) Then
buy("CC_B");
}
iF crossDown(ma20, ma60) then CD_Check1 = index;{
if CD_Check1 + 11 < index then {
if C <= 선행스팬2[52] and CrossUp(D_MA5, D_Dnline) then{
if MarketPosition == 0 or LatestEntryName(0) != "GS_B" or
(MarketPosition == 1 and LatestEntryName(0) == "GS_B" and index >= I2+20) Then
buy("GS_B");
}
}
}
### 매도 전략
if MarketPosition == 1 then{
if B1 >= 1 then{
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "DP_S1" Then
X1 = 1;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "DP_S2" Then
X1 = 2;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "DP_S3" Then
{X1 = 3; z1 = 1;}
if X1 == 0 Then
ExitLong("DP_S1",AtLimit,E1*1.05,"DP_B",Floor(V1*0.3),1);
if X1 == 1 Then
ExitLong("DP_S2",AtLimit,E1*1.10,"DP_B",Floor(V1*0.3),1);
if X1 == 2 Then
ExitLong("DP_S3",AtLimit,E1*1.15,"DP_B");
}
}
if MarketPosition == 1 then{
if B2 >= 1 then{
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "CC_S1" Then
X2 = 1;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "CC_S2" Then
X2 = 2;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "CC_S3" Then
{X2 = 3; z2 = 1;}
if X2 == 0 Then
ExitLong("CC_S1",AtLimit,E2*1.05,"CC_B",Floor(V2*0.3),1);
if X2 == 1 Then
ExitLong("CC_S2",AtLimit,E2*1.10,"CC_B",Floor(V2*0.3),1);
if X2 == 2 Then
ExitLong("CC_S3",AtLimit,E2*1.15,"CC_B");
}
}
if MarketPosition == 1 then{
if B3 >= 1 then{
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "GS_S1" Then
X3 = 1;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "GS_S2" Then
X3 = 2;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "GS_S3" Then
{X3 = 3; z3 = 1;}
if X3 == 0 Then
ExitLong("GS_S1",AtLimit,E3*1.05,"GS_B",Floor(V3*0.3),1);
if X3 == 1 Then
ExitLong("GS_S2",AtLimit,E3*1.10,"GS_B",Floor(V3*0.3),1);
if X3 == 2 Then
ExitLong("GS_S3",AtLimit,E3*1.15,"GS_B");
}
}
if CurrentContracts == 0 or z1[1] == 1 then {B1 = 0; V1 = 0; i1 = 0; M1 = 0; E1 = 0; X1 = 0; z1 = 0;}
if CurrentContracts == 0 or z2[1] == 1 then {B2 = 0; V2 = 0; i2 = 0; M2 = 0; E2 = 0; X2 = 0; z2 = 0;}
if CurrentContracts == 0 or z3[1] == 1 then {B3 = 0; V3 = 0; i3 = 0; M3 = 0; E3 = 0; X3 = 0; z3 = 0;}
2019-04-04
221
글번호 127631
답변완료
저번에 질문 올렸었는데요
아래 코드로 답변 해주셨는데 한가지 더 궁금한점이 있어 글 올립니다.
제가 개장시간을 잘못 알고 있었는데요.
18시에 개장해서 익일 17:45에 마감이던데요 아래전략을 적용하고싶으면
1. 90000 --> 180000
2. SetStopEndofday(044000); 에서 044000 --> 174500
으로만 교체하면 되는건가요?
3. SetStopEndofday(0); 이게 의미하는바가 무엇이죠? 왜 필요한지 궁금합니다
4. 분봉 적용 맞지요?
----------------------------------------------------------------------
안녕하세요
예스스탁입니다.
랭귀지에서 종가가 들어오는 시점은 장이 종료된 시점입니다.
당일청산시간을 종가보다 조금 앞의 시간으로 설정하셔야 합니다.
44분으로 지정해 드립니다.
var : OO(0),HH(0),LL(0),OO1(0),HH1(0),LL1(0);
var : entry(0);
if sdate != sdate[1] Then
SetStopEndofday(044000);
if (sdate != sdate[1] and stime >= 90000) or
(sdate == sdate[1] and stime >= 90000 and stime[1] < 90000) Then
{
SetStopEndofday(0);
OO = O;
HH = H;
LL = L;
OO1 = OO[1];
HH1 = HH[1];
LL1 = LL[1];
entry = 0;
}
if H > HH Then
HH = H;
if L < LL Then
LL = L;
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
entry = entry+1;
if HH1 > 0 and LL1 > 0 and entry < 1 then
{
if MarketPosition <= 0 and H < OO+(HH1-LL1)*0.5 Then
buy("b",AtStop,OO+(HH1-LL1)*0.5);
if MarketPosition <= 0 and L > OO-(HH1-LL1)*0.5 Then
sell("s",AtStop,OO-(HH1-LL1)*0.5);
}
즐거운 하루되세요
> 에이치 님이 쓴 글입니다.
> 제목 : 질문드립니다.
> 해외 선물 백테스팅 해보려구 하는데요. 래리 윌리엄스 전략을 구현해보려고합니다.
개장시간이 09:00~04:45 인데
시가 -> 09:00(T) 가격
range -> 전날 09:00(T-1) ~ 04:45(T) 동안 최고가 - 최저가
1. 현재가가 시가 + range * 0.5 를 돌파할때 매수
2. 현재가가 시가 - range *0.5 를 돌파할때 매도
3. 종가(04:45 시점)청산
* 같은날에 매수/매도가 중복되서 들어가지 않도록 한번만 진입
을 구현하고 싶습니다.
부탁드리겠습니다
2019-04-04
214
글번호 127630
답변완료
질문드립니다.
1. 매입평균가 N%수익시 전량청산식이 아래가 맞나요?
if MarketPosition == 1 Then
ExitLong("bx",Atlimit,AvgEntryPrice*1.N,"",Floor(MaxContracts*1.0),1);
맞다면, 매입평균가 3% 손실시 전량청산식 부탁드립니다.
트레일링스탑도 위와같이 작성해주시면 감사하겠습니다.
//
2. 아래는 감사히 짜주신 로직인데요. 여기에 추가로 N%상승한 캔들의 윗꼬리가 몸통보다작고 장대 캔들이후 지금까지 생성된 캔들의 거래대금이 N%상승한장대봉 거래대금보다 적은 종목검색으로 부탁드립니다.
input : N(15),aa(5),xx(5);
var : mav(0);
mav = ma(C,3);
if C >= O*(1+N/100) Then
{
var1 = 0;
var2 = c;
Condition1 = false;
}
Else
{
var1 = var1+1;
if var1 == 3 and var2 > 0 and (mav <= var2*(1+aa/100) and mav >= var2*(1-xx/100)) then
{
Condition1 = true;
if Condition1 == true Then
find(1);
}
}
3. 위 검색식으로 찾은 종목 진입 청산 이후 N%장대봉 발생시 조건초기화(3캔들부터 거래)
4. a라는 조건 발생시 더이상 진입신호 X
2019-04-05
212
글번호 127627
답변완료
문의드립니다
안녕하세요!!
아래지표도 "틱챠트용"으로 변환 부탁드립니다
* 지난번 문의때 함께 질문 드렸어야했는데..
귀찮게해드려서 죄송합니다
input : N(60),HHMMSS(150000);
var : HH(0,data2),LL(0,data2),HH1(0,data2),LL1(0,data2),OO(0,data2),CC(0,data2),CC1(0,data2);
var : Var4(0,data2),var12(0,data2);
if data2(dayindex == 0) Then
Var4 = 0;
Else
Var4 = Var4+data2(BarInterval);
var12 = Var4%N;
if data2(dayindex == 0 or (stime <= HHMMSS and var12 == 0)) Then
{
HH = data2(H);
LL = data2(L);
OO = data2(O);
HH1 = HH[1];
LL1 = LL[1];
CC1 = CC[1];
}
if data2(H) > HH Then
HH = data2(H);
if data2(L) < LL Then
LL = data2(L);
CC = data2(c);
plot1(HH1,"고가-1");
plot2(LL1,"저가-1");
plot3(OO,"oo");
plot4(CC1,"종가-1");
2019-04-04
195
글번호 127622