커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
7424
글번호 230811
답변완료
타주기챠트에서의 익절및 손절추가
항상 감사드립니다
아래시스템을 이용하여 다음조건으로 변경하고 싶습니다
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
130
글번호 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
179
글번호 97794
답변완료
문위드립니다
30분봉에 지표를 200틱으로 그대로 볼수있을까요?
감사드립니다
됀다면 다른 틱으로 할땐는 무엇을 어떻게해야할까요
2016-05-07
177
글번호 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
261
글번호 97792
답변완료
For 문으로 배열에 EMA 입력하는 차이
다음과 같은 수식으로 배열에 For문으로 EMA 를 넣으려는데 값이 이상합니다.
(첫번째 첨부 화일)
Arrays : a_ma[9](0);
For Value1 = 0 to 8 {
a_ma[Value1] = Ema(c, Value1 + 2);
}
plot1(a_ma[0], "t1");
plot2(a_ma[1], "t2");
plot3(a_ma[2], "t3");
plot4(a_ma[3], "t4");
plot5(a_ma[4], "t5");
plot6(a_ma[5], "t6");
plot7(a_ma[6], "t7");
plot8(a_ma[7], "t8");
plot9(a_ma[8], "t9");
그런데 다음과 같이 수식을 For문이 아니라 그냥 나열해서 넣으면 제대로 나옵니다.
(두번째 첨부 화일)
Arrays : a_ma[9](0);
a_ma[0] = ema(c, 2);
a_ma[1] = ema(c, 3);
a_ma[2] = ema(c, 4);
a_ma[3] = ema(c, 5);
a_ma[4] = ema(c, 6);
a_ma[5] = ema(c, 7);
a_ma[6] = ema(c, 8);
a_ma[7] = ema(c, 9);
a_ma[8] = ema(c, 10);
plot1(a_ma[0], "t1");
plot2(a_ma[1], "t2");
plot3(a_ma[2], "t3");
plot4(a_ma[3], "t4");
plot5(a_ma[4], "t5");
plot6(a_ma[5], "t6");
plot7(a_ma[6], "t7");
plot8(a_ma[7], "t8");
plot9(a_ma[8], "t9");
어떤 차이가 있는지요?
2016-05-07
146
글번호 97791
답변완료
강조수식부탁드립니다
안녕하세요
2가지 강조수식부탁드립니다
1.
1) 상승할때 강조는 아래 지표식 단기볼린져밴드(색변화)가 상승하고 벌어지면서
이평선 3종류(단기,중기,장기)골든크로스 유지되면서 adx상승 중일때 레드색 유지
2) 하락할때 강조는 아래 지표식 단기볼린져밴드(색변화)가 하락하고 벌어지면서
이평선 3종류(단기,중기,장기)데드크로스 유지되면서 adx상승 중일때 블루색 유지
2.
틱봉에서
1)상승시 다음틱봉이 전틱봉의 저점을 깨지 않고 계속 상승 유지하면 레드색유지
2)하락시 다음틱봉이 전틱봉의 고점을 깨지 않고 계속 하락유지하면 블루색유지
감사합니다
2016-05-06
153
글번호 97790
답변완료
참조 데이터를 사용할때 심각한 오류가 있습니다.!!!
참조데이터를 사용할때 아주 심각한 오류가 있습니다.
상황 설명이 난해하고 어려워 예를 들어서 설명을 하겠습니다.
1. 시뮬레이션 차트를
연결선물, 10분봉, 2015-01-01 ~ 2015-12-31 로 설정을 합니다.
2. 다음의 수식으로 시스템만들어 적용을 합니다.
Variables : MA1(0), MA2(0);
MA1 = MA(Close, 10);
MA2 = MA(Close, 20);
If (MA1[1] < MA2[1] ) Then
Buy ();
If (MA1[1] > MA2[1] ) Then
Sell ();
3. 수수료 = 0, 슬리피지 = 0, 강제청산 없음 으로 세팅후
시뮬레이션 성능보고서를 확인해보면
=> 총손익이 10.50 pt 로 나옵니다.
4. 참조데이터로 ATM 연결 콜옵션을 5 분봉으로 추가합니다.
5. 위의 수식 제일 아랫부분에 다음 코드를 추가합니다.
Var : test(1);
test = Data2( close );
이 코드는 실제 매수/매도 에는 전혀 영향을 미치지 않는 코드입니다.
6. 다시 총손익을 확인해봅니다.
=> 총손익이 9.45 로 바뀌어 있습니다.
7. 참조데이터의 주기를 1분으로 바꾸어봅니다.
=> 총손익이 11.95 로 다시 바뀌었습니다.
7. 모든 차트는 그대로 둔 상태에서 시스템식에 추가한 두줄을 다시 삭제해봅니다.
=> 총손익이 다시 10.50 으로 돌아옵니다.
이렇게 실제 매매에 전혀 영향을 주어서는 안되는 코드가 실제 영향을 주고 있습니다.
제가 간단하게 예제만 작성을 하였기 때문에 그나마 영향이 적은 것이지
제가 실사용중인 시스템에서는 거의 사용 불가능할 정도로 영향을 주고 있습니다.
빠른 조치 부탁드립니다!!!
2016-05-07
218
글번호 97789
답변완료
부탁 드립니다.
항상 도움 주심에 감사 드립니다.
질문1)
전일 일봉의
1)고점선
2)저점선
3)(고점선+저점선)/2 를 당일 분봉에 나타 내는 수식
질문2)그림과 같은 내용의
피보나치 수식을 log 피보나치로 나타 낼수 있겠는지요?
고점1.2797 저점 1.2506
로그로 변환한 값
-23.6%->1.2725
-38.2%->1.2582
-50%->1.2648
-61.8%->1.2613
-76.4%->1.2572
미리 감사와 경배 드립니다.
2016-05-06
238
글번호 97788
답변완료
상한가찾기
저는 다음과 같은 수식으로 상한가를 찾고 있습니다.
input : N(0);
var : 상한가(0), UpLimit(0);
var : up1(0), up2(0), up3(0), up4(0), up5(0),up6(0),Up7(0);
if date >= 19981207 then {
if date < 20050328 && CodeCategory() == 2 then
UpLimit = (BP[0] * 1.12);
Else if date >= 20050328 and date < 20150615 Then
UpLimit = (BP[0] * 1.15);
Else
UpLimit = (BP[0] * 1.30);
if CodeCategory() == 2 then {
if date >= 20030721 then {
up1 = int(UpLimit/100+0.00001)*100;
up2 = int(UpLimit/100+0.00001)*100;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
else {
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/10+0.00001)*10;
up7 = int(UpLimit/1+0.00001)*1;
}
}
Else {
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
if CodeCategory() == 1 || CodeCategory() == 2 then {
if sdate < 20101004 Then{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 100000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=100000, up2, up3);
Else If BP >= 10000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=10000, up4, up5);
Else If BP >= 1000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=1000, up6, up6);
}
Else{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 100000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=100000, up2, up3);
Else If BP >= 10000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=10000, up4, up5);
Else If BP >= 1000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=1000, up6, up7);
}
}
else if CodeCategory() == 8 || CodeCategory() == 9 then { // ETF
상한가 = up6;
}
}
if H[N] >= 상한가[N] Then
find(1);
이건 예스스탁쪽에서 적어준 식인데, 이대로 검색을 하면 실제 상한가를 친 종목에서 한 두 종목 빼고 나올때가 많습니다. 예를들어
2016년 04월 01의 상한가 친 종목은 보락, 지에스인스트루, 대성미생물인데 여기서 검색하면 보락과 지에스인스트루만 나옵니다. 이런 경우는 나열하려면 셀 수 없이 많습니다. 왜 이런지 궁금하고, 모든 상한가 친 종목을 검색할 수 있는 검색식좀 부탁드리겠습니다.
2016-05-06
167
글번호 97787