커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
1527
글번호 230811
답변완료
어떻게 고쳐야 할까요?
Inputs:
UseRealMBO(False), { True: 실 Bid/Ask 체결량 함수 사용, False: 업틱/다운틱 근사 }
MBOLen(30), { MBO 누적 길이(분) }
MBOSmooth(10),
ATR_Len(14),
ST_ATRMult(2.0), { SuperTrend ATR 배수 }
EMA_Len(20), { 추세평균(EMA) }
RSI_Len(14),
CCI_Len(20),
LearnRate(0.02), { 학습률 η }
L2Decay(0.001), { L2 정규화 λ }
ScoreThreshold(0.15), { 관망 데드존 |score|<=thr }
MaxLots(3), { 최대 계약수 (미니 기준) }
BaseLots(1), { 최소 계약수 }
RiskATR_SL(2.0), { 고정 손절: ATR x N }
RiskATR_Trail(3.0), { 트레일링: ATR x N }
DayLossLimit_KRW(300000), { 1일 손실한도 }
DayProfitTarget_KRW(200000), { 1일 이익목표 }
PointValue(100000), { 미니선물 1pt=100,000원 }
TickSize(0.05),
CostPerRt_KRW(10000), { 왕복 비용(수수료+슬리피지) 가정값/계약 }
UseVWAPFilter(True),
UseTimeFilter(True); { 09:15~09:45, 13:30~14:30만 진입 }
Vars:
{ --- Intraday VWAP --- }
CumPV(0), CumV(0), VWAP(0),
{ --- MBO (업틱-다운틱 근사 or 실체결량) --- }
UpV(0), DownV(0), AskV(0), BidV(0), MBO_1m(0), MBO_30(0), MBO_30_S(0),
{ --- SuperTrend --- }
atr(0), basicU(0), basicL(0), finalU(0), finalL(0), STdir(0),
{ --- 기타 인디케이터 --- }
ema(0), rsi(0), cci(0),
{ --- AI 가중치 (features 1..6) --- }
w1(0), w2(0), w3(0), w4(0), w5(0), w6(0),
x1(0), x2(0), x3(0), x4(0), x5(0), x6(0),
score(0), action(0), { action ∈ {-1,0,1} }
ret_pt(0), reward_pt(0),
{ --- P&L/리스크 관리 --- }
DayPnL_KRW(0), LastClose(0),
Lots(0), StopPx(0), TrailPx(0),
canEnter(False), inTime(False),
{ --- 유틸 --- }
i(0);
/* ========= 0) 일중 리셋 ========= */
If Date <> Date[1] then begin
CumPV = 0; CumV = 0; DayPnL_KRW = 0;
TrailPx = 0; StopPx = 0;
end;
/* ========= 1) VWAP 업데이트 ========= */
atr = AvgTrueRange(ATR_Len);
If CumV = 0 then begin
CumPV = Close * Volume;
CumV = Volume;
end else begin
CumPV = CumPV + Close * Volume;
CumV = CumV + Volume;
end;
If CumV > 0 then VWAP = CumPV / CumV else VWAP = Close;
/* ========= 2) SuperTrend 계산 (기본형) ========= */
basicU = (High + Low) * 0.5 + ST_ATRMult * atr;
basicL = (High + Low) * 0.5 - ST_ATRMult * atr;
If CurrentBar = 1 then begin
finalU = basicU;
finalL = basicL;
STdir = 1;
end
else begin
finalU = minlist(basicU, IFF(Close[1] > finalU[1], basicU, finalU[1]));
finalL = maxlist(basicL, IFF(Close[1] < finalL[1], basicL, finalL[1]));
If Close > finalU[1] then STdir = 1
else if Close < finalL[1] then STdir = -1
else STdir = STdir[1];
If STdir > 0 then finalL = maxlist(finalL, finalL[1]);
If STdir < 0 then finalU = minlist(finalU, finalU[1]);
end;
/* ========= 3) EMA/RSI/CCI ========= */
ema = XAverage(Close, EMA_Len);
rsi = RSI(RSI_Len);
cci = CCI(CCI_Len);
/* ========= 4) MBO (1분 단위 근사) =========
UseRealMBO = True일 때 AskV/BidV를 실 함수명으로 교체
*/
If UseRealMBO then begin
{ 예: AskV = AskTradeVol; BidV = BidTradeVol; <-- 플랫폼 함수명으로 교체 }
AskV = 0;
BidV = 0;
MBO_1m = AskV - BidV;
end
else begin
If Close >= Close[1] then UpV = Volume else UpV = 0;
If Close < Close[1] then DownV = Volume else DownV = 0;
MBO_1m = UpV - DownV;
end;
MBO_30 = Summation(MBO_1m, MBOLen);
MBO_30_S = Average(MBO_30, MBOSmooth);
/* ========= 5) 피처 벡터 x =========
안정화를 위해 ATR/Close 등으로 정규화하고, -3~+3으로 클리핑
*/
{ x1: 모멘텀(수익률/ATR) }
x1 = (Close - Close[1]) / MaxList(atr, 0.00001);
{ x2: RSI 정규화 }
x2 = (rsi - 50) / 50;
{ x3: CCI 정규화 }
x3 = cci / 100;
{ x4: VWAP 위치 (상회=+, 하회=-) }
x4 = (Close - VWAP) / MaxList(atr, 0.00001);
{ x5: 변동성 레짐 (ATR/Close) }
x5 = (atr / MaxList(Close, 0.00001));
{ x6: 수급(MBO 30분, 스무딩) 정규화 }
x6 = MBO_30_S / MaxList(Average(Volume, MBOLen), 1);
{ 클리핑 }
x1 = MaxList(-3, MinList(3, x1));
x2 = MaxList(-3, MinList(3, x2));
x3 = MaxList(-3, MinList(3, x3));
x4 = MaxList(-3, MinList(3, x4));
x5 = MaxList(-3, MinList(3, x5));
x6 = MaxList(-3, MinList(3, x6));
/* ========= 6) 정책 점수 score = w·x ========= */
score = w1*x1 + w2*x2 + w3*x3 + w4*x4 + w5*x5 + w6*x6;
/* ========= 7) 시간대 필터 ========= */
inTime = True;
If UseTimeFilter then begin
inTime = (Time >= 0950 ;
end;
/* ========= 8) 액션 선택 (롱/숏/관망) ========= */
action = 0;
If inTime then begin
If score > ScoreThreshold then action = 1;
If score < -ScoreThreshold then action = -1;
end;
/* ========= 9) 포지션 사이징 (간단 켈리풍; 변동성 억제) ========= */
Lots = BaseLots;
If atr > 0 then begin
{ 위험회피: 변동성 높을수록 수량 축소 }
Lots = BaseLots + IFF(atr/Close < 0.007, 1, 0); { 대략 0.7% 미만이면 +1 }
Lots = MinList(Lots, MaxLots);
end;
/* ========= 10) 1일 손익 한도 체크 ========= */
{ 직전 바 대비 손익 업데이트 (보유 포지션 기반) }
If MarketPosition = 1 then DayPnL_KRW = DayPnL_KRW + (Close - Close[1]) * PointValue * CurrentContracts
else if MarketPosition = -1 then DayPnL_KRW = DayPnL_KRW + (Close[1] - Close) * PointValue * CurrentContracts;
canEnter = (DayPnL_KRW > -DayLossLimit_KRW) and (DayPnL_KRW < DayProfitTarget_KRW);
/* ========= 11) 진입/청산 로직 ========= */
{ 신호와 반대 포지션 보유 시 우선 청산 }
If MarketPosition = 1 and action <= 0 then Sell ("ExitLongSig") all contracts next bar at market;
If MarketPosition = -1 and action >= 0 then BuyToCover ("ExitShortSig") all contracts next bar at market;
{ 신규 진입 (한 방향만) }
If canEnter then begin
If MarketPosition <> 1 and action = 1 then begin
If (not UseVWAPFilter) or (Close > VWAP) then
Buy ("AI-Long") Lots contracts next bar at market;
end;
If MarketPosition <> -1 and action = -1 then begin
If (not UseVWAPFilter) or (Close < VWAP) then
SellShort ("AI-Short") Lots contracts next bar at market;
end;
end;
/* ========= 12) 리스크 관리: ATR 손절 + 트레일링 ========= */
If MarketPosition = 1 then begin
StopPx = EntryPrice - RiskATR_SL * atr;
TrailPx = MaxList(TrailPx, Close - RiskATR_Trail * atr);
If Low <= StopPx then Sell ("SL-L") all contracts next bar at market
else if Low <= TrailPx then Sell ("TR-L") all contracts next bar at market;
end;
If MarketPosition = -1 then begin
StopPx = EntryPrice + RiskATR_SL * atr;
TrailPx = MinList(TrailPx, Close + RiskATR_Trail * atr);
If High >= StopPx then BuyToCover ("SL-S") all contracts next bar at market
else if High >= TrailPx then BuyToCover ("TR-S") all contracts next bar at market;
end;
/* ========= 13) 보상 계산(온라인 학습) =========
- 포지션 방향 × (당일 한 바 수익) [포인트 단위]
- 비용 차감(왕복비용을 바 단위로 균등 가정 - 근사)
*/
ret_pt = (Close - Close[1]); { 해당 바의 포인트 변화 }
If MarketPosition = 1 then reward_pt = ret_pt
else if MarketPosition = -1 then reward_pt = -ret_pt
else reward_pt = 0;
{ 비용 근사: 포지션 있을 때만 소폭 차감 }
If MarketPosition <> 0 then reward_pt = reward_pt - (CostPerRt_KRW/PointValue) * 0.05;
/* ========= 14) 가중치 업데이트: w <- (1-λ)w + η * reward * x ========= */
w1 = (1 - L2Decay) * w1 + LearnRate * reward_pt * x1;
w2 = (1 - L2Decay) * w2 + LearnRate * reward_pt * x2;
w3 = (1 - L2Decay) * w3 + LearnRate * reward_pt * x3;
w4 = (1 - L2Decay) * w4 + LearnRate * reward_pt * x4;
w5 = (1 - L2Decay) * w5 + LearnRate * reward_pt * x5;
w6 = (1 - L2Decay) * w6 + LearnRate * reward_pt * x6;
예스시스템 언어로 어떻게 고쳐야 할까요?
2025-08-30
510
글번호 193610
답변완료
부틱드립니다
수고하십니다
키움수식을 예스로 부탁드립니다
수식1
x=sum(c*v);
z=valuewhen(1,date != date(1) , x(1));
x1=sum(v);
z1=valuewhen(1,date != date(1) , x(1));
(x-z)/(x1-z1)
수식2
x=sum(((h+l+c)/3)*v);
z=valuewhen(1,date != date(1) , x(1));
x1=sum(v);
z1=valuewhen(1,date != date(1) , x(1));
(x-z)/(x1-z1)
2025-08-30
199
글번호 193609
드림365 님에 의해서 삭제되었습니다.
2025-08-30
0
글번호 193608
답변완료
키움수식 종목검색 부탁드립니다.
CC=CCi(20);
M=Macd(12,26);
Ms=eavg(M,9);
S=SuperTrend(60,2);
R=RSI(14);
bs_C=Barssince(CC<-100);
bs_M=Barssince(M<0 && CrossUp(M,Ms));
bs_S=Barssince(CrossUp(C,S));
bs_R=Barssince(R<30);
조건=
bs_C=최소 && bs_C <=봉C &&
bs_M=최소 && bs_M <=봉M &&
bs_S=최소 && bs_S <=봉S &&
bs_R=최소 && bs_R <=봉R;
조건 && !조건(1)
지표변수
봉C 10
봉M 10
봉R 10
봉S 10
최소 5
2025-08-30
197
글번호 193607
답변완료
다음의 지표를 변환하여 주시기를 부탁드립니다.
트레이딩뷰의 "Squeeze Index [LuxAlgo]" 지표입니다.
횡보구간을 잡으려고 여러가지 지표를 사용해 보았으나 소귀의 목적을 이루지는 못했습니다. 스퀴즈 부분을 어느정도 잡을 수 있는 지표라고 하니 꼭 변환을 해 주시면 고맘겠습니다.
우선 자동매매에 적용을 하려고 하니 시스템에 맞게 부탁을 드리고 부차적으로 수동매매시 참고할 수 있도록 지표에 적용될 수 있도록 지표로도 부탁드립니다.
// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
// © LuxAlgo
//@version=5
indicator("Squeeze Index [LuxAlgo]", "Squeeze Index [LuxAlgo]")
//------------------------------------------------------------------------------
//Settings
//-----------------------------------------------------------------------------{
conv = input(50, 'Convergence Factor')
length = input(20)
src = input(close)
//Style
col_0 = input(#ffeb3b, 'Gradient'
, inline = 'inline0'
, group = 'Style')
col_1 = input(#ff5d00, ''
, inline = 'inline0'
, group = 'Style')
col_2 = input(#ff1100, ''
, inline = 'inline0'
, group = 'Style')
//-----------------------------------------------------------------------------}
//Squeeze index
//-----------------------------------------------------------------------------{
var max = 0.
var min = 0.
max := nz(math.max(src, max - (max - src) / conv), src)
min := nz(math.min(src, min + (src - min) / conv), src)
diff = math.log(max - min)
psi = -50 * ta.correlation(diff, bar_index, length) + 50
//-----------------------------------------------------------------------------}
//Plots
//-----------------------------------------------------------------------------{
css1 = color.from_gradient(psi, 0, 80, col_0, col_1)
css2 = color.from_gradient(psi, 80, 100, css1, col_2)
plot_0 = plot(psi, 'PSI', psi > 80 ? na : css2)
plot(psi, 'Dots', psi > 80 ? css2 : na, style = plot.style_cross)
plot_1 = plot(80, display = display.none, editable = false)
fill(plot_0, plot_1, psi < 80 ? na : color.new(#ff1100, 80))
hline(80)
//-----------------------------------------------------------------------------}
2025-08-30
396
글번호 193606
2wnwn 님에 의해서 삭제되었습니다.
2025-08-30
44
글번호 193605
마음모아 님에 의해서 삭제되었습니다.
2025-08-29
0
글번호 193604
일목균형표
안녕하세요?
일목균형표에서 전환선 기준선이 현재봉 기준 9일, 26일 전고점과 전저점이 갱신되지 않는 조건에서 미리 계산할 수 있는 것으로 알고있습니다. 그래서 현재봉이 완성될 때마다 전환선, 기준선 각각 5개 포인트를 미리 계산해서 현재봉까지의 전환선, 기준선 실제값과 붙여서 함께 그려지게 가능할까요?
Shift 기능을 사용해야할 것 같은데, 아무튼 도움 부탁드리겠습니다.
미리 감사드립니다.
2025-08-29
262
글번호 193602
답변완료
함수값 검증을 누르면 오류창이 발생
안녕하세요.함수값이 잘못 되었는지 검증을 누르면 오류창이 발생해서 확인 한번 부탁드립니다.
// ===== 전역 변수 선언 =====
var timer5 = 5;// 5초
var 매수금 = 100000
var 손절 = 0.95
var 익절 = 1.05
var OrderList = []
var MKList = []
var req = null
var V1 = 0 // 스팟 시작시 잔고평가금액 저장용
function Main_OnStart()
{
// 1번 타이머, 5초
Main.SetTimer(1, timer5 * 1000);
// 오늘 매수한 종목 관리 배열 초기화
MKList = [];
// 스팟 시작시 잔고평가금액
V1 = Account1.GetBalanceETCinfo(100);
}
function Main_OnTimer(nEventID) {
var d = new Date();
var YYYYMMDD = d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
// 09:00:00 ~ 15:15:00 사이에 파워종목검색 수행
if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS < 151500) {
Main.ReqPowerSearch("파워종목검색 제목");
}
if (nEventID == 1) {
// 계좌보유종수
var num = Account1.GetTheNumberOfBalances();
// 09:00:00 ~ 15:15:00 사이
if (HHMMSS >= 90000 && HHMMSS < 151500) {
if (num >= 1) {
// 계좌평가금액이 시작 대비 5% 이상이면 전량 매도
if (Account1.GetBalanceETCinfo(100) >= V1 * 1.05) {
// 1번 타이머 종료
Main.KillTimer(1);
// 전 종목 전량 매도
for (var i = 0; i < num; i++) {
Account1.SetBalance(i);
if (Account1.Balance.count > 0) {
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1);
}
}
return; // 전량 매도 후 종료
} else {
// 개별종목 익절/손절 체크
for (var i = 0; i < num; i++) {
Account1.SetBalance(i);
if (Account1.Balance.count > 0 &&
(
Account1.Balance.current >= Account1.Balance.avgUnitCost * 익절 ||
Account1.Balance.current <= Account1.Balance.avgUnitCost * 손절
)
) {
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1);
}
}
}
}
}
// 15:15:00 이후엔 전량 매도 후 타이머 종료
if (HHMMSS >= 151500) {
Main.KillTimer(1);
for (var i = 0; i < num; i++) {
Account1.SetBalance(i);
if (Account1.Balance.count > 0) {
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1);
}
}
}
}
}
2025-08-29
251
글번호 193601