커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4632
글번호 230811
답변완료
수식 수정 부탁드립니다.
안녕하세요,
1) 지난번에 dayopen, dayclose 등의 함수에 대한 내용에 대한 질문을 드렸는데,
"dayhigh,daylow,dayopen,dayclose는
영업일 변경기준으로 계산을 합니다. 0시가 아닙니다.
차트를 우리나라시간기준으로 설정하시면
7시~다음날 06시가 하루입니다."
란 답변을 듣고 아래와 같은 수식을 작성하였습니다.
수식에서 의도한 바는 7시기준 시가가 PivPnt 중심점 보다 높으면 매수 포지션을 진입하는 것인데, 시뮬레이션 결과에서 00:00 기준으로 매수 주문이 나가고 있습니다.
원래 의도 한 대로 dayopen은 오전 7시 dayclose는 오전 6시에 맞춰서 주문을 하려면 수식을 어떻게 수정해야하나요?
2) 오전 7시 부터 익일 오전 6시까지 매수/청산 주문은 한번만 이루어졌으면 하는데, 어떤 수식이 추가되어야 하나요?
수식)
var : PivPnt(0),Support1(0),Resistance1(0),idx(0);
PivPnt = (DayHigh(1) + DayLow(1) + DayClose(1)) / 3;
Support1 = (PivPnt * 2) - DayHigh(1);
Resistance1 = (PivPnt * 2) - DayLow(1);
if MarketPosition == 0 and PivPnt < dayopen Then
Buy("B",AtStop,DayOpen);
if MarketPosition == 1 Then{
ExitLong("BP1",atlimit,Support1);
ExitLong("BL2",AtStop,(PivPnt+Resistance1)/2);}
2016-05-08
107
글번호 97800
답변완료
Print 와 MessageLog 함수 질문입니다.
질문1 : Print("r:₩a.txt", "%.f", C); 와 MessageLog("%.f", C); 를 종목검색식에서 사용하고 싶습니다.
건의1 : 종목검색에서 Find(A, B, C, ...) 로 진화.
환경 : 하이투자증권의 YesTrader 4.0 , Windows 8.1 x64
질문 : 아래의 식을 지표에서 사용해 보았습니다.
MessageLog("%.f", C);
Print("r:₩a.txt", "%.f", C);
디버깅창과 파일로 출력이 잘 됩니다.
이번에는 종목검색식에
MessageLog("%.f", C);
Print("r:₩a.txt", "%.f", C);
Find(1);
위의 3줄만 입력하였습니다.
화면번호 [3201] 종목검색의 신호검색에서 실행을 시켰습니다.
파일검색은 1665개가 출력되었으나 MessageLog 함수와 Print 함수 2개 모두 되지 않는군요.
그런데 Q&A게시판에서 제목+내용으로 검색해 보니 다른 분들은 사용하고 있네요.
답변 부탁 드립니다.
건의 : 종목검색식에서 Find(매개변수)를 Find(매개변수1, 매개변수2,...)으로 하면 좋겠습니다. 프로그램으로 자신이 원하는 수식을 만드는 과정에서 가장 많은 시간과 비중을 차지하는 것이 변수값의 변화를 확인하는 과정일 것입니다. 물론 messagelog 와 print 함수를 사용할 수 있지만 검색된 각 종목과 같은 행에 출력된 값을 검토하는 것과는 많은 차이가 있을 것입니다. 지표의 경우에는 messagelog 와 print 함수를 사용해도 상관 없으나, 종목 검색의 경우에는 각 종목마다 수치를 검토해야 하므로 원하는 갯수 만큼의 매개변수 항목이 추가로 나와 주면 좋겠습니다.
예) Find(사용자함수 또는 변수값 A, B, C);
[3201] 에 출력된 결과
항목 : 체크항목 뉴 종목명 A B C 종목코드 현재가 거래량 ......
부탁 드립니다.
좋은 하루 되세요.
2016-05-08
139
글번호 97799
회원 님에 의해서 삭제되었습니다.
2016-05-08
26
글번호 97798
답변완료
시스템식부탁드립니다
휴일동안 계속 연이어 부탁드리게 되었습니다
아래 단기 볼린져 색변화 지표식을
상단 하단 red + 중앙 red 발생후 유지할때까지 매수신호 유지
상단 하단 red + 중앙 blue 발생후 유지할때까지 매도신호 유지 시스템식부탁드립니다
만저 감사인사드립니다
input : P(5),dv(2);
var : Price(0),BBmd(0),BBup(0),BBdn(0),diff(0);
Price = (C+H+L)/3;
BBmd = ma(Price,P);
BBup = BBmd + std(Price,5)*dv;
BBdn = BBmd - std(Price,5)*dv;
diff = BBup-BBdn;
if BBmd > BBmd[1] then
plot1(BBmd,"중앙",red);
Else
plot1(BBmd,"중앙",blue);
if diff > diff[1] then{
plot2(BBup,"상단",red);
plot3(BBdn,"하단",red);
}
else{
plot2(BBup,"상단",blue);
plot3(BBdn,"하단",blue);
}
2016-05-07
102
글번호 97797
답변완료
문의드립니다
MACD 로 시스템을 설정하고싶습니다
기준: 0 선에 맞춰서 시스템신호를 받고싶습니다
1. 0선을 타고 올라가는 거에서 매수신호
0선위에서 크로스 발생시 청산신호
0선위에서 청산신호 후 는 매매신호 발생금지
0선 밑으로 내려갈경우 매도신호
0선밑에서 크로스 발생시 청산신호
0선밑에서 청산신호 후 더이상 매매신호 발생금지
2. 외부변수 사용가능하게 설정좀부탁드리겠습니다^^
2016-05-09
103
글번호 97796
답변완료
타주기챠트에서의 익절및 손절추가
항상 감사드립니다
아래시스템을 이용하여 다음조건으로 변경하고 싶습니다
1_변경조건
1)갭발생시(20틱이상) 두번째신호부터 신호발생
2)당일수익 100틱,당일손실50틱 조건만족시 시스템종료
3)연속2회손실시 신호발생금지--> 삭제
4)당일손실이 50틱이상이(신호발생시점) 될때까지 신호발생
5)청산시스템추가
#########################
##### 당일익절 설정 #####
#########################
input : 당일수익틱수(100),당일손실틱수(50);
var : NP(0),PreNP(0),dayPL(0),DollerToTick(0),당일수익(0),당일손실(0);
NP = NetProfit;
당일수익 = PriceScale*당일수익틱수;
당일손실 = PriceScale*당일손실틱수;
if stime == 170000 or (stime > 170000 and stime[1] < 170000) then
PreNP = NP[1];
#당일 손익(포인트)
DayPL = NetProfit-PreNP ;
### 동일방향 재진입금지/전일 마지막신호와 무관하게 진입 ###
### 2회연속손실시 시스템 신호발생 금지 ###
### 시초가 갭발생시(20틱이상) 첫번재신호 발생금지 ###
var : entrycnt(0),cond(false),T(0),count(0),gap(false),Xcond(false);
#장시작
if stime == 170000 or (stime > 170000 and stime[1] < 170000) Then{ # 현지시간_뉴욕 17:00 장시작 #
Entrycnt = 0;
cond = false;
Xcond = false;
#매수매도 방향을 알기위한 변수 초기값은 0
T = 0;
#조건만족횟수 카운트 초기화 0
count = 0;
#시가가 전봉종가(전일종가)보다 20틱이상 크거나 20틱이상 낮으면
#gap은 true 아니면 false
if O >= C[1]+PriceScale*20 or O <= C[1]-PriceScale*20 Then
gap = true;
Else
gap = false;
}
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
Entrycnt = Entrycnt+1;
if TotalTrades > TotalTrades[1] and (IsExitName("BP",1) or IsExitName("BL",1) or IsExitName("SP",1) or IsExitName("SL",1)) Then
Xcond = true;
cond = false;
if entrycnt >= 5 Then{
if MarketPosition == 0 and PositionProfit(1) < 0 and PositionProfit(2) < 0 Then
cond = true;
if MarketPosition != 0 and PositionProfit(0) < 0 and PositionProfit(1) < 0 Then
cond = true;
}
if (stime > 170000 or stime < 143000) and (DayPL < 당일수익틱수*PriceScale and dayPL > -당일손실틱수*PriceScale and Xcond == false ) Then{
# 현지시간_뉴욕 17:00 장시작~익일 14:30 장종료 #
if T <= 0 and #T가 0이고 매수조건이 만족하면
((entrycnt == 0) or
(entrycnt >= 1 and ((MarketPosition == 0 and MarketPosition(1) != 1) or (MarketPosition == -1)))) and #동일방향 재진입금지#
V10 == 1 and data1(c)>선행1 and macdv1>0 and var13==1 and upAroon1 > DnAroon1 and upAroon1>70 and
V70 == 1 and macdv2>0 and upAroon2 > DnAroon2 and dnAroon2<50 Then {
T = 1; #T는 1(매수조건만족했음을 나타냄)
count = count+1; #count는 1증가, 장시작이후 조건만족 횟수를 카운트
#gap이 false이거나 gap이 true이면 count가 2이상일때 진입
if gap == false or (gap == true and count >= 2) Then
{
if cond == false then
buy("B1_1분");
Else
ExitShort();
}
}
if T >= 0 and
((entrycnt == 0) or
(entrycnt >= 1 and ((MarketPosition == 0 and MarketPosition(1) != -1) or (MarketPosition == 1)))) and #동일방향 재진입금지#
V10 == -1 and data1(c)<선행1 and macdv1<0 and var13==-1 and upAroon1 < DnAroon1 and dnAroon1>70 and
V70 == -1 and macdv2<0 and upAroon2 < DnAroon2 and upAroon2<50 Then{
T = -1;
count = count+1;
#gap이 false이거나 gap이 true이면 count가 2이상일때 진입
if gap == false or (gap == true and count >= 2) Then
{
if cond == false Then
sell("S1_1분");
Else
ExitLong();
}
}
}
###############################
##### 청산 시스템 #####
###############################
if MarketPosition == 1 and V70 == -1 and macdv2<0 and upAroon2 < DnAroon2 and upAroon2<50 then
exitlong("eB_타주기");
if MarketPosition == -1 and V70 == 1 and macdv2>0 and upAroon2 > DnAroon2 and dnAroon2<50 Then
ExitShort("eS_타주기");
###############################
##### 매일 14:30 강제청산 #####
###############################
if stime == 143000 or (stime > 143000 and stime[1] < 143000) Then{
exitlong("당일청산B");
ExitShort("당일청산S");
}
### 손절 ###
SetStopLoss(PriceScale*50,PointStop);
감사합니다.
2016-05-08
105
글번호 97795
답변완료
1~2분봉상에서 30분봉 and 일봉지표를 나타내고 싶습니다.
수고하십니다
1. 30분봉 500 개에 대한 아래 지표를 1분 또는 2분 봉상에 표현하고 싶습니다.
2. 일봉 240 개에 대한 아래 지표를 1분 또는 2분 봉상에 표현하고 싶습니다.
### 지표 ####
Var:공격3(0),이평13(0);
공격3 = (DayHigh+DayLow)/2.0;
이평13 = ma(C,13);
Input:상승률(7.2), //지그재그 파동의 상승률
하락률(11.9), //지그재그 파동의 하락률
참조종목(1); //2 이상이면 참조종목의 파동을 이용
Var:CC(0),j(0),k(0),
추세(0),상승(100),하락(-100),
전고점(1),전저점(2),연속고(3),연속저(4),
기준고(0),기준저(0),
변곡점(0),
Array:고[10](0),저[10](0);
#==============================================================================#
# 초기처리 (Initialize Routine)
#==============================================================================#
if 참조종목 == 1 then CC = C;
변곡점 = 0; //매번 0값으로 초기화
#=========================================================#
# 고저 계산
#=========================================================#
if 기준고 <= CC or 기준고 == 0 or IsNaN(기준고) == true then 기준고 = CC;
if 기준저 >= CC or 기준저 == 0 or IsNaN(기준저) == true then 기준저 = CC;
if 기준저[1] * (1 + (상승률/100)) > CC[1] and 기준저[1] * (1 + (상승률/100)) <= CC then
추세 = 상승;
else if 기준고[1] * (1 - (하락률/100)) < CC[1] and 기준고[1] * (1 - (하락률/100)) >= CC then
추세 = 하락;
if 추세[1] == 상승 and 추세 == 하락 then
{
for j = 8 downto 1
{
고[j+1] = 고[j];
}
고[1] = 기준고;
기준고 = CC;
기준저 = CC;
변곡점 = 전고점;
}
else if 추세[1] == 하락 and 추세 == 상승 then
{
for j = 8 downto 1
{
저[j+1] = 저[j];
}
저[1] = 기준저;
기준저 = CC;
기준고 = CC;
변곡점 = 전저점;
}
else if 추세[1] == 하락 and 추세 == 하락 then
{
if 기준고[1] * (1 - (하락률/100)) <= CC[1]
and 기준고[1] * (1 - (하락률/100)) > CC
and 고[1] < 기준고 then
{
고[1] = 기준고;
기준고 = CC;
변곡점 = 연속고;
}
}
else if 추세[1] == 상승 and 추세 == 상승 then
{
if 기준저[1] * (1 + (상승률/100)) >= CC[1]
and 기준저[1] * (1 + (상승률/100)) < CC
and 저[1] > 기준저 then
{
저[1] = 기준저;
기준저 = CC;
변곡점 = 연속저;
}
}
plot1(고[1],"전고");
plot2(저[1],"전저");
plot3(공격3,"공격3");
plot4(이평13,"이평13");
########### 미리 감사 드립니다. ############
2016-05-07
151
글번호 97794
답변완료
문위드립니다
30분봉에 지표를 200틱으로 그대로 볼수있을까요?
감사드립니다
됀다면 다른 틱으로 할땐는 무엇을 어떻게해야할까요
2016-05-07
149
글번호 97793
답변완료
수식 부탁드립니다.
아래 두 식은 수식지왕님의 블로그에서 참조(주석생략)한 식인데요.
두 식 모두 고점과 저점을 수평선(Plot)으로 잇는 식을 부탁드립니다.
예전에 답해주셨던 게시물 내용을 참조로 스스로 식을 작성해 보았지만 아직 초보의 한계를 벗어나지 못하고 있네요.
잘 부탁드리며 항상 적극적인 도움을 주셔서 감사드립니다.
1번 식
#==========================================#
# 지표명 : 지그재그파동(변동률)
# 작성자 : 수식지왕
# 블로그 : http://yahoosir.blog.me
#==========================================#
Input:chngRate(5);
Var:j(0),lastHiVal(0),lastLoVal(0),turnPntBit(""),TL1(0);
Array:valArr[20](0),barArr[20](0),turnPntArr[20]("");
For j = 0 To 19 {
barArr[j] = barArr[j] + 1;
Condition1 = Min(valArr[1],valArr[2]) * (1 + (chngRate/100)) < H and lastHiVal < H;
Condition2 = Max(valArr[1],valArr[2]) * (1 - (chngRate/100)) > L and (lastLoVal > L || lastLoVal == 0);
If Condition1 Then { lastHiVal = H; lastLoVal = 0; }
If Condition2 Then { lastLoVal = L; lastHiVal = 0; }
turnPntBit = "";
If Condition1 and Condition2 Then {
If turnPntArr[1] == "Hi" Then turnPntBit = "Lo";
Else If turnPntArr[1] == "Lo" Then turnPntBit = "Hi";
}
Else If Condition1 Then turnPntBit = "Hi";
Else If Condition2 Then turnPntBit = "Lo";
If turnPntBit == "Hi" or turnPntBit == "Lo" Then {
If turnPntBit <> turnPntArr[1] Then {
for j = 18 downto 1 {
valArr[j+1] = valArr[j];
barArr[j+1] = barArr[j];
turnPntArr[j+1] = turnPntArr[j];
}
}
If turnPntBit <> turnPntArr[1] or
(turnPntBit == turnPntArr[1] and
((turnPntBit == "Hi" and valArr[1] < H) or
(turnPntBit == "Lo" and valArr[1] > L))) Then {
valArr[1] = IFF(turnPntBit == "Hi",H,L);
barArr[1] = 0;
turnPntArr[1] = turnPntBit;
If turnPntArr[1][1] <> turnPntArr[1][0] Then
TL1 = TL_New(sDate[barArr[2]],sTime[barArr[2]],valArr[2],sDate[barArr[1]],sTime[barArr[1]],valArr[1]);
Else
TL_SetEnd(TL1,sDate[barArr[1]],sTime[barArr[1]],valArr[1]);
}
}
TL_SetSize(TL1,1);
TL_SetColor(TL1,Black);
2번 식
Input:length(12);
Var:j(0),lastHiVal(0),lastLoVal(0),sBar(0),eBar(0),TL1(0),
Text1(0),처리구분("");
Array:고점[10,2](0),저점[10,2](0); //가격,위치
처리구분 = "";
If Highest(H,length) == H and lastHiVal <> H and
Lowest(L,length) == L and lastLoVal <> L Then
{
If 저점[1,1] > L Then 처리구분 = "저점처리";
If 고점[1,1] < H Then 처리구분 = "고점처리";
}
Else If Highest(H,length) == H and lastHiVal <> H Then
처리구분 = "고점처리";
Else If Lowest(L,length) == L and lastLoVal <> L Then
처리구분 = "저점처리";
If 처리구분 == "고점처리" Then
{
lastHiVal = H;
If 고점[1,2] < 저점[1,2] Then
{
For j = 10 DownTo 2
{
고점[j,1] = 고점[j-1,1];
고점[j,2] = 고점[j-1,2];
}
}
If 고점[1,2] < 저점[1,2] or 고점[1,1] < H Then
{
고점[1,1] = H;
고점[1,2] = Index;
sBar = Index - 저점[1,2];
eBar = 0;
If TL_GetBeginDate(TL1) == sDate[sBar] and
TL_GetBeginTime(TL1) == sTime[sBar] Then
{
TL_Delete(TL1);
Text_Delete(Text1);
}
TL1 = TL_New(sDate[sBar],sTime[sBar],저점[1,1],
sDate[eBar],sTime[eBar],고점[1,1]);
Text1 = Text_New(sDate[eBar],sTime[eBar],고점[1,1],
NumToStr(고점[1,1],2));
Text_SetStyle(Text1, 2, 1);
}
}
If 처리구분 == "저점처리" Then
{
lastLoVal = L;
If 저점[1,2] < 고점[1,2] then
{
For j = 10 DownTo 2
{
저점[j,1] = 저점[j-1,1];
저점[j,2] = 저점[j-1,2];
}
}
If 저점[1,2] < 고점[1,2] or 저점[1,1] > L then
{
저점[1,1] = L;
저점[1,2] = Index;
sBar = Index - 고점[1,2];
eBar = 0;
If TL_GetBeginDate(TL1) == sDate[sBar] and
TL_GetBeginTime(TL1) == sTime[sBar] Then
{
TL_Delete(TL1);
Text_Delete(Text1);
}
TL1 = TL_New(sDate[sBar],sTime[sBar],고점[1,1],
sDate[eBar],sTime[eBar],저점[1,1]);
Text1 = Text_New(sDate[eBar],sTime[eBar],저점[1,1],
NumToStr(저점[1,1],2));
Text_SetStyle(Text1, 2, 0);
}
}
TL_SetSize(TL1,3);
TL_SetColor(TL1,CYAN);
2016-05-07
199
글번호 97792