커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
5526
글번호 230811
답변완료
캔들이평돌파
캔들이 20일이평선 상향돌파하자마자 시장가로 매수 된후 30틱 손절 60틱 익절 로 1계약
식과
갵들이 20일이평선 하향돌파하자마사 시장가로 매수 된후 30틱 손절 60틱 익절로 1계약
식 알려주시면 감사하겠습니다.
2019-06-29
246
글번호 129869
답변완료
수식부탁드립니다
캔들차트중에 하이켄아쉬라는 차트가 있던데 그걸 구현하는 수식 부탁드립니다
2019-06-29
236
글번호 129868
답변완료
시스템 오류수정 부탁합니다.
아래 시스템식 오류수정 부탁합니다.
Input:주가파동기간(7),지표파동기간(10),유효기간(40);
Var:j(0),k(0),value(0),n1(0),n2(0),추세선(0),다이버전스(0),다이버전스Bar(0),
상승(100),하락(-100);
Array:고[10](0),저[10](0),고Bar[10](0),저Bar[10](0),
지표고[10](0),지표저[10](0),지표고Bar[10](0),지표저Bar[10](0);
#=========================================================#
# 초기처리 (Initialize Routine)
#=========================================================#
n1 = 주가파동기간;
n2 = 지표파동기간;
value = ema(MACD(12, 26),9);
//value = stochasticsD(12,5,5);
for j = 1 to 9 {
고Bar[j] = 고Bar[j] + 1;
저Bar[j] = 저Bar[j] + 1;
지표고Bar[j] = 지표고Bar[j] + 1;
지표저Bar[j] = 지표저Bar[j] + 1;
}
다이버전스Bar = 다이버전스Bar + 1;
#=========================================================#
# 주가 Swing 계산
#=========================================================#
#---------------------------------------------------------#
# 전고점(Peak) 계산
#---------------------------------------------------------#
if Highest(H,n1)[n1+1] <= H[n1] and H[n1] > Highest(H,n1) then {
for j = 8 downto 1 {
고[j+1]= 고[j];
고Bar[j+1] = 고Bar[j];
}
고[1]= H[n1];
고Bar[1] = n1;
if 저Bar[1] > 고Bar[2] then {
for j = 8 downto 1 {
저[j+1]= 저[j];
저Bar[j+1] = 저Bar[j];
}
k = n1 + 1;
for j = n1 + 2 to 고Bar[2]-1 {
if L[k] > L[j] then k = j;
}
저[1]= L[k];
저Bar[1] = k;
}
}
#---------------------------------------------------------#
# 전저점(Trough) 계산
#---------------------------------------------------------#
if Lowest(L,n1)[n1+1] >= L[n1] and L[n1] < Lowest(L,n1) then {
for j = 8 downto 1 {
저[j+1]= 저[j];
저Bar[j+1] = 저Bar[j];
}
저[1]= L[n1];
저Bar[1] = n1;
if 고Bar[1] > 저Bar[2] then {
for j = 8 downto 1 {
고[j+1]= 고[j];
고Bar[j+1] = 고Bar[j];
}
k = n1 + 1;
for j = n1 + 2 to 저Bar[2]-1 {
if H[k] < H[j] then k = j;
}
고[1]= H[k];
고Bar[1] = k;
}
}
#=========================================================#
# 지표식 Swing 계산
#=========================================================#
#---------------------------------------------------------#
# 전고점(Peak) 계산
#---------------------------------------------------------#
if Highest(value,n2)[n2+1] <= value[n2] and
value[n2] > Highest(value,n2) then {
for j = 8 downto 1 {//배열값을 순차적으로 바꿔준다
지표고[j+1]= 지표고[j];
지표고Bar[j+1] = 지표고Bar[j];
}
k = n2 + 1;
for j = n2 + 2 to 지표고Bar[2]-1 {
if value[k] > value[j] then k = j;
}
지표저[1]= value[k];
지표저Bar[1] = k;
}
}
#---------------------------------------------------------#
# 전저점(Trough) 계산
#---------------------------------------------------------#
if Lowest(value,n2)[n2+1] >= value[n2] and
value[n2] < Lowest(value,n2) then {
for j = 8 downto 1 {
지표저[j+1]= 지표저[j];
지표저Bar[j+1] = 지표저Bar[j];
}
지표저[1]= value[n2];
지표저Bar[1] = n2;
if 지표고Bar[1] > 지표저Bar[2] then {
for j = 8 downto 1 {
지표고[j+1]= 지표고[j];
지표고Bar[j+1] = 지표고Bar[j];
}
k = n2 + 1;
for j = n2 + 2 to 지표저Bar[2]-1 {
if value[k] < value[j] then k = j;
}
지표고[1]= value[k];
지표고Bar[1] = k;
}
}
#=========================================================#
# 다이버전스 계산
#=========================================================#
if 고Bar[1] == n1 or 지표고Bar[1] == n2 or
저Bar[1] == n1 or 지표저Bar[1] == n2 then {
if 고[2] < 고[1] and 지표고[2] > 지표고[1] then {
다이버전스= 하락;
다이버전스Bar = 0;
}
else if 저[2] > 저[1] and 지표저[2] < 지표저[1] then {
다이버전스= 상승;
다이버전스Bar = 0;
}
}
if 다이버전스Bar > 유효기간 then 다이버전스 = 0;
#=========================================================#
# 추세선 계산
#=========================================================#
if 다이버전스 == 상승 then {
추세선 = (고[1]-고[2])/(고Bar[2]-고Bar[1]) * 고Bar[2] + 고[2];
}
if 다이버전스 == 하락 then {
추세선 = (저[1]-저[2])/(저Bar[2]-저Bar[1]) * 저Bar[2] + 저[2];
}
if 다이버전스 == 0 then {
추세선 = 0;
}
#=========================================================#
# 시스템 식
#=========================================================#
if 다이버전스 == 상승 and C > ma(C,20) and CrossUp(C,추세선) then
Buy();
if 다이버전스 == 하락 and C < ma(C,20) and CrossDown(C,추세선) then
Sell();
2019-06-29
208
글번호 129867
답변완료
오류수정 부탁
아래 시스템식에서 선업되지 않은 이름 i가 사용되었습니다. 라는 오류가 떠서 오류수정부탁 드립니다.
Input:n(5),미완성사용(True);
Var:j(0),k(0),고점표시(0),저점표시(0);
Array:고[20](0),저[20](0),고Bar[20](0),저Bar[20](0),
고idx[20](0),저idx[20](0);
#---------------------------------------------------------#
# Index()와 마찬가지로 1봉이 바뀔 때마다 1씩 증가
#---------------------------------------------------------#
for j = 1 to 19 {
저Bar[j] = 저Bar[j] + 1;
고Bar[j] = 고Bar[j] + 1;
고iDx[j] = I - 고Bar[j];
저idx[j] = I - 저Bar[j];
}
고점표시=(O[n]+C[n])/2;
저점표시=(O[n]+C[n])/2;
#=========================================================#
# 주처리 (Main Routine) 파동선 계산
#=========================================================#
# 전고점(Peak) 계산
#---------------------------------------------------------#
//Highest(H,2)[3] <= H[2] and H[2] > Highest(H,2)
if Highest(H,n)[n+1] <= H[n] and H[n] > Highest(H,n) then {
if 미완성사용 == True then {
for j = 18 downto 1 { //배열값을 순차적으로 바꿔준다
고[j+1] = 고[j];
고Bar[j+1] = 고Bar[j];
고idx[j+1] = 고idx[j];
}
고[1]= H[n];
고Bar[1] = n;
고idx[1] = I - 고Bar[1];
고점표시 = 고[1]*1.005;
if 저Bar[1] > 고Bar[2] then {
for j = 18 downto 1 {
저[j+1]= 저[j];
저Bar[j+1] = 저Bar[j];
저idx[j+1] = 저idx[j];
}
k = n + 1;
for j = n+ 2 to 고Bar[2]-1 {
if L[k] > L[j] then k = j;
}
저[1]= L[K];
저Bar[1] = k;
저idx[1] = i - 저Bar[1];
}
}
if 미완성사용 == False then {
if 고Bar[1] > 저Bar[1] then {
for j = 18 downto 1 {
고[j+1] = 고[j];
고Bar[j+1] = 고Bar[j];
고Idx[j+1] = 고Idx[j];
}
}
if 고Bar[1] > 저Bar[1] or 고[1] <= H[n] then {
고[1]= H[n];
고Bar[1] = n;
고Idx[1] = i -고Bar[1];
고점표시 = 고[1]*1.005;
}
}
}
if Lowest(L,n)[n+1] >= L[n] and L[n] < Lowest(L,n) then {
if 미완성사용 == True then {
for j = 18 downto 1 {
저[j+1] = 저[j];
저Bar[j+1] = 저Bar[j];
저Idx[j+1] = 저Idx[j];
}
저[1]= L[n];
저Bar[1] = n;
저Idx[1] = i - 저Bar[1];
저점표시 = 저[1]*0.995;
if 고Bar[1] > 저Bar[2] then {
for j = 18 downto 1 {
고[j+1]= 고[j];
고Bar[j+1] = 고Bar[j];
고Idx[j+1] = 고Idx[j];
}
k = n + 1;
for j = n + 2 to 저Bar[2]-1 {
if H[k] < H[j] then k = j;
}
고[1]= H[k];
고Bar[1] = k;
고Idx[1] = i - 고Bar[1];
}
}
if 미완성사용 == False then {
if 저Bar[1] > 고Bar[1] then {
for j = 18 downto 1 {
저[j+1]= 저[j];
저Bar[j+1] = 저Bar[j];
저Idx[j+1] = 저Idx[j];
}
}
if 저Bar[1] > 고Bar[1] or 저[1] >= L[n] then {
저[1]= L[n];
저Bar[1] = n;
저Idx[1] = i - 저Bar[1];
저점표시 = 저[1]*0.995;
}
}
}
if 고점표시 > H[n] then Plot1(고점표시,"전고점",RED);
if 저점표시 < L[n] then Plot2(저점표시,"전저점",BLUE);
if 고Bar[1]==n and 고[1] > 0 then Plot3(고[1]);
if 저Bar[1]==n and 저[1] > 0 then Plot3(저[1]);
if 저Bar[1]==n and 저[1] > 0 then Plot4(저[1]);
if 고Bar[1]==n and 고[1] > 0 then Plot4(고[1]);
2019-06-29
209
글번호 129866
답변완료
확인좀 부탁 드립니다.
* 아래글 < 63046 > 다시 확인좁 부탁 드립니다.
* 아래식으로 적용 하니까 이상 하게 청산됨니다.
즉 10틱 이상 최대 수익이면 60% 선에서 청산이 안됨니다.
* 확인 좀 부탁 드립니다.
##################################
var : EH(0),EL(0);
if MarketPosition == 1 then
{ EH = highest(H,BarsSinceEntry);
if EH < EntryPrice+PriceScale*10 Then ExitLong("bx1",AtStop,EH*0.50);
if EH >= EntryPrice+PriceScale*10 and EH < EntryPrice+PriceScale*30 Then ExitLong("bx2",AtStop,EH*0.60);
if EH >= EntryPrice+PriceScale*30 and EH < EntryPrice+PriceScale*40 Then ExitLong("bx3",AtStop,EH*0.70);
if EH >= EntryPrice+PriceScale*40 and EH < EntryPrice+PriceScale*50 Then ExitLong("bx4",AtStop,EH*0.80);
if EH >= EntryPrice+PriceScale*50 Then
ExitLong("bx5",AtStop,EH*0.90);
}
if MarketPosition == -1 then
{ EL = highest(H,BarsSinceEntry);
if EL > EntryPrice-PriceScale*10 Then ExitShort("sx1",AtStop,EL*1.50);
if EL <= EntryPrice-PriceScale*10 and EL > EntryPrice-PriceScale*30 Then ExitShort("sx2",AtStop,EL*1.40);
if EL <= EntryPrice-PriceScale*30 and EL > EntryPrice-PriceScale*40 Then ExitShort("sx3",AtStop,EL*1.30);
if EL <= EntryPrice-PriceScale*40 and EL > EntryPrice-PriceScale*50 Then ExitShort("sx4",AtStop,EL*1.20);
if EL <= EntryPrice-PriceScale*50 Then ExitShort("sx5",AtStop,EL*1.10);
}
################
고맙 습니다.
2019-07-01
241
글번호 129865
답변완료
오류수정 요청드립니다
<1>아래와 같이 시스템식 입력하면 에서 연산자 앞 뒤 두데이터의 형태가 같아야 합니다.라고 오류가 뜨네요.. 수정부탁드립니다.
input:shortP(12),longP(26),midP(9);
var:macdVal(0),macdSig(0),disp(0);
macdVal=MACD(shortP,longP);
macdSig=ema(macdVal,midP);
disp=ma(C,5)/ma(C,60)*100>102;//③
if CrossUP(macdVal,macdSig)and disp then
Buy();
if CrossDown(macdVal,macdSig)then
ExitLong();
<2>아래 시스템식에서는 오류가 2군데 나와서 수식 수정부탁드립니다.
input:P1(20),P2(12),P3(10),P4(6),P5(5),P6(3),BaseLine(50);
var:Sto1(0),Sto2(0),Sto3(0);
Sto1=StochasticsK(P1,P2);
Sto2=StochasticsK(P3,P4);
Sto3=StochasticsK(P5,P6);
if Sto1>BaseLine and Sto1[2]<Sto1[1] and Sto1[1]<Sto1 and
Sto2>BaseLine and Sto2[2]<Sto2[1 and Sto2[1]<Sto2 and
Sto3[2]>Sto3[1] and Sto3[1]<Sto3 then
Buy();
if Sto1<BaseLine and Sto1[2]>Sto1[1] and Sto1[1]>Sto1 and
Sto2<BaseLine and Sto2[2]>Sto2[1] and Sto2[1]>Sto2 and
Sto3[2]<Sto3[1] and Sto3[1]>Sto3 then
Sell();
2019-06-28
202
글번호 129864
답변완료
수식부탁드립니다.
부탁드린대로 잘만들어주셔서 감사드립니다..
제가 스스로 응용하여 만들어보려했으나 부족한능력으로 한계가있어 다시문의드리게되었습니다.
1) 3계약중 첫번째1계약 목표가가 S1 .R1이었다면 진입가에서 +- 35틱 익절로 부탁드립니다. (SetStopProfittarget(PriceScale*35,PointStop)으로하니 2회이상진입 되더라구요..
2)당일 손절발생시에만 S3 = Dayhigh-PriceScale*120; 에서 매수 ,
R3 = Daylow+PriceScale*120; 에서 매도 진입,
청산은 70틱익절
3) 3번째계약은 목표가를 매수시 R3 , 매도시 S3으로 부탁드리고
트레일링스탑은 2차청산(S2,R2지점)이되면
S2,R2에서 위아래로 15틱이상움직엿을시 2차청산지점(S2,R2)에서 청산
S3 = Dayhigh-PriceScale*120;
R3 = Daylow+PriceScale*120;
4) 기존전략이 35틱 움직였을시 본절청산이었는데요
1번째계약이 S1,R1에서 청산되었을시, 나머지2,3계약은 본절에서 모두청산되게 부탁드립니다.
언제나 감사드립니다 항상행복하세요..
---------------------------------------------------------
안녕하세요
예스스탁입니다.
식을 수정했습니다.
1
input : xtime(050000);
var : R2(0),R1(0),S1(0),S2(0),entry(0);
var : Tcond(false),BX1(false),BX2(false),SX1(false),SX2(false);
if bdate != bdate[1] then
{
Tcond = true;
entry = 0;
}
if (sdate != sdate[1] and stime >= xtime) or
(sdate == sdate[1] and stime >= xtime and stime[1] < xtime) then
{
Tcond = false;
if MarketPosition == 1 Then
ExitLong("BX");
if MarketPosition == -1 Then
ExitShort("SX");
}
R2 = DayLow+PriceScale*90;
R1 = DayLow+PriceScale*55;
S1 = DayHigh-PriceScale*55;
S2 = DayHigh-PriceScale*90;
if MarketPosition(0) != 0 and MarketPosition(0) != MarketPosition(0)[1] Then
entry = entry+1;
if Tcond == true then
{
if MarketPosition <= 0 and entry < 1 Then
{
if H < S1 Then
buy("b1",AtStop,S1,3);
if L > S1 then
buy("b2",AtLimit,S1,3);
}
if MarketPosition >= 0 and entry < 1 Then
{
if L > R1 Then
sell("R1",AtStop,R1,3);
if H < R1 Then
sell("R2",AtLimit,R1,3);
}
if MarketPosition == 1 then
{
if CurrentContracts > CurrentContracts[1] Then
{
BX1 = false;
BX2 = false;
}
if CurrentContracts < CurrentContracts[1] then
{
if (LatestExitName(0) == "bx11" or LatestExitName(0) == "bx12") Then
BX1 = true;
if (LatestExitName(0) == "bx21" or LatestExitName(0) == "bx22") Then
BX2 = true;
}
if BX1 == false Then
{
if H < R1 Then
ExitLong("bx11",AtLimit,R1,"",1,1);
if L > R1 Then
ExitLong("bx12",AtStop,R1,"",1,1);
}
if BX2 == false Then
{
if H < R2 Then
ExitLong("bx21",AtLimit,R2,"",1,1);
if L > R2 Then
ExitLong("bx22",AtStop,R2,"",1,1);
}
if highest(H,BarsSinceEntry) >= EntryPrice+PriceScale*35 Then
ExitLong("bx3",AtStop,EntryPrice);
}
if MarketPosition == -1 then
{
if CurrentContracts > CurrentContracts[1] Then
{
SX1 = false;
SX2 = false;
}
if CurrentContracts < CurrentContracts[1] then
{
if (LatestExitName(0) == "sx11" or LatestExitName(0) == "sx12") Then
SX1 = true;
if (LatestExitName(0) == "sx21" or LatestExitName(0) == "sx22") Then
SX2 = true;
}
if SX1 == False then
{
if L > S1 Then
ExitShort("sx11",AtLimit,S1,"",1,1);
if H < S1 Then
ExitShort("sx12",AtStop,S1,"",1,1);
}
if SX2 == false then
{
if L > S2 Then
ExitShort("sx21",AtLimit,S2,"",1,1);
if H < S2 Then
ExitShort("sx22",AtStop,S2,"",1,1);
}
if Lowest(L,BarsSinceEntry) <= EntryPrice-PriceScale*35 Then
ExitShort("sx3",AtStop,EntryPrice);
}
}
SetStopLoss(PriceScale*20,PointStop);
즐거운 하루되세요
2019-06-29
216
글번호 129863
답변완료
오류 수정 요청
아래 시스템식중 ①②③에서 연산자 앞뒤 두 데이터의 형태가 같아야 합니다.
라고 오류가 뜨는데 그 이유를 알고 싶습니다.
================================================================================
input:shortPeriod(5),midPeriod(10),longPeriod(20),Percent(1),수렴조건(2),청산조건(1);
var:단기이평(0),중기이평(0),장기이평(0),정배열(0),역배열(0),최대(0),최소(0),이평수렴(0);
단기이평=ma(C,shortPeriod);
중기이평=ma(C,midPeriod);
장기이평=ma(C,longPeriod);
정배열 =단기이평>중기이평 and 중기이평>장기이평;//①
역배열 =단기이평<중기이평 and 중기이평<장기이평;//②
최대=max(단기이평,중기이평,장기이평);
최소=min(단기이평,중기이평,장기이평);
이평수렴 =최대[1]/최소[1]<=(1+Percent/100);//③
if CrossUp(단기이평,중기이평) and 정배열 and
((수렴조건 == 1 and AccumN(이평수렴,5)>0) or
(수렴조건 == 2 and 이평수렴)or
(수렴조건 == 3 and AccumN(이평수렴,3)==3))
then
Buy();
if(청산조건==1and!정배열)or
(청산조건 == 2 and 역배열 )
then
ExitLong();
if CrossDown(단기이평, 중기이평) and 역배열 and
(( 수렴조건 == 1 and AccumN( 이평수렴 ,5) > 0) or
( 수렴조건 == 2 and 이평수렴 ) or
( 수렴조건 == 3 and AccumN( 이평수렴 ,3) == 3))
then
Sell();
if ( 청산조건 == 1 and ! 역배열 ) or
( 청산조건 == 2 and 정배열 ) then
ExitShort();
2019-06-28
221
글번호 129861
답변완료
63070 번 수식
20 이평이 상승에서 하락 전환시 20 캔들 최고치를 표시한다(A)
20 이평이 하락에서 상승 전환시 20 캔들 최저치를 표시한다(B)
20 이평이 하락에서 상승 전환후 다시 하락 전환할 때 20캔들 최고치를 표시한다(C)
20 이평이 상승에서 하락 전환후 다시 상승 전환할 때 20캔들 최저치를 표시한다(D)
C 가 A 보다 낮은 상태에서 B 바닥 붕괴시 A~B 상향 대칭을 표시한다
C 가 A 보다 낮은 상태에서 B 바닥 붕괴시 B~A 하향 대칭을 표시한다
D 가 B 보다 높은 상태일때 C 천정 돌파시 C~B 상향 대칭을 표시한다
D 가 B 보다 높은 상태일때 A 천정 돌파시 A~B 상향 대칭을 표시한다
2019-06-28
220
글번호 129859