커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
5502
글번호 230811
답변완료
종목검색에서 find(1) 명령에서 1을 쓰는 이유가 궁금합니다.
안녕하세요?
아주 사소한 질문을 올립니다. 너무 초보라서 죄송합니다.
if crossup(c,mav) and cond[1] == true then
find(1);
이런 명령에서 find 뒤에 (1)을 붙이는 이유가 궁금합니다.
종목 검색식을 만드는데 저는 괄호에 0을 넣고 검색을 하니까 원래의 목적했던대로
되지 않아서 한참을 헤맸는데,
알고보니 (1)을 붙이는 거였습니다. ㅠㅠ
find 뒤에 (1)붙이는 이유를 알려주세요.
감사합니다.
2023-09-15
902
글번호 172480
답변완료
부탁드립니다
키움에서 쓰던 수식인데 변환 부탁드립니다.
수식1
atrv=((avg(max(max(H-L,abs(C(1)-H)),abs(C(1)-L)),단기,1)/C(1)*100+
avg(max(max(H-L,abs(C(1)-H)),abs(C(1)-L)),장기,1)/C(1)*100)/2)*일정배수
수식2
mm=nPreDayClose(20)+nPreDayClose(19)+nPreDayClose(18)+nPreDayClose(17)+nPreDayClose(16)+nPreDayClose(15)+
nPreDayClose(14)+nPreDayClose(13)+nPreDayClose(12)+nPreDayClose(11)+nPreDayClose(10)+nPreDayClose(9)+
nPreDayClose(8)+nPreDayClose(7)+nPreDayClose(6)+nPreDayClose(5)+nPreDayClose(4)+nPreDayClose(3)+
nPreDayClose(2)+nPreDayClose(1))/20;
수식3
mm+mm*atrv/100
수식4
mm-mm*atrv/100
이고 단기(10) 장기(60) 일정배수(5) 값을 입력하고
수식2가 중단 수식3이 상단 수식4가 하단이며
전일 종가가 하단보다 아래있으며 금일 하단과 골든크로스가 났을때 종가에 매수,
1차매수 값보다 낮을때 종가에 추가매수,
주가가 상단을 골든크로스 했을때 매도
2023-09-15
876
글번호 172479
답변완료
수식 문의
수식 부탁 드립니다.
A1 = BBandsUP(20,2);
A2 = BBandsC(20,2);
A3 = BBandsDown(20,2);
m1 = avg(c, 10);
m2 = avg(c, 20);
ValueWhen(1,(((L(1)<=A2(1)) or (C(1) <=A2(1)) or
(L(2)<=A2(2)) or (C(2) <=A2(2))) &&
C>A2 && ((C>m1) or (C>m1 && C>m2) && C>O)), L)
~ 언제나 감사드려요..... ^*^
2023-09-14
1234
글번호 172478
답변완료
진입조건에 거래 후 청산하고 다시 진입조건에 거래하기 문의
항상 도움에 감사드립니다.
이해를 돕기 위해 이미지를 첨부 했습니다.
아래의 수식은
여러 기준선들 중에서
상단이나 하단을 5번 먼저 터치 하면
진입이 시작되고 목표가격에서 청산 후
거래가 종료되는 수식인데요
--------------------------------------
input : ntime(173800), xtime(230000);
input : tick_size(8);
input : line_num(20); //줄을 몇개 그을 것인지
input : num(8); // 몇번 터치하면 진입하는지.
var : Tcond(False), oo(0), k(0), PriceScale_tick_size(0);
var : 상단(0),하단(0),n1(0),daypl(0),vol(0),xcond(False);
array : up_flag[100](0), dn_flag[100](0);
array : b_cnt[100](0), b_text_display[100](0);
array : b_b_cnt[100](0), b_b_text_display[100](0);
array : b_line[100](0), b_TL_display[100](0);
array : b_b_line[100](0), b_b_TL_display[100](0);
array : u_cnt[100](0), u_text_display[100](0);
array : u_u_cnt[100](0), u_u_text_display[100](0);
array : u_line[100](0), u_TL_display[100](0);
array : u_u_line[100](0), u_u_TL_display[100](0);
if (sdate != sdate[1] and stime >= xtime) or
(sdate == sdate[1] and stime >= xtime and stime[1] < xtime) Then
Tcond = False;
if (sdate != sdate[1] and stime >= ntime) or
(sdate == sdate[1] and stime >= ntime and stime[1] < ntime) Then
{
// 변수들 초기화 해주기
Tcond = true;
oo = o;
For k = 1 to line_num
{
up_flag[k] = 0;
dn_flag[k] = 0;
u_cnt[k] = 0;
u_u_cnt[k] = 0;
b_cnt[k] = 0;
b_b_cnt[k] = 0;
PriceScale_tick_size = PriceScale*tick_size;
u_line[k] = oo + (k-1)*PriceScale_tick_size;
u_u_line[k] = oo + k*PriceScale_tick_size;
b_line[k] = oo - (k-1)*PriceScale_tick_size;
b_b_line[k] = oo - k*PriceScale_tick_size;
}
// 조건문으로 터치 카운트 하기
For k = 1 to line_num
{
if H >= u_u_line[k] Then
{
up_flag[k] = 1;
u_u_cnt[k] = u_u_cnt[k] + 1;
}
if L <= b_b_line[k] Then
{
dn_flag[k] = -1;
b_b_cnt[k] = b_b_cnt[k] + 1;
}
}
}
Else
{
if Tcond == true Then
{
For k = 1 to line_num
{
if dn_flag[k] <= 0 and H >= b_line[k] and H[1] < b_line[k] Then
{
dn_flag[k] = 1;
b_cnt[k] = b_cnt[k] + 1;
}
if dn_flag[k] >= 0 and L <= b_b_line[k] and L[k] > b_b_line[k] Then
{
dn_flag[k] = -1;
b_b_cnt[k] = b_b_cnt[k] + 1;
}
if up_flag[k] <= 0 and H >= u_u_line[k] and H[1] < u_u_line[k] Then
{
up_flag[k] = 1;
u_u_cnt[k] = u_u_cnt[k] + 1;
}
if up_flag[k] >= 0 and L <= u_line[k] and L[1] > u_line[k] Then
{
up_flag[k] = -1;
u_cnt[k] = u_cnt[k] + 1;
}
}
}
}
var : T(0);
if (sdate != sdate[1] and stime >= ntime) or
(sdate == sdate[1] and stime >= ntime and stime[1] < ntime) Then
{
T = 0;
n1 = NetProfit;
xcond = False;
}
if TotalTrades > TotalTrades[1] and (IsExitName("bp3",1) or IsExitName("sp3",1)) Then
xcond = true;
if Tcond == true and xcond == False Then
{
if T == 0 Then
{
For k = 1 to line_num
{
if u_u_cnt[k] >= num or u_cnt[k] >= num Then
{
T = k;
상단 = u_u_line[k];
하단 = u_line[k];
}
if b_b_cnt[k] >= num or b_cnt[k] >= num Then
{
T = k;
상단 = b_line[k];
하단 = b_b_line[k];
}
}
}
if T != 0 Then
{
dayPL = (NetProfit-n1)+PositionProfit(0); // n1은 초기의 NetProfit이다.
if daypl >= 0 Then
vol = 2;
Else
vol = max(Ceiling(abs(daypl)/((상단-하단)*3)),2);
ClearDebug;
MessageLog("dayPL : %.2f | NetProfit : %.2f | PositionProfit : %.2f | vol : %.f", daypl, NetProfit, PositionProfit, vol);
MessageLog("상단 : %.2f | 하단 : %.2f | 위청산 : %.2f | 아래청산 : %.2f", 상단, 하단, 상단+(상단-하단)*6, 하단-(상단-하단)*6);
MessageLog("상단 - 하단 : %.2f, T : %.f", 상단-하단, T);
if MarketPosition <= 0 and CrossUp(C,상단) Then
Buy("b1",AtMarket,Def,vol);
if MarketPosition >= 0 and CrossDown(C,하단) Then
Sell("s1",AtMarket,Def,vol);
if MarketPosition == 1 Then
{
ExitLong("Bp1",AtLimit,상단+(상단-하단)*3,"",Floor(CurrentContracts*0.5),1); // 3배수 위치에서 물량 일부 청산하기, 1은 전체에서 한번 청산, 0은 각 진입 횟수 만큼 청산
ExitLong("Bp2",AtLimit,상단+(상단-하단)*7,"",Floor(CurrentContracts*0.5),1);
ExitLong("Bp3",AtLimit,상단+(상단-하단)*10);
}
if MarketPosition == -1 Then
{
ExitShort("sp1",AtLimit,하단-(상단-하단)*3,"",Floor(CurrentContracts*0.5),1);
ExitShort("sp2",AtLimit,하단-(상단-하단)*7,"",Floor(CurrentContracts*0.5),1);
ExitShort("sp3",AtLimit,하단-(상단-하단)*10);
}
MessageLog("daypl %.2f", daypl);
}
}
--------------------------------------------------------------
위의 수식을 아래와 같이 수정, 보완하고 싶습니다
1. 목표가에서 청산후 거래 종료 시점부터
2. 다시 터치 횟수를 처음부터 시작해 5번 터치하면
3. 처음 진입 조건과 같이 진입하고 목표가에서 청산하고
4. 또 목표가에서 청산하고 나면
5. 청산 시점부터 다시 터치 횟수를 시작해
6. 5번 터치 한곳에서 진입을 시작하는 수식입니다
도움 부탁드립니다
2023-09-14
1803
글번호 172477
답변완료
문의드립니다.
수고많습니다.
수식공부차 문의드립니다.
if MarketPosition <= 0 and L < Var5-PriceScale*50 Then
Buy("매수1",AtLimit,Var5-PriceScale*50);
L < Var5-PriceScale*50 대신에 C > Var5-PriceScale*50 변경하면 어떤 차이가 있는지
설명 부탁드리겠습니다. (이렇게 변경하면 수익률이 더 좋게 나와서 문의드립니다)
(왜 L < 을 쓰는지 이해가 안되서 그렇습니다. 저가보다 기준값이 낮을때 매수라는건데
봉의 저가인 L 보다 Var5-PriceScale*50 이 낮을 수 있는건지 모르겠습니다)
또 이때 AtLimit 대신에 비슷하다고 생각한 AtStop 으로 바꾸면
결과값이 많이 달라지는데 당연한 것인지도 궁금합니다.
참고로 기준선에서 많이 빠지면 매수하고, 많이 오르면 매도하는 시스템입니다.
2023-09-14
962
글번호 172475
회원 님에 의해서 삭제되었습니다.
2023-09-14
25
글번호 172474
회원 님에 의해서 삭제되었습니다.
2023-09-14
30
글번호 172473
러블리 님에 의해서 삭제되었습니다.
2023-09-14
16
글번호 172469
답변완료
문의 드립니다
Input : shortPeriod(3), longPeriod(10);
value1 = ma(C, shortPeriod);
value2 = ma(C, longPeriod);
# 매수/매도청산
If CrossUP(value1, value2) Then
{
Buy();
}
# 매도/매수청산
If CrossDown(value1, value2) Then
{
ExitLong();
}
30 이평선 아래 매수금지 수식어의 추가를 부탁합니다.
2023-09-14
925
글번호 172463