커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
8208
글번호 230811
답변완료
부탁드립니다.
수고 많습니다.
1. 틱차트에서 일봉의 5 이평,주봉의 5이평을 구현하는 식.
2. 틱차트에서 일봉의 5이평이 상승중일때,하락중일때를 구현하는 식.
감사합니다.
2013-11-18
193
글번호 69570
회원 님에 의해서 삭제되었습니다.
2013-11-18
7
글번호 69569
답변완료
문의드립니다
[기존수식]
if C > O and ((C >= BBdn and BBdn >= O) or (C <= BBdn)) Then
var1 = 1;
if (MarketPosition == 0 and var1 == 1 and C > O and ((C >= BBdn and BBdn >= O) or (C <= BBdn))) And (money >= 10000 or (money >= Money[1]*(1+Per/100))) Then{
var1 = 2;
Buy("매수");
}
수식을 적용햇는데 반영이 안되네요 뭐가 잘못됫는지 해서요
해당봉의 거래대금이 10000 미만인데도 매수신호가 들어가고 있습니다.
money=1 이 거래대금 1000만원이므로
지표상 거래대금이 10000 일 경우 10000 * 1천만 = 1000억이 되야하지 않나요?
이게 수식상에 들어가야 되는거 아닌가요? 뭔가 오류가 잇습니다.
수정바랍니다
2013-11-18
185
글번호 69568
답변완료
부탁 드립니다.
안녕하세요.
오늘은 질문과 내용이 아주 깁니다.
생각나는대로 질문드려서 수식을 넣어봤는데 원하는 대로 작동을 안하네요.
전체적으로 점검 부탁드리고요, 틀린 코멘트 있는지 살펴주세요.
신규로 작성해주시는 수식엔 코멘트 부탁 드리고요.
진입조건은 세가지인데 다 똑같이 macd로 통일하고 1분봉으로 했습니다.
신호가 자주나오게 해서 수식이 제대로 작동하는지 확인하려고 합니다.
진입하고 손절가가 오면 손절과 동시에 스위칭을하고 계약 수에 따라 분할 청산. 그리고 마지막 남은 1계약은 익절로 마무리.
세번이상 스위칭을 하고 분할 청산도 나왔는데 익절이 나오지 않으면 지금까지의 손절값을 포함한 본절+1에 트레일링 스탑.
네번이상 스위칭을 하면 분할 청산이 나오지 않아도 지금까지의 손절값을 포함한 본절+1에 트레일링 스탑.
다섯번 스위칭을 하면 분할 청산이 나오지 않아도 지금까지의 손절값을 포함한 본절+1에 트레일링 스탑하거나 손절.
다섯번 스위칭 후 손절이 나온 경우 진입 조건이 나오면 진입할수도 안할수도 있도록 변수를 조정하게 함.
당일 1계약의 익절 거래가 1번일 때, 2번일 때, 3번일 때 등을 Profit(3)변수를 조정해서 사용함.
진입부터 제대로 잘 안됩니다.
첫 번째 진입 후 익절은 하면 두 번째 진입이 와야하는데 건너뛰고 세 번째 진입이 나옵니다.
13/11/5
역시 익절 후 macd 골드에 두 번째 진입이 나오지 않습니다.
13/11/7
알려주신 수식으로 트레일링 스탑이 나오지 않아서
#일부 청산 후 본절을 위한 수식
Condition1 = EntryDate(4) == sdate and (IsEntryName("sb4",4) == true or IsExitName("bs4",4) == true) and (IsEntryName("sb4",3) == true or IsExitName("bs4",3) == true) And (IsEntryName("sb4",2) == true or IsExitName("bs4",2) == true) And (IsEntryName("sb4",1) == true or IsExitName("bs4",1) == true);
이런식으로 or 조건을 넣어봤는데도 나오지 않네요.
bx,sx,btr,str로 끝나는 청산이 하나도 안나옵니다.
지난번에 33407번에서 질문에 답변 주신 내용을 이해 못했습니다.
#Condition1이 true이면 청산후 30분 경과후에
#조건 만족하면 매수나 매도 진입
if Condition1 == false or
(Condition1 == true and TimeToMinutes(stime) >= TimeToMinutes(ExitTime(1))+60) Then{
if 매수조건 Then
buy();
if 매도조건 Then
sell();
}
청산후 30분 경과후에는 왜 나온건지, 30분인데 수식엔 60이 들어가는게 맞는건지.
청산조건의 var2는 뭔지. 도대체 모르겠습니다.
●두 가지 조건을 더 추가하고 싶습니다.
하나는 진입하고 스위칭이 없었을 때 30분 내에 분할청산이 나오지 않으면 본절.
스위칭이 있었으면 30분 내에 분할 청산이 나오지 않으면 진입가격 + 스위칭 손절가격에 청산 또는 스위칭 없이 10틱 손절.
익절까지 나와서 모든 포지션이 청산되면 마지막 청산값+원하는 가격에 주문을 넣을 수 있나요?
트레일링 스탑이 작동을 안해서 진행안되고 멈춰있는 상태입니다. 주문부터 원하는대로 안되는 상태지만요.
바쁘시더라도 작동안하는 수식없게 잘 살펴주세요.
부탁 드립니다.
//**수식**//
Input : shortPeriod(12), longPeriod(26), Period(9),Profit(3);
Input : 일부청산(10);
var : MACDV(0),MACDS(0),cnt(0),count(0),cnt1(0),count1(0),xcond(false);
var : Pcnt(0);
value1 = TRIX(shortPeriod);
value2 = ema(value1, Period);
if date != date[1] Then
Pcnt = 0;
MACDV = MACD(shortPeriod, longPeriod);#MACD
MACDS = ema(MACDV, Period);#MACD시그널
#당일 최근5번 거래의 진입이 sb1,sb2,sb3,sb4,sb5,sb6,sb7,bs1,bs2,bs3,bs4,bs5,bs6,bs7 인 횟수
count = 0;
for cnt = 0 to 4{
if sdate == EntryDate(cnt) And
(IsExitName("sb1") == true Or
IsExitName("sb2") == true Or
IsExitName("sb3") == true Or
IsExitName("sb4") == true Or
IsExitName("sb5") == true Or
IsExitName("sb6") == true Or
IsExitName("sb7") == true Or
IsExitName("bs1") == true Or
IsExitName("bs2") == true Or
IsExitName("bs3") == true Or
IsExitName("bs4") == true Or
IsExitName("bs5") == true Or
IsExitName("bs6") == true Or
IsExitName("bs7") == true) Then
count = count+1;
}
#bx나 sx청산이 나오면 true아니면 false
xcond = ExitDate(1) == sdate and (IsExitName("bx",1) ==true or IsExitName("sx",1) == true);
#익절청산횟수
if ExitDate(1) == sdate and MarketPosition == 0 and MarketPosition[1] != 0 Then
Pcnt = Pcnt+1;
#당일 진입횟수 카운트
count1 = 0;
for cnt1 = 0 to 20{
if sdate == EntryDate(cnt1) Then
count1 = count1+1;
}
#일부 청산 후 본절을 위한 수식
Condition1 = EntryDate(4) == sdate and (IsEntryName("sb4",4) == true or IsExitName("bs4",4) == true) and (IsEntryName("sb4",3) == true or IsExitName("bs4",3) == true) And (IsEntryName("sb4",2) == true or IsExitName("bs4",2) == true) And (IsEntryName("sb4",1) == true or IsExitName("bs4",1) == true);
#무포지션
If MarketPosition == 0 and
#청산이 발생한 봉에서 동시에 진입을 하지 못하게하는내용
(ExitDate(1) != sdate or (ExitDate(1) == sdate and BarsSinceExit(1) != 0)) and
#수익청산 횟수 제어
Pcnt < Profit and
#5번연속 손절발생시 더이상 추가진입을 하지 못하게 함
Xcond == false Then{
#첫 진입 macd
if count1 == 0 Then{
#골든크로스이면 매수
if CrossUP(MACDV, MACDS) Then
Buy("b첫매수",OnClose,def,1);
#데드크로스이면 매도
if CrossDown(MACDV, MACDS) and Xcond == false Then
Sell("s첫매도",OnClose,def,1);
}
#두 번째 진입
if count1 == 1 Then{
if CrossUP(MACDV, MACDS) Then
Buy("b두번째매수",OnClose,def,2);
if CrossDown(MACDV, MACDS) Then
Sell("s두번째매도",OnClose,def,2);
}
#세 번째 진입
if count1 == 2 Then{
if CrossUP(MACDV, MACDS) Then
Buy("b세번째매수",OnClose,def,3);
if CrossDown(MACDV, MACDS) Then
Sell("s세번째매도",OnClose,def,3);
}
}
#매수포지션 진입 후
if MarketPosition == 1 Then{
#포지션 최대계약수가 3이상일때 첫번째 청산
if (CurrentContracts == MaxContracts and MaxContracts >= 3) Then
ExitLong("매수일부청산1",Atlimit,EntryPrice+PriceScale*(일부청산+5),"",MaxContracts-2,1);
#포지션 최대계약수가 3이상일때 두번째 청산
if CurrentContracts < MaxContracts and MaxContracts >= 3 and CurrentContracts == 2 then
ExitLong("매수일부청산2",Atlimit,EntryPrice+PriceScale*(일부청산+7),"",1,1);
#포지션 최대계약수가 2일때 첫번째 청산
if (CurrentContracts == MaxContracts and MaxContracts == 2) Then
ExitLong("매수청산a",Atlimit,EntryPrice+PriceScale*(일부청산+5),"",1,1);
#마지막 청산
if CurrentContracts == 1 Then
ExitLong("매수잔량익절",Atlimit,EntryPrice+PriceScale*(일부청산+15)); //나머지 전량청산
if MarketPosition == 1 and Condition1 == true and (IsEntryName("sb1",0) == true or IsEntryName("sb2",0) == true or IsEntryName("sb3",0) == true or IsEntryName("sb4",0) == true)
And countif(CurrentContracts < CurrentContracts[1],BarsSinceEntry) >= 1 Then ExitLong("btr",AtStop,EntryPrice);
#손절 후 스위칭이 연속 8번미만일때
if count < 8 Then{
#현재 남은 수량이 7계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 7
if CurrentContracts == 7 Then
sell("bs7",AtStop,EntryPrice-PriceScale*10,7);
#현재 남은 수량이 6계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 6
if CurrentContracts == 6 Then
sell("bs6",AtStop,EntryPrice-PriceScale*10,6);
#현재 남은 수량이 5계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 5
if CurrentContracts == 5 Then
sell("bs5",AtStop,EntryPrice-PriceScale*10,5);
#현재 남은 수량이 4계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 4
if CurrentContracts == 4 Then
sell("bs4",AtStop,EntryPrice-PriceScale*10,4);
#현재 남은 수량이 3계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 3
if CurrentContracts == 3 Then
sell("bs3",AtStop,EntryPrice-PriceScale*10,3);
#현재 남은 수량이 2계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 2
if CurrentContracts == 2 Then
sell("bs2",AtStop,EntryPrice-PriceScale*10,2);
#현재 남은 수량이 1계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 1
if CurrentContracts == 1 Then
sell("bs1",AtStop,EntryPrice-PriceScale*10,1);
}
#스위칭3번연속일때 10틱 손실이면 청산
if count == 3 Then
ExitLong("bx",AtStop,EntryPrice-PriceScale*10);
}
#매도포지션 진입 후
if MarketPosition == -1 Then{
#포지션 최대계약수가 3이상일때 첫번째 청산
if (CurrentContracts == MaxContracts and MaxContracts >= 3) Then
ExitShort("매도일부청산1",Atlimit,EntryPrice-PriceScale*(일부청산+5),"",MaxContracts-2,1);
#포지션 최대계약수가 3이상일때 두번째 청산
if CurrentContracts < MaxContracts and MaxContracts >= 3 and CurrentContracts == 2 then
ExitShort("매도일부청산2",Atlimit,EntryPrice-PriceScale*(일부청산+7),"",1,1);
#포지션 최대계약수가 2일때 첫번째 청산
if (CurrentContracts == MaxContracts and MaxContracts == 2) Then
ExitShort("매도청산a",Atlimit,EntryPrice-PriceScale*(일부청산+5),"",1,1);
#마지막 청산
if CurrentContracts == 1 Then
ExitShort("매도잔량익절",Atlimit,EntryPrice-PriceScale*(일부청산+15)); //나머지 전량청산
#트레일링 스탑
if MarketPosition == -1 and Condition1 == true and (IsEntryName("bs1",0) == true or IsEntryName("bs2",0) == true or IsEntryName("bs3",0) == true or IsEntryName("bs4",0) == true)
And countif(CurrentContracts < CurrentContracts[1],BarsSinceEntry) >= 1 Then
ExitShort("str",AtStop,EntryPrice);
#손절 후 연속스위칭8번미만일때
if count < 8 Then{
#현재 남은 수량이 7계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 7
if CurrentContracts == 7 Then
Buy("sb7",AtStop,EntryPrice+PriceScale*10,7);
#현재 남은 수량이 6계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 6
if CurrentContracts == 6 Then
Buy("sb6",AtStop,EntryPrice+PriceScale*10,6);
#현재 남은 수량이 5계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 5
if CurrentContracts == 5 Then
Buy("sb5",AtStop,EntryPrice+PriceScale*10,5);
#현재 남은 수량이 4계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 4
if CurrentContracts == 4 Then
Buy("sb4",AtStop,EntryPrice+PriceScale*10,4);
#현재 남은 수량이 3계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 3
if CurrentContracts == 3 Then
Buy("sb3",AtStop,EntryPrice+PriceScale*10,3);
#현재 남은 수량이 2계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 2
if CurrentContracts == 2 Then
Buy("sb2",AtStop,EntryPrice+PriceScale*10,2);
#현재 남은 수량이 1계약일때 10틱 손실이면 매도로 스위칭하고 진입수량은 1
if CurrentContracts == 1 Then
Buy("sb1",AtStop,EntryPrice+PriceScale*10,1);
}
#스위칭3번연속일때 10틱 손실이면 청산
if count == 3 Then
ExitShort("sx",AtStop,EntryPrice+PriceScale*10);
}
2013-11-18
259
글번호 69567
회원 님에 의해서 삭제되었습니다.
2013-11-18
25
글번호 69566
답변완료
수고하십니다
항상 고생이 많으십니다
진입이나 청산시 봉 완성시가 아니고
조건 만족시로 할려면 어떻게 합니까?
감사합니다
2013-11-18
182
글번호 69565
답변완료
문의 드립니다.
감사합니다.
2013-11-18
186
글번호 69562
답변완료
부탁드립니다.
운영자님
항상 친절하시어 감사드리며 노고에 수고많어십니다.
아래의 내용을 부탁합니다.
1. 직전 진입까지 전체거래에서 수익나면 4번째 진입을 허용하고
5번째 이후는 직전 진입에서 수익이 나야 진입을 허용하는 식,
2. 4번째이후 진입을 직전진입에서 수익이 나야 진입을 허용하도록 하는식,
참고로 제가 사용하는 시스템이며 분봉이며, 참조데이타를 사용하고 일일청산입니다.
진입종류에 상관없이 적용되도록 부탁합니다
3. 아래는 제가 사용하는 청산식인데 너무 복잡한 것 같아서 논리적 문제는 없는지 검토해주시고, 너무 풀어져 있는 데 간단하게 합쳐질 수 있는 것은 수정 부탁합니다.
if MarketPosition == 1 and BarsSinceEntry >= N1 Then {
exitlong("B이익",Atlimit,Entryprice +목표1); }
if MarketPosition == 1 and BarsSinceEntry < N1 Then {
exitlong("B이익12",Atlimit,Entryprice +목표12); }
if MarketPosition == 1 and BarsSinceEntry >= N11 then
SetStopTrailing(수익후하락1,최고수익1, percentstop, 0) ;
if MarketPosition == 1 and BarsSinceEntry < N11 then
SetStopTrailing(수익후하락11,최고수익11, percentstop, 0) ;
if MarketPosition == -1 and BarsSinceEntry >= N2 Then {
exitshort("S이익",Atlimit,Entryprice-목표2); }
if MarketPosition == -1 and BarsSinceEntry < N2 Then
{
exitshort("S이익22",Atlimit,Entryprice-목표22); }
if MarketPosition == -1 and BarsSinceEntry >= N23 then
SetStopTrailing(수익후하락2,최고수익2, percentstop, 0) ;
if MarketPosition == -1 and BarsSinceEntry < N23 then
SetStopTrailing(수익후하락22,최고수익22, percentstop, 0) ;
If marketposition <>0 then {
exitlong("B추적",Atstop,highest(high,barsSinceEntry+1)-atr(스탑1)*스탑12);
exitshort("S추적",Atstop, lowest(low,barsSinceEntry+1)+atr(스탑2)*스탑22);
ExitShort("S청",AtStop,Lowest(L,BarsSinceEntry)+ATR(ATRP2)*Ss2);
}
if MarketPosition == 1 and (CrossDown(수청단기이평,수청장기이평) ) Then{
exitlong("이수청",AtMarket);}
if MarketPosition == -1 and (Crossup(도청단기이평,도청장기이평) or Crossup(도청단기이평1,도청장기이평1)) Then{
ExitShort("이도청",AtMarket);
}
2013-11-18
193
글번호 69561
답변완료
부탁드립니다.
아래식에 한가지 추가 부탁드립니다.
-매수 전일부터 6거래일(-1~-6) 동안, 일봉의 종가(15:00)가 60일(일봉)이평 이격도 100미만이 1개이상 발생되었다면 매수 금지.
-------------------------------------------
input : P(60);
var : cnt(0),sum(0),sum1(0),sum2(0),sum3(0),sum4(0),sum5(0),sum6(0);
var : mav(0),mav1(0),mav2(0),mav3(0),mav4(0),mav5(0),mav6(0);
var : dis(0),dis1(0),dis2(0),dis3(0),dis4(0),dis5(0),dis6(0);
sum = 0;
sum1 = 0;
sum2 = 0;
sum3 = 0;
sum4 = 0;
sum5 = 0;
sum6 = 0;
for cnt = 0 to P-1{
sum = sum+DayClose(cnt);
sum1 = sum1+DayClose(cnt+1);
sum2 = sum2+DayClose(cnt+2);
sum3 = sum3+DayClose(cnt+3);
sum4 = sum4+DayClose(cnt+4);
sum5 = sum5+DayClose(cnt+5);
sum6 = sum6+DayClose(cnt+6);
}
mav = sum/P;
mav1 = sum1/P;
mav2 = sum2/P;
mav3 = sum3/P;
mav4 = sum4/P;
mav5 = sum5/P;
mav6 = sum6/P;
dis = C/mav*100;
dis1 = DayClose(1)/mav1*100;
dis2 = DayClose(2)/mav2*100;
dis3 = DayClose(3)/mav3*100;
dis4 = DayClose(4)/mav4*100;
dis5 = DayClose(5)/mav5*100;
dis6 = DayClose(6)/mav6*100;
var1 = iff(dis1 >= 100 and dis1 <= 102.5,1,0);
var2 = iff(dis2 >= 100 and dis2 <= 102.5,1,0);
var3 = iff(dis3 >= 100 and dis3 <= 102.5,1,0);
var4 = iff(dis4 >= 100 and dis4 <= 102.5,1,0);
var5 = iff(dis5 >= 100 and dis5 <= 102.5,1,0);
var6 = iff(dis6 >= 100 and dis6 <= 102.5,1,0);
if ExitDate(1) != sdate and
var1+var2+var3+var4+var5+var6 >= 3 And
dis >= 100 and dis <= 102 And
C < dayopen Then
buy();
if MarketPosition == 1 Then{
exitlong("bx1",atlimit,EntryPrice*1.14);
if sdate > EntryDate and stime == 150000 and dis <= 99.5 and dis1 <= 99.5 Then
exitlong("bx2",AtMarket);
}
즐거운 하루되세요
> 쌀사비팔 님이 쓴 글입니다.
> 제목 : 부탁드립니다.
> 현물 1분봉.
<매수조건>
-매수 전일부터 6거래전일(-1일~-6일) 동안, 일봉의 종가(15:00)가 60일(일봉) 이평 이격도 100~102.5가 3개봉이고,
<매수>
-매수당일, 주가가 60일(일봉)이평 이격도 100~102이고, 당일 시초가보다 미만(당일 음봉)이면 매수
-오늘 매도되었다면, 매수금지.
<청산>
-매수후, 일봉의 종가(15:00)가 60일(일봉) 이평 이격도 99.5 미만이 2회 발생하면 다음 첫봉에 청산
-매수가 대비 14% 수익시 청산
2013-11-18
186
글번호 69560