커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
8101
글번호 230811
답변완료
청산 관련
안녕하세요.
글번호 58847번의 연장입니다. (지난 8월 1일 문의함)
항셍과 같이 당일 진입 당일 청산을 하는 종목은 아래와 같이 장 마감 전 모든 포지션을 강제청산하는게 용이합니다.
Var: MP(0);
MP = MarketPosition;
If (MP <> 0) then SetStopEndofday(051430);
문제는 당일 진입 후 익일 청산하는 종목들(CME 거래소 종목)에서는
위와 같은 강제청산 로직을 쓰면 당일 진입을 못하고 익일 자정 이후부터 포지션이 잡힌다는 겁니다.
그래서 지난 번 알려주신 로직을 아래와 같이 잘 쓰고 있습니다.
Inputs: SSTIME(200000), EETIME(050000), XXTIME(051430);
//--------- 써머타임 체크 ---------//
Vars: ST(0), ET(0), Year(0);
Year = Floor(sDate / 10000);
Var18 = DayofWeek( (10000 * Year) + (100 * 3) + 1 );
If Var18 == 0 Then Value98 = 8;
Else Value98 = 15 - Var18; // 3월 두번째 일요일 날짜
Var20 = DayofWeek( (10000 * Year) + (100 * 11) + 1 );
If Var20 == 0 Then Value99 = 1;
Else Value99 = 8 - Var20; // 11월 첫번째 일요일 날짜
If sDate > (10000 * Year) + (100 * 3) + Value98 And sDate < ( 10000 * Year) + (100 * 11) + Value99 Then
Begin
ST = 070000; // 써머타임 적용 시, 장 시작 시간
ET = 060000; // 써머타임 적용 시, 장 종료 시간
End
Else
Begin
ST = 080000; // 장 시작 시간
ET = 070000; // 장 종료 시간
End;
CONDITION1 = ( IntPortion(Time / 10000) > IntPortion(ET / 10000) And IntPortion(Time[1] / 10000) <= IntPortion(ET / 10000) ) Or ST <> ST[1];
//------- 매매 시간대 -------//
Vars: MP(0), TimeCond(False);
MP = MarketPosition;
If (sDate != sDate[1] and sTime >= SSTIME) or (sDate == sDate[1] and sTime >= SSTIME and sTime[1] < SSTIME) Then
Begin
TimeCond = True;
End;
If (sDate != sDate[1] and sTime >= EETIME) or (sDate == sDate[1] and sTime >= EETIME and sTime[1] < EETIME) Then
Begin
TimeCond = False;
End;
If (sDate != sDate[1] and sTime >= XXTIME) or (sDate == sDate[1] and sTime >= XXTIME and sTime[1] < XXTIME) Then
Begin
If MP == 1 Then ExitLong("Exit Buy");
If MP == -1 Then ExitShort("Exit Sell");
End;
//--------- 진입 로직 ---------//
If TimeCond Then
Begin
~~~~~~~~~~~ 중략 ~~~~~~~~~~~~
End;
여기까지는 좋은데 문제는 '시스템 매매 설정'에서 주문 시작 신호를 진입 신호로 안쓰고 모든 신호로 잘못해서 설정할 경우에는
Exitlong 함수에서 매도로 진입하고, Exitshort에서 매수로 진입하는 경우가 있습니다.
이렇게 되면 뒤에 연이어 다른 진입신호가 떴을 때 한번 더 진입을 하게 되어 총 2개의 포지션을 갖게 됩니다.
다음에 나올 청산 로직에서는 진입 포지션을 한 개로만 인식하고 하나만 청산합니다.
그럼 나머지 하나의 포지션은 장 마감 이후에도 포지션이 정리가 안되어 남아 있습니다.
이런 경우를 대비해 SetStopEndofday() 함수를 이용해 남아 있는 당일 모든 포지션을 강제 청산하려는 것인데
CME 거래소 종목에서는 의도하는 시간대부터 진입이 안되는 문제가 있어서 강제청산함수를 못쓰고 있습니다.
이를 대체할 수 있는 청산 로직을 가이드 해주시면 감사하겠습니다.
2018-08-19
312
글번호 121442
답변완료
종목 검색 관련 문의드립니다.
안녕하세요.
특정 종목을 장전에 선택한 후, 그 종목이 시가 대비 -2% 하락하면 매수하는 코드를 짜고 싶습니다.
1. 파워종목 검색의 예스랭귀지 편집기에서 코드를 짤 수 있을까요?
2. 아니면, 예스스팟 전략파일 자체에서 코드를 짜야하나요?
가능하다면 관련해서 예시 코드를 보고싶습니다.
감사합니다!
2018-08-19
202
글번호 121441
답변완료
식 변경 부탁드립니다.
안녕하세요,
아래 식 변경하여 문의드리고자 합니다
1.
1일1진입을 삭제하고 당일청산 삭제
2.
한번 진입에서 추가로
제가 설정한 비율로 두번 더 진입할수있도록 하며(총3번진입)
설정한 비율에서 진입하면 중복진입하지 않습니다.
(설정일부터 설정한 진입값 이후 추가 진입값에 도달하지못해
모두 진입하지 못하고 청산값에 도달하여도 청산,
청산이나 손절이 나오면 더이상 진입안함)
3.
청산,손절은 전량청산
4.
설정날 저점과 고점을 설정후
고점갱신이 아닌 처음 설정한 저점과고점으로 고정
(설정한 날의 당일은 분봉 고점갱신 설정되고 이후날부터 고점갱신없음
, 당일 분봉으로만 고점갱신. 후일 고점갱신없음)
위 내용 부탁드립니다.
감사합니다.
---------------------------------------------------------------
input : ndate(20180601),ntime(90000),수량(1),고점(100),저점(90);
input : 매매구분(1),rate(0.652),청산1(0.7),청산2(0.6),청산조건가격(0.4),손절(0.3);
var : Tcond(false),HH(0),ll(0),t1(0),entrycount(0),dd(0),gap(0);
if bdate != bdate[1] Then
t1 = TotalTrades;
if MarketPosition == 0 Then
entrycount = TotalTrades-t1;
Else
entrycount = TotalTrades-t1+1;
if sdate == ndate and stime == ntime Then
{
Tcond = true;
hh = 고점;
ll = 저점;
dd = sdate;
}
if Tcond == true then
{
if sdate >= dd and H > hh Then
hh = h;
var1 = hh-(hh-LL)*rate;
if 매매구분 == 1 and entrycount < 1 and L > var1 and stime < 144000 Then
buy("b",AtLimit,var1,수량);
if MarketPosition == 1 Then
{
gap = (EntryPrice-var1[BarsSinceEntry])/var1[BarsSinceEntry]*100;
if lowest(L,BarsSinceEntry) > (hh-(hh-LL)*청산조건가격)*(1+gap/100) then
ExitLong("bp1",atlimit,(hh-(hh-LL)*청산1)*(1+gap/100));
Else
ExitLong("bp2",atlimit,(hh-(hh-LL)*청산2)*(1+gap/100));
ExitLong("bl",AtStop,(hh-(hh-LL)*손절)*(1+gap/100));
}
}
SetStopEndofday(151500);
2018-08-20
224
글번호 121440
답변완료
문의드립니다.
도움주시는 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 지표
-5분봉
a-일봉크기 절대값의 [200개] 평균
plot1= dayopen + a 표준편차1
plot2= dayopen + b 표준편차1
*[]은 외부변수
2018-08-19
207
글번호 121439
답변완료
문의 드립니다.
안녕하세요.. 문의 드립니다.
해외선물거래 입니다.
매도 진입 : 종가가 볼린저 밴드 (20,2) 상단선 위에 있거나 (or),
볼린전밴드 상단선과 1%이내로 이격 되어 있는 상태에서
macd(5.20.2)선이 시그널선을 crossdown 발생 후 (첫번째 신호)
다시한번 macd(5.20.2)선이 시그널선을 crossdown 발생 (n번째 신호)
macd 기준선과 이격이 n번째신호, 첫번째신호 순이며,(n번째가 가깝고 첫번째가 멀리 있음)
신호발생가격은 첫번째 신호 발생가격보다 n번째 신호 발생가격이 20틱이상 높으면 매도 진입
매수 진입 : 종가가 볼린저 밴드 (20,2) 하단선 아래에 있거나 (or),
볼린전밴드 하단선과 1%이내로 이격 되어 있는 상태에서
macd(5.20.2)선이 시그널선을 crossup 발생 후 (첫번째 신호)
다시 한번 macd(5.20.2)선이 시그널선을 crossup 발생 (n번째 신호)
macd 기준선과 이격이 n번째신호, 첫번째신호 순이며,(n번째가 가깝고 첫번째가 멀리 있음)
신호발생가격은 첫번째 신호 발생가격보다 n번째 신호 발생가격이 20틱 이상 낮으면 매수 진입
청산 : 50틱 수익 발생후 최고수익의 30%하락시 청산
가변 변수 설정은 : macd와 볼린저밴드 변수로 해주십시요.
2018-08-19
217
글번호 121438
답변완료
엑셀로 출력할수있게 부탁드립니다
1.상하한가 30%이후 기준으로
(일봉상)
거래대금 500억 이상의 상한가 출현시
상한가 당일의 시.고.저.종.거래대금.5.10.20.60.120이평값과
상한가이후의 N일까지 (N은 외부변수로 빼주세요)
시.고.저.종.거래대금.5.10.20.60.120이평값을 엑셀로 출력할수 있게 만들어주세요
(거래대금은 꼭 일봉상 완성된봉의 거래대금이 출력될수 있도록 부탁드립니다)
2.위에 조건에서 N일까지가 아니라 일봉상 종가가 20이평아래로 떨어질때까지 엑셀로 출력
하도록 만들어주세요
항상 고맙습니다
수고하세요!
2018-08-20
234
글번호 121437
답변완료
Moving Average Oscllator
MAO(Moving Average Oscllator -기본 변수값)매매수식 부탁합니다
(1) MAO가 상승하면 매수하고 하락하면 매도
(2) MAO가 기준선을 상향 돌파하면 매수, 기준선을 하향 돌파하면 매도
2018-08-19
222
글번호 121436
관리자에 의해 프로그램 사용법 QnA로 이동되었습니다
2018-08-18
11
글번호 121434
답변완료
문의드립니다.
도움주시는 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 기타
아래 전략은 진입횟수 1로 해도 하루 진입횟수를 초과해서 진입하더라구요. 어떻게 수정해야 하나요?
/*
1. 전략내용
LRL지표의 변화율이(현재봉과 두봉전) 상승하면서 일정값 이상이면 매수, 하락하면서 일정값 이하면 매도
매수포지션 상태에서 진입후 LRL의 최고가에서 일정값 이상 하락하면 매도
매도포지션 상태에서 진입후 LRL의 최저가에서 일정값 이상 상승하면 매수
2. 기타
LRL지표를 이용하여 TrailingStop과 같은 기능을 구현한게 눈에 띔
매수와 매도 변수를 각각 따로 최적화 하는 것이 갠적으로 걸림..
*/
inputs: ndays(30),//10~100(10)
pctup(0.01),//0.001~0.01(0.001)
pctdn(0.005),//0.001~0.01(0.001)
jmpup(0.20),//0.10~0.60(0.02)
jmpdn(0.18);//0.10~0.60(0.02)
vars: pf(0),le(0),se(0);
pf = LRL(close, ndays);
if marketposition == 0 then begin
if pf / pf[2]*100 > 100 + jmpup then begin
buy("B1", atmarket);
le = 1;
end;
if pf / pf[2]*100 < 100 - jmpdn then begin
sell("S1", atmarket);
se = 1;
end;
end;
input :
진입횟수(1),
손절률(1),
익절률(1)
;
var : count(0),T1(0);
input : 진입시간(90000),제한시간(150000),청산시간(153400);
var : Tcond(false);
SetStopLoss(손절률,PercentStop);
SetStopProfittarget(익절률,PercentStop);
if stime == 청산시간 or (stime > 청산시간 and stime < 청산시간) Then{
Tcond = false;
if MarketPosition == 1 Then
exitlong();
if MarketPosition == -1 Then
ExitShort();
}
if (sdate != sdate[1] and stime >= 진입시간) or
(sdate == sdate[1] and stime >= 진입시간 and stime[1] < 진입시간) then
{
Tcond = true;
T1 = TotalTrades;
}
if (sdate != sdate[1] and stime >= 제한시간) or
(sdate == sdate[1] and stime >= 제한시간 and stime[1] < 제한시간) then
{
Tcond = false;
}
if MarketPosition == 0 Then
count = TotalTrades-T1;
Else
count = TotalTrades-T1+1;
if Count < 진입횟수 and Tcond == true then
{
if marketposition == 1 then begin
if pf < highest(pf, le) * (1 - pctdn) then begin
sell("S2", atmarket);
le = 0;
end;
le = le + 1;
end;
if marketposition == -1 then begin
if pf > lowest(pf, se) * (1 + pctup) then begin
buy("B2", atmarket);
se = 0;
end;
se = se + 1;
end;
}
2. 기타
아래 전략 시뮬차트에서도 쓸 수 있게 수정부탁드립니다.
Inputs: TrixLen(3), TSLen(8), ZeroCrss("Y"), AvgCrss("Y");
Vars: TRXval(0), AvgTRX(0), Zero(0), NewTrix(0);
Vars: LogP(0), alpha(0), sm1(0), sm2(0), sm3(0);
//newTrix 시작
LogP = Log(Close);
IF CurrentBar == 1 Then Begin
sm1 = LogP;
sm2 = LogP;
sm3 = LogP;
alpha = 2 / (TRIXLen + 1);
End
Else Begin
sm1 = (LogP - sm1) * alpha + sm1;
sm2 = (sm1 - sm2) * alpha + sm2;
sm3 = (sm2 - sm3) * alpha + sm3;
NewTrix = (sm3 - sm3[1]) * 100;
End;
//newTrix 끝
TRXval = NewTRIX;
AvgTRX = LRL(TRXval, TSLen);
IF UpperStr(ZeroCrss) == "Y" Then Begin
IF CrossUp(TRXval , Zero) Then
Buy("B_ZCrss");
IF CrossDown(TRXval , Zero) Then
Sell("S_ZCrss");
End;
IF UpperStr(AvgCrss) == "Y" Then Begin
IF CrossUp(TRXval , AvgTRX) Then
Buy("B_AvgCrss");
IF Crossdown(TRXval , AvgTRX) Then
Sell("S_AvgCrssS");
End;
3. 기타
전에 만들어주신 수식인데요. 한번 진입한 뒤 진입을 안합니다. 가장 첫 거래때 손실이면 0이 되서 진입을 안하는 건지 이유를 잘 모르겠습니다. 수정 부탁드립니다.
1.
input : 설정수량(1),증감수량(1),제한수량(10);
var : vol(0);
if MarketPosition == 0 then
{
if TotalTrades == 0 Then
vol = 설정수량;
Else
{
if PositionProfit(1) >= 0 Then
vol = MaxContracts(1)+증감수량;
else
vol = MaxContracts(1)-증감수량;
}
}
else
{
if PositionProfit(0) >= 0 Then
vol = MaxContracts(0)+증감수량;
else
vol = MaxContracts(0)-증감수량;
}
if MarketPosition <= 0 and vol <= 제한수량 and 매수진입조건 Then
{
Buy("b",OnClose,def,vol);
}
if MarketPosition >= 0 and vol <= 제한수량 and 매도진입조건 Then
{
sell("s",OnClose,def,vol);
}
2
input : 설정수량(1),증감수량(1),제한수량(10);
var : vol(0);
if MarketPosition == 0 then
{
if TotalTrades == 0 Then
vol = 설정수량;
Else
{
if PositionProfit(1) >= 0 Then
vol = MaxContracts(1)+증감수량;
}
}
else
{
if PositionProfit(0) >= 0 Then
vol = MaxContracts(0)+증감수량;
}
if MarketPosition <= 0 and vol <= 제한수량 and 매수진입조건 Then
{
Buy("b",OnClose,def,vol);
}
if MarketPosition >= 0 and vol <= 제한수량 and 매도진입조건 Then
{
sell("s",OnClose,def,vol);
}
2018-08-19
267
글번호 121433