커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4325
글번호 230811
답변완료
수식문의드립니다.
어제 질문했던 것을 보니 제가 질문을 잘못했더군요.
매수든 매도든 다수의 계약으로 한번에 진입한 이후,
청산을 여러가지 경우로 나누어 청산하는 전략을 세우려고 합니다.
예를 들어,
매수로 N계약만큼 진입 이후,
1. 체결된 계약(또는 남아 있는 계약)의 1/2은 0.5P(10틱)에서 청산
2. A라는 조건을 만족시 남아 있는 계약의 1/2은 청산
3. B라는 조건을 만족시 남아 있는 계약의 1/2은 청산
4. 체결된 계약(또는 남아 있는 계약 전부)에 대해서 C라는 조건을 만족시에는 모두 청산
위 1~4의 조건은 어떤 것이 먼저 만족할 지는 상황에 따라 다릅니다.
이와 같이 청산 전략을 세울경우 수식을 어떻게 만들어야 되나요?
(4번에서, C라는 조건이었는데, B라는 조건이라고 써놔서 혼란을 야기한 것 같습니다.)
알려주신 수식에서
var : count(0);
if MarketPosition == 1 then{
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "bx1" Then
Condition1 = true;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "bx2" Then
Condition2 = true;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "bx3" Then
Condition3 = true;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "bx4" Then
Condition4 = true;
부분이 꼭 필요한가요?
각조건 별로...exitlong함수에서 currentcontracts*0.5나 currentcontracts를 써서 그냥 작성하면 오류가 나나요?
이래저래 청산되고 남은 계약수가 0이 되었을때는, exitlong이나 exitshort 함수가 실행되지 않도록 하는 작업이 꼭 필요한 것인지요? 그냥 currentcontracts 나 marketposition이 0이 되면 어차피 실행이 안되니 상관없는 것 아닌지 궁금합니다.
그냥, 위 예시에서.
if 진입 then
exitlong("",atlimit,EntryPrice+PriceScale*10,"",Floor(CurrentContracts*0.5),1);
if A조건 then
exitlong("",OnClose,def,"",Floor(CurrentContracts*0.5),1);
if B조건 then
exitlong("",OnClose,def,"",Floor(CurrentContracts*0.5),1);
if C조건 then
exitlong("",OnClose,def,"",Floor(CurrentContracts),1);
이런 식으로 해버리면 오류가 나나요?
2017-11-24
169
글번호 114476
답변완료
문의드립니다
아래 수식은 매수 매수청산, 매도 매도청산 수식을 하나로 통합하였으나
수식을 실제로 적용하니 일정구간은 계속 매수진입만 또는 일정구간은 매도진입만 실행이 됩니다
구현하고자 하는 수식은
매수진입후 매수청산, 매도진입후 매도청산 순으로 반복적으로 실행하여야 합니다
예를 들자면 매수진입-- 매수청산,
매수청산 후(또는 동시에) 매도진입-- 매도청산
매도청산 후(또는 동시에) 매수진입 순으로 구현하는 방법입니다
아울러 통합된 수식에서 구현이 불가능하다면 매수수식 한가지만을 이용하여 만들어 주세요
현재 매수수식은 매수진입-매수청산만 있습니다
이것을 매수진입 - 매수청산 동시에 매도진입 - 매도청산 동시에 매수진입 순으로 진행하고자 합니다
항상 감사합니다
input : b1(9),b2(9),X1(9),X2(9),진입눌림(3),진입돌파(1),청산눌림(3),청산돌파(1),거래횟수(20),시작시간(090000) ;
var : T1(0),entry(0),LL(0),EH(0),E1(0),H1(0),i1(0),S1(0),L1(0),V1(0);
var : sHH(0),sEL(0),sE1(0),sH1(0),si1(0),sS1(0),sL1(0),sV1(0);
if (sdate != sdate[1] and stime >= 시작시간) or
(sdate == sdate[1] and stime > 시작시간 and stime[1] < 시작시간) Then{
T1 = TotalTrades;
E1 = 0;
LL = L;
}
if stime >= 시작시간 then{
if L < LL Then
LL = L;
if MarketPosition == 0 Then
entry = TotalTrades-T1;
Else
entry = (TotalTrades-T1)+1;
if MarketPosition == 0 and entry == 0 Then{
if E1 == 0 and C >= LL+PriceScale*B1 and C[1] < LL+PriceScale*B1 Then{
E1 = 1;
H1 = H;
i1 = index;
V1 = LL; //시작점 종가
}
if E1 == 1 and index > i1 then{
if H > H1 Then
H1 = H;
#저가가 시작봉종가보다 클때만 눌림체크
if L >= V1 and L <= H1-PriceScale*진입눌림 Then{
E1 = 2;
i1 = index;
S1 = H1;
}
}
//시작점 종가보다 낮은 가격이 발생하면 초기화
if E1 >= 1 and L < V1 Then{
E1 = 0;
LL = L;
}
if E1 == 2 and index > i1 and C >= S1+PriceScale*진입돌파 Then{
buy("b1");
}
}
if TotalTrades > TotalTrades[1] Then{
E1 = 0;
LL = L;
}
if L < LL Then
LL = L;
if MarketPosition == 0 and entry >= 1 and entry < 거래횟수 Then{
if E1 == 0 and C >= LL+PriceScale*B2 and C[1] < LL+PriceScale*B2 Then{
E1 = 1;
H1 = H;
i1 = index;
V1 = LL; //시작점 종가
}
if E1 == 1 and index > i1 then{
if H > H1 Then
H1 = H;
#저가가 시작봉종가보다 클때만 눌림체크
if L >= V1 and L <= H1-PriceScale*진입눌림 Then{
E1 = 2;
i1 = index;
S1 = H1;
}
}
//시작점 종가보다 낮은 가격이 발생하면 초기화
if E1 >= 1 and L < V1 Then{
E1 = 0;
LL = L;
}
if E1 == 2 and index > i1 and C >= S1+PriceScale*진입돌파 Then{
buy("b2");
}
}
if MarketPosition == 1 Then{
if entry >= 1 then{
if CurrentContracts > CurrentContracts[1] Then{
EH = H;
E1 = 0;
}
if H > EH Then{
EH = H;
E1 = 0;
}
if E1 == 0 and C <= EH-PriceScale*X1 Then{
E1 = 1;
L1 = L;
i1 = index;
}
if E1 == 1 and index > i1 Then{
if L < L1 Then
L1 = L;
if H >= L1+PriceScale*청산눌림 Then{
E1 = 2;
I1 = index;
S1 = L1;
}
}
if E1 == 2 and index > i1 and C <= S1-PriceScale*청산돌파 Then{
exitlong("bx1");
E1 = 0;
}
}
}
if MarketPosition == 1 Then{
if entry >= 1 then{
if CurrentContracts > CurrentContracts[1] Then{
EH = H;
E1 = 0;
}
if H > EH Then{
EH = H;
E1 = 0;
}
if E1 == 0 and C <= EH-PriceScale*X2 Then{
E1 = 1;
L1 = L;
i1 = index;
}
if E1 == 1 and index > i1 Then{
if L < L1 Then
L1 = L;
if H >= L1+PriceScale*청산눌림 Then{
E1 = 2;
I1 = index;
S1 = L1;
}
}
if E1 == 2 and index > i1 and C <= S1-PriceScale*청산돌파 Then{
exitlong("bx2");
E1 = 0;
}
}
}
}
if (sdate != sdate[1] and stime >= 시작시간) or
(sdate == sdate[1] and stime > 시작시간 and stime[1] < 시작시간) Then{
T1 = TotalTrades;
sHH = H;
sE1 = 0;
}
if stime >= 시작시간 then{
if H > sHH Then
sHH = H;
if MarketPosition == 0 Then
entry = TotalTrades-T1;
Else
entry = (TotalTrades-T1)+1;
if MarketPosition == 0 and entry == 0 Then{
if sE1 == 0 and C <= sHH-PriceScale*B1 and C[1] > sHH-PriceScale*B1 Then{
sE1 = 1;
sL1 = L;
si1 = index;
sV1 = sHH;
}
if sE1 == 1 and index > si1 then{
if L < sL1 Then
sL1 = L;
if H <= sV1 and H >= sH1+PriceScale*진입눌림 Then{
sE1 = 2;
si1 = index;
sS1 = sL1;
}
}
if sE1 >= 1 and H > sV1 Then{
sE1 = 0;
sHH = H;
}
if sE1 == 2 and index > si1 and C <= sS1-PriceScale*진입돌파 Then{
sell("s1");
}
}
if TotalTrades > TotalTrades[1] Then{
sE1 = 0;
sHH = H;
}
if H > sHH Then
sHH = H;
if MarketPosition == 0 and entry >= 1 and entry < 거래횟수 Then{
if sE1 == 0 and C <= sHH-PriceScale*B2 and C[1] > sHH-PriceScale*B2 Then{
sE1 = 1;
sL1 = L;
si1 = index;
sV1 = sHH; //시작점 종가
}
if sE1 == 1 and index > si1 then{
if L < sL1 Then
sL1 = L;
if H <= sV1 and H >= sL1+PriceScale*진입눌림 Then{
sE1 = 2;
si1 = index;
sS1 = sL1;
}
}
if sE1 >= 1 and H > sV1 Then{
sE1 = 0;
sHH = H;
}
if sE1 == 2 and index > si1 and C <= sS1-PriceScale*진입돌파 Then{
sell("s2");
}
}
if MarketPosition == -1 Then{
if entry >= 1 then{
if CurrentContracts > CurrentContracts[1] Then{
sEL = L;
sE1 = 0;
}
if L < sEL Then{
sEL = L;
sE1 = 0;
}
if sE1 == 0 and C >= sEL+PriceScale*X1 Then{
sE1 = 1;
sH1 = H;
si1 = index;
}
if sE1 == 1 and index > si1 Then{
if H > sH1 Then
sH1 = H;
if L <= sH1-PriceScale*청산눌림 Then{
sE1 = 2;
sI1 = index;
sS1 = sH1;
}
}
if sE1 == 2 and index > si1 and C >= sS1+PriceScale*청산돌파 Then{
ExitShort("sx1");
sE1 = 0;
}
}
}
if MarketPosition == -1 Then{
if entry >= 1 then{
if CurrentContracts > CurrentContracts[1] Then{
sEL = L;
sE1 = 0;
}
if L < sEL Then{
sEL = L;
sE1 = 0;
}
if sE1 == 0 and C >= sEL+PriceScale*X2 Then{
sE1 = 1;
sH1 = H;
si1 = index;
}
if sE1 == 1 and index > si1 Then{
if H > sH1 Then
sH1 = H;
if L <= sH1-PriceScale*청산눌림 Then{
sE1 = 2;
sI1 = index;
sS1 = sH1;
}
}
if sE1 == 2 and index > si1 and C >= sS1+PriceScale*청산돌파 Then{
ExitShort("sx2");
sE1 = 0;
}
}
}
}
2017-11-24
160
글번호 114473
해월정 님에 의해서 삭제되었습니다.
2017-11-24
2
글번호 114467
답변완료
수식부탁드립니다
1.
daylow 에서 7번째 양 캔들 고가가 양 캔들 고가 중 가장 고가일 때
daylow 에서 5번째 양 캔들 시가 표시
dayhigh 에서 7번째 음 캔들 저가가 음 캔들 저가 중 가장 저가일 때
dayhigh 에서 5번째 음 캔들 시가 표시
감사합니다
2017-11-24
205
글번호 114466
답변완료
이것저것 문의드립니다.
덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
이전에 투입금액을 봉 갯수로 나누어서 봉마다 진입, 이전 봉에 따라 다음 투입금액을 달리하는 코딩을 부탁드렸는데요. 한번 수정해서 이 비율에 외부변수를 곱해보니 모두 같은 결과가 나왔습니다. 제가 이해하기에는 봉마다 누적으로 비율이 바뀌니 시뮬결과도 다르게 나와야 할 것 같은데요. 모두 같은 결과가 나옵니다. 제가 착각하는 건지요. 설명 부탁드립니다.
input : 투입금액(1000000),p(0.5);
var : Rate(0);
var1 = (C-C[1])/C[1]*100;
if MarketPosition == 0 Then
value1 = 100;
if Rate > 0 Then
value1 = value1-(value1*Rate*p);
Else
value1 = value1+(value1*Rate*p);
if MarketPosition >= 0 and sdate == 20171116 Then
buy("b",OnClose,def,floor((투입금액*value1)/C));
if NextBarSdate > sdate Then
ExitLong("bx",AtMarket);
[원질문 원답변]
input : 투입금액(1000000);
var : Rate(0);
var1 = (C-C[1])/C[1]*100;
if MarketPosition == 0 Then
value1 = 100;
if Rate > 0 Then
value1 = value1-(value1*Rate);
Else
value1 = value1+(value1*Rate);
if MarketPosition >= 0 and sdate == 20171114 Then
buy("b",OnClose,def,floor((투입금액*value1)/C));
if NextBarSdate > sdate Then
ExitLong("bx",AtMarket);
원질문
-설정금액
-투입금액: 봉갯수만큼 나눠서 매수
-봉 종가마다 매수
-봉 종가가 이전 종가보다 높으면 오른 퍼센테이지만큼 뺀 금액 매수
(예 종가가 1개봉전 종가보다 0.2% 올랐다. => 기존 투입금액의 98.8% 매수)
-다음봉도 이전봉보다 0.2% 올랐다면 98.8%-(98.8%*0.2%) 금액만큼 매수(누적 개념으로)
반대로 봉 종가가 이전 종가보다 낮으면 내린 퍼센테이지만큼 더한 금액 매수
(예 종가가 1개봉전 종가보다 0.2%내렸다. => 현 투입금액*0.2% 더한 금액만큼 매수, 무조건 조건은 이전봉 기준으로, 예를 들어 계속 상승해서 95%투입하다가 다시 오르기 시작하면 95%투입 기준으로 더하기 시작)
청산: 다음날 시가에 청산.
2. 종목검색
해당날짜(외부변수)에 14:00까지
-거래대금 100억원 이상
-장대양봉(기준이 애매하면 그냥 길이가 n이상으로 작성부탁드립니다.)
-당일 거래대금 순위 30위권 이내
-하루변동폭 a% 이상
을 기록한 종목
3.
설정금액
각 봉마다 투입금액은 설정금액/봉 타임프레임 봉 갯수
진입
-각 봉마다 봉 시가매수 봉 종가매도
-1번처럼 앞 포지션이 2% 수익이면 투입금액은 98% 이런식으로 투입금액 변화, 손실도 마찬가지로
4. 시스템
1번 수정한 시스템에 당일 전체 손실금액이 투입금액의 n%가 되면 진입제한 수식 부탁드립니다.
5. 기타
설정자금을 설정해놓고 봉갯수로 나누거나 n으로 나누어서 투입하는 식을 적용해보면
많은 금액을 적용했을 때 진입신호가 안나오는 경우가 생깁니다. 종목보다 적은 금액을 설정해놔서 진입신호가 안나오는 건 이해가 되는데요. 왜 많은 금액을 설정해놓으면 신호가 나오지 않을까요?
2017-11-24
173
글번호 114461
잡다백수 님에 의해서 삭제되었습니다.
2017-11-24
2
글번호 114456
답변완료
수식 부탁드립니다.
수고 많으십니다
현재봉 기준으로 20봉 내에 양봉이 하나이상 존재하고 두 개이상인 경우에는 연속으로 존재하는 구간에서
(A) 구간내에서의 최고종가가격
(B) 구간내에서의 최고종가과 최저시가의 변화율
(C) 최고종가가격의 현재봉으로부터의 위치
(D) 현재봉부터 (C)의 봉 사이에 최저가
(B)>=5% and ((A)/(D)-1)*100>5 인 종목을 검색하는 식 부탁드립니다.
조건검색식 아닙니다
2017-11-24
183
글번호 114455
답변완료
부탁 드립니다,
도움 주심에 감사 드립니다.
williams AD의
타주기(분봉,틱용) 부탁 드립니다.
미리 감사 드립니다.
var : WAD(0);
WAD = WillA;
2017-11-24
208
글번호 114454
답변완료
지표부탁드립니다.
안녕하세요. ^^
항상 감사합니다.
윗꼬리 혹은 아랫꼬리가 몸통보다 긴 캔들이 완성되면 해당 캔들위에 점이나 원으로 표시하는 지표를 알고 싶습니다.
즐거운 날 되세요.
감사합니다.^^
2017-11-24
162
글번호 114453