커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4515
글번호 230811
답변완료
함수변환요청
안녕하세요?
아래의 스크립트는 시그널랭귀지로 작성된 것입니다.
함수변환 요청드립니다.
Vars : st(0), et(0), vTIME_Close(0);
V1 = Dayofweek((10000 * Year(D)) + (100 * 3) + 1);
If V1 = 0 Then Value2 = 8
Else Value2 = 15 - V1; // 3월 두번째 일요일 날짜
V2 = Dayofweek((10000 * Year(D)) + (100 * 11) + 1);
If V2 = 0 Then Value4 = 1
Else value4 = 8 - V2; // 11월 첫번째 일요일 날짜
If date > (10000 * Year(D)) + (100 * 3) + value2
And date < (10000 * Year(D)) + (100 * 11) + value4 Then
Begin
st = 070000; // 써머타임 적용 시, 장시작 시간
et = 060000; // 써머타임 적용 시, 장종료 시간
vTIME_Close = 160000;
End
Else
Begin
st = 080000; // 장 시작 시간
et = 070000; // 장 종료 시간
vTIME_close = 170000;
End;
condition1 = (IntPortion(time/10000) > IntPortion(et/10000)
And IntPortion(time[1]/10000) <= IntPortion(et/10000)) Or st <> st[1];
/////////////////////////////////////////////////////////////////
Vars : vDayOpen(0), vDayC(0);
If condition1 Then vDayOpen = O;
If TIME[1] < vTIME_Close And TIME >= vTIME_Close Then v99 = C;
Vars : TCOND(False);
IF vTIME_Close < et Then
Begin
If vTIME_close < TIME And TIME < et Then TCOND = True
Else TCOND = False;
End
Else
Begin
If vTIME_Close < TIMe Or TIME < et Then TCONd = True
Else TCOND = False;
End;
If TCOND Then
Begin
if O > C Then Sell("S", Atlimit, O);
If O < C Then Buy("B", Atlimit, O);
End;
2019-04-04
177
글번호 127632
답변완료
진입제한2
일전에 주신 답변 감사합니다.
보내주신 코딩은 Currentcontracts에서 3개의 진입수를 합산하여 처리하는 것 같습니다.
각 진입별로 계약수를 관리하다가 매도 조건에서 매도할수 없는지요?
그리고 Daytrading말고 매수조건 이후 매도조건 발생할때까지 길게 가져가는 것으로 하고 싶습니다.
아래와 같이 작성했는데, 시작 조건일의 첫번째 조건의 진입매수와 매도 3번을 정상적으로 작동하지만, 그 이후 여러개 진입이 동시에 일어날 경우, 매도가 1,2번은 생략되고 3번 매도만 발생하는 등의 문제가 있습니다.
아마도 B1, V1, i1, M1, E1,X1,z1 등을 언제 초기화하는가에 문제가 있는 것 같습니다. 아마도 M과 E에 대한 다른 접근이 필요한 것 같기도 합니다.
var : B1(0),B2(0),B3(0);
var : I1(0),I2(0),I3(0);
var : V1(0),V2(0),V3(0);
var : M1(0),M2(0),M3(0);
var : E1(0),E2(0),E3(0);
var : X1(0),X2(0),X3(0);
IF SDate > 20160901 then Begin
# 조건변수 처리
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "DP_B" Then{
B1 = B1+1;
i1 = index;
V1 = V1+CurrentContracts-CurrentContracts[1]; #지정이름진입 수량 누적
M1 = M1+(CurrentContracts-CurrentContracts[1])*LatestEntryPrice(0);
E1 = M1/V1;#평단가
}
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "CC_B" Then{
B2 = B2+1;
i2 = index;
V2 = V2+CurrentContracts-CurrentContracts[1];
M2 = M2+(CurrentContracts-CurrentContracts[1])*LatestEntryPrice(0);
E2 = M2/V2;
}
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "GS_B" Then{
B3 = B3+1;
i3 = index;
V3 = V3+CurrentContracts-CurrentContracts[1];
M3 = M3+(CurrentContracts-CurrentContracts[1])*LatestEntryPrice(0);
E3 = M3/V3;
}
#### 매수조건
if DispBuy==1 and B1 < 2 Then{
if MarketPosition == 0 or LatestEntryName(0) != "DP_B" or
(MarketPosition == 1 and LatestEntryName(0) == "DP_B" and index >= I1+20) Then
buy("DP_B");
}
if M_CCI == 1 and B2 < 2 Then{
if MarketPosition == 0 or LatestEntryName(0) != "CC_B" or
(MarketPosition == 1 and LatestEntryName(0) == "CC_B" and index >= I2+20) Then
buy("CC_B");
}
iF crossDown(ma20, ma60) then CD_Check1 = index;{
if CD_Check1 + 11 < index then {
if C <= 선행스팬2[52] and CrossUp(D_MA5, D_Dnline) then{
if MarketPosition == 0 or LatestEntryName(0) != "GS_B" or
(MarketPosition == 1 and LatestEntryName(0) == "GS_B" and index >= I2+20) Then
buy("GS_B");
}
}
}
### 매도 전략
if MarketPosition == 1 then{
if B1 >= 1 then{
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "DP_S1" Then
X1 = 1;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "DP_S2" Then
X1 = 2;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "DP_S3" Then
{X1 = 3; z1 = 1;}
if X1 == 0 Then
ExitLong("DP_S1",AtLimit,E1*1.05,"DP_B",Floor(V1*0.3),1);
if X1 == 1 Then
ExitLong("DP_S2",AtLimit,E1*1.10,"DP_B",Floor(V1*0.3),1);
if X1 == 2 Then
ExitLong("DP_S3",AtLimit,E1*1.15,"DP_B");
}
}
if MarketPosition == 1 then{
if B2 >= 1 then{
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "CC_S1" Then
X2 = 1;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "CC_S2" Then
X2 = 2;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "CC_S3" Then
{X2 = 3; z2 = 1;}
if X2 == 0 Then
ExitLong("CC_S1",AtLimit,E2*1.05,"CC_B",Floor(V2*0.3),1);
if X2 == 1 Then
ExitLong("CC_S2",AtLimit,E2*1.10,"CC_B",Floor(V2*0.3),1);
if X2 == 2 Then
ExitLong("CC_S3",AtLimit,E2*1.15,"CC_B");
}
}
if MarketPosition == 1 then{
if B3 >= 1 then{
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "GS_S1" Then
X3 = 1;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "GS_S2" Then
X3 = 2;
if CurrentContracts < CurrentContracts[1] and LatestExitName(0) == "GS_S3" Then
{X3 = 3; z3 = 1;}
if X3 == 0 Then
ExitLong("GS_S1",AtLimit,E3*1.05,"GS_B",Floor(V3*0.3),1);
if X3 == 1 Then
ExitLong("GS_S2",AtLimit,E3*1.10,"GS_B",Floor(V3*0.3),1);
if X3 == 2 Then
ExitLong("GS_S3",AtLimit,E3*1.15,"GS_B");
}
}
if CurrentContracts == 0 or z1[1] == 1 then {B1 = 0; V1 = 0; i1 = 0; M1 = 0; E1 = 0; X1 = 0; z1 = 0;}
if CurrentContracts == 0 or z2[1] == 1 then {B2 = 0; V2 = 0; i2 = 0; M2 = 0; E2 = 0; X2 = 0; z2 = 0;}
if CurrentContracts == 0 or z3[1] == 1 then {B3 = 0; V3 = 0; i3 = 0; M3 = 0; E3 = 0; X3 = 0; z3 = 0;}
2019-04-04
196
글번호 127631
답변완료
저번에 질문 올렸었는데요
아래 코드로 답변 해주셨는데 한가지 더 궁금한점이 있어 글 올립니다.
제가 개장시간을 잘못 알고 있었는데요.
18시에 개장해서 익일 17:45에 마감이던데요 아래전략을 적용하고싶으면
1. 90000 --> 180000
2. SetStopEndofday(044000); 에서 044000 --> 174500
으로만 교체하면 되는건가요?
3. SetStopEndofday(0); 이게 의미하는바가 무엇이죠? 왜 필요한지 궁금합니다
4. 분봉 적용 맞지요?
----------------------------------------------------------------------
안녕하세요
예스스탁입니다.
랭귀지에서 종가가 들어오는 시점은 장이 종료된 시점입니다.
당일청산시간을 종가보다 조금 앞의 시간으로 설정하셔야 합니다.
44분으로 지정해 드립니다.
var : OO(0),HH(0),LL(0),OO1(0),HH1(0),LL1(0);
var : entry(0);
if sdate != sdate[1] Then
SetStopEndofday(044000);
if (sdate != sdate[1] and stime >= 90000) or
(sdate == sdate[1] and stime >= 90000 and stime[1] < 90000) Then
{
SetStopEndofday(0);
OO = O;
HH = H;
LL = L;
OO1 = OO[1];
HH1 = HH[1];
LL1 = LL[1];
entry = 0;
}
if H > HH Then
HH = H;
if L < LL Then
LL = L;
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
entry = entry+1;
if HH1 > 0 and LL1 > 0 and entry < 1 then
{
if MarketPosition <= 0 and H < OO+(HH1-LL1)*0.5 Then
buy("b",AtStop,OO+(HH1-LL1)*0.5);
if MarketPosition <= 0 and L > OO-(HH1-LL1)*0.5 Then
sell("s",AtStop,OO-(HH1-LL1)*0.5);
}
즐거운 하루되세요
> 에이치 님이 쓴 글입니다.
> 제목 : 질문드립니다.
> 해외 선물 백테스팅 해보려구 하는데요. 래리 윌리엄스 전략을 구현해보려고합니다.
개장시간이 09:00~04:45 인데
시가 -> 09:00(T) 가격
range -> 전날 09:00(T-1) ~ 04:45(T) 동안 최고가 - 최저가
1. 현재가가 시가 + range * 0.5 를 돌파할때 매수
2. 현재가가 시가 - range *0.5 를 돌파할때 매도
3. 종가(04:45 시점)청산
* 같은날에 매수/매도가 중복되서 들어가지 않도록 한번만 진입
을 구현하고 싶습니다.
부탁드리겠습니다
2019-04-04
195
글번호 127630
답변완료
질문드립니다.
1. 매입평균가 N%수익시 전량청산식이 아래가 맞나요?
if MarketPosition == 1 Then
ExitLong("bx",Atlimit,AvgEntryPrice*1.N,"",Floor(MaxContracts*1.0),1);
맞다면, 매입평균가 3% 손실시 전량청산식 부탁드립니다.
트레일링스탑도 위와같이 작성해주시면 감사하겠습니다.
//
2. 아래는 감사히 짜주신 로직인데요. 여기에 추가로 N%상승한 캔들의 윗꼬리가 몸통보다작고 장대 캔들이후 지금까지 생성된 캔들의 거래대금이 N%상승한장대봉 거래대금보다 적은 종목검색으로 부탁드립니다.
input : N(15),aa(5),xx(5);
var : mav(0);
mav = ma(C,3);
if C >= O*(1+N/100) Then
{
var1 = 0;
var2 = c;
Condition1 = false;
}
Else
{
var1 = var1+1;
if var1 == 3 and var2 > 0 and (mav <= var2*(1+aa/100) and mav >= var2*(1-xx/100)) then
{
Condition1 = true;
if Condition1 == true Then
find(1);
}
}
3. 위 검색식으로 찾은 종목 진입 청산 이후 N%장대봉 발생시 조건초기화(3캔들부터 거래)
4. a라는 조건 발생시 더이상 진입신호 X
2019-04-05
197
글번호 127627
답변완료
문의드립니다
안녕하세요!!
아래지표도 "틱챠트용"으로 변환 부탁드립니다
* 지난번 문의때 함께 질문 드렸어야했는데..
귀찮게해드려서 죄송합니다
input : N(60),HHMMSS(150000);
var : HH(0,data2),LL(0,data2),HH1(0,data2),LL1(0,data2),OO(0,data2),CC(0,data2),CC1(0,data2);
var : Var4(0,data2),var12(0,data2);
if data2(dayindex == 0) Then
Var4 = 0;
Else
Var4 = Var4+data2(BarInterval);
var12 = Var4%N;
if data2(dayindex == 0 or (stime <= HHMMSS and var12 == 0)) Then
{
HH = data2(H);
LL = data2(L);
OO = data2(O);
HH1 = HH[1];
LL1 = LL[1];
CC1 = CC[1];
}
if data2(H) > HH Then
HH = data2(H);
if data2(L) < LL Then
LL = data2(L);
CC = data2(c);
plot1(HH1,"고가-1");
plot2(LL1,"저가-1");
plot3(OO,"oo");
plot4(CC1,"종가-1");
2019-04-04
181
글번호 127622
답변완료
함수요청
안녕하세요?
크루드오일 1분봉으로 매매를 하고자 합니다.
특정시간 봉 완성의 종가를 지정할 수 있는지요?
가령 아침의 시가(O)와 16:00분(써머타임 해지시 17:00) (C) 완성봉을 기준으로
O > C 이면 O 값에 지정가 매도
O < C 이면 O 값에 지정가 매수
하는 예제를 작성 부탁드립니다.
2019-04-04
181
글번호 127616
답변완료
문의드립니다.
도움주시는 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 기타
직접 만든 수식인데요. 잘못된 거 없는 거 같은데 비용이 아난티 같은 종목에서 2000(거의 10%를 넘게) 넘게 나와요. 계산해보면 대강 200~300원 나와야하거든요. 뭘 잘못계산한 건지 모르겠습니다.
input : 세금(0.3), 수수료(0.015), 슬리피지(2), 호가단위(100);
var: 비용(0),봉나누기비용(0);
// 세금 + 수수료 + 슬리피지
비용 = (DayOpen * (세금/100)) + (DayOpen * (수수료/100) *2) + (호가단위 * 슬리피지);
// 만약 양봉이면(dayclose-dayopen) > 0
if (DayClose - dayopen) > 0 then
// 봉나누기 비용은 당일고가 - 당일저가를 비용으로 나누기
봉나누기비용 = (DayHigh-DayLow)/ 비용;
else
// 만약 음봉이면 봉나누기비용은 0.1(무조건 1이하)로 한다.
봉나누기비용 = 0.1;
plot1(봉나누기비용);
PlotBaseLine1(1,"아무리 잘해도 손해선");
MessageLog("%.f",비용);
2019-04-04
210
글번호 127615
답변완료
매매시간 요청 드립니다.
* 좋은 하루 되십시요^^
* 요청 사항: 마지막 매매 시간(매매(매수 or 매도 or 청산 등 모든 거래 포함)을
기준으로 5분 대기후 매매하는 수식 방법 좀 요청 드립니다.
즉 어떤 매매든 시스템 시작 할려면 마지막 거래 이후
4분 경과후 시스탬 로직이 적용 되도록 부탁 드립니다.
( 단 첫 거래는 10시 정각에 매수 했다 바로 매도 하도록 부탁 드립니다.)
var1 = ma(c,5);
var2 = ma(c,20);
if crossup(var1,var2) then buy();
if crossdown(var1,var2) then sell();
* 매번 부탁 만 드리고 항상 고맙습니다^^
2019-04-04
187
글번호 127614
답변완료
안녕하세요
안녕하세요.
수고 많으십니다.
다름아니라 아래수식은 20 이동평균선이 당일 중심선 Per3(50.0)을 관통할때
매도 매수를 할려고하는데 잘 안되네요.
수식보안 부탁드립니다.
감사합니다.
수고 하세요.
var : pp(0),tx(0);
var1 = ma(C,20);
input : Per1(23.6),Per2(38.2),Per3(50.0),Per4(61.8),Per5(76.4);
var : cnt(0),HH(0),LL(0),RR(0),Tcond(false);
if (sdate != sdate[1] and stime >= 000000) or
(sdate == sdate[1] and stime >= 000000 and stime[1] < 000000) Then
{
Tcond = true;
HH = H;
LL = L;
}
if (sdate != sdate[1] and stime >= 160000) or
(sdate == sdate[1] and stime >= 160000 and stime[1] < 160000) Then
{
Tcond = true;
HH = H;
LL = L;
}
if (sdate != sdate[1] and stime >= 233000) or
(sdate == sdate[1] and stime >= 233000 and stime[1] < 233000) Then
{
Tcond = true;
HH = H;
LL = L;
}
if Tcond == true then
{
if H > HH then
HH = H;
if L < LL Then
LL = L;
RR = HH-LL;
}
if L > O[1] and crossup( var1)>,Per3(50.0) Then
buy();
if H < O[1] and CrossDown( var1>Per3(50.0) Then
sell();
2019-04-04
161
글번호 127613