커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
6067
글번호 230811
답변완료
전략합치는거 가능한가요?
참조 DATA가 많아지니
LAG 걱정때문에
전략을 10개 이상 굴리기가 쉽지 않네요...
전략합치는거 가능한가요?
예를들어
value1 = data1(MA(C,20));
value2 = data1(MA(C,60));
value3 = data2(MA(C2,20));
value4 = data2(MA(C2,60));
value5 = data3(MA(C3,20));
value6 = data3(MA(C3,60));
if crossup (value1,value2) then buy();
if crossup (value3,value4) then buy();
if crossup (value5,value6) then buy();
2021-06-26
1402
글번호 150299
답변완료
수식도움 부탁드립니다.
아래의 수식에서
직전고점을 돌파한 상승파동(빨간색 파동선)의 신규고점을 카운팅하여 숫자를 빨간색으로
직전저점을 돌파한 하락파동(파란색 파동선)의 신규저점을 카운팅하여 숫자를 파란색으로
파란색파동의 고점에는 카운팅이 필요없습니다.
파란색파동에서는 직전저점을 돌파한 저점만 카운팅 1,3,5,7,9...
빨간색 파동의 저점에는 카운팅이 필요없습니다.
빨간색 파동에서는 직전고점을 돌파한 고점만 카운팅 1,3,5,7,9,..
텍스트 출력하는 수식보완 도움부탁드립니다.
그림참조부탁드립니다.
아래수식...
//===================================//
Input:ChgRate(0.25),굵기(1),수치표시(1),추세선(1),크기(11);
Var:TL1(0),TL2(0),TL3(0),TL4(0),TL2_exist(0),color(0),
종가사용여부(0), // 종가로 계산하려면 1로 설정한다.
TL_NewBit(0), // 1:NewLine 2:SetEndLine
slope(0),mid_idx(0),mid_val(0),
j(0),k(0),q(0);
Array:고[10,4](0),저[10,4](0); // 1:가격,2:Index,3:sDate,4:sTime
#==========================================#
Value1 = ChgRateZigZag(ChgRate,종가사용여부,고,저,TL_NewBit);
If Value1 == 1 Then { // 고점
If TL_NewBit == 1 Then { // 신규
If 고[2,1] < 고[1,1] Then {
slope = (고[1,1] - 저[1,1]) / (고[1,2] - 저[1,2]);
mid_idx = Floor((고[2,1] - 저[1,1]) / slope);
mid_val = slope * mid_idx + 저[1,1];
Var1 = Index - (저[1,2] + mid_idx);
TL1 = TL_New(저[1,3],저[1,4],저[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,고[1,3],고[1,4],고[1,1]);
Var2 = Index - 저[1,2];
TL_SetColor(TL1,color[Var2]);
color = RED;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(저[1,3],저[1,4],저[1,1],고[1,3],고[1,4],고[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
If TL_NewBit == 2 Then { // 연장
TL_Delete(TL1);
If TL2_exist == 1 Then TL_Delete(TL2);
If 고[2,1] < 고[1,1] Then {
slope = (고[1,1] - 저[1,1]) / (고[1,2] - 저[1,2]);
mid_idx = Floor((고[2,1] - 저[1,1]) / slope);
mid_val = slope * mid_idx + 저[1,1];
Var1 = Index - (저[1,2] + mid_idx);
TL1 = TL_New(저[1,3],저[1,4],저[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,고[1,3],고[1,4],고[1,1]);
Var2 = Index - 저[1,2];
TL_SetColor(TL1,color[Var2]);
color = RED;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(저[1,3],저[1,4],저[1,1],고[1,3],고[1,4],고[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
} Else If Value1 == -1 Then { // 저점
If TL_NewBit == 1 Then { // 신규
If 저[2,1] > 저[1,1] Then {
slope = (저[1,1] - 고[1,1]) / (저[1,2] - 고[1,2]);
mid_idx = Floor((저[2,1] - 고[1,1]) / slope);
mid_val = slope * mid_idx + 고[1,1];
Var1 = Index - (고[1,2] + mid_idx);
TL1 = TL_New(고[1,3],고[1,4],고[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,저[1,3],저[1,4],저[1,1]);
Var2 = Index - 고[1,2];
TL_SetColor(TL1,color[Var2]);
color = BLUE;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(고[1,3],고[1,4],고[1,1],저[1,3],저[1,4],저[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
If TL_NewBit == 2 Then { // 연장
TL_Delete(TL1);
If TL2_exist == 1 Then TL_Delete(TL2);
If 저[2,1] > 저[1,1] Then {
slope = (저[1,1] - 고[1,1]) / (저[1,2] - 고[1,2]);
mid_idx = Floor((저[2,1] - 고[1,1]) / slope);
mid_val = slope * mid_idx + 고[1,1];
Var1 = Index - (고[1,2] + mid_idx);
TL1 = TL_New(고[1,3],고[1,4],고[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,저[1,3],저[1,4],저[1,1]);
Var2 = Index - 고[1,2];
TL_SetColor(TL1,color[Var2]);
color = BLUE;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(고[1,3],고[1,4],고[1,1],저[1,3],저[1,4],저[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
}
TL_SetSize(TL1,굵기);
TL_SetSize(TL2,굵기);
//
if 추세선 == 1 Then {
If Value1 == 1 Then { // 고점
If TL_NewBit == 1 Then { // 신규 고점
k = 0;
For j = 2 To 10 {
If 저[1,1] > 저[j,1] and 저[j,1] > 0 Then { // 전저점보다 낮은 이전 전저점 찾는다
k = j;
j = 10; // exit loop
}
}
If k > 1 Then { // 낮은 전저점이 찾아졌다면
TL3 = TL_New(저[k,3],저[k,4],저[k,1],sDate,sTime,(저[1,1]-저[k,1])/(저[1,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
TL_SetColor(TL3,rgb(255,187,0));
}
q = q + 1; // 고점이 새로 추가되었으므로 1 증가
If q > 2 and q <= 10 Then { // 1 증가했으니 2보다 커야 하고 배열 크기가 10이므로 10 이내
TL_SetEnd(TL4,sDate,sTime,(고[2,1]-고[q,1])/(고[2,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
}
} Else { // 신규 고점이 아니면 기존 추세선만 연장
If k > 1 Then {
TL_SetEnd(TL3,sDate,sTime,(저[1,1]-저[k,1])/(저[1,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
}
If q > 2 and q <= 10 Then {
TL_SetEnd(TL4,sDate,sTime,(고[2,1]-고[q,1])/(고[2,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
}
}
} Else If Value1 == -1 Then { // 저점
If TL_NewBit == 1 Then { // 신규 저점
k = k + 1; // 저점이 새로 추가되었으므로 1 증가
If k > 2 and k <= 10 Then { // 1 증가했으니 2보다 커야 하고 배열의 크기가 10이므로 10 이내
TL_SetEnd(TL3,sDate,sTime,(저[2,1]-저[k,1])/(저[2,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
}
q = 0;
For j = 2 To 10 {
If 고[1,1] < 고[j,1] Then { // 전고점보다 높은 이전 전고점을 찾는다
q = j;
j = 10; // exit loop
}
}
If q > 1 Then { // 높은 전고점이 찾아졌다면
TL4 = TL_New(고[q,3],고[q,4],고[q,1],sDate,sTime,(고[1,1]-고[q,1])/(고[1,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
TL_SetColor(TL4,cyan);
}
} Else { // 신규 저점이 아니면 기존 추세선만 연장
If k > 2 and k <= 10 Then {
TL_SetEnd(TL3,sDate,sTime,(저[2,1]-저[k,1])/(저[2,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
}
If q > 1 Then {
TL_SetEnd(TL4,sDate,sTime,(고[1,1]-고[q,1])/(고[1,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
}
}
}
}
//======================================================================//
var : Tx(0);
if 수치표시 == 1 Then {
if value1 == 1 Then
{
if value1[1] == -1 Then
{
Tx = Text_New(고[1,3],고[1,4],고[1,1],NumToStr(고[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[2,1]-저[1,1])*100,0)+"%"+")");
Text_SetStyle(tx,2,1);
}
Else
{
Text_SetString(tx,NumToStr(고[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[2,1]-저[1,1])*100,0)+"%"+")");
Text_SetLocation(tx,고[1,3],고[1,4],고[1,1]);
}
}
if value1 == -1 Then
{
if value1[1] == 1 Then
{
Tx = Text_New(저[1,3],저[1,4],저[1,1],NumToStr(저[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[1,1]-저[2,1])*100,0)+"%"+")");
Text_SetStyle(tx,2,0);
}
Else
{
Text_SetString(tx,NumToStr(저[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[1,1]-저[2,1])*100,0)+"%"+")");
Text_SetLocation(tx,저[1,3],저[1,4],저[1,1]);
}
}
Text_SetSize(Tx,크기);
Text_SetColor(tx,white);
}
2021-06-26
1813
글번호 150298
답변완료
수식 부탁 드립니다.
관리자님,
수식 부탁 드립니다.
1) if c>ma(c,60) then buy();
2) if crossdown(c,ma(c,60)) then exitlong();
3) 추가로 이전 1봉과 현재의 2봉을중에서 주가가 최고점대비 10% 하락시 그시점에 매도
4) 추가가 현재의 1봉에서 주가가 최고점대비 10% 하락시 그시점에 매도
에서 시그날이 들어 오면 지체없이 바로 매수/매도 하도록 수식 부탁 드립니다.
2021-06-25
1391
글번호 150297
답변완료
주석요청
안녕하세요?
아래 글번호 73042번 답변주신 스크립트의 주석을 요청드립니다.
감사합니다.
input : cnt(3);
if MarketPosition == 0 Then
Begin
If O > data2(Highest(H,cnt)[1]) Then Sell("S1", AtMarket);
If O < data2(Lowest(L,cnt)[1]) Then Buy("B1", AtMarket);
If O > data2(Highest(C,cnt)[1]) Then Sell("S2", AtMarket);
If O < data2(Highest(C,cnt)[1]) Then Buy("B2", AtMarket);
End;
If CrossDown(O, data2(Ma(C,5))) Or CrossDown(C, data2(Ma(C, 5))) Then ExitLong("EXB");
If CrossUp(O, data2(Ma(C,5))) Or CrossUp(C, data2(Ma(C,5))) Then ExitShort("EXS");
2021-06-25
1184
글번호 150296
kh 님에 의해서 삭제되었습니다.
2021-06-25
30
글번호 150295
답변완료
검토부탁드립니다
안녕하세요.....글번호73061 수식에데이타 4의시가라인이 그려져야하는데
데이타6의 시가라인으로나오네요. 검토부탁드립니다.
수고하세요...꾸벅
2021-06-25
1847
글번호 150294
답변완료
종목검색
다음의 조건을 모두 만족하는 종목을 검색하는 식을 구합니다
- 일목균형표 선행지표2개중 작은것 보다 종가가 크고
- 거래량이 거래량60일이평보다 많고
- 일일 거래대금이 1000억원 이상이며
- 5일이평이 20일이평보다 작은 종목을 구하는 식을 구합니다
감사합니다
-
2021-06-25
1629
글번호 150287
답변완료
73050번 Yes Global - Yes Spot 적용 잔고 수량 값이 0으로 나옵니다!
아래와 같이 수식을 바꾸고(*제외) 해도 여전히 잔고(count)는 0으로 나오네요!ㅜㅜ
포지션, 평균단가, 현재가, 종목 코드는 정상적으로 잘 나옵니다.
그러나 평가금액, 잔고 수량은 0으로 나오네요!
왜 그러는 것일까요?!
YesGlobal - Yes Spot(NH선물, 해외선물 거래중)을 사용중입니다.
var RF;
function Main_OnStart()
{
var d = new Date();
var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
Main.MessageLog(HHMMDD+":"+"전략 시작");
Main.MessageLog("계좌번호:"+A1.number +", 계좌명:"+A1.name);
OrderCode = Main.GetOrderCode(F1.code); //F1 종목 객체에서 종목코드를 주문용 코드로 변환
Main.MessageLog("단축코드:" + F1.code + "주문용 종목코드:"+OrderCode+", 종목명:"+F1.name +" ,잔존일수:"+F1.remainDay);
//잔고 정보 조회
A1.SetBalanceItem(F1.code, 0); //잔고객체를 사용하기위해 종목 설정
A1.Refresh();//가원장 새로 고침
Main.RefreshAccount(A1.number);//Main에서 A1 계좌번호로 가원장 새로 고침
RF = true;
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
if (A1.number == sAccntNum && RF == true && lUp*dateID == 30000)
{
RF = false
Bal = A1.GetTheNumberOfBalances(); //잔고 리스트 개수 반환 현재 계좌에 1종목 1개 존재
A1.SetBalanceIndex(0);//잔고 인덱스 0 설정(1종목 1수량 존재하므로)
Main.MessageLog("잔고 리스트 개수:" + Bal);
Main.MessageLog("잔고 code:"+A1.Balance.code);
Main.MessageLog("잔고 포지션(S:1,L:2)):"+ A1.Balance.position);
Main.MessageLog("잔고 count:"+ A1.Balance.count);
Main.MessageLog("잔고 평균단가:"+ A1.Balance.avgUnitCost);
Main.MessageLog("잔고 평가금액:"+ A1.Balance.assessedAmount);
Main.MessageLog("잔고 current:"+ A1.Balance.current);
}
}
2021-06-25
1643
글번호 150286
답변완료
변수추출
안녕하세요~
변수 A, B, C 가 있는경우 시가보다 크면서 시가에 가장 가까운 변수 값으로 sell 하는 수식 부탁드립니다.
2021-06-25
1620
글번호 150282