커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
1708
글번호 230811
답변완료
문의 드립니다.
아래 로직에서 시가를 기준으로 주가가 시가가 위에 있을 때에만
매수 신호 진입과 청산 가능하도록 추가 부탁드립니다.
Input : Period(10), MultiD(2);
var : BBmd(0),BBup(0),BBdn(0);
BBmd = ma(C,Period);
BBup = BollBandUp(Period,MultiD);
BBdn = BollBandDown(Period,MultiD);
if C > BBmd and crossup(C[1],BBmd[1]) Then
buy();
input : P(10);
var1 = ma(C,P);
if CrossDown(c,var1) Then
ExitLong();
2021-11-30
864
글번호 154048
답변완료
수식문의 드립니다
Input : Period(3),ntime(110000);
var : value1(0,data2),value2(0,data3),Value3(0),Value5(0);
value1 = ma(data2("c"),Period);
value2 = ma(data3("C"),Period);
value3 = value1 - value2; // 차
Value5 = data2("C")/data3("C")*100; // 비율
if Data2(Bdate != Bdate[1]) Then
Condition1 = False;
if Value5 < 110 Then
Condition1 = true;
if Condition1 == False and
((sdate != sdate[1] and stime >= ntime) or
(sdate == sdate[1] and stime >= ntime and stime[1] < ntime)) Then
Buy();
value5 값이 10분봉에서 첫봉부터 현재봉까지 계속 모든봉에서 100 이상일경우 11시에
매수하고
value5 값이 10분봉에서 첫봉부터 현재봉까지 계속 모든봉에서 100 이하일경우 11시에
매도하려 합니다
수식부탁 드립니다 감사합니다
2021-11-30
819
글번호 154042
답변완료
청산 후 재진입1
국내선물
데이트레이딩
손절로 청산된 경우 당일 저점을 3회 갱신하면 sell
trailingstop으로 청산된 경우 당일 저점을 2회 갱신하면 sell
최소가격변화로 청산된 경우 당일 저점을 1회 갱시하면 sell
위 조건을 아래 수식에 추가하여 주십시요.
*******************************************************************************
input : 이평1(12),이평2(13);
input: loss(0.3),trail(1.5);
input : 최소가격(99999),봉갯수(99999);
Var :v1(0),v2(0);
v1 = ma(downvol,이평1);
v2 = ma(downvol,이평2);
if CrossUp(v1,v2) Then
Sell();
SetStopLoss(loss,PercentStop);
SetStopTrailing(trail,0,PercentStop,1);
SetStopInactivity(최소가격,봉갯수,PercentStop);
2021-12-16
787
글번호 154041
답변완료
지표 수식 부탁드립니다.
당일고점대비 -5, -10, -15, -20, -25, -30
수식 부탁드립니다.
감사합니다.
2021-11-30
819
글번호 154040
답변완료
수식 문의드립니다.
수고하십니다.
저번 수식에 수정을 조금 하고 싶습니다.
매수조건은 볼린저밴드 하단에 있을때, rsi지표가 30이하, 주가이동평균선이 5일선이 120일 이하일때, macd선이 macd시그널선 아래에 있을때 분할매수하고
매도조건은 볼린저밴드 상단에 있을때, rsi지표가 70이상, 주가이동평균선이 5일선이 120일 이상일때, macd선이 macd시그널선 위에 있을때 분할매도하는
input : BBPeriod(20),dv(5),RSIPeriod(10),maPeriod1(5),maPeriod2(20),short(12),long(26),sig(9);
input : 매수금액(100000),매도금액(100000);
var : BBup(0),BBdn(0),RSIV(0),mav1(0),mav2(0),macdv(0),macds(0);;
BBup = BollBandUp(BBPeriod,dv);
BBdn = BollBandDown(BBPeriod,dv);
RSIV = RSI(RSIPeriod);
mav1 = ma(C,maPeriod1);
mav2 = ma(C,maPeriod2);
macdv = macd(short,long);
macds = Ema(macdv,sig);
if C < bbdn and RSIV <= 30 and mav1 < mav2 and macdv < macds Then
Buy("b",OnClose,DEF,Floor(매수금액/C));
if MarketPosition == 1 and
C > AvgEntryPrice and
C > bbup and RSIV >= 70 and mav1 > mav2 and macdv > macds Then
ExitLong("bx",OnClose,DEF,"",Floor(매도금액/C),2);
이렇게 작성해주셨는데 1시간봉으로 볼때 볼린저밴드랑 주가이평선은 일봉기준으로 하고 rsi, macd는 1시간봉기준으로요.
그리고 당일 거래 횟수를 제한하고 싶은데 하루 3번만 거래하는식이 가능할까요?
감사합니다.
2021-11-30
747
글번호 154039
답변완료
예스스팟의 주문체결통보 객체가 이상합니다.
안녕하세요. 언제나 친절한 답변에 감사드립니다.
파이선 등의 외부 프로그램에서 데이터베이스에 명령값 등을 수출하고, 그걸 예스스팟의 데이터베이스 객체로 읽어 예스스팟의 매매를 실행하는 전략을 만들었습니다. 그런데 이 전략을 오일, 골드 종목별로 여러개 띄울때 문제가 생깁니다. 종목별로 데이터베이스 테이블 명과 Chart1 의 종목 등을 변경 적용했을때, 주문체결통보객체(Main_OnNotifyFill)에서 반환값이 전략간 구분이 안가고 모든게 global 변수 처리돼 섞이는 것 같습니다. 주문접수응답 객체(Main_OnOrderResponse)는 종목별 전략 간에 섞이지 않는 것같습니다. 그런데 주문체결통보객체는 종목별 전략 간에 섞입니다. 이게 원래 그런건지 봐주십시오. 감사합니다.
첨부파일의 전략을 오일용으로 하나, 데이터베이스 테이블명과 Chart1 객체 설정을 바꿔서 골드용으로 또 하나 이렇게 전략 2개를 만들고 실행했을때 Main.MessageList 출력을 보면 jumunJunCode 가 종목별로 달라야 하는데 같은것으로 설정되는 문제를 첨부 파일 그림에서 볼 수 있습니다.
##################### 예스스팟 전략 #########################
var tableEreum="YESSPOT_IMSI_OIL"; // 마리아디비 테이블 이름 - 종목별. // 골드 종목시 "YESSPOT_IMSI_GOLD"
var sqlSel*ct="0";
var fieldCountVV=0;
var sql_rra_positionGo=new Array();
var jnibSuryang=2;
var hhPythonPositionBalryung=0;
var positionGoSeHengOn=0;
var hhDocDoinpositionGoAnneBun=0;
var position=0;
var hhJnibga=0;
var jumunJunCode="0";
var choKkuenHurum=1;
var sql_rra=0;
var hhGejwaBun=0;
var isNormalVV=0;
var orderNumVV=0;
var orderCountVV=0;
function Main_OnStart()
{
Main.MessageList("계좌번호=",hhGejwaBun);
}
////////////////////////// Chart1==AD_position 2틱인.
function Chart1_OnBarAppended(nData)
{
if (nData==1){
if (choKkuenHurum==1){
sqlSel*ct="count(ANNE) from ";
sqlSel*ct+=tableEreum;
sqlSel*ct+=";";
// Main.MessageList("sqlSel*ct=",sqlSel*ct);
DataBase1.Sel*ct(sqlSel*ct,"AD");
sql_rra=DataBase1.GetFieldValue(0);
if (sql_rra>=1){
////////////// 포지션 데이터베이스 읽기
sqlSel*ct="* from ";
sqlSel*ct+=tableEreum;
sqlSel*ct+=" ORDER BY ANNE DESC LIMIT 1;";
// Main.MessageList("sqlSel*ct=",sqlSel*ct);
DataBase1.Sel*ct(sqlSel*ct,"AD");
fieldCountVV=DataBase1.GetFieldCount();
for (var i=0; i<=fieldCountVV-1; i++){
sql_rra_positionGo[i]=DataBase1.GetFieldValue(i);
}
if (Math.abs(sql_rra_positionGo[4])==1){
choKkuenHurum=2; // 실시간 포지션 수출이 시작됐으면 흐름 2 영구 부여.
}
}
}
////////////// 포지션 데이터베이스 읽기
if (choKkuenHurum==2){
sqlSel*ct="* from ";
sqlSel*ct+=tableEreum;
sqlSel*ct+=" ORDER BY ANNE DESC LIMIT 1;";
// Main.MessageList("sqlSel*ct=",sqlSel*ct);
DataBase1.Sel*ct(sqlSel*ct,"AD");
fieldCountVV=DataBase1.GetFieldCount();
for (var i=0; i<=fieldCountVV-1; i++){
sql_rra_positionGo[i]=DataBase1.GetFieldValue(i); // 결. 배열에 마지막 행 배치한.
}
hhPythonPositionBalryung=0;
hhPythonPositionBalryung=sql_rra_positionGo[4];
////////////// 포지션 데이터베이스 새행 온 변수 발령
positionGoSeHengOn=0;
if (sql_rra_positionGo[0]>hhDocDoinpositionGoAnneBun){
positionGoSeHengOn=1; // 파이썬 포지션 새 포지션 발령 1 부여
hhDocDoinpositionGoAnneBun=sql_rra_positionGo[0];
}
Main.MessageList("파이썬 포지션고 새행 온 positionGoSeHengOn=",positionGoSeHengOn);
}
//////////////////////////// 포지션 진입
if (positionGoSeHengOn==1){
if (position==0){ // 포지션 없을 시
if (hhPythonPositionBalryung==1){
position=1; // 상방 1
hhJnibga=Chart1.GetClose(nData,0);
jumunJunCode=Chart1.GetCode(1);
Main.MessageList("상방 진입 주문하는");
Account1.OrderBuy(jumunJunCode,jnibSuryang,hhJnibga,2);
} else if (hhPythonPositionBalryung==-1){
position=-1; // 하방 -1
hhJnibga=Chart1.GetClose(nData,0);
jumunJunCode=Chart1.GetCode(1);
Main.MessageList("하방 진입 주문하는");
Account1.OrderSell(jumunJunCode,jnibSuryang,hhJnibga,2);
}
} else if (position==1){ // 포지션 상방시
if (hhPythonPositionBalryung==10){
position=0;
hhJnibga=Chart1.GetClose(nData,0);
Main.MessageList("상방 청산 주문하는");
Account1.OrderSell(jumunJunCode,jnibSuryang,hhJnibga,2);
}
} else if (position==-1){ // 포지션 하방시
if (hhPythonPositionBalryung==-10){
position=0;
hhJnibga=Chart1.GetClose(nData,0);
Main.MessageList("하방 청산 주문하는");
Account1.OrderBuy(jumunJunCode,jnibSuryang,hhJnibga,2);
}
}
}
Main.MessageList("현재 position=",position," hhPythonPositionBalryung=",hhPythonPositionBalryung," jumunJunCode=",jumunJunCode," orderNumVV=",orderNumVV," orderCountVV=",orderCountVV," hhDocDoinpositionGoAnneBun=",hhDocDoinpositionGoAnneBun);
}
}
function Main_OnOrderResponse(OrderResponse)
{
isNormalVV=OrderResponse.isNormal;
orderNumVV=OrderResponse.orderNum;
orderCountVV=OrderResponse.orderCount;
Account1.SetUnfillOrderNumber(orderNumVV); // 미체결
}
function Main_OnNotifyFill(NotifyFill)
{
jumunJunCode=NotifyFill.code; // 주문 응답시 코드 재부여
}
###################### 데이터베이스 쿼리 #########################
sql="CREATE TABLE yesspot_imsi_oil (ID INT, SDATE INT, STIME BIGINT, C INT, POSITIONBALRYUNG INT, POSITION INT, JANGJUN_GESU INT);"
############# 설명
1. ID 는 행별로 반드시 1증씩 하는 값이 입력돼야 합니다.
2. SDATE, STIME 은 아무 값이 입력돼도 됩니다.
3. POSITIONBALRYUNG 컬럼엔 포지션이 1(매수 진입)이 날시는 1이, 매수 포지션 청산시는 10 이 입력돼야 합니다. 매도 진입시는 -1이 매도 포지션 청산시는 -10 이 입력돼야 합니다.
4. 매수 포지션을 가질 때는 1, 매도 포지션은 -1, 포지션이 없을시는 0 이 입력돼야 합니다.
5. JANGJUN_GESU 는 매번 0 이 입력되면 됩니다.
############# 예시
파이선에서 매수 포지션 진입 명령을 수출할 시.
sql="ins*rt into yesspot_imsi_oil values (1, 1234, 1234, 77.02, 1, 1);"
파이선에서 매수 포지션 청산 명령을 수출할 시.
sql="ins*rt into yesspot_imsi_oil values (2, 1234, 1234, 77.12, 10, 0);"
2021-11-30
949
글번호 154035
답변완료
문의드립니다.
안녕하세요.
var : HV(0),HC(0),HL(0),HCT(0),HCI(0);
# 기준봉
if v[1]==HV[1] && c[1]>c[2]*1.015 then # 전봉이 당일최고거래량.. +1.5% 이상 양봉
{
value1 = c[1]/c[2];
value2 = v[1];
value3 = h; # 기준봉 고점 - 빨강점선으로 출력
value9 = index;
}
var1 = (c/c[1]) / value1; # 당봉폭 / 기준봉폭
var2 = v / Value2;
if Bdate != Bdate[1] Then
{
HV = 0;
HC = 0;
HCT = 0;
HCI = 0;
}
Else
{
if HV == 0 or (HV > 0 and V > HV) Then
HV = V;
if var1 > 1 and Var2 > 1 Then # 당봉폭이 기준봉폭 보다 크다 - 이 조건이 충족되지 않습니다
{
HC = C;
HL = L;
HCT = sTime;
HCI = Index;
}
Else
{
if HC > 0 and C > HC Then
{
HC = C;
HL = L;
HCT = sTime;
HCI = Index;
}
}
}
if HCI > 0 and Index < HCI+7 Then
plot1(HC,"HC"); #검정점선
plot2(value3*1.003,"기준봉"); # 빨강점선
74836 답변 받은 종목검색된 종목이 좀 이상해서
위그림의 지표로 출력하였습니다.
기준봉의 양봉크기를 3%에서 1.5%로 수정하였습니다.
위 그림과 같이 (제이시스 메디칼 오늘 1분봉)
기준봉은 양봉조건인데 노랑동그라미의 음봉 고점에서 출력되었고
HC 조건의 var1 > 1(기준봉의 양봉 크기 보다 더 크다 조건도 지키지 않습니다.
수식 수정 부탁드립니다.
================================================
안녕하세요
예스스탁입니다.
문의하신 내용에서는 var11,var12변수는 필요가 없습니다.
var1,var2값을 이용하시면 됩니다.
var1>1 && var2>0.8 조건을 만족하면 새로 지정하므로
해당 조건이 만족하면 해당봉의 고가로 초기화하고
이후 var11>1 && var12>0.8 조건이 만족하지 않을떄만
갱신하게 작성해 드립니다.
var : HV(0),HC(0),HL(0),HCT(0),HCI(0);
# 기준봉
if v[1]==HV[1] && c[1]>c[2]*1.03 then # 전봉이 당일최고거래량.. +3% 이상 양봉
{
value1 = c[1]/c[2];
value2 = v[1];
value9 = index;
}
var1 = (c/c[1]) / value1; # 당봉폭 / 기준봉 폭
var2 = v / Value2; # 당봉거래량 / 기준봉거래량
if Bdate != Bdate[1] Then
{
HV = 0; # 당일최고거래량
HC = 0; # 최고종가양봉
HCT = 0; # 최고종가양봉의 시간
HCI = 0;
}
Else
{
if HV == 0 or (HV > 0 and V > HV) Then
HV = V;
if var1 > 1 and Var2 > 0.8 Then
{
HC = C; # 최고종가양봉의 종가
HL = L; # 최고종가양봉의 저가
HCT = sTime; # 최고종가양봉의 시간
HCI = Index;
}
Else
{
if HC > 0 and C > HC Then
{
HC = C; # 최고종가양봉의 종가
HL = L; # 최고종가양봉의 저가
HCT = sTime; # 최고종가양봉의 시간
HCI = Index;
}
}
}
if HCI > 0 and Index < HCI+7 Then
Find(1);
즐거운 하루되세요
> land22 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 안녕하세요.
var : HV(0),HC(0),HL(0),HCT(0);
if Bdate != Bdate[1] Then
{
HV = 0; # 당일최고거래량
HC = 0; # 최고종가양봉
HCT = 0; # 최고종가양봉의 시간
Condition1 = False;
}
Else
{
if HV == 0 or (HV > 0 and V > HV) Then
HV = V;
if HC == 0 or (HC > 0 and C > HC) Then # 당일최고종가양봉
{
HC = C; # 최고종가양봉의 종가
HL = L; # 최고종가양봉의 저가
HCT = sTime; # 최고종가양봉의 시간
}
}
# 기준봉
if v[1]==HV[1] && c[1]>c[2]*1.03 then # 전봉이 당일최고거래량.. +3% 이상 양봉
{
value1 = c[1]/c[2];
value2 = v[1];
value9 = index;
}
var1 = (c/c[1]) / value1; # 당봉폭 / 기준봉 폭
var2 = v / Value2; # 당봉거래량 / 기준봉거래량
If C==HC && L== HL then # 당봉종가가 최고종가이면
{
var11 = var1; # 최고종가봉의 폭비율
var12 = var2; # 최고종가봉의 거래량비율
}
if index >= value9 && #기준봉 이후부터
HCT >= 091000 && # 최고종가봉 시간이 9시10분 후부터
HC>DayClose(1)*1.05 && HC<DayClose(1)*1.25 && # 당일최고종가가 5%~25% 사이
var11>1 && var12>0.8
Then
Condition1 = true;
if Condition1 == true Then
Find(1);
위 수식은 분봉에서
위 조건 만족한 적이 있는 모든 종목을 검색하는 검색식입니다.
만들고 싶은 종목검색식은
최고종가봉 HC에서 var11>1 && var12>0.8를 만족하면 이 HC는 지정하고
이후 HC가 갱신되어도 var11>1 && var12>0.8 조건을 만족하지 않으면
(HC가 갱신되고 var11>1 && var12>0.8 조건을 만족하면 새로 지정함)
조건만족한 HC 발생봉부터 7봉 내에 있는 종목을 검색하는 수식을 알려주세요.
분봉이라서 HC봉만 검색하면 바로 사라지기 때문입니다.
수고하세요.
2021-12-02
750
글번호 154032
회원 님에 의해서 삭제되었습니다.
2021-11-30
0
글번호 154031
답변완료
지표 질문입니다
틱 차트에서
시가 시작후 최초 5분간 고가 저가를 표시한다
시가 시작후 둘째 5분간 고가 저가를 표시한다
최초 5분간 고가와 둘째 5분간 고가를 연결하여 선으로 표시한다
최초 5분간 저가와 둘째 5분간 저가를 연결하여 선으로 표시한다
감사합니다
2021-11-30
632
글번호 154030