커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
6526
글번호 230811
수식문의 드립니다...
진입가 대비 1포 상승시 익절하고 0.5포 아락하면 손절한다고 할때.
매수접수는 250에 접수되었으나 매수체결은 249.90에 체결되었읍니다...
이때 익절은 접수가 대비 1포인 251.00에 익절 ...
손절은 0.5포아래인 249.50에 손절됩니다.
.
체결가249.90을 기준으로 250.90에 익절..249.40에 손절 될수는 없는건가요?
체결된 지수에서 1포상승 익절 , 0.5포 하락손절하고 싶은데...
체결방식을 시장가나 다른방법으로도 안되는건가요?
2015-10-22
134
글번호 91579
답변완료
부탁 드립니다.
언제나 만족한 수식 답변으로
도움 주셔서 깊이 감사드립니다.
수식1)
그림1과 같이 우측편에
텍스트 입력 부탁 드립니다.
수식2)
그림2와 같이 좌측편에
텍스트 입력 부탁 드립니다.
(용도:해선용)
미리 감사 드립니다.
var : TL1(0),TL2(0);
if Bdate != Bdate[1] Then{
var1 = sdate[1];
var2 = stime[1];
}
TL_Delete(TL1);
TL_Delete(TL2);
TL1 = TL_New(var1,var2,dayhigh,sdate,stime,dayhigh);
TL2 = TL_New(var1,var2,daylow,sdate,stime,dayLow);
TL_SetExtRight(TL1,True);
TL_SetExtRight(TL2,True);
2015-10-23
193
글번호 91576
답변완료
분봉겟수 합 수식요청 드립니다.
* 항상 많은 도움 고맙습니다.
* 질문 : 평균거래량 * 분봉겟수 보다 크면 매수
* 설명
10분봉 그래프에서
현재봉 거래량이 전 10봉 평균 거래량 보다 크고
현재 dayindex() *(곱하기) 평균 거래량 보다 V(현재총거래량)가 크면 매수
→ (dayindex() * HH >= V THEN BUY()
* 수고하십시요.
2015-10-22
155
글번호 91573
답변완료
지표에 줄긋기함수 부탁드립니다.
국선 장시작후 5분종가까지의 최고/최저값에 먼저 닿는선을 기준으로 위로 0.5 아래로 0.5
줄긋기(plot)함수식을 부탁드리겠습니다.
2015-10-22
143
글번호 91572
답변완료
함수변경요청(SK증권)
안녕하세요?
아래는 SK증권에서 사용했던 함수입니다.
YT에서 사용할 수 있도록 함수 변경 요청드립니다.
Params :
TimeEnd( 144000 ),
FastLeng( 5 ),
MidLeng( 13 ),
SlowLeng( 34 ),
Brick( 0.06 ),
BarSize( 0.8 ),
BarLow( 0.4 ),
BarHigh( 0.4 ),
ProfitVal( 1.25 ),
Plok( 0.6 ),
Danger( 12 );
Var :
cnt( 0 ),
RangeValue( 0 );
// 총손익과 현재포지션의 손익을 저장함.
V8 = 1;
V9 = Danger;
V10 = NetProfit + OpenPositionProfit;
while V10 >= V9
Begin
V8 = V8 + 1;
V9 = V9 + (V8 * C * Danger * 0.01);
If V8 > 50 then V9 = V10 + 1;
End;
V11 = V8;
V1 = WMA(L, MidLeng); // 저가 이용한 중기 가중이동평균
V2 = WMA(H, MidLeng); // 고가 이용한 중기 가중이동평균
V3 = WMA(C, SlowLeng); // 종가 이용한 장기 가중이동평균
V4 = WMA(C, FastLeng); // 종가 이용한 단기 가중이동평균
If CB = 1
Then
Begin
v0 = 0;
For Cnt = 0 to 20 - 1 step 1
Begin
v0 = v0 + H[Cnt] - L[Cnt] ;
End;
End
Else v0 = v0[1] - (H[20] - L[20]) + (H - L);
RangeValue = v0/20;
Value1 = Rangevalue * Brick;
Value2 = Rangevalue * BarSize;
Value3 = Value2 * BarLow;
Value4 = Value2 * BarHigh;
// 전봉 고가 - 저가한 값이 BarSize 보다 작으면 V5 = 1
If H[1] - L[1] <= Value2 Then V5 = 1
Else V5 = 999999;
If AbsValue(L[1] - V3[1]) <= Value3 Then V12 = 1
Else V12 = 999999;
If AbsValue(H[1] - V3[1]) <= Value4 Then V13 = 1
Else V13 = 999999;
/*---------------- BRICK GAP FILTER -------------------------*/
// 5봉 최저가가 장기이평 위에 있으면 Byflag = 1(매수조건 완성)
If (V3 - Lowest(L, 5)) <= Value1 Then V14 = 1
Else V14 = 999999;
// 5봉 최고가가 장기이평 아래에 있으면 slflag = 1(매도조건 완성)
If (Highest(H, 5) - V3) <= Value1 Then V15 = 1
Else V15 = 999999;
If C > V3 // 종가가 장기이평 위에 있고
And V4[1] < V4[2] // 전봉의 단기 이평이 하락중 있었고
And V4[1] < V2[1] // 전봉의 단기 이평이 고가를 이용한 중기 이평보다 아래에 있었고
And V4 > V4[1] // 최근봉의 단기 이평이 상승중이고
And V14 = 1 // 단기 이평의 매수조건 완성
And V5 = 1 // 전봉의 봉사이즈가 작아야 함.
And V12 = 1 // 전봉의 저가와 단기 이평의 거리가 일정 범위 내에 있어야 함.
And V4 > V3 // 현재봉 기준의 단기이평이 장기이평 위에 있어야 함.
And TimeEnd > time
Then Buy("Le1", AtMarket, def, V11); // 다음봉 시가로 매수
If Close < V3 // 종가가 장기이평 아래에 있
And V4[1] > V4[2] // 전봉의 단기 이평이 상승중 있었고
And V4[1] > V1[1] // 전봉의 단기 이평이 저가를 이용한 중기 이평보다 위에 있었고
And V4 < V4[1] // 최근봉의 단기 이평이 하락중이고
And V13 = 1 // 전봉의 고가와 단기 이평의 거리가 일정 범위 내에 있어야 함.
And V4 < V3 // 현재봉 기준의 단기이평이 장기이평 아래에 있어야 함.
Then Sell("Se1", AtMarket, def, V11); // 다음봉 시가로 매도
Cond1 = SignalPosition = 1 And ((V4[1] > V3[1] And CrossUp(V4, V3)));
If Cond1 Then ExitLong("LX1", AtMarket); // 매수 청산
Cond2 = SignalPosition = -1 And ((V4[1] < V3[1] And CrossDown(V4, V3)));
if Cond2 Then ExitShort("SX1", AtMarket); // 매도 청산
/*
* 수익보존 청산
* - 포지션이 일정 포인트 이상 수익이 발생하는 상태에서
* - 손익이 줄어서 Plok 만큼 줄어들면 청산 하는 로직
*/
Cond3 = SignalPosition = 1 And MaxPositionProfit(0) >= (ProfitVal/100) * EntryPrice * V11;
If Cond3 Then ExitLong("LX2", AtStop, EntryPrice + (ProfitVal/100)*Plok * EntryPrice * v11); // 손익이 Plok 까지 줄어들면 매수청산
Cond4 = SignalPosition = -1 And MaxPositionProfit(0) >= (ProfitVal/100) * EntryPrice * V11;
If Cond4 Then ExitShort("SX2", AtStop, EntryPrice - (ProfitVal/100)*Plok * EntryPrice * v11); // 손익이 Plok 까지 줄어들면 매도청산
2015-10-22
160
글번호 91571
답변완료
문의
Sell ("매도");
2015-10-23
132
글번호 91570
답변완료
문의드립니다
위 그림 관련 답변 받은 수식은 아래와 같습니다.
매봉 그려지는 식이 아니므로
지표속성에서 일자그래프로 지정하고 적용하시기 바랍니다.
var : T(0),HL(0),LH(0);
if dayindex == 0 Then
T = 0;
if dayindex > 0 and H == dayhigh Then{
T = 1;
HL = L;
}
if dayindex > 0 and L == DayLow Then{
T = -1;
LH = H;
}
#당일최고가 이후최저가
if L < HL Then
HL = L;
#당일최저가 이후 최고가
if H > LH Then
LH = H;
#최근 당일최저가를 갱신했고
#당일최저가 이후 최고가는 당일고가보다는 작고
#당일최저가 이후 최고가는 당일최저가대비 1포인트이상 높고
#현재봉의 고가는 당일최저가 이후 최고가보다 작을때 최근최고가와 당일저가의 0.618선 출력
if T == -1 and T[1] == -1 and
LH < dayhigh and
LH >= daylow+1 and
H < LH Then
plot1(LH-(LH-daylow)*0.618,"지표",blue);
#최근 당일최고가를 갱신했고
#당일최고가 이후 최저가는 당일저가보다는 크고
#당일최고가 이후 최저가는 당일최고가대비 1포인트이상 낮고
#현재봉의 저가는 당일최고가 이후 최저가보다 클때 최근최저가와 당일고가의 0.618선 출력
if T == 1 and T[1] == 1 and
HL > dayLow and
HL <= dayhigh-1 and
L > HL Then
plot1(HL+(dayhigh-HL)*0.618,"지표",red);
-----------------------------------------------
다시 드리는 질문입니다.
1. 위 수식은 당일 움직임인데,
전일과 당일 포함한 움직임에서 위 그림 만족하는 수식 부탁드립니다.
2. period 기간 중 고가 Highest(h,period), 저가 Lowest(L,period)일 때 위 수식으로 전환 부탁드립니다.
3. 위에 말씀하신 '일자그래프로 지정하고 적용' 하라는게 뭔지 설명 좀 부탁드립니다.
4. 해외선물 오일에 위 수식을 그대로 사용해도 되는지.. 안되면 수식 부탁드립니다.
수고하세요.
2015-10-22
218
글번호 91569
답변완료
44590번글 관련 - 시스템식 수정 부탁드립니다.
요구한 시스템식에 감사드리고 시스템식에 주석처리해 주신점 더더욱 감사드립니다.
아래와 같이 몇명 수정건과 추가사항을 검토후 시스템식 수정 부탁드립니다.
1. 진입횟수 오류에 대한 문제 - 수정건
1) 일봉과 분봉차트를 보면 4월 22일 1차매수후 1차매도가 이루어 지고 3일이상 횡보하여
1차매수당시~3일동안의 최저가를 이탈하여 29일 "익절"처리되어 매수된 물량이 모두 처리되어 "0인 상태로
여기까지 정상입니다.
2) 이후 6월 1일 1차매수가 부근에서 신호가 발생되어야 하는데 신호가 잡히질 않습니다.
3) 변수설정에서 전략식진입횟수(10)이고 피라미딩 설정에서 다른진입 신호만 허용에 체크되었습니다.
4) 검토후 수정 부탁드립니다.
2. "익절" 내용관련 설명 및 수정건
1) 44590번글 중에 익절에 대해 다음과 같은 답변을 주셨습니다.
-----------------------------------------------------------------------------
"익절내용중 1차매수당시 최저점 등 매수당시 최저점이 어떤 값인지 정확치 않아
매수당시 그날의 최저가로 지정했습니다."
-----------------------------------------
2) 제가 설명이 다소 부족해서 다시 설명 드리자면 매수당시의 최저점이 매수당시 그날의
최저가가 아니라 각각의 매수후 "타점보유일수" 동안의 최저가입니다.
3) 정리하면...
각각의 매수후 1차매도만 이루어 지고 하락시 매수당시부터 보유일수 동안의 최저점을 이탈하면 익절
예: 1차매수 --> 1차매도만 발생하고 --> 하락하여 1차매수당시~보유일수 동안의 최저점을 이탈하면 익절
1차매수+2차매수 --> 1차매도만 발생하고 --> 하락하여 2차매수당시~보유일수 동안의 최저점을 이탈하면
익절
1차매수+2차매수+3차매수 --> 1차매도만 발생하고 --> 하락하여 3차매수당시~보유일수 동안의 최저점을
이탈하면 익절
3. "익절"에 대해 시스템식 추가건
44590번글의 4.손절기준의 1)항과 비슷한 개념으로...
----- 44590번글의 4.1)항은 다음과 같습니다. 참고해 주세요.. -------------------------------
ㅣ 4. 손절기준
ㅣ 1) 각각의 매수위치에서 매수후 타점보유일수 만큼 경과하면 해당보유일수 동안의 저점이탈시 손절
ㅣ 예: 1차매수시 "타점보유일수(3)" 인 경우 1차매수후 매수일 포함 3일동안 해당수익이 발생하지 못해
ㅣ 1차매도가 이루어지지 않았을 경우 3일동안의 최저점을 이탈시 손절
ㅣ 또한 같은 경우로 1차매수+2차매수가 되었을때 최종2차매수후 3일동안 1차매도가 이루어지지 않을
ㅣ 경우 최종 2차매수후 3일동안의 최저점을 이탈시 손절
ㅣ 1차매수+2차매수+3차매수가 되었을때 최종3차매수후 3일동안 1차매도도 이루어 지지않았을 경우
ㅣ 최종 3차매수후 3일동안으 최저점을 이탈시 손절
----------------------------------------------------------------------------------------
1) 각각의 매수위치에서 매수후 매수일 포함 타점보유일수 동안 1차매도(수익)가 발생하지 않을 경우 즉,
횡보할 경우 타점보유일수 다음날 시가에 익절
2) 예 : 1차매수후 "타점보유일수(3)" 동안 "1차매도"가 발생하지 않을 경우 타점보유일수+1일의 시가에 매도
1차매수+2차매수후 "타점보유일수" 동안 "1차매도"가 발생하지 않을 경우 다음날 시가에 매도
1차매수+2차매수+3차매수후 "타점보유일수"동안 "1차매도"가 발생하지 않을 경우 다음날 시가에 매도
3) 매도가 된 경우 차트에 "익절"로 표시 부탁드립니다.
4. 진입시간 오류에 관한 수정건
그림4)와 같이 진입시간을 10:00로 설정했는데 3분봉 두번째 봉에서 신호가 잡히네요..
이것도 검토후 수정 부탁드립니다.
즐거운 하루되세요.
이전의 시스템식은 다음과 같습니다.
--------------------------------------------------------------------------------------
input : 전략식시작일자(20150422), 전략식시작시간(090000), 전략총매수금액(2000); # 금액은 만원단위
input : P(10),매수위치1차(10), 매수위치2차(7), 매수위치3차(14);
input : 매수위치보정(1);
input : 매도위치1차(7), 매도위치2차(14);
input : 매수비중1차(20), 매수비중2차(30), 매수비중3차(50);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(10);
input : 타점보유일수(3);
var : sum(0),mav(0),cnt(0),eup(0),edn(0),Didx(0),LatestEntryDidx(0);
var : TimeCond(false),Xcond1(false),Xcond2(false),Loss(0),LatestEntryDlow(0);
#일자수 계산
if date != date[1] Then
Didx = Didx+1;
#당일포함 일봉 P개의 종가를 누적
sum = 0;
for cnt = 0 to P-1{
sum = sum+DayClose(cnt);
}
#누적값을 P로 나누어 평균값 산출
mav = sum/P;
#상단
Eup = mav+mav*(매수위치1차/100);
#하단
Edn = mav-mav*(매수위치1차/100);
#지정일 지정시간이 되면 TimeCond는 True(그전에는 false)
if sdate == 전략식시작일자 and (stime == 090000 or (stime > 전략식시작시간 and stime[1] < 전략식시작시간 )) then
TimeCond = true;
#TimeCond가 True가 된 후
if TimeCond == true then{
#무포지션 상태에서 매수위치1차에 도달하면 매수
if MarketPosition == 0 and TotalTrades == 0 Then
buy("1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략총매수금액*10000/c)*(매수비중1차/100)));
#첫매수이후
if MarketPosition == 1 Then{
#최근 진입시점의 일자수 저장
if CurrentContracts > CurrentContracts[1] Then{
LatestEntryDidx = Didx;
LatestEntryDlow = daylow;
}
#1차매수 발생 후 매수위치2차에 도달하면 매수
if MaxEntries == 1 Then
buy("2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략총매수금액*10000/c)*(매수비중2차/100)));
#1차매수 발생 후 매수위치3차에 도달하면 매수
if MaxEntries == 2 Then
buy("3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략총매수금액*10000/c)*(매수비중3차/100)));
#1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true
if LatestExitName(0) == "1차매도" then
Xcond1 = true;
#2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true
if LatestExitName(0) == "2차매도" then
Xcond2 = true;
#Xcond1이 false일때
#진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산
if Xcond1 == false Then
exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1);
#Xcond2가 false일
#진입이후 최저가에서 매도위치2차 만큼 상승하면 전량청산
if Xcond2 == false Then
exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100));
#최근 진입후 3일이상 경과(현재 일자수가 최근진입시점의 일자수보다 3이상증가)
if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then{
#최근 진입이후 3일되었을때의 최근진입일 포함3일 최저가 계산
if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then{
Loss = daylow(1);
for cnt = 1 to 타점보유일수{
if daylow(cnt) < Loss Then
Loss = daylow(cnt);
}
}
#Loss값 이하로 가격하락하면 전량 청산
exitlong("손절",AtStop,Loss);
}
#1차매도가 발생한 상황
#가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산
if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then{
exitlong("익절",AtStop,LatestEntryDlow);
}
}
else{#매수포지션이 아니면 false로 초기화
Xcond1 = false;
Xcond2 = false;
}
}
-----------------------------------------------------------------------------------------
2015-10-22
207
글번호 91568
답변완료
질문...
분봉상 적용코드입니다
1번째와 2번째 코드의 V3[0] 와 VV1[0] 에 관해서입니다
if sdate >= 특정일 then{
V3[1] > 0 and VV1[1] > 100 일 경우 해당일의 특정일값에 해당일에 들어갈수있도록
ex) 해당일이 20151019 면
코드내에서 자동으로
if sdate >= 20151019 then{
이렇게 인식이 되도록
ex)
V3[1] > 0 and VV1[1] > 100 ---> 20151019 조건 불만족
V3[2] > 0 and VV1[2] > 100 ---> 20151018 조건 만족
V3[3] > 0 and VV1[3] > 100 ---> 20151017 조건 불만족
일 경우
if sdate >= 20151018 then{
이렇게 해당코드를 인식하게끔 하고 싶습니다
[0]데이타는 0~5까지입니다
즉 [0],[1],[2],[3],[4],[5] 이렇게 6일동안 그 가운데 조건 만족하는 날의 특정일을
찾아내고 그 값을 3번째 코드내의 특정일로 자동으로 인식하게 하고 싶은겁니다
그래서 3번째 코드를 실행하는데
예를들어 보겠습니다
20151001 - V3[5] > 0 and VV1[5] > 100 조건 불만족
20151002 - V3[4] > 0 and VV1[4] > 100 조건 만족
20151003 - V3[3] > 0 and VV1[3] > 100 조건 불만족
20151004 - V3[2] > 0 and VV1[2] > 100 조건만족
20151005 - V3[1] > 0 and VV1[1] > 100 조건만족
20151006 - V3[0] > 0 and VV1[0] > 100 조건불만족
이렇다고 가정하면
if sdate >= 특정일 then{
의 특정일에는 코드내에서 조건만족 제일 먼저하는 날인 20151002로 들어가야하고
3번째 코드가 진행될껍니다
그때 var3이 누적되면서 값이 0 이상이어야 계속 유지되어야하고
예를들어 1002부터 누적된값이 1003에 var3이 0 이하가 되면
Var3값을 0으로 초기화하고 다시 1004 만족되면
코드는 특정일이 20151004로 인식해서 var3값을 다시 누적해 나갑니다
이때 1006에 조건이 불만족하여도 var3이 0 이상이면 계속 누적해 나갑니다
요약하면
조건이 만족하는 특정일부터 var3값을 누적하고 그 값이 0 이상 유지되면 조건관계없이 계속
누적해가고 var3이 0 이하가 되면 0값으로 초기화하고 또 진행하다 조건만족하는 특정일이
나오면 그때부터 다시 var3값을 누적해 갑니다
그리고 한가지 추가 질문입니다
데이타를 위에서 얘기했듯이 [0]~[5]까지 6일로 얘기했는데
이것을 [0]~[19]까지 20일로 하면 분봉에서 종목검색시 부하가 많이 걸리나요?
이해가 되지 않으신다면 전화해도 될런지요?
부탁드립니다
#########################################################
var : V1(0),V2(0),cnt(0);
Array : V3[10](0);
if date != date[1] Then{
for cnt = 1 to 9{
V3[cnt] = V3[cnt-1][1];
}
}
v1 = accumn(upvol,dayindex+1);
v2 = accumn(DOWNvol,dayindex+1);
V3[0] = V1 - V2 ;
##################################################
var : Vcnt(0),PreDate(0),PreDayV(0);
Array : VV1[10](0);
if date != date[1] Then{
PreDate = sdate[1];
for Vcnt = 1 to 9{
VV1[Vcnt] = VV1[Vcnt-1][1];
}
}
if PreDate > 0 Then{
for Vcnt = 1 to 1000 {
if stime[Vcnt] <= stime and sdate[Vcnt] == PreDate then{
PreDayV = DayVolume[Vcnt];
Vcnt = 10000;
}
}
}
VV1[0] = DayVolume/PreDayV*100 ;
#########################################################################
// input : 특정일(20151002) ;
if sdate >= 특정일 then{
var1 = var1+Upvol;
var2 = var2+DownVol;
VAR3 = VAR1 - VAR2;
if sdate[1] < 특정일 Then
var4 = var3;
if var3 > var4 Then
var4 = var3;
}
2015-10-21
166
글번호 91567