커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
7565
글번호 230811
답변완료
수식 요청
안녕하세요
관리자님. 수고 많으십니다
아래 내용이용하여. 매매코져 하오니
시스템식. 부탁드립니다
선물2분. 또는5분 에서. 매매계힉이고요
수고^^. 그럼. 꾸벅
  
_NormSDist.yfu   (표준정규분포사용자함수)
input:z(numeric);
var : a1(0.31938153),
      a2(-0.356563782),
      a3(1.781477937),
      a4(-1.821255978),
      a5(1.330274429),
      R(0.2316419),
      Exp(2.71828182846), 
      k(0),
      N(0);
        
k = 1 / (1 + (R * Abs(z)));
        
N = 1 / (Sqrt(2 * Pie())) * Exp^(-(z^2) / 2);
        
_NormSDist = 1 - N * (a1 * k + a2 * (k ^ 2) + a3 * (k ^ 3) + a4 * (k ^ 4) + a5 * (k ^ 5));
 
If z < 0 Then
   _NormSDist = 1 - _NormSDist;
 
_BlackSholes.yfu (BS 모델이론가 사용자함수)
input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric);
var:Exp(2.71828182846);
 
var1 = (log(S/X) + (r + (Sig^2) / 2) * T) / (Sig*sqrt(T));
var2 = var1 - Sig*sqrt(T);
 
if cpflag == 1 then
   {
   _BlackSholes = S * _NormSDist(var1) - X * (Exp^((-r)*T)) * _NormSDist(var2);
   }
else if cpflag == 2 then
   {   
   _BlackSholes = X * (Exp^((-r)*T)) * _NormSDist(var2) - S * _NormSDist(var1);
   }
 
_ImVol.yfu (내재변동성 사용자함수)
input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Price(numeric);
var:vLow(0), vHigh(0), vi(0),cLow(0), cHigh(0), Epsilon(0.001), j(0), n(5000);
   
vLow = 0.01;
vHigh = 2;
   
cLow = _BlackSholes(cpFlag, S, X, T, r, q, vLow);
cHigh = _BlackSholes(cpFlag, S, X, T, r, q, vHigh);
vi = vLow + (Price - cLow) * (vHigh - vLow) / (cHigh - cLow);
 
for j = 0 to n
      {
      If _BlackSholes(cpFlag, S, X, T, r, q, vi) < Price Then
         vLow = vi;
      Else
         vHigh = vi;
      cLow = _BlackSholes(cpFlag, S, X, T, r, q, vLow);
      cHigh = _BlackSholes(cpFlag, S, X, T, r, q, vHigh);
      vi = vLow + (Price - cLow) * (vHigh - vLow) / (cHigh - cLow);
 
      if Abs(Price - _BlackSholes(cpFlag, S, X, T, r, q, vi)) <= Epsilon then
         {
         var1 = vi;
         j = n;
         }
    }
            
_ImVol = vi;
 
_Delta.yfu  (델타 사용자함수)
input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric);
var:Exp(2.71828182846);
 
var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T));
 
if cpflag == 1 then
   {
   _Delta = Exp^((q-r)*T) * _NormSDist(var1);
   }
else if cpflag == 2 then
   {   
   _Delta = Exp^((q-r)*T) * (_NormSDist(var1)-1);
   }
 
 
_Gamma.yfu  (감마 사용자함수)
input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric);
var:Exp(2.71828182846);
 
var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T));
var3 = (1 / Sqrt(2 * pie())) * (1 / Exp^((var1^2) / 2));
 
_Gamma = Exp^((q-r)*T) * var3 / (S*Sig*Sqrt(T));
 
 
_Vega.yfu   (베가 사용자함수)
input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric);
var:Exp(2.71828182846);
 
var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*Sqrt(T));
var3 = (1 / Sqrt(2*pie())) * (1 / Exp^((var1^2) / 2));
 
_Vega = S * Exp^((q-r)*T) * var3 * Sqrt(T) /100;
 
 
_Theta.yfu  (쎄타 사용자함수)
input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric);
var:Exp(2.71828182846);
 
var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T));
var2 = var1 - Sig*sqrt(T);
var3 = (1 / Sqrt(2 * pie())) * (1 / Exp^((var1^2) / 2));
 
