커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4655
글번호 230811
답변완료
글번호 46959번 재질문(11-1)
안녕하세요?
글번호 46959번 재질문입니다.
아래의 스크립트에 주석으로 요청드립니다.
감사합니다.
var : TF(0);
var : Xtime(0), Etime(false),cnt(0),mav1(0),mav2(0);
var : HV(0),LV(0),HV1(0),LV1(0),HV2(0),LV2(0);
Array : HH[50](0),LL[50](0),CC[50](0);
mav1 = ma(c,5);
mav2 = ma(C,20);
TF = TimeToMinutes(stime)%30;
if Bdate != Bdate[1] Then{
Etime = true;
if stime >= 090000 Then
Xtime = 050000;
Else
Xtime = 060000;
}
if Bdate != Bdate[1] or (TF < TF[1] and stime > stime[1]) or date != date[1] Then{
HH[0] = H;
LL[0] = L;
for cnt = 1 to 49{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
}
}
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
CC[0] = C;
if HH[25+2] > 0 Then{
HV = HH[0];
LV = LL[0];
HV1 = HH[1];
LV1 = LL[1];
HV2 = HH[2];
LV2 = LL[2];
for cnt = 0 to 25{
if HH[cnt] > HV Then
HV = HH[cnt];
if LL[cnt] < LV Then
LV = LL[cnt];
if HH[cnt+1] > HV Then
HV = HH[cnt+1];
if LL[cnt+1] < LV Then
LV = LL[cnt+1];
if HH[cnt+2] > HV Then
HV = HH[cnt+2];
if LL[cnt+2] < LV Then
LV = LL[cnt+2];
}
var1 = (HV+LV)/2;
var2 = (HV1+LV1)/2;
var3 = (HV2+LV2)/2;
if Etime == true then{
if MarketPosition == 0 and CC[0] > var1 and CC[1] < var2 and CC[2] < var3 and C >= daylow+0.5 Then
buy("b",AtMarket);
if MarketPosition == 1 and c <= highest(H,BarsSinceEntry)-0.5 and CrossDown(mav1,mav2) Then
ExitLong("bx",AtMarket);
}
}
if stime == Xtime or (stime > Xtime and stime[1] < Xtime) Then{
Etime = false;
ExitLong();
}
2016-03-25
113
글번호 96583
회원 님에 의해서 삭제되었습니다.
2016-03-25
30
글번호 96577
답변완료
특정 시간동안의 변동성을 구할 수 있는 식이 있나요?
특정 선물상품을 거래한다 쳤을때
예컨대 오후 10시~오전 6시 동안의 변동폭을 구할 수 있는 식이 있습니까?
일단 오후 10시에 무조건 매수진입해서, 오전 6시에 무조건 청산하는 식을 만들면
시스템 리포트상에 그 기간동안의 최대 손실폭이 나올것 같은데
이런식으로 설정해서 시간을 변수로 만들어
가장 변동성이 적은 시간대를 구하고 싶습니다.
그럼 오늘도 수고하십시오!
2016-03-25
125
글번호 96571
답변완료
문의드립니다
if date != date[1] Then{
var1 = 0;
var2 = 0;
}
If (C > O) or (C == O and C >= C[1]) Then
var1 = var1+(V-V[1]);
If !(C > O) or (C == O and C >= C[1]) Then
var2 = var2+(V-V[1]);
Plot1(var1, "상승거래량");
Plot2(var2, "하락거래량"); 당일상승거래량합계,하락거래량합계 누적합계수치를 지표상에(오른쪽에)나타나게 하고싶습니다 우리나라시간으로오전9시부터 다음날오전5시까지 적용 부탁드립니다 ~~미리감사드립니다
2016-03-25
135
글번호 96570
답변완료
문의드립니다
안녕하세요
두가지입니다.
1.아래지표식(RENKO_MACD)에서 MACD 대신에
RENKO_RSI
지표식을 부탁드립니다.
input:renkoSize(0.5),p1(12),p2(26),p3(9);
input : 마지막봉시간(065900);
var:j(0),k(0),renkoCnt(0),gubun(0),filename("renko2.txt"),printOK(False),
sum(0),ema1_OK(false),ema2_OK(false),sig_OK(False),idx(0);
array:OO[50](0),HH[50](0),LL[50](0),CC[50](0),ma1[50](0),ma2[50](0),
ema1[50](0),ema2[50](0),macdVal[50](0),macdSig[50](0);
if Bdate != Bdate[1] Then
idx = 0;
idx = idx+1;
If idx == 0 Then { //break on session에 해당, 즉 일자가 바뀌면 새로 계산
gubun = 0; //방향을 초기화한다. 이후 형성되는 가격에 의해 방향이 계산
For j = 49 DownTo 1 { //금일 시가봉을 신규 추가
OO[j] = OO[j-1];
HH[j] = HH[j-1];
LL[j] = LL[j-1];
CC[j] = CC[j-1];
ema1[j] = ema1[j-1];
ema2[j] = ema2[j-1];
macdVal[j] = macdVal[j-1];
macdSig[j] = macdSig[j-1];
}
OO[0] = C; //분봉의 종가를 기반으로 계산하기 때문에 당일 시초가 아니다
HH[0] = C;
LL[0] = C;
CC[0] = C;
}
Else {
If gubun == 0 and CC[0] > 0 Then { //일 첫봉이 완성되지 않은 시점
If OO[0] - renkoSize >= C Then {
gubun = -1;
CC[0] = OO[0] - renkoSize;
HH[0] = OO[0];
LL[0] = CC[0];
//지수이평을 계산할 수 있을 만큼 렌코가 만들어진 이후 계산 시작
if ema1_OK then ema1[0] = (CC[0]-ema1[1])*(2/(p1+1))+ema1[1];
if ema2_OK then ema2[0] = (CC[0]-ema2[1])*(2/(p2+1))+ema2[1];
if ema2_OK then macdVal[0] = ema1[0] - ema2[0];
if sig_OK then macdSig[0] = (macdVal[0] - macdSig[1])*(2/(P3+1))+macdSig[1];
j = 0;
if printOK then print(filename,
"1=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",
j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
Else If OO[0] + renkoSize <= C Then {
gubun = 1;
CC[0] = OO[0] + renkoSize;
HH[0] = CC[0];
LL[0] = OO[0];
if ema1_OK then ema1[0] = (CC[0]-ema1[1])*(2/(p1+1))+ema1[1];
if ema2_OK then ema2[0] = (CC[0]-ema2[1])*(2/(p2+1))+ema2[1];
if ema2_OK then macdVal[0] = ema1[0] - ema2[0];
if sig_OK then macdSig[0] = (macdVal[0] - macdSig[1])*(2/(P3+1))+macdSig[1];
j = 0;
if printOK then print(filename,
"2=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",
j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
If LL[0] - renkoSize >= C Then {
gubun = -1;
renkoCnt = Int(Round((LL[0]-C)/renkoSize,9));
if renkoCnt > 49 then renkoCnt = 49;
For j = 49 DownTo renkoCnt {
OO[j] = OO[j-renkoCnt];
HH[j] = HH[j-renkoCnt];
LL[j] = LL[j-renkoCnt];
CC[j] = CC[j-renkoCnt];
if ema1_OK then ema1[j] = ema1[j-renkoCnt];
if ema2_OK then ema2[j] = ema2[j-renkoCnt];
if ema2_OK then macdVal[j] = macdVal[j-renkoCnt];
if sig_OK then macdSig[j] = macdSig[j-renkoCnt];
}
For j = renkoCnt-1 DownTo 0 {
OO[j] = LL[j+1];
CC[j] = LL[j+1] - renkoSize;
HH[j] = OO[j];
LL[j] = CC[j];
if ema1_OK then ema1[j] = (CC[j]-ema1[j+1])*(2/(p1+1))+ema1[j+1];
if ema2_OK then ema2[j] = (CC[j]-ema2[j+1])*(2/(p2+1))+ema2[j+1];
if ema2_OK then macdVal[j] = ema1[j] - ema2[j];
if sig_OK then macdSig[j] = (macdVal[j] - macdSig[j+1])*(2/(P3+1))+macdSig[j+1];
if printOK then print(filename,
"3=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
Else If HH[0] + renkoSize <= C Then {
gubun = 1;
renkoCnt = Int(Round((C-HH[0])/renkoSize,9));
if renkoCnt > 49 then renkoCnt = 49;
For j = 49 DownTo renkoCnt {
OO[j] = OO[j-renkoCnt];
HH[j] = HH[j-renkoCnt];
LL[j] = LL[j-renkoCnt];
CC[j] = CC[j-renkoCnt];
ema1[j] = ema1[j-renkoCnt];
ema2[j] = ema2[j-renkoCnt];
macdVal[j] = macdVal[j-renkoCnt];
macdSig[j] = macdSig[j-renkoCnt];
}
For j = renkoCnt-1 DownTo 0 {
OO[j] = HH[j+1];
CC[j] = HH[j+1] + renkoSize;
HH[j] = CC[j];
LL[j] = OO[j];
if ema1_OK then ema1[j] = (CC[j]-ema1[j+1])*(2/(p1+1))+ema1[j+1];
if ema2_OK then ema2[j] = (CC[j]-ema2[j+1])*(2/(p2+1))+ema2[j+1];
if ema2_OK then macdVal[j] = ema1[j] - ema2[j];
if sig_OK then macdSig[j] = (macdVal[j] - macdSig[j+1])*(2/(P3+1))+macdSig[j+1];
if printOK then print(filename,
"4=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",
j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
Else If stime >= 마지막봉시간 and stime[1] < 마지막봉시간 Then { //당일 종가봉에서
For j = 49 DownTo 1 {
OO[j] = OO[j-1];
HH[j] = HH[j-1];
LL[j] = LL[j-1];
CC[j] = CC[j-1];
ema1[j] = ema1[j-1];
ema2[j] = ema2[j-1];
macdVal[j] = macdVal[j-1];
macdSig[j] = macdSig[j-1];
}
If LL[1] > C Then { //종가가 이전 봉보다 아래 형성
OO[0] = LL[1];
CC[0] = C;
HH[0] = OO[0];
LL[0] = CC[0];
} Else If HH[1] < C Then { //종가가 이전 봉보다 위에 형성
OO[0] = HH[1];
CC[0] = C;
HH[0] = CC[0];
LL[0] = OO[0];
} Else { //종가가 이전 봉의 중간에 형성
OO[0] = C;
CC[0] = C;
HH[0] = C;
LL[0] = C;
}
if ema1_OK then ema1[0] = (CC[0]-ema1[1])*(2/(p1+1))+ema1[1];
if ema2_OK then ema2[0] = (CC[0]-ema2[1])*(2/(p2+1))+ema2[1];
if ema2_OK then macdVal[0] = ema1[0] - ema2[0];
if sig_OK then macdSig[0] = (macdVal[0] - macdSig[1])*(2/(P3+1))+macdSig[1];
j = 0; //마지막 1봉만 출력
if printOK then print(filename,
"5=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",
j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
if ema1_OK == False and CC[p1] > 0 then { //지수이평 계산 가능할 때까지 대기
sum = 0;
for j = 0 to p1 - 1 {
sum = sum + CC[j];
}
ema1[0] = sum/p1; //처음 값은 단순이평값으로
ema1_OK = True; //다음 봉부터 지수이평 계산되도록 설정
}
if ema2_OK == False and CC[p2] > 0 then {
sum = 0;
for j = 0 to p2 - 1 {
sum = sum + CC[j];
}
ema2[0] = sum/p2;
ema2_OK = True;
}
if sig_OK == False and CC[P2+p3] > 0 then {
sum = 0;
for j = 0 to p3 - 1 {
sum = sum + macdVal[j];
}
macdSig[0] = sum/p3;
sig_OK = True;
}
Plot1(macdVal[0],"macd");
Plot2(macdSig[0],"macd signal");
PlotBaseLine1(0);
2.아래지표식 Range Bar MACD 에서 MACD 대신에
Range Bar Stochastics(단순이평적용) 부탁드립니다.
Input:tick(20);
Input:shortPeriod(12), longPeriod(26), Period(9);
Var:j(0),k(0),n(0),trend(0),tickVal(0),oneTick(0),count(0),remain(0);
Var:epS(0),epL(0),ep(0),JISU1(0),JISU2(0),SigV(0),PreJISU1(0),preJISU2(0),PreSigV(0);
// macdV(0),macdS(0),macdO(0);
Array:OO[1000](0),HH[1000](0),LL[1000](0),CC[1000](0),val[4](0);
Array:MacdVal[1000](0),MacdSig[1000](0),MacdOsc[1000](0);
#==============================================================================#
# Range Bar Chart 계산
#==============================================================================#
If Index == 0 Then
{
tickVal = tick * PriceScale;
oneTick = PriceScale;
OO[0] = O;
HH[0] = O;
LL[0] = O;
CC[0] = O;
}
count = 0;
val[0] = O;
val[3] = C;
If O > C Then
{
val[1] = H;
val[2] = L;
If L < C Then trend = 1;
Else trend = -1;
}
Else If O < C Then
{
val[1] = L;
val[2] = H;
If H > C Then trend = -1;
Else trend = 1;
}
Else If C[1] > O Then
{
val[1] = L;
val[2] = H;
If H > C Then trend = -1;
Else trend = 1;
}
Else If C[1] < O Then
{
val[1] = H;
val[2] = L;
If L < C Then trend = 1;
Else trend = -1;
}
Else If trend == 1 Then
{
val[1] = H;
val[2] = L;
If L < C Then trend = 1;
Else trend = -1;
}
Else If trend == -1 Then
{
val[1] = L;
val[2] = H;
If H > C Then trend = -1;
Else trend = 1;
}
For k = 0 To 3
{
If HH[0] > 0 && HH[0] < val[k] Then
{
While val[k] - LL[0] > tickVal
{
HH[0] = LL[0] + tickVal;
CC[0] = HH[0];
For j = 998 DownTo 0
{
OO[j+1] = OO[j];
HH[j+1] = HH[j];
LL[j+1] = LL[j];
CC[j+1] = CC[j];
}
count = count + 1;
OO[0] = HH[1] + oneTick;
LL[0] = OO[0];
}
If val[k] - LL[0] <= tickVal Then
{
HH[0] = val[k];
CC[0] = val[k];
}
}
Else If LL[0] > val[k] Then
{
While HH[0] - val[k] > tickVal
{
LL[0] = HH[0] - tickVal;
CC[0] = LL[0];
For j = 998 DownTo 0
{
OO[j+1] = OO[j];
HH[j+1] = HH[j];
LL[j+1] = LL[j];
CC[j+1] = CC[j];
}
count = count + 1;
OO[0] = LL[1] - oneTick;
HH[0] = OO[0];
}
If HH[0] - val[k] <= tickVal Then
{
LL[0] = val[k];
CC[0] = val[k];
}
}
Else
{
CC[0] = val[k];
}
}
#==============================================================================#
# Range Bar Chart MACD 값 계산
#==============================================================================#
If Index == 0 Then
{
epS = 2/(shortPeriod+1);
epL = 2/(longPeriod+1);
ep = 2/(Period+1);
}
If count > 0 Then
{
For n = count DownTo 1
{
For j = 998 DownTo 1
{
MacdVal[j+1] = MacdVal[j];
MacdSig[j+1] = MacdSig[j];
MacdOsc[j+1] = MacdOsc[j];
}
PreJISU1 = JISU1;
PreJISU2 = JISU2;
PreSigV = SigV;
JISU1 = CC[n] * epS + PreJISU1 * (1-epS);
JISU2 = CC[n] * epL + PreJISU2 * (1-epL);
MacdVal[1] = JISU1 - JISU2;
SigV = MacdVal[1] * ep + PreSigV * (1-ep);
MacdSig[1] = SigV;
MacdOsc[1] = MacdVal[1] - MacdSig[1];
}
}
Else
{
Value1 = CC[0] * epS + PreJISU1 * (1-epS);
Value2 = CC[0] * epL + PreJISU2 * (1-epL);
MacdVal[0] = Value1 - Value2;
Value3 = MacdVal[0] * ep + PreSigV * (1-ep);
MacdSig[0] = Value3;
MacdOsc[0] = MacdVal[0] - MacdSig[0];
}
If DayIndex == 0 Then remain = 0;
remain = remain + count;
n = remain;
Plot1(MacdVal[n]);
Plot2(MacdSig[n]);
If remain > 0 Then remain = remain - 1;
PlotBaseLine1(0, "기준선1");
2016-03-25
190
글번호 96569
답변완료
안녕하세요
제가 잘 몰라서요
1번질문:
var1 = ma(c,3);
var2 = ma(C,5);
var3 = ma(c,20);
if MarketPosition <= 0 and crossup(var2,var3) Then
buy("매수");
if MarketPosition == 0 and MarketPosition(1) == 1 and CrossDown(var1,var2) and var1 > var3 Then
buy("재매수");
if MarketPosition <= 0 and CrossDown(var2,var3) Then
sell("매도");
if MarketPosition == 0 and MarketPosition(1) == 1 and CrossUp(var1,var2) and var1 < var3 Then
sell("재매도");
SetStopLoss(PriceScale*5,PointStop);
SetStopProfittarget(PriceScale*5,PointStop);
앞전에 부탁해서 만들어주셨는데요 익절하고 손절 없애주시면 감사하겠습니다
2번질문
Input: SPeriod(12), LPeriod(29);
Var: ma1(0), ma2(0), MACDv(0);
ma1 = (dayOpen()-ema(C, SPeriod))+dayOpen();
ma2 = (dayOpen()-ema(C, LPeriod))+dayOpen();
MACDv = ma1-ma2;
plot1(MACDV); //역
plot2(MACD(SPeriod,LPeriod));//정
차트상 지표속성에서 변수값이 안나오게 해주시면 감사하겠습니다
3번질문
Input: SPeriod(12), LPeriod(29);
Var: ma1(0), ma2(0), MACDv(0);
ma1 = (dayOpen()-ema(C, SPeriod))+dayOpen();
ma2 = (dayOpen()-ema(C, LPeriod))+dayOpen();
MACDv = ma1-ma2;
plot1(MACDV); //역
plot2(MACD(SPeriod,LPeriod));//정
매수 매도 신호로 바꿔주시면 감사하겠습니다
1번부터-3번까지 질문해놓았습니다 잘 몰라서 이렇게 부탁드립니다 수고하세요
2016-03-25
153
글번호 96568
답변완료
수식문의
수고하십니다.
첨부파일처럼
양이나 음오실 신규 발생시 해당하는 봉의 시가~종가까지 색깔을 입혀서
현재까지 나타나게 할수있나요?
3개까지 입니다. 즉, 다음에 새로 나타나면 그전전것은 사라집니다.
감사합니다.
2016-03-24
144
글번호 96567
회원 님에 의해서 삭제되었습니다.
2016-03-25
31
글번호 96566
답변완료
문위드립니다
당일에 고저가가 자동으로 표시돼게해주세요
홍콩항생의경우 시가가 저녁18시에 시작돼서 피보나치가 그려지는데요...
요것을 시가가 아침장시작시간 10시 15분분터 시가시작으로.... 24시 까지를 하루로보고
그려지게할수있나요.
그냥 피보나치하니 시가가 18시부터 시작하는것을---아침 10시15분부터 시작 하는걸루요
감사합니다
2016-03-24
201
글번호 96565