커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
6573
글번호 230811
답변완료
수식 관련 문의드립니다.
아래와 같은 상황을 가정하면,
어떤 값이 반환되는지요?
현재시각 오전 09:13분입니다.
30분봉 차트로 사용데이터는 10개입니다.
이 상황에서 DayLow(0)[1] 라고 사용하면,
1봉전 값중 가장 낮은 당일날 Low 값을 가져와야하는데,
아직 봉은 미완성입니다.
이런 경우 어떤 값이 나오는 것인지요? 아니면 아무 값도 없는것인지요?
09:30 분 이후면, DayLow(0)[1]는 값이 있을 것 같습니다.
30분봉 하나가 있으니, 그 값의 Low값이 될 것 같은데요..제가 이해한게 맞는지요?
2015-05-26
148
글번호 86425
i행운아 님에 의해서 삭제되었습니다.
2015-05-26
0
글번호 86424
답변완료
주문접수나 취소시에 그 내역들이 Account객체에 반영되는 메카니즘을 알고 싶습니다
문의1)
증권사 시스템은 사용자가 주문을 낼때 계좌에 예탁금이 충분한지를 체크합니다.
예를들어, 현재 예탁금으로 주문가능한 계약수는 3계약인데, 그 이상을 주문하면 당연히 주문은 실패하겠죠.
이때 주문을 내는데 필요한 금액이 계좌에 예치되어 있는지에대한 판단(즉, 주문가능 여부에 대한 판단)을 사용자PC에서 하는지 증권사 서버에서 하는지 가 궁금해서 제가 다음과 같이 수식을 짜서 테스트 삼아 돌려보았습니다.
실제계좌에 3100만원을 입금시키고 예스스팟에서 자동주문으로 실행하였습니다.
예스트레이더의 통합주문(2101)화면에서 코스피200 선물6월물로 주문가능한 계약수를 확인해보니 3계약까지 가능하더군요.
function Main_OnStart()
{
var i, j, k=0, l, jumunka=250;
Main.MessageList("주문시작:");
for (i=0; i<3; i++)
{
j = Account.OrderBuy(future.code, 1, jumunka, 0);
jumunka += 0.05;
k = Account.GetTheNumberOfUnfills();
l = Account.GetBalanceETCinfo(29);
Main.MessageList(i, j, k, l);
}
Main.SetTimer(1, 20000);
}
function Main_OnOrderResponse(OrderResponse)
{
var x, y;
x = Account.GetTheNumberOfUnfills();
y = Account.GetBalanceETCinfo(29);
Main.MessageList("OnOrderResponse:", OrderResponse.orderID, OrderResponse.orderNum, OrderResponse.orgOrderNum, OrderResponse.orderPrice, OrderResponse.isNormal, x, y);
}
function Main_OnTimer(nEventID)
{
var i, j, k, l, m;
Main.KillTimer(1);
k = Account.GetTheNumberOfUnfills();
Main.MessageList("주문취소:", k);
for (i=0; i<k; i++)
{
Account.SetUnfillIndex(i);
j = Account.OrderCancel(Account.Unfill.orderNum);
m = Account.GetTheNumberOfUnfills();
l = Account.GetBalanceETCinfo(29);
Main.MessageList("OnTimer:", i, j, m, l);
}
j = Account.OrderBuy(future.code, 3, 252, 0);
m = Account.GetTheNumberOfUnfills();
l = Account.GetBalanceETCinfo(29);
Main.MessageList("OnTimer:", 99999, j, m, l);
}
실행한 결과는 다음과 같습니다.
주문시작:
0 1 0 31000000
1 2 0 31000000
2 3 0 31000000
OnOrderResponse: 1 437 0 250 ture 1 31000000
OnOrderResponse: 2 438 0 250.05 true 2 31000000
OnOrderResponse: 3 439 0 250.1 true 3 31000000
주문취소: 3
OnTimer: 0 4 3 1071625
OnTimer: 1 5 3 1071625
OnTimer: 2 6 3 1071625
OnTimer: 99999 7 3 1071625
OnOrderResponse: 4 440 437 0 true 2 1071625
OnOrderResponse: 5 441 438 0 true 1 1071625
OnOrderResponse: 6 442 439 0 true 0 1071625
OnOrderResponse: 7 443 0 252 true 1 1071625
근데, 실행결과를 보면 이상한 점들이 있어서 문의드립니다.
신규로 1계약씩 총 3계약을 매수주문을 냄과 동시에 미체결내역 수와 주문가능총액을 MessageList()로 찍어보면 account계좌에 즉각 반영이 안되더군요.
OnOrderResponse 이벤트가 발생하고 나서야 그나마 미체결내역 수는 계좌(Account객체)에 반영되는데, 주문가능총액은 여전히 반영이 안된채로 31,000,000원을 그대로 표시해주네요.
주문가능총액도 주문응답을 하나씩 받을때마다 단계적으로 감소해야 될거 같은데 말이죠.
주문가능총액은 타이머로 20초 후에 전체 매수주문에대해 취소주문을 낼 때 쯤에야 1,071,625원이 Account객체에 반영이 된걸 확인할수 있네요
또한 취소주문을 냄과 동시에 미체결 내역수를 찍어봐도 역시 바로 Account객체에 반영이 안되고 3으로 표시됩니다.
취소주문을 1개씩 낼때마다 미체결 내역도 –1씩 감소해야 정상인데, 그러질 않네요.
근데, 여기서 정말 이상한 점은... 취소주문을 3개를 냈긴 하지만 아직 미체결 내역 수는 3이고, 주문가능 총액은 1,071,625원으로, 주문 취소한 내역이 아직 Account객체에 반영이 안된 상태인데, 3계약 매수주문은 정상적으로 실행이 되더군요.
주문가능총액이 부족하면 3계약 매수주문이 실행이 되선 안될 거 같은데 말이죠.
주문을 내거나 취소시에 미체결 내역 수와 주문가능총액 등이 계좌객체에 바로 반영되는 것도 있고 느리게 반영되는 것도 있고, 이런 식으로 반영되는 시차가 제각각이면...제가 수식으로 주문가능한 계약수를 계산할 때 잘못된 값을 계산할 수도 있을 거 같은데요.
주문가능한 계약수를 계산하려면 주문가능총액 가지고 계산할 수 밖에 없는데, 정확한 반영 여부를 알수가 없다면 문제가 있을 거 같습니다.
그리고, 제가 궁금해 했던...주문을 내는데 필요한 금액이 계좌에 예치되어 있는지에대한 판단, 즉, 주문가능 여부에대한 판단을 사용자PC에서 하는지 증권사 서버에서 하는지에 대해서는 일단 증권사 서버에서 하진 않고 사용자PC에서 하는 거 같군요.
증권사 서버로부터 주문응답(OrderResponse)을 받기도 전에 주문은 즉각적으로 바로 나가는 걸 보면 사용자 PC에서 하는거 같은데, 제 생각이 맞나요?
요약하면, 주문을 내거나 주문취소 등의 행위가 있을 시에 이러한 내역들이 Account객체에 반영되는 메카니즘을 알고 싶습니다. 어떤 방식으로 계좌객체에 반영되는지...전체적인 동작방식이 잘 이해가 안됩니다.
문의2)
이건 다른 문제인데요.
원래 종목객체 추가는 15초당 60회, 주문은 15초당 90회..이렇게 횟수제한이 있는 걸로 알고 있는데, 동시에 여러개의 전략을 실행시키니까 시간제한 오류가 발생하지 않는군요.
예를들어, A전략과 B전략이 둘다 15초당 60번의 종목객체를 추가하도록 수식을 작성한 상태에서 예스스팟에서 2개의 전략을 동시에 실행시키면 A전략과 B전략이 15초당 총 120번의 종목객체를 추가하게 되는데, 실제로 이렇게 실행시켜봤더니 시간제한 오류를 발생시키지 않고 정상적으로 2개 전략이 잘 실행되더군요.
15초당 60회(혹은 90회) 횟수 제한이 예스트레이더의 예스스팟 화면에서 실행되는 전체 전략들을 대상으로 그 횟수가 계산되어 제한이 가해지는게 아니고, 각각의 전략단위로 계산되어 제한이 가해지는 거 같군요.
그러면 동일한 전략을 1개의 전략으로 만들지 않고, 여러개의 전략으로 나누어 만들면 15초당 60회(혹은 90회) 등의 회수제한에 제약됨이 없이 무제한으로 이용할 수 있다는 얘긴데...이렇게 사용해도 되나요?
그러면 증권사에서 시간제한,횟수제한을 둔 의미가 없어지는데....이렇게 전략을 여러개로 나누어 동시에 실행시킬 때 기술적인 혹은 기타 문제점은 없는지 궁금합니다.
그리고, 한가지 더 좀 여쭐게요.
시간제한 오류가 발생하면 전략 수행이 통째로 멈춰버리던데, 제가 20초 후에 타이머를 작성하도록 수식을 짰는데, 그 전에 시간제한 오류가 발생하니까 20초가 지나도 타이머가 작동을 안하네요.
게다가, OnUp dateMarket 이벤트조차도 더 이상 발생을 안합니다.
시간제한 오류가 발생했는데 그와 상관없는 OnUp dateMarket 이벤트가 왜 멈추는지도 잘 이해가 안되고...
원래 시간제한 오류 발생하면 전략 실행이 올스톱 되나요?
이게 시간제한 오류가 발생한 해당 전략만 올스톱되는게 아니라 시간제한이 발생하지 않은 멀쩡하게 잘 실행되던 다른 전략까지 올스톱됩니다.
예스스팟(6131)화면에서 모든 전략들이 빨간색으로 “제한”이란 표시가 뜨면서, 15초가 지나도 그대로 있습니다.
이거 15초가 지나면 제한이 풀려야 되지 않나요?
한 전략에서 시간제한 오류가 발생하더라도 다른 전략에는 영향을 미치면 안될 거 같은데...이거 좀 골치 아프네요.
시간제한 오류가 발생하더라도 15초가 지나면 전략은 다시 정상 수행해야 되지 않나요?
그러니까 내용을 요약하면 이렇습니다.
복수개의 전략들에 대해 원천적으로 각 전략마다 15초동안 60회(혹은 90회)만 종목객체추가나 주문을 내도록 프로그래밍한 후 이 복수개의 전략들을 동시 실행시키면 복수개 전략들 전체로 합산해서 15초당 60회(혹은 90회)를 훨씬 초과하는 종목객체 추가나 주문이 발생하더라도 시간제한 오류가 발생하지 않고 정상 수행되는데, 이렇게 프로그래밍하지 않고 좀 수식을 엉성하게 짜서 한 전략이라도 15초동안 정해진 횟수를 한번이라도 초과하게 되면 횟수초과 하지 않은 다른 전략들까지 수행정지가 된다는 얘기죠.
2015-05-27
295
글번호 86422
답변완료
안녕하세요4
안녕하세요 에스트레이더에서(하이투자)cci가200,180,140,100등을 하향돌파-200.-180,-140,-110상향돌파등을 화살표신호를 차트(6101)에나타나게하고,일봉3일5일선을분봉에나타나게할려고하는데요 방법좀알려주세요
2015-05-26
147
글번호 86421
답변완료
문의
안녕하세요
1. 아래식은 이평선을 이용해서 만든 수식인데요.
국내선물용으로 point로 만든건데, 혹시 틱수로 조정해서 해선에 응용을 하고 싶은데 수정 좀 부탁드립니다.
2. 추가로 해외선물에서 당일 봉의 고가-저가의 틱수를 차트내에 텍스트로 표현하는 식을 부탁합니다.
감사합니다.
---------------------------------------------------------------------------------------------------
input : N(0.05),loss(0.3),ret(0.4),Profit(0.4),switch(1);
var1 = ma(c,10);
var2 = ma(c,40);
if dayindex+1 >= 10 and stime < 145000 Then
{
if MarketPosition <= 0 and var2 > var2[1] and var1>var2 and C <= var1-N and (TotalTrades == 0 or (TotalTrades >= 1 and BarsSinceExit(1) != 0)) Then
{
buy("b");
# Text_New(sdate,stime,H+PriceScale*2,NumToStr(var1-N,2));
ExitLong("bx2",AtLimit,C+Profit);
# Text_New(sdate,stime,H+PriceScale*2,NumToStr(var1-N,2));
}
if MarketPosition >= 0 and var2 < var2[1] and var1<var2 and C >= var1+N and (TotalTrades == 0 or (TotalTrades >= 1 and BarsSinceExit(1) != 0)) Then
{
sell("s");
# Text_New(sdate,stime,L-PriceScale*2,NumToStr(var1+N,2));
ExitShort("sx2",AtLimit,C-Profit);
# Text_New(sdate,stime,L-PriceScale*2,NumToStr(var1+N,2));
}
}
if MarketPosition == 1 Then{
if highest(H,BarsSinceEntry) >= EntryPrice+ret Then
exitlong("Bx",AtStop,EntryPrice);
ExitLong("bP",AtLimit,EntryPrice+Profit);
if switch == 0 then
ExitLong("bL",AtStop, EntryPrice-loss);
}
if MarketPosition == -1 then{
if lowest(L,BarsSinceEntry) <= EntryPrice-ret Then
ExitShort("sx",AtStop,EntryPrice);
ExitShort("sP",AtLimit,EntryPrice-Profit);
if switch == 0 then
ExitShort("sL",AtStop, EntryPrice+loss);
}
SetStopEndofday(145900);
2015-05-26
168
글번호 86416
답변완료
함성시스템 요청
안녕하세요?
메뉴의 '시스템합성관리자'가 아닌 함수를 통해서
시스템A와 시스템B를 다음의 청산 조건을 추가하여
하나의 시스템으로 만들고 싶습니다.
- 청산조건 : 손절매 : 0.5%
목표수익 : 1%
최소가격변화 : 0.5%, 10봉이내
- 시스템A :
var : TF(0);
var : Xtime(0), Etime(false),cnt(0),mav1(0),mav2(0);
var : HV(0),LV(0),HV1(0),LV1(0),HV2(0),LV2(0);
Array : HH[50](0),LL[50](0),CC[50](0);
mav1 = ma(c,5);
mav2 = ma(C,20);
TF = TimeToMinutes(stime)%30;
if Bdate != Bdate[1] Then{
Etime = true;
if stime >= 150000 Then
Xtime = 050000;
Else
Xtime = 060000;
}
if Bdate != Bdate[1] or (TF < TF[1] and stime > stime[1]) or date != date[1] Then{
HH[0] = H;
LL[0] = L;
for cnt = 1 to 49{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
}
}
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
CC[0] = C;
if HH[25+2] > 0 Then{
HV = HH[0];
LV = LL[0];
HV1 = HH[1];
LV1 = LL[1];
HV2 = HH[2];
LV2 = LL[2];
for cnt = 0 to 25{
if HH[cnt] > HV Then
HV = HH[cnt];
if LL[cnt] < LV Then
LV = LL[cnt];
if HH[cnt+1] > HV Then
HV = HH[cnt+1];
if LL[cnt+1] < LV Then
LV = LL[cnt+1];
if HH[cnt+2] > HV Then
HV = HH[cnt+2];
if LL[cnt+2] < LV Then
LV = LL[cnt+2];
}
var1 = (HV+LV)/4;
var2 = (HV1+LV1)/4;
var3 = (HV2+LV2)/4;
if Etime == true then{
if MarketPosition == 0 and CC[0] > var1 and CC[1] < var2 and CC[2] < var3 and C >= daylow+0.5 Then
buy("b",AtMarket);
if MarketPosition == 0 and CC[0] < var1 and CC[1] > var2 and CC[2] > var3 and C <= dayhigh-0.5 Then
sell("s",AtMarket);
if MarketPosition == 1 and c <= highest(H,BarsSinceEntry)-0.5 and CrossDown(mav1,mav2) Then
ExitLong("bx",AtMarket);
if MarketPosition == -1 and c >= Lowest(L,BarsSinceEntry)+0.5 and CrossUp(mav1,mav2) Then
ExitShort("sx",AtMarket);
}
}
if stime == Xtime or (stime > Xtime and stime[1] < Xtime) Then{
Etime = false;
ExitLong();
ExitShort();
}
- 시스템B :
var : TF(0);
var : Xtime(0), Etime(false),cnt(0),mav1(0),mav2(0);
var : HV(0),LV(0),HV1(0),LV1(0),HV2(0),LV2(0);
Array : HH[50](0),LL[50](0),CC[50](0);
mav1 = ma(c,5);
mav2 = ma(C,20);
TF = TimeToMinutes(stime)%30;
if Bdate != Bdate[1] Then{
Etime = true;
if stime >= 090000 Then
Xtime = 050000;
Else
Xtime = 060000;
}
if Bdate != Bdate[1] or (TF < TF[1] and stime > stime[1]) or date != date[1] Then{
HH[0] = H;
LL[0] = L;
for cnt = 1 to 49{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
}
}
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
CC[0] = C;
if HH[25+2] > 0 Then{
HV = HH[0];
LV = LL[0];
HV1 = HH[1];
LV1 = LL[1];
HV2 = HH[2];
LV2 = LL[2];
for cnt = 0 to 25{
if HH[cnt] > HV Then
HV = HH[cnt];
if LL[cnt] < LV Then
LV = LL[cnt];
if HH[cnt+1] > HV Then
HV = HH[cnt+1];
if LL[cnt+1] < LV Then
LV = LL[cnt+1];
if HH[cnt+2] > HV Then
HV = HH[cnt+2];
if LL[cnt+2] < LV Then
LV = LL[cnt+2];
}
var1 = (HV+LV)/3;
var2 = (HV1+LV1)/3;
var3 = (HV2+LV2)/23
if Etime == true then{
if MarketPosition == 0 and CC[0] > var1 and CC[1] < var2 and CC[2] < var3 and C >= daylow+0.5 Then
buy("b",AtMarket);
if MarketPosition == 1 and c <= highest(H,BarsSinceEntry)-0.5 and CrossDown(mav1,mav2) Then
ExitLong("bx",AtMarket);
}
}
if stime == Xtime or (stime > Xtime and stime[1] < Xtime) Then{
Etime = false;
ExitLong();
}
2015-05-26
191
글번호 86412
답변완료
42022 답변에 대한 질의3의 내용 재 질문입니다
매 15분마다 진입 후 14시45분에는 진입금지입니다!!!!
수식에 대한 주석 좀 달아주세요!!! 조건문 수식이 이해가 안됩니다!!!!
감사합니다!!!
2015-05-26
149
글번호 86407
답변완료
항상 감사 드립니다.
그림 첨부합니다.. 참조해주세요. 종목 검색 질문드려요
- 종가기준 / 5일선 기준
조건1: 금일 현재 주가 5일선 아래에 있음
조건2: 전일 주가 5일선 아래로 처음 내려옴
조건3: 2일전 주가 5일선 위에 있음
- x일 : 최근 처음으로 5일선 위로 올라간 날
조건4: x일에서 2일전까지 상승율이 YY%(예:50%) 이상
조건5: x일에서 2일전까지 날짜별 거래량중 가장큰 거래량 > 전일 거래량 and 전전일 거래량
바쁘신데 종목 검색 수식좀 부탁드릴께요. 항상 감사합니다.
2015-05-26
181
글번호 86405
답변완료
보시고 참조 해주세요
환경--- 주차트와 참조 차트와 두개의 차트를 사용합니다
특정 이평선 세개를 각각사용합니다
기준-- 특정이평선 위에 있으면 상방 아래있으면 하방으로 봅니다
예외-- 동시호가에 방향성이 같으면 방향성 무시 합니다
(주가의 위치를 신호라고 이야기 하겠습니다 편의상)
오늘은 기준으로 설명합니다 좀더 정확성을 이야기 하기 위해서 시간을 적어보겠습니다
09:00 주차트 상방 09:00 참조차트 상방 --- 첫 신호가 같은 방향성이기 때문에 신호무시
09:01 주차트 상방 09:01 참조차트 하방 --- 두차트가 서로 방향성이 틀림
09:02 주차트 하방 09:02 참조차트 하방 ----- 두차트가 방향성 일치
두차트가 서로 방향성이 틀리다가 일치가됨
매도1
참조설명--- 물론 이곳에 적은것처럼 두 차트가 동시에
같은 방향성은 나오지 않습니다
중요한것은 주차트가 먼저든 또는
참조차트 먼저든 중요한것이 아니라
틀리다과 같은 방향성으로 변했다는것입니다
이점이 상당히 중요합니다
현재 매도1 이 진행중입니다
09:30 주차트 하방 09:30 참조차트 상방 ------ 신호가 틀리면 기존 포지션 계속유지
(매도1유지 입니다)
09:40분 주차트 상방 09:40참조차트 사방 ------ 방향성이 같아짐 매수1
참조설명 --- 누가 먼저 방향성이 변한것이 중요하지
않습니다
같은 방향성으로 변한것이 중요합니다
특정 이평선 10일 8일 5일 로해서 식부탁합니다
손절 ---- 신호봉 이전 1봉전 저가 또는 고가 이탈시 손절입니다
참고로 신호차트는 주차트 참조차트 두개중에 먼저간것이 아니라
방향성를 따라가는 차트게죠
손절을 하면 반대포지션 진입
익절 --- 매수에서 진행중에 최고수익이 0.5포 이상 발생하고 8일 이평선 이탈시 익절
또는 5일 이평선 이탈하고 돌파하고 한번
이탈하고 돌파하고 두번
이탈하면 세번째 이탈시 익절
손절이 연속적으로 세번이상 발생하면 당일 매매중지
모든 매매는 당일 시작 당일청산입니다
2015-05-26
193
글번호 86398