if cpflag == 1 then
   {
   _Theta = (-1) * (S * Exp^((q-r)*T) * var3 * Sig) / (2*Sqrt(T))
            - (q-r) * S * Exp^((q-r)*T) * _NormSDist(var1)
            - r * X * Exp^((-r)*T) * _NormSDist(var2);
   }
else if cpflag == 2 then
   {   
   _Theta = (-1) * (S * Exp^((q-r)*T) * var3 * Sig) / (2*Sqrt(T))
            + (q-r) * S * Exp^((q-r)*T) * _NormSDist(-var1)
            + r * X * Exp^((-r)*T) * _NormSDist(-var2);
   }
 
_Theta = _Theta / 365;
 
 
 
_Rho.yfu   (로 사용자함수)
input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric);
var:Exp(2.71828182846);
 
var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T));
var2 = var1 - Sig*sqrt(T);
 
if cpflag == 1 then
   {
   _Rho = X * T * Exp^((q-r)*T) * _NormSDist(var2);
   }
else if cpflag == 2 then
   {   
   _Rho = -X * T * Exp^((q-r)*T) * _NormSDist(-var2);
   }
 
 
옵션민감도.yin  (지표식)
/*cpFlag : Call,Put 구분, 1,2로 표현
  S : 기초자산가격의 가격, 예)주가지수(KOSPI200)
  X : 행사가격
  T : 잔존만기(연율)
  r : 무위험 이자율, 예) CD금리
  q : 배당률
  Sig : 변동성 */
 
input: cpflag(1),     //콜풋 입력
       InS(0),        //현재 지수를 입력 안하면 data 참조를 통해 실시간 가격을 이용. 테스트시 이용
       x(145.0),      //행사가 입력
       ex(20050908),  //만기일
       r(0.0351),     //CD 금리, 요기서 볼 수 있음 ==> http://stock.koscom.co.kr/
       q(0),          //배당률
       InSig(0),      //내재변동성을 입력 안하면 자체 계산된 변동성을 사용. 단, 오차 감안해야 함
       InPrice(0);    //역시 테스트를 목적으로 함
var:S(0),T(0),sig(0),price(0),ImVol(0),bs(0),delta(0),gamma(0),vega(0),theta(0),rho(0);
    
S = iff(inS!=0,inS,data1("c")); //kospi종합을 같이 띄워 놓아야 합니다.
T = (DateToJulian(ex) - DateToJulian(date) + 1)/365;
price = iff(inPrice!=0,inPrice,c);
 
imvol = _ImVol(cpFlag, S, X, T, r, q, price);
sig = iff(insig!=0,insig,ImVol);
 
bs = _BlackSholes(cpFlag, S, X, T, r, q, sig);
delta = _Delta(cpFlag, S, X, T, r, q, sig);
gamma = _gamma(cpFlag, S, X, T, r, q, sig);
theta = _theta(cpFlag, S, X, T, r, q, sig);
vega = _vega(cpFlag, S, X, T, r, q, sig);
rho = _rho(cpFlag, S, X, T, r, q, sig);
 
plot1(imvol*100,"내재변동성");
plot2(bs,"이론가");
plot3(delta,"델타");
plot4(gamma,"감마");
plot5(theta,"쎄타");
plot6(vega,"베가");
plot7(rho,"로");
매매 방법. Plot1. Plot2.plot3. Plot4. Plot5. Plot6. Plot7.
각각 서로 교차돌파 할때.마다 한번씩
즉시. 상승돌파면. 매수. 하락돌파면 매도식
감사합니다. ^^. 시스템에 에러없는지. 확인해주시면 더욱 고맙습니다 ^^
2013-05-09
811
글번호 63013
답변완료
수식 작성방법에 대한 문의입니다.
잘 답변해 주셔서 감사합니다.
한가지 더 물어볼것이 있습니다.
var : n(0),period26(26);
var1 = ema(C,Period26);
n=2;
if H[n+4] < var1[n+4] and #1번 지수이평
H[n+3] >= var1[n+3] and #2번 지수이평
H[n+2] >= var1[n+2] and #3번 지수이평
H[n+1] >= var1[n+1] and #4번 지수이평
............ then
sell("");
위와같이 작성하여 문제없이 되는데
예를 들어 다음과 같이 n=3 인 경우에 대한 진입식도 계속 써주게 되면
n=3;
if H[n+4] < var1[n+4] and #1번 지수이평
H[n+3] >= var1[n+3] and #2번 지수이평
H[n+2] >= var1[n+2] and #3번 지수이평
H[n+1] >= var1[n+1] and #4번 지수이평
............ then
sell("");
이렇게 써줬을때 진입을 안하거나 엉뚱한 진입을 하더군요.
매뉴얼도 보고 방법을 바꿔보면서 시도해봤는데 잘 안되서 그럽니다.
내장변수인 var1 을 써도 괜찮지만 알아보기 편한 새로 변수 선언을 해주고 써보려고 하는데 초기화를 한다던지 다른 방법 없을까 해서요.
배열변수라는것도 있던데 이걸 써서 변수 여러개를 만들어서 진입식 하나마다 다른 변수명으로 할당해줘야 하나요?
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 수식이 이상한건지 아니면 이상한 부분이 있는지 확인 부탁드립니다.
> 안녕하세요
예스스탁입니다.
var : n(0),period26(26);
n=2;
if H[n+4] < ema(C[n+4],period26) and #1번 지수이평
H[n+3] >= ema(C[n+3],period26) and #2번 지수이평
H[n+2] >= ema(C[n+2],period26) and #3번 지수이평
H[n+1] >= ema(C[n+1],period26) and #4번 지수이평
............ then
sell("");
와 같이 작성하시면 수식이 처음에 메모리가 셋팅이 될때
n이 0이므로
1번 지수이평은 과거값이 4개봉,
2번 지수이평은 과거값이 3개봉,
3번 지수이평은 과거값이 2개봉,
4번 지수이평은 과거값이 1개봉
이 필요한 것으로 인식하여 메모리가 셋팅이 됩니다.
이후 수식에서 n에 2값이 할당되므로 만들지 않은
6,5,4,3전봉의 값을 요구하므로 잘못된 값을 리턴하게 됩니다.
ema를 변수처리하시고 해당 변수에 이전값을 가져오게 작성하시면 됩니다.
또한 수식에서 함수는 작성한 수만큼 계산이 됩니다.
동일 계산식이면 해당 계산식을 변수에 할당하고 해당 변수를
사용하시면 중복계산을 피하게 되므로 수식의 가독성이 올라가게 됩니다.
var : n(0),period26(26);
var1 = ema(C,Period26);
n=2;
if H[n+4] < var1[n+4] and #1번 지수이평
H[n+3] >= var1[n+3] and #2번 지수이평
H[n+2] >= var1[n+2] and #3번 지수이평
H[n+1] >= var1[n+1] and #4번 지수이평
............ then
sell("");
즐거운 하루되세요
> 개냥이 님이 쓴 글입니다.
> 제목 : 수식이 이상한건지 아니면 이상한 부분이 있는지 확인 부탁드립니다.
> 제 시스템 식 중에 일부인데 다음과 같이 상수를 넣어야 할 것을
반복되는 부분도 있고 편의를 위해서 n을 변수로 할당해서 다음과 같이 만들어줬습니다.
var : n(0),period26(26);
n=2;
if H[n+4] < ema(C[n+4],period26) and
H[n+3] >= ema(C[n+3],period26) and
H[n+2] >= ema(C[n+2],period26) and
H[n+1] >= ema(C[n+1],period26) and
............ then
sell("");
그런데 분명히 진입해야 되는 부분에서 진입 안되서
점검을 하다보니 n=2로 넣는 부분을 없애고 그냥 숫자를 집어넣어서 H[n+4] 대신에 H[6] 이런식으로 만들어주니 원하는 진입신호가 제대로 나옵니다.
var : period26(26);
if H[6] < ema(C[6],period26) and
H[5] >= ema(C[5],period26) and
H[4] >= ema(C[4],period26) and
H[3] >= ema(C[3],period26) and
............ then
sell("");
그런데 그전에도 비슷한 경우가 있더군요.
비슷한 경우에 문제가 되면 모르는데 동일하게 작성해줘도 어느 부분은 그냥 신호가 잘 나옵니다.
시스템을 전부 올리기는 조금 뭐하긴 한데 혹시 제가 작성한 내용이 문제될만한 부분이 있는지 아니면 다른 문제인지 모르겠네요.
messagelog로 필요한 부분 데이타까지 출력해봐도 문제점을 못 찾겠습니다.
확인 부탁드립니다.
2013-05-09
316
글번호 62999
답변완료
시스템식 문의
질의드립니다.
스톡케스틱을 이용하여 매수를 하고자 하는데
아래의 식에서 스토케스틱을 지수이평이 아니라 단순이평을
적용하고 싶은데요 수정부탁드립니다.
var1 = StochasticsK(25,6);
var2 = StochasticsD(25,6,6);
var3 = ma(c,200);
if crossup(var1,20) and c > var3 Then
buy("b1",OnClose,def,vol1);
2013-05-09
200
글번호 62998
답변완료
문의합니다
안녕하세요. 항상 수고 많으십니다.
20일이평과 5일이평에서 20일 이평선은 그대로 표시하고
1. 5일이평 > 20일이평 일때만 5일 이평선을 표시하고
2. 5일이평 < = 20일이평 일때는 아예 5일 이평선을 표시하지 않는다.
이 수식을 알고 싶습니다.
(참고)
var1 = ma(c,20);
var2 = ma(c,5);
plot1(var1,"20",red);
if var2 > var1 Then
plot2(var2,"5",green);
Else
noplot(2);
이 수식을 적용하니 Else 부분은 연결 직선이 나타납니다.
좋은 하루 되세요.
2013-05-09
234
글번호 62997
챠트의꿈 님에 의해서 삭제되었습니다.
2013-05-09
0
글번호 62996
답변완료
시스템식 및 지표식
30229관련입니다.
주신 식에서
data2,3,4는 콜옵션
dtat5.6.7은 풋옵션이며
V1=콜 당일미결제금액(수량말고 금액)의 합
V2=풋 당일미결제금액의 합인데
var:V1(0,data2),V2(0,data3);이라고 되어있어
V2에 data3이라고 해도 되는지 재차 확인합니다.
또한 미결제금액(수량말고)의 합인 것도 맞죠?
2013-05-09
224
글번호 62995
답변완료
수식부탁드립니다
안녕하세요^^
이 상태에서
1)
if C > DayClose(6) Then
buy("매수");
2)
동시에 6 이동평균선을 돌파하면 매수
즉 1번과 2번이 동시 만족시 매수 하나만 만족할 경우 반응을 하지 않도록 부탁드립니다.
2013-05-09
195
글번호 62994
답변완료
재문의 드립니다.
수고가 많으십니다.
아래와 같은 수식을 받아 적용을 하였는데..
음..거래내역을 보면, bs4, sb4 신호가 적용되지 않습니다.
확인 요청드립니다.
1. 매도 진입 후 1시간동안 매도 진입가가 최저가(진입 이후) 대비 0.5P 이하로 유지하고 진입가와 현재가가 +0.5 이상이면 매수 전환.
2. 매수 진입 후 1시간동안 매수 진입가가 최고가(진입 이후) 대비 0.5P 이하로 유지하고 진입가와 현재가가 -0.5 이상이면 매도 전환.
If asks > bids then Sell("sell");
if MarketPosition == -1 and Isentryname("sell") == true and TimeToMinutes(stime) == TimeToMinutes(stime)+60 and
Lowest(L,BarsSinceEntry) > entryprice+0.5 and C >= Lowest(L,BarsSinceEntry)+0.5 Then
buy("sb4");
If bids > asks then buy("Buy");
if MarketPosition == 1 and Isentryname("buy") == true and TimeToMinutes(stime) == TimeToMinutes(stime)+60 and
highest(H,BarsSinceEntry) < entryprice+0.5 and C <= highest(H,BarsSinceEntry)-0.5 Then
sell("bs4");
감사합니다.
2013-05-09
231
글번호 62990
답변완료
아래 iff 구문의 의미가 이해 안됩니다.
자동추세선 로직중에보면
iff(예비고bar<우,예비고<h,1)
라는 구문이 있습니다. 그런데, iff문은 iff(조건,1,0) 처럼 조건이 만족하면 1, 아니면 0을 반환하는 것 아닌가요?
위의 자동추세선 로직의 iff는 예비고bar가 우 보다 작으면, 예비고<h 를 리턴하라 말인데.. 이게 이해가 안되네요.
2013-05-09
302
글번호 62987