커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
7444
글번호 230811
답변완료
부탁드림니다.
아래 수식에 매수/매도시에 익절20틱,손절15틱을 추가하고 싶슴니다.
# 매수/매도청산
If CrossUP(value1, value2) Then
{
Buy();
}
# 매도/매수청산
If CrossDown(value1, value2) Then
{
Sell();
}
2015-10-24
117
글번호 91649
답변완료
함수수정요청(11-1)
안녕하세요?
아래의 함수에서 하루를 영업일 기준이 아닌
우리시각 기준으로 변환 부탁드립니다.
24시 기준으로 하루변경)
var : entry1(0);
var : ho1(0),OL1(0),HL1(0);
var : maho1(0),maOL1(0),maHL1(0);
var : cnt1(0),sumho1(0),sumOL1(0),sumHL1(0);
var : EntryCnt1(0);
var : V1(0),V2(0),V3(0),V4(0),V5(0);
var : V6(0),V7(0),V8(0),V9(0),V10(0);
if bdate != bdate[1] Then
entry1 = 0;
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
entry1 = entry1+1;
ho1 = Dayhigh-Dayopen;
OL1 = DayOpen-DayLow;
HL1 = DayHigh-DayLow;
sumho1 = 0;
sumOL1 = 0;
sumHL1 = 0;
for cnt1 = 1 to 10{
sumho1 = sumho1 + (dayhigh(cnt1)-dayopen(cnt1));
sumOL1 = sumOL1 + (DayOpen(cnt1)-DayLow(cnt1));
sumHL1 = sumHL1 + (DayHigh(cnt1)-DayLow(cnt1));
}
maho1 = sumho1/10;
maOL1 = sumOL1/10;
maHL1 = sumHL1/10;
V1 = dayopen(0)+maho1;
V2 = DayOpen(0)-maOL1;
V3 = DayOpen(0)+maHL1;
V4 = DayOpen(0)-maHL1;
V5 = NthMaxList(1,V1,V2,V3,V4);
V6 = NthMaxList(2,V1,V2,V3,V4);
V9 = NthMaxList(3,V1,V2,V3,V4);
V10 = NthMaxList(4,V1,V2,V3,V4);
V7 = (V5+V10)/2;
V8 = (V6+V9)/2;
if MarketPosition == 0 and entry1 == 0 Then{
if V7 > V8 Then
sell("s1",AtStop,V7-0.02);
if V7 < V8 Then
sell("s2",Atlimit,V8-0.02);
}
if MarketPosition == -1 and IsEntryName("s1") == true Then{
ExitShort("sp1",atlimit,V9-0.03);
ExitShort("sl1",AtStop,V6);
}
if MarketPosition == -1 and IsEntryName("s2") == true Then{
ExitShort("sp2",atlimit,V9-0.03);
ExitShort("sl2",AtStop,V6);
}
2015-10-24
119
글번호 91648
답변완료
시스템식 검토 부탁드립니다.
안녕하세요.. 항상 감사드립니다.
아래 시스템식에서 input : 전략식종료일자(20151021); 를 추가해서
전략식시작일자~전략식종료일자에 시스템식으로 매매되도록 수정 부탁드립니다.
----------------------------------------------------------------------------------------------
input : 전략식시작일자(20150422), 전략식시작시간(090000), 전략총매수금액(2000); # 금액은 만원단위
input : P(10),매수위치1차(10), 매수위치2차(7), 매수위치3차(14);
input : 매수위치보정(1);
input : 매도위치1차(7), 매도위치2차(14);
input : 매수비중1차(20), 매수비중2차(30), 매수비중3차(50);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(10);
input : 타점보유일수(3);
var : sum(0),mav(0),cnt(0),eup(0),edn(0),Didx(0),LatestEntryDidx(0),Ecnt(0);
var : TimeCond(false),Xcond1(false),Xcond2(false),Loss(0),LatestEntrylow(0);
#일자수 계산
if date != date[1] Then
Didx = Didx+1;
#당일포함 일봉 P개의 종가를 누적
sum = 0;
for cnt = 0 to P-1{
sum = sum+DayClose(cnt);
}
#누적값을 P로 나누어 평균값 산출
mav = sum/P;
#상단
Eup = mav+mav*(매수위치1차/100);
#하단
Edn = mav-mav*(매수위치1차/100);
#지정일 지정시간이 되면 TimeCond는 True(그전에는 false)
if sdate == 전략식시작일자 and (stime == 전략식시작시간 or (stime > 전략식시작시간 and stime[1] < 전략식시작시간 )) then
TimeCond = true;
#TimeCond가 True가 된 후
if TimeCond == true then{
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "1차매수" Then
Ecnt = Ecnt+1;
#무포지션 상태에서 매수위치1차에 도달하면 매수
if MarketPosition == 0 and Ecnt < 전략식진입횟수 Then
buy("1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략총매수금액*10000/c)*(매수비중1차/100)));
#첫매수이후
if MarketPosition == 1 Then{
#최근 진입시점의 일자수 저장
if CurrentContracts > CurrentContracts[1] Then{
LatestEntryDidx = Didx;
LatestEntrylow = L;
}
#1차매수 발생 후 매수위치2차에 도달하면 매수
if MaxEntries == 1 Then
buy("2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략총매수금액*10000/c)*(매수비중2차/100)));
#1차매수 발생 후 매수위치3차에 도달하면 매수
if MaxEntries == 2 Then
buy("3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략총매수금액*10000/c)*(매수비중3차/100)));
#1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true
if LatestExitName(0) == "1차매도" then
Xcond1 = true;
#2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true
if LatestExitName(0) == "2차매도" then
Xcond2 = true;
#Xcond1이 false일때
#진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산
if Xcond1 == false Then
exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1);
#Xcond2가 false일
#진입이후 최저가에서 매도위치2차 만큼 상승하면 전량청산
if Xcond2 == false Then
exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100));
#최근 진입후 3일이상 경과(현재 일자수가 최근진입시점의 일자수보다 3이상증가)
if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then{
#최근 진입이후 3일되었을때의 최근진입일 포함3일 최저가 계산
if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then{
Loss = daylow(1);
for cnt = 1 to 타점보유일수{
if daylow(cnt) < Loss Then
Loss = daylow(cnt);
}
}
#Loss값 이하로 가격하락하면 전량 청산
exitlong("손절",AtStop,Loss);
}
#최종 매수일 포함 3일경과되면 다음날 시가에 매도
if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 Then{
exitlong("익절2",AtMarket);
}
#1차매도가 발생한 상황
#가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산
# if L < LatestEntrylow and Xcond1 == false Then
# LatestEntrylow = L;
# if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then{
# exitlong("익절1",AtStop,LatestEntrylow);
# }
}
else{#매수포지션이 아니면 false로 초기화
Xcond1 = false;
Xcond2 = false;
}
}
2015-10-24
147
글번호 91647
답변완료
종목검색 수식 부탁드립니다.
1. 고점대비 30% 이상 하락한 종목
2. 3개월 이상 횡보한 종목
3. 전일거래량보다 크고 거래량 60이평보다 큰 종목
수식: 1+2
수식: 2+3
수식: 1+3
수식: 1+2+3
이렇게 4개를 부탁드립니다.
2015-10-23
152
글번호 91646
답변완료
시스템 수식 부탁드립니다.
매수조건
1. 진입 날짜 지정
2. 시초가 갭 상승후 하락하여 전일종가 아래에서 다시 반등시 전일 종가에 매수
3. 전일 종가까지 내려오지 않고 반등시는 시가에 매수
손절조건
금액으로 지정
익절조건
평단가 대비 +10%
2015-10-23
115
글번호 91645
답변완료
글번호 44648번 검증요청
안녕하세요?
아래 글번호 44648번에서
변환해주신 전략을 적용하면
편집기상에서 검증이 완료되었음에도 불구하고
다음과 같은 팝업이 뜨면서 시스템 적용이 되지 않습니다.
"논리값(참/거짓)이나 논리표현식이 와야 합니다."
2015-10-23
213
글번호 91644
답변완료
질문...
분봉적용코드입니다
44613번 연관된 질문입니다
답변주신 코드에
IF VAR3 > 0 Then
FIND(1) ;
이렇게만 추가해서 종목검색을 했는데 종목이 하나도 안나옵니다
나와야 정상인데요...
다시 전체 코드 올려드립니다
보시고 어디가 잘못되었는지 부탁드립니다
검색은 10분봉이던 5분봉이던 상관없구요
검색에 필요한 최소기간을 500까지도 해봤습니다
코드가 틀린게 있다면 조건을 변수화한것뿐입니다
########################################################
INPUT : N(10),UDVol(0),VolRate(200) ;
var : V1(0),V2(0),cnt(0);
Array : V3[10](0);
var : Vcnt(0),PreDate(0),PreDayV(0),ndate(0);
var : Xcnt(0),Nbar(0);
Array : VV1[10](0);
Array : DD[10](0);
if date != date[1] Then{
for cnt = 1 to 9{
V3[cnt] = V3[cnt-1][1];
DD[cnt] = DD[cnt-1][1];
}
}
v1 = accumn(upvol,dayindex+1);
v2 = accumn(DOWNvol,dayindex+1);
V3[0] = V1 - V2 ;
DD[0] = sdate;
if date != date[1] Then{
PreDate = sdate[1];
for Vcnt = 1 to 9{
VV1[Vcnt] = VV1[Vcnt-1][1];
}
}
if PreDate > 0 Then{
for Vcnt = 1 to 1000 {
if stime[Vcnt] <= stime and sdate[Vcnt] == PreDate then{
PreDayV = DayVolume[Vcnt];
Vcnt = 10000;
}
}
}
VV1[0] = DayVolume/PreDayV*100 ;
ndate = 0;
for cnt = 0 to N{
if V3[cnt] > UDVol and VV1[cnt] > VolRate Then
ndate = dd[cnt];
}
if Ndate > 0 then{
Xcnt = 0;
for cnt = 0 to 2000{
if sdate[cnt] >= Ndate Then{
Xcnt = cnt;
}
}
nbar = Xcnt;
if nbar > 0 and nbar < 2000 then{
var1 = 0;
var2 = 0;
var3 = 0;
var4 = var3;
for cnt = nbar downto 0{
var1 = var1+Upvol[cnt];
var2 = var2+DownVol[cnt];
var3 = var1-var2;
if var3 > var4 Then
var4 = var3;
}
}
}
IF VAR3 > 0 Then
FIND(1) ;
2015-10-23
175
글번호 91643
답변완료
고가 저가돌파후 macd 교차
현제종가기준 n봉전에 최고가 최저가를 돌파하고나서 n봉이전에 macd가
교차한시점에 신호를 뛰우고싶습니다.
그림으로 표시했습니다.
부탁드림니다.
익절 손절후 다름신호까지 대기 <매수한번 매도 한번>
첫진입 손실두번째진입2계약 손실시 세번째4계약 마틴으로
진입하고싶어요 이익 청산시 원래1계약입니다
2015-10-23
242
글번호 91642
답변완료
함수변경요청(SK증권)
안녕하세요?
아래는 SK증권에서 사용했던 함수입니다.
CB의 의미는 CurrentBar입니다.
즉, 현재 봉의 유효한 봉번호입니다.
최소필요봉수가 50이라면 51번째 봉의 CB가 1값입니다.
YT로 변환 요청드립니다.
Params : pPVal_1( Close ), pLeng_1( 14 ), pLine_1( 5 ) ;
v11 = RSI( pPVal_1, pLeng_1 ) ;
if CB > 1 then
if CrossUp(v11, pLine_1) Then
Buy ("RSI Stg BY", AtMarket);
Params : pPVal_2( Close ), pLeng_2( 5 ) ;
v0 = Momentum( pPVal_2, pLeng_2 ) ;
v1 = Momentum( v0, 1 ) ;
if v0 < 0 and v1 < 0 then
Sell ("Momentum SE", AtStop, L + 1 ) ;
Params : pLeng_3( 3 ), pFloorAmt_3( 1 ), pPositionBasis_3( false ) ;
v2 = HighestFast( High, pLeng_3 ) ;
If pPositionBasis_3 = false then
v3 = CurrentShares * pFloorAmt_3
else
v3 = pFloorAmt_3 ;
Cond1 = SignalPosition = -1 && MaxPositionProfit >= v3 ;
if Cond1 then
ExitShort ( "TrailingChannel SX", AtStop, v2 ) ;
Params : pLeng_4( 3 ), pProfit_4( 0.5 ), pIsPosition_4( false ) ;
v4 = LowestFast( Low, pLeng_4 ) ;
If pIsPosition_4 = false then
v5 = CurrentShares * pProfit_4
else
v5 = pProfit_4 ;
Cond5 = SignalPosition = 1 && MaxPositionProfit >= v5 ;
If Cond5 then
ExitLong ( "TrailingChannel LX", AtStop, v4) ;
2015-10-23
177
글번호 91632