커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
7768
글번호 230811
답변완료
특정날짜의 특정시간대 거래중지하는 함수
2009년 5월25일 11시부터 2시까지의 거래만 시스템식에서 제외하고 싶을때의
함수를 부탁드림
#특정일 배제#
Date==20090525 and sDate==20090526;
위와같이 했더니 안되더라구요
2009-06-08
571
글번호 22628
답변완료
수식부탁드립니다.
안녕하세요?
수식부탁드립니다
1.매수수식 : 5MA가 60MA상향돌파시 MACD가 제로라인 이상에 있으면 매수("BB1")하는데 하루에 5회로제한하고 자동청산은 5MA가 40MA하향하고, 이익청산은 1포인트,손실청산은 0.5포인트
2.매도수식 : 5MA가 60MA하향돌파시 MACD가 제로라인 이하에 있으면 매도("SS1")하는데 하루에 5회로제한하고 자동청산은 5MA가 40MA상향하고, 이익청산은 1포인트,손실청산은 0.5포인트
미리 감사드립니다.
2009-06-08
651
글번호 22627
답변완료
수식지문요.
아래와 같은 조건이 있습니다.
장기이평선 위에 있을때와 아래 있을때
각각 다른조건으로 매수 청산이 이루어지도록 설정하고 싶은데요.
즉 매수1로 진입을 했다면, 청산1 이마 청산 1-2 로만 청산을 하고 싶습니다. 그러나,
아래와 같이 작성해서 하게 되면.
매수1로 진입을 하더라고 조건만 맞는다면 청산2로도 청산이 이루어지고 있는데요
수식을 어찌 변경해야 할지 가르쳐주십시오.
if data2(c) > data2(ma(c,1720)) Then
{
if Crossup(data2(C), data2(ma(c,182))) Then
Buy("매수1");
if highest(var2,BarsSinceEntry) >= var1[BarsSinceEntry]*1.025 and
data2(c) <= var1[BarsSinceEntry]+(highest(var2,BarsSinceEntry) - var1
[BarsSinceEntry])*0.63 Then
exitlong("청산1");
if var1 <= var1[BarsSinceEntry]*0.981 Then
exitlong("청산1-2");
}
if data2(c) < data2(ma(c,1720)) Then
{
if Crossup(data2(C), data2(ma(c,182))) Then
Buy("매수2");
if highest(var2,BarsSinceEntry) >= var1[BarsSinceEntry]*1.009 and
data2(c) <= var1[BarsSinceEntry]+(highest(var2,BarsSinceEntry) - var1
[BarsSinceEntry])*0.81 Then
exitlong("청산2");
if var1 <= var1[BarsSinceEntry]*0.995 Then
exitlong("청산2-2");
}
2009-06-07
671
글번호 22626
답변완료
분할진입 문의드립니다.
안녕하세요.
항상 수고가 많으십니다.
그리고 친절한 답변에 감사드립니다.
얼마전 질문드린 피라미딩에 관한 식(10857번글 : 아래에 붙여놨습니다)을 적용해보니
첫번째 진입 후 피라미딩이 일어나지 않고 곧바로 손절되거나 '매수(도) 수익1'로 청산됩니다.
왜 그런지 이유를 잘 모르겠습니다.
아래와 같이 다시 질문을 드립니다.
1) 일괄청산(매수의 경우)
첫번째 진입의 손절은 진입시점의 atr만큼 하락시 실행.
진입시점의 atr만큼 상승시 추가진입.
추가진입이 이루어질때마다 일괄청산 가격도 atr만큼씩 상향 이동.
예)진입시점의 atr : 1
첫번째 진입;100(1계약) / 청산 99(전체 1계약)
두번째 진입; 101(1계약) / 청산 100(전체 2계약)
세번째 진입; 102(1계약) / 청산 101(전체 3계약)
네번까지 진입하는 경우와 종가청산전까지 계속 이루어지는 경우 2가지로 알아보고자 합니다.
2) 분할청산(매수의 경우)
청산은 진입한 가격에서 각각 atr만큼 하락시 실행.
첫번째 진입;100(1계약) / 청산 99(전체 1계약)
두번째 진입; 101(1계약) / 청산 100(전체 1계약)
세번째 진입; 102(1계약) / 청산 101(전체 1계약)
네번까지 진입하는 경우와 종가청산전까지 계속 이루어지는 경우 2가지로 알아보고자 합니다.
아래는 10857번글입니다.
지난 번 식은 4회까지 분할진입하는 경우였는데
횟수 제한없이 종가청산전까지 추가진입하는 경우도 부탁드립니다.
감사합니다...
안녕하세요
예스스탁입니다.
1.
input : 자본금(50000000);
var : 매매당손절금액(0),진입시점의변동성(0),주문가능계약수(0);
var : cond(false,data2);
var : BEP(0),SEP(0);
var1 = data2(c);
var2 = data2(h);
var3 = data2(L);
Var4 = Lowest(close,100)[1];
Var5 = Lowest(close,100)[1];
Var6 = Highest(close,100)[1];
Var7 = Highest(close,100)[1];
Var8 = atr(60);
매매당손절금액 = int(자본금*0.02);
진입시점의변동성 = var8*500000;
주문가능계약수 = int(매매당손절금액/진입시점의변동성);
if stime > 100000 and stime < 140000 Then{
if MarketPosition == 0 and data2(c)>data2(o) and data2(c)>data2(dayhigh[1]) and data2(c) > data2(o) and
data2(C[1]) > data2(o[1]) and data2(c[2]) > data2(o[2]) and data2(c[3]) > data2(o[3]) then{
buy("매수",OnClose,def,주문가능계약수);
}
}
if stime > 100000 and stime < 140000 Then{
if MarketPosition == 0 and data2(c)<data2(o) and data2(c)<data2(daylow[1]) then
sell("매도",OnClose,def,주문가능계약수);
}
if MarketPosition == 1 and CurrentEntries < 4 and CountIF(CurrentEntries< CurrentEntries[1],BarsSinceEntry) < 1 Then{
buy("추가매수",AtStop,EntryPrice+var8[BarsSinceEntry]*CurrentEntries,주문가능계약수[BarsSinceEntry]);
}
if MarketPosition == -1 and CurrentEntries < 4 and CountIF(CurrentEntries< CurrentEntries[1],BarsSinceEntry) < 1 Then{
Sell("추가매도",AtStop,EntryPrice-var8[BarsSinceEntry]*CurrentEntries,주문가능계약수[BarsSinceEntry]);
}
if MarketPosition == 1 Then{
if CurrentEntries > CurrentEntries[1] Then
BEP = C;
if CurrentEntries == 1 Then{
Exitlong("매수손절1",AtStop,EntryPrice-var8[BarsSinceEntry],"",주문가능계약수[BarsSinceEntry],1);
Exitlong("매수수익1",AtLimit,BEP+var8);
}
if CurrentEntries == 2 Then{
Exitlong("매수손절2",AtStop,EntryPrice,"",주문가능계약수[BarsSinceEntry],1);
Exitlong("매수수익2",AtLimit,BEP+var8);
}
if CurrentEntries == 3 Then{
Exitlong("매수손절3",AtStop,EntryPrice+var8[BarsSinceEntry],"",주문가능계약수[BarsSinceEntry],1);
Exitlong("매수수익3",AtLimit,BEP+var8);
}
if CurrentEntries == 4 Then{
Exitlong("매수손절4",AtStop,EntryPrice+var8[BarsSinceEntry]*2,"",주문가능계약수[BarsSinceEntry],1);
Exitlong("매수수익4",AtLimit,BEP+var8);
}
if stime > 100500 and stime < 143000 then {
If CrossDown(close,Var4) Then
ExitLong("매수반대청산1",Onclose);
}
}
if MarketPosition == -1 Then{
if CurrentEntries > CurrentEntries[1] Then
SEP = C;
if CurrentEntries == 1 Then{
ExitShort("매도손절1",AtStop,EntryPrice+var8[BarsSinceEntry],"",주문가능계약수[BarsSinceEntry],1);
ExitShort("매도수익1",atlimit,SEP-var8);
}
if CurrentEntries == 2 Then{
ExitShort("매도손절2",AtStop,EntryPrice,"",주문가능계약수[BarsSinceEntry],1);
ExitShort("매도수익2",atlimit,SEP-var8);
}
if CurrentEntries == 3 Then{
ExitShort("매도손절3",AtStop,EntryPrice-var8[BarsSinceEntry],"",주문가능계약수[BarsSinceEntry],1);
ExitShort("매도수익3",atlimit,SEP-var8);
}
if CurrentEntries == 4 Then{
ExitShort("매도손절4",AtStop,EntryPrice-var8[BarsSinceEntry]*2,"",주문가능계약수[BarsSinceEntry],1);
ExitShort("매도수익4",atlimit,SEP-var8);
}
if stime > 100500 and stime < 140000 then {
If Crossup(close,Var6) Then
ExitShort("매도반대청산1",Onclose);
}
}
SetStopEndofday(150400);
2.
input : 자본금(50000000);
var : 매매당손절금액(0),진입시점의변동성(0),주문가능계약수(0);
var : cond(false,data2);
var : BEP(0),SEP(0);
var1 = data2(c);
var2 = data2(h);
var3 = data2(L);
Var4 = Lowest(close,100)[1];
Var5 = Lowest(close,100)[1];
Var6 = Highest(close,100)[1];
Var7 = Highest(close,100)[1];
Var8 = atr(60);
매매당손절금액 = int(자본금*0.02);
진입시점의변동성 = var8*500000;
주문가능계약수 = int(매매당손절금액/진입시점의변동성);
if stime > 100000 and stime < 140000 Then{
if MarketPosition == 0 and data2(c)>data2(o) and data2(c)>data2(dayhigh[1]) and data2(c) > data2(o) and
data2(C[1]) > data2(o[1]) and data2(c[2]) > data2(o[2]) and data2(c[3]) > data2(o[3]) then{
buy("매수",OnClose,def,주문가능계약수);
}
}
if stime > 100000 and stime < 140000 Then{
if MarketPosition == 0 and data2(c)<data2(o) and data2(c)<data2(daylow[1]) then
sell("매도",OnClose,def,주문가능계약수);
}
if MarketPosition == 1 and CurrentEntries < 4 and CountIF(CurrentEntries< CurrentEntries[1],BarsSinceEntry) < 1 Then{
buy("추가매수",AtStop,EntryPrice+var8[BarsSinceEntry]*CurrentEntries,주문가능계약수[BarsSinceEntry]);
}
if MarketPosition == -1 and CurrentEntries < 4 and CountIF(CurrentEntries< CurrentEntries[1],BarsSinceEntry) < 1 Then{
Sell("추가매도",AtStop,EntryPrice-var8[BarsSinceEntry]*CurrentEntries,주문가능계약수[BarsSinceEntry]);
}
if MarketPosition == 1 Then{
if CurrentEntries > CurrentEntries[1] Then
BEP = C;
if CurrentEntries == 1 Then{
Exitlong("매수손절1",AtStop,EntryPrice-var8[BarsSinceEntry],"",주문가능계약수[BarsSinceEntry],1);
Exitlong("매수수익1",AtLimit,BEP+var8);
}
if CurrentEntries == 2 Then{
Exitlong("매수손절2",AtStop,EntryPrice,"",주문가능계약수[BarsSinceEntry],1);
Exitlong("매수수익2",AtLimit,BEP+var8);
}
if CurrentEntries == 3 Then{
Exitlong("매수손절3",AtStop,EntryPrice+var8[BarsSinceEntry],"",주문가능계약수[BarsSinceEntry],1);
Exitlong("매수수익3",AtLimit,BEP+var8);
}
if CurrentEntries == 4 Then{
Exitlong("매수손절4",AtStop,EntryPrice+var8[BarsSinceEntry]*2,"",주문가능계약수[BarsSinceEntry],1);
Exitlong("매수수익4",AtLimit,BEP+var8);
}
if stime > 100500 and stime < 143000 then {
If CrossDown(close,Var4) Then
ExitLong("매수반대청산1",Onclose);
}
}
if MarketPosition == -1 Then{
if CurrentEntries > CurrentEntries[1] Then
SEP = C;
if CurrentEntries == 1 Then{
ExitShort("매도손절1",AtStop,EntryPrice+var8[BarsSinceEntry],"",주문가능계약수[BarsSinceEntry],1);
ExitShort("매도수익1",atlimit,SEP-var8);
}
if CurrentEntries == 2 Then{
ExitShort("매도손절2",AtStop,EntryPrice,"",주문가능계약수[BarsSinceEntry],1);
ExitShort("매도수익2",atlimit,SEP-var8);
}
if CurrentEntries == 3 Then{
ExitShort("매도손절3",AtStop,EntryPrice-var8[BarsSinceEntry],"",주문가능계약수[BarsSinceEntry],1);
ExitShort("매도수익3",atlimit,SEP-var8);
}
if CurrentEntries == 4 Then{
ExitShort("매도손절4",AtStop,EntryPrice-var8[BarsSinceEntry]*2,"",주문가능계약수[BarsSinceEntry],1);
ExitShort("매도수익4",atlimit,SEP-var8);
}
if stime > 100500 and stime < 140000 then {
If Crossup(close,Var6) Then
ExitShort("매도반대청산1",Onclose);
}
}
SetStopEndofday(150400);
즐거운 하루되세요
> 아로마 님이 쓴 글입니다.
> 제목 : 수식부탁드립니다.
> 안녕하세요.
혹시나해서 다시 글을 올려봅니다.
항상 수고가 많으십니다.
아래의 식에서 분할진입을 적용해보고 싶습니다.
제가 수식을 작성해보려고 하는데 잘 안되서 도움을 부탁드립니다.
input : 자본금(50000000);
var : 매매당손절금액(0),진입시점의변동성(0),주문가능계약수(0);
매매당손절금액 = int(자본금*0.02);
진입시점의변동성 = var8*500000;
주문가능계약수 = int(매매당손절금액/진입시점의변동성);
var : cond(false,data2);
var1 = data2(c);
var2 = data2(h);
var3 = data2(L);
Var4 = Lowest(close,100)[1];
Var5 = Lowest(close,100)[1];
Var6 = Highest(close,100)[1];
Var7 = Highest(close,100)[1];
Var8 = atr(60);
if stime > 100000 and stime < 140000 Then{
if data2(date) != data2(date[3]) Then
cond = False;
if data2(c)>data2(o) and data2(c)>data2(dayhigh[1]) Then{
cond = True;
if cond == True and data2(c) > data2(o) and data2(C[1]) > data2(o[1]) and data2(c[2]) > data2(o[2]) and data2(c[3]) > data2(o[3]) then{
buy("매수",OnClose,def,주문가능계약수);
cond = False;
}}}
if stime > 100000 and stime < 140000 Then{
if data2(c)<data2(o) and data2(c)<data2(daylow[1]) then sell("매도",OnClose,def,주문가능계약수);
}
if MarketPosition == 1 Then{
Exitlong("매수손절",AtStop,EntryPrice-var8[BarsSinceEntry]);
if stime > 100500 and stime < 143000 then {
If CrossDown(close,Var4) Then ExitLong("매수반대청산1",Onclose);
SetStopEndofday(150400);
}
}
if MarketPosition == -1 Then{
ExitShort("매도손절",AtStop,EntryPrice+var8[BarsSinceEntry]);
if stime > 100500 and stime < 140000 then {
If Crossup(close,Var6) Then ExitShort("매도반대청산1",Onclose);
SetStopEndofday(150400);
}
}
위의 식에서
추가진입은 균등한 계약수로
매수진입후 Var8 = atr(60)만큼 가격이 상승할때마다 추가진입 4회까지
매도진입후 Var8 = atr(60)만큼 가격이 하락할때마다 추가진입 4회까지
청산은
두가지 경우로 작성 부탁드립니다.
어느 것이 더 나은지 알아보고자 합니다.
1)일괄청산
매수의 경우 추가 진입할 때마다 Var8 = atr(60)만큼 청산가격을 올리는 방식
매도의 경우 추가 진입할 때마다 Var8 = atr(60)만큼 청산가격을 내리는 방식
2)분할청산
각각의 진입에 대한 손절은 각각의 진입가격대비 Var8 = atr(60)만큼 손실이 날 때
위의 1),2)청산조건을 제외하고는
원래의 식에서 설정한 조건에 맞으면 일괄청산되게 적용하고자 합니다.
추가질문입니다.
아래 조건에서 바로 진입하지 않고,
if data2(c)<data2(o) and data2(c)<data2(daylow[1]) then sell("매도",OnClose,def,주문가능계약수);
위와같은 조건 만족된 후,
그 시점에서의 주종목의 가격이 Var8 = atr(60) 만큼 추가 하락하면
그때 매도진입하는 진입식을 부탁드립니다.
감사합니다...
2009-06-07
992
글번호 22625
답변완료
타옵션가격을 조건으로 하는 수식작성?
타옵션가격을 조건으로 하는 수식작성?
시스템 트레이딩 초보입니다.
챠트를 이용하는 방식이 아니라 옵션가격을 조건으로한 수식작성이 가능한가요?
예를 들어,
<풋175 가격이 0.5 상승했을 때 콜175를 자동매수하라>
이런 수식이 가능한지요?
2009-06-07
778
글번호 22624
답변완료
단계별 청산식 부탁합니다
단계별 청산식 부탁 드립니다..
1) c>ma(c,20)&&c<ma(c,60) 이면 20을 깨면 청산
2) c>ma(c,20)&&c>ma(c,60) 이면 60깨면 청산 되는 식을 만들어 주세요..
감사합니다..
2009-06-06
640
글번호 22623
답변완료
목표수익 발생 후 재진입
장시작시 양봉이면 매수
음봉이면 매도
진입 후 3 이평선이 진입가 교차시 매수 매도
목표수익 2pt
목표수익에서 청산 후 재진입 (청산 다음봉 양봉 매수 음봉매도)
최종 진입가에서 3 이평선 교차시 매수,매도
당일청산 15:03
수식 부탁합니다.
2009-06-07
675
글번호 22622
회원 님에 의해서 삭제되었습니다.
2009-06-06
1
글번호 22621
답변완료
atlimit
input: 매수희망가(12300),매수일자(20090605);
if sdate>=매수일자 then
buy("편하게주문넣고싶다",atlimit,매수희망가,def,1000);
=========
챠트를 보다 이쯤에서 사야겠다 마음먹었는데
매수세가 많아서 내가 본 가격 위로 오르기만 하고
추격매수는 하기싫고
주문창으로 넣자니 (분할매수의 경우) 여러번 번거롭고
미리 매수희망가에 주문 안넣어두자니 매수우선순에서 밀려 사기 힘들겠고...
그래서 지금바로 내가 원하는 가격을 (다양한 조건 생략) 산출하여
자동으로 미리 주문 넣어두고 싶습니다.
limit오더가 봉이 조건만족했을 때만 주문나가는 걸로 알고 있는데
마냥 위처럼 수식해놔도 - 현재가는 매수희망가보다 높은 상황 -
₩12,300 이하 지정가로 "당일현재즉시" 자동주문해주나요?
limit 성격상 주문 안나가겠죠?
챠트조건과 상관없이
원하는 가격(지정가)으로 주문 나가는 수식을 안내 부탁합니다========
2009-06-06
753
글번호 22620