커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
3713
글번호 230811
답변완료
조건 수식 문의 드립니다.
많은 도움 감사드립니다.
코스피200선물.
A시스텀 로직으로 누적수익(전1일,전2일)이 5포인트 이상이면,
B시스텀 로직으로 매매가 적용되도록 하고,
또다시 B시스텀 로직으로 누적수익이 5포인트 이상이면,
A시스텀 로직으로 자동 변환 될 수 있도록 하는
시스텀 조건 변경이 가능할 수 있을카요?
수고하세요.^^
2020-06-24
1977
글번호 140107
답변완료
시스템 문의합니다
1번질문
1번식은 매수 버전 2번식은 매도 버전인데요
1-2번을 합쳤을때 1번의 모든 변수(28개)와 2번의 모든변수(22개)를 각각 따로 변수값을 지정할수있게 합칠수있나요? 총 50개값으로 지정할수있게 가능한가요?
매수일때 조건하고 매도 조건을 각각 따로따로 지정하고 싶어서 그런건데 가능하며 부탁드립니다
2번질문 혹시 손실이 마니나는 시스템을 buy랑 sell 만 바꾼다고해서 그손실이 수익으로 바뀌는개념은 불가능한 부분이겠죠?
-----------------------------------1번---
Input : RSIPeriod(7),RSI매수값(28),SimPeriod(14),심리도값(36); # RSI와 심리도 기간 및 값 변수
Input : N1(1),초기화(3); # 위 해당 조건 발생후 진입 유효 기간, 7일경과후 초기화
Input : 하락틱수(2); # 해당 조건 발생후 하락틱수만큼 하락후 진입 변수
Input : RSIPeriod1(6),A(0),B(4),D(48),E(72); # 일봉기준 RSI값이 해당변수안에 속해있을때 진입 변수
Input : 거래량1(600),거래량평균봉수(55),거래량평균봉수비율(3.6); # 해당 거래량1,2 사이에 속해 있을때 진입되는 변수 18000
# 1일 1회 거래
# 청산 조건 변수
Input : CCI기간(20),CCI값(500); # CCI값에 의해 청산 수식 변수
Input : 즉시익절1(70),즉시손절1(90); # 익절값 손절값 변수
Input : N2(0.6),N3(0.15); # 상승후 본절청산 관련 수식
Input : tr수익(70),tr하락(25); # 트레일링 관련 수식
Input : N4(0.7),본전생각틱(10); # 하락후 본절청산 관련 수식
Input : N5(0.8),CCI값1(120); # 약 손절 관련 수식
Input : 터치익절(105);
var : cnt(0),SigSum(0),count2(0),RSIsig(0);
Var : Counter(0), DownAmt(0), UpAmt(0), UpSum(0), DownSum(0), UpAvg(0), DownAvg(0);
var : idx(0), PreUpAvg(0), preDownAvg(0),RSIVv(0);
Array : C1[100](0);
var : CCIv(0),RSIv(0),Simri(0),BuySetup(false),DD(0),entry(0);
CCIv = CCI(CCI기간);
RSIV = RSI(RSIPeriod);
Simri = Simrido(SimPeriod);
var4 = ma(V,20);
if Bdate != Bdate[1] Then
{
for cnt = 1 to 99
{
C1[cnt] = C1[cnt-1][1];
}
PreUpAvg = UpAvg[1];
preDownAvg = DownAvg[1];
idx = idx + 1;
}
C1[0] = C;
If idx == RSIPeriod1+2 Then
{
UpSum = 0;
DownSum = 0;
For Counter = 0 To RSIPeriod1 - 1
{
UpAmt = C1[Counter] - C1[Counter+1];
If UpAmt >= 0 Then
DownAmt = 0;
Else
{
DownAmt = -UpAmt;
UpAmt = 0;
}
UpSum = UpSum + UpAmt;
DownSum = DownSum + DownAmt;
}
UpAvg = UpSum / RSIPeriod1;
DownAvg = DownSum / RSIPeriod1;
}
If idx > RSIPeriod1+2 Then
{
UpAmt = C1[0] - C1[1];
If UpAmt >= 0 Then
DownAmt = 0;
Else
{
DownAmt = -UpAmt;
UpAmt = 0;
}
UpAvg = (PreUpAvg * (RSIPeriod1 - 1) + UpAmt) / RSIPeriod1;
DownAvg = (preDownAvg * (RSIPeriod1 - 1) + DownAmt) / RSIPeriod1;
}
If UpAvg + DownAvg <> 0 Then
RSIvv = 100 * UpAvg / (UpAvg + DownAvg);
Else
RSIvv = 0;
if bdate != bdate[1] Then
{
Entry = 0;
Condition2 = true;
}
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
entry = entry+1;
if TotalTrades > TotalTrades[1] and
(IsExitName("즉시손절1",1) == true or IsExitName("본전청산1",1)) then
Condition2 = false;
Condition1 = RSIv < RSI매수값 and Simri < 심리도값 and ((RSIVV > A and RSIVV < B) or (RSIVV > D and RSIVV < E)) ;
if bdate != bdate[1] Then
{
DD = DD+1;
if var2 > 0 and DD == var2+초기화 Then
BuySetup = false;
}
if BuySetup == false and Condition1 == true and Condition1[1] == false Then
{
var1 = C;
var2 = DD;
BuySetup = true;
}
if Condition2 == true and MarketPosition == 0 and C < O and C[1] < O and BuySetup == true and entry == 0
and v < ma(v,거래량평균봉수)*거래량평균봉수비율 and v > 거래량1 Then # and C < O
{
buy("매수",AtLimit,var1-PriceScale*하락틱수);
ExitLong("즉시손절1",AtStop,EntryPrice-PriceScale*즉시손절1);
}
if MarketPosition == 1 then
{
BuySetup = false;
if countif(CrossDown(CCIv,CCI값),BarsSinceEntry) >= 1 and
CCIv < CCI값 and C < O Then
ExitLong("매수cci청산",OnClose);
if highest(H,BarsSinceEntry) >= EntryPrice+PriceScale*즉시익절1 and C < O Then
ExitLong("즉시익절1",OnClose);
if highest(H,BarsSinceEntry) >= (EntryPrice+PriceScale*즉시익절1*N2) Then
ExitLong("본전청산1",AtStop,EntryPrice+PriceScale*즉시익절1*N3);
if highest(H,BarsSinceEntry) >= EntryPrice+PriceScale*tr수익 Then
ExitLong("tr",AtStop, highest(H,BarsSinceEntry)-PriceScale*tr하락);
if lowest(L,BarsSinceEntry) <= EntryPrice-PriceScale*즉시손절1*N4 and C < O Then
ExitLong("저점에서 올라와서 본전 청산",atlimit,EntryPrice+PriceScale*본전생각틱);
if lowest(L,BarsSinceEntry) <= EntryPrice-PriceScale*즉시손절1 *N5 and CCIv >= CCI값1 and C < O Then
ExitLong("저점에서 올라와서 약손절",OnClose);
}
SetStopLoss(PriceScale*즉시손절1,PointStop);
SetStopProfittarget(PriceScale*터치익절,PointStop);
-----------2번----
# 매도 진입 조건 변수
Input : RSIPeriod(7),RSI매수값(65),SimPeriod(7),심리도값(45);
Input : N1(1),초기화(2);
Input : 하락틱수(5);
Input : RSIPeriod1(6),A(14),B(40),D(88),E(100);
Input : 거래량1(100),거래량평균봉수(60),거래량평균봉수비율(4); # Input : 거래량1(100),거래량2(22000);
# 청산 조건 변수
Input : 즉시익절1(70),즉시손절1(70);
Input : N2(0.25),N3(-0.75);
Input : tr수익(75),tr하락(55);
Input : N4(0.45),본전생각틱(55);
Input : 터치익절(115);
var : cnt(0),SigSum(0),count2(0),RSIsig(0);
Var : Counter(0), DownAmt(0), UpAmt(0), UpSum(0), DownSum(0), UpAvg(0), DownAvg(0);
var : idx(0), PreUpAvg(0), preDownAvg(0),RSIVv(0);
Array : C1[100](0);
var : CCIv(0),RSIv(0),Simri(0),SellSetup(false),DD(0),entry(0);
RSIV = RSI(RSIPeriod);
Simri = Simrido(SimPeriod);
if Bdate != Bdate[1] Then
{
for cnt = 1 to 99
{
C1[cnt] = C1[cnt-1][1];
}
PreUpAvg = UpAvg[1];
preDownAvg = DownAvg[1];
idx = idx + 1;
}
C1[0] = C;
If idx == RSIPeriod1+2 Then
{
UpSum = 0;
DownSum = 0;
For Counter = 0 To RSIPeriod1 - 1
{
UpAmt = C1[Counter] - C1[Counter+1];
If UpAmt >= 0 Then
DownAmt = 0;
Else
{
DownAmt = -UpAmt;
UpAmt = 0;
}
UpSum = UpSum + UpAmt;
DownSum = DownSum + DownAmt;
}
UpAvg = UpSum / RSIPeriod1;
DownAvg = DownSum / RSIPeriod1;
}
If idx > RSIPeriod1+2 Then
{
UpAmt = C1[0] - C1[1];
If UpAmt >= 0 Then
DownAmt = 0;
Else
{
DownAmt = -UpAmt;
UpAmt = 0;
}
UpAvg = (PreUpAvg * (RSIPeriod1 - 1) + UpAmt) / RSIPeriod1;
DownAvg = (preDownAvg * (RSIPeriod1 - 1) + DownAmt) / RSIPeriod1;
}
If UpAvg + DownAvg <> 0 Then
RSIvv = 100 * UpAvg / (UpAvg + DownAvg);
Else
RSIvv = 0;
if bdate != bdate[1] Then
{
Entry = 0;
Condition2 = true;
}
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
entry = entry+1;
if TotalTrades > TotalTrades[1] and
(IsExitName("즉시손절1",1) == true or IsExitName("본전청산1",1)) then
Condition2 = false;
Condition1 = RSIv > RSI매수값 and Simri > 심리도값 and ((RSIVV > A and RSIVV < B) or (RSIVV > D and RSIVV < E)) ;
if bdate != bdate[1] Then
{
DD = DD+1;
if var2 > 0 and DD == var2+초기화 Then
SellSetup = false;
}
if SellSetup == false and Condition1 == true and Condition1[1] == false Then
{
var1 = C;
var2 = DD;
SellSetup = true;
}
if Condition2 == true and MarketPosition == 0 and SellSetup == true and C > O and entry == 0 and v > 거래량1
and v < ma(v,거래량평균봉수)*거래량평균봉수비율 Then
sell("매도",AtStop,var1+PriceScale*하락틱수);
if MarketPosition == -1 then
{
SellSetup = false;
SetStopProfittarget(PriceScale*터치익절,PointStop);
if Lowest(L,BarsSinceEntry) <= EntryPrice-PriceScale*즉시익절1 and C > O Then
ExitShort("s즉시익절1",OnClose);
if Lowest(L,BarsSinceEntry) <= (EntryPrice-PriceScale*즉시익절1*N2) Then
ExitShort("s본전청산1",AtStop,EntryPrice-PriceScale*즉시익절1*N3);
if Lowest(L,BarsSinceEntry) <= EntryPrice-PriceScale*tr수익 Then
ExitShort("str",AtStop, Lowest(L,BarsSinceEntry)+PriceScale*tr하락);
if Highest(H,BarsSinceEntry) >= EntryPrice+PriceScale*즉시손절1*N4 and C > O Then
ExitShort("s고점에서 내려와서 본전 청산",atlimit,EntryPrice-PriceScale*본전생각틱);
}
SetStopLoss(PriceScale*즉시손절1,PointStop);
SetStopProfittarget(PriceScale*터치익절,PointStop);
2020-06-24
1869
글번호 140106
답변완료
지표문의요
하한선=BBandsdown(20,2);
Bd=valuewhen(1,crossup(c,하한선),L);
crossup(c,Bd);
변경부탁드립니다 더운데 수고많습니다 감사합니다
2020-06-24
1782
글번호 140105
아무다 님에 의해서 삭제되었습니다.
2020-06-24
3
글번호 140104
답변완료
매수조건관련 문의(Atmarket)
#일봉
input : K1(0.8);
If MarketPosition == 0 and dayhigh > dayopen+(dayhigh(1)-daylow(1))*K1 Then
buy("b",atmarket);
if MarketPosition == 1 Then
{
if NextBarSdate > sdate Then
exitlong("bx2",AtMarket);
}
이런식으로 전략을 만들었습니다.(일봉)
그런데 buy(atmarket)으로 하게 되면 조건이 완성되고 다음봉 시가로 진입을 하기 때문에 익일 시초가로 매수가 됩니다.
제가 원했던 조건은 위의 조건이 만족되면 당일(조건완성시점에 즉시)에 매수하는 방식입니다. 도움 부탁드립니다.
늘 감사드립니다.
2020-06-23
1779
글번호 140103
답변완료
종목검색식 부탁합니다
williams,R(14),energy(100)
1.종목검색식-energy1>energy2 이고 williams,R 이 -50 or -20선을 상향돌파하는종목검색식
2.시스템식- 위 종목검색식을 만족하면 매수
수고하세요~~
2020-06-23
1807
글번호 140102
답변완료
68062 추가질문입니다.
68062 추가질문입니다.
1.
작성해주신 고,저가는 발생된 시점으로부터 갱신이 되는게 아니라
고,저를 수평선으로 표현됨니다.(사진2)
요청드린 부분은 그림2처럼 갱신된 부분을 요청한건데요.(그림1)
수식 수정 부탁드립니다.
2. plot가 많을 경우 그림3처럼 영업일이 변경될때 선들이 겹쳐 보이는데요
지표속성에서 종류->선, 형태는 3번째 점선 입니다.
저가 알고 있는 방법은 지표속성에서 종류->점그래프로 하면 이현상은 나타나지
않지만 굵기를 작게하면 잘 안보이고 두껍게 하면 캔들과 겹칩니다.
이부분을 해결 할려고 TL로 수정할려고 하는건데요
지표속성에서 종류->선, 형태는 3번째 점선을 하면서 영업일사이에 나타나는 현상을
안보이게 하는 방법이 있을까요?
2020-06-23
2011
글번호 140101
답변완료
수식에 오류가 있어 재문의 드립니다.
안녕하세요.
오늘 만들어 주신 수식에 오류가 있어서 좀 더 자세한 설명 첨부하여 부탁드립니다.
** 질의 내용 **
분봉에서 전일 종가 대비 시가가(dayopen 봉만 사용) 5% 이상 갭상승했고 음봉임(오늘 시가봉은 음봉)
그렇다면 시가봉(음봉)의 고가를 돌파하는 봉에서 매수하는 수식을 만들고 싶습니다.
아래가 만들어주신 수식입니다.
2
if bdate != bdate[1] then
{
Condition1 = false;
if C < O and O >= C[1]*1.05 Then
{
Condition1 = true;
var1 = H;
}
}
if Condition1 == true and C > var1 Then
{
Condition1 = false;
buy();
그런데 이 수식은 오늘 시가봉이 음봉일 때 고가를 넘어가서 신호도 나오지만,
첨부한 그림처럼 음봉 다음에서도 신호가 많은 종목에서 나오는 오류가 있는데, 아마도 시가봉 음봉이 고정이 안되고, 전일 봉들의 고가를 넘어도 신호가 나오는가 아닌가 생각되는데, 살펴보시고 수정 부탁드립니다.
감사합니다.
2020-06-23
1929
글번호 140100
답변완료
검색식 수정 부탁드립니다.
이제 막 수식입문한 생초보입니다.
20분봉에서 간단한 검색식을 만들었는데, 프로그램에서 20분 설정하고 검색해도 검색이 되지를 않는데
어디가 잘못 되었는지 수정부탁드립니다.
더불어 현재봉의 거래량(20분봉임)이 전일 하루 동안의 총거래량의 100%를 넘어야 된다는 조건도 넣어주시면 감사하겠습니다.
var : UPline(0),DNline(0);
UPline = EnvelopeUp(120, 3);
Dnline = EnvelopeDown(120, 3);
if
ma(c,8) > ma(c,120) && ma(c,20) > ma(c,120) && ma(c,60) > ma(c,120) &&
ma(c,240)<UPline && ma(c,240)>Dnline &&
ma(c,120)>ma(c,120)[1] && ma(c,120)[1]>ma(c,120)[2] && ma(c,120)[2]>ma(c,120)[3] &&
ma(c,120)[3]>ma(c,120)[4]
Then
find(1);
2020-06-23
1791
글번호 140097