예스스탁
예스스탁 답변
2022-04-19 11:08:55
안녕하세요
예스스탁입니다.
1
정확히는 기억이 나지 않지만 해당 서적에 몇몇 수식은 자체적으로 오류가 있습니다.
올리신 수식에서 if method == 0 then은 삭제가 되거나
혹은 if method >= 0 then이 되어야 하고
Elseif method = 1 or method = 2 or method = 3 then에서는
elseif가 if가 되어야 합니다.
2
해당 수식들이 적용해 보았지만 매도진입이 정상적으로 발생합니다.
3
다른 랭귀지의 수식을 변환할떄 시간지정 부분을 유의하셔야 합니다.
프로그램 별로 차트봉의 대표시간을 끝시간으로 사용하는 경우가 있고
시작시간을 대표시간으로 사용하는 경우가 있습니다.
대신은 대표시간이 끝시간 기준입니다.
끝시간 기준은 해당봉이 완성하는 시간으로 봉의 시간을 지정합니다.
예를 들어 1분봉으로 첫봉을 예로 들면
9:00:00~9:00:59의 데이타를 모아 봉을 만드는데
해당봉의 시간은 봉이 완성되는 9:01:00으로 불리게 됩니다.
저희 차트는 대표시간 시작시간 기준으로
동일하게 9:00:00~9:00:59의 데이타를 모아 첫봉을 만드는데
해당봉을 9:00:00입니다. 예스랭귀지에서 time을 사용하면
봉의 마지막데이타 시간으로 9:00:59와 같이 해당 시간안에
마지막 시세의 시간에 따라 달라지게 됩니다.
그러므로 예스랭귀지에서 시간을 지정하실 경우에는 stime을 사용하셔야 합니다.
3
Setbarback은 별도로 제공되지 않습니다.
예스랭귀지에는 이미 NextBarSdate,NextBarStime,NextBarOpen이 제공되고 있습니다.
하나의 봉이 완성은 다음봉시가가 수신될때 입니다.
즉 완성된 봉의 시고저종은 O,H,L,C으로 리턴되고
다음봉의 시가의 날짜, 시간, 가격은 NextBarSdate,NextBarStime,NextBarOpen으로
리턴되므로 수식에서 사용할 수 있습니다.
즉 봉완성이 다음봉시가가 수신될때이므로 해당 시가까지는 수식에서 사용할수 있도록
함수로 제공이 되고 있습니다.
4
Input: len(0.37), atrlen(20), len1(3.2), entrystart(092000), entrylimit(143000), dayin(3), method(0) ;
Var1=dayhigh(1)-daylow(1) ; // 전일 range
Condition1= exitname(1) == "매수추적스탑" And date == exitdate(1) And date == Entrydate(1) And exitprice(1)>dayopen+Var1*len ;
Condition2= exitname(1) == "매도추적스탑" And date == exitdate(1) And date == Entrydate(1) And exitprice(1)<dayopen-Var1*len ;
Condition3= exitname(1) == "매수추적스탑" And date == exitdate(1) And date <> Entrydate(1) And exitprice(1)>dayopen+Var1*len ;
Condition4= exitname(1) == "매도추적스탑" And date == exitdate(1) And date <> Entrydate(1) And exitprice(1)<dayopen-Var1*len ;
If Entrystart < stime And stime < Entrylimit Then
{
If Condition1 == False And Condition3==False Then buy("매수",Atstop,dayopen+Var1*len) ;
If Condition2 == False And Condition4==False Then sell("매도",Atstop,dayopen-Var1*len) ;
}
If MarketPosition<>0 Then
{
exitlong("매수추적스탑",Atstop,NthHighest(1,high,BarsSinceEntry+1)-atr(atrlen)*len1) ;
exitshort("매도추적스탑",Atstop,NthLowest(1,low,BarsSinceEntry+1)+atr(atrlen)*len1) ;
}
//'손실발생당일청산-----------------------------------------------------
//Else if method == 1 Or method == 2 Or method == 3 then {
if method == 1 Or method == 2 Or method == 3 then
{
If stime == 145000 And MarketPosition<>0 Then //'2시50분에포지션이 있다면
{
If MarketPosition==1 And Entryprice > close Then //'진입가격보다종가가낮다면
exitlong("당일청산lloss",Atmarket) ;
If MarketPosition == -1 And Entryprice<close Then
exitshort("당일청산sloss",Atmarket) ;
}
}
//'방향성청산----------------------------------------------------------
Else if method == 2 Or method == 3 then
{
If stime==145000 And MarketPosition<>0 Then
{
If MarketPosition == 1 And (dayopen-Var1*len>daylow Or Entryprice>close) Then
exitlong("당일청산ldirection",Atmarket) ;
If MarketPosition == -1 And (dayopen+var1*len<dayhigh Or Entryprice<close) Then
exitshort("당일청산sdirection",Atmarket) ;
}
}
//'ProfitableOpenStop---------------------------------------------------
Else if method == 3 then
{
If MarketPosition==0 Then //'날짜변경을 카운트하기 위한 식
Var50=0 ; //'초기화
If date<>date[1] And MarketPosition<>0 Then //'포지션이 있으면서 날짜가 변경되면
Var50=Var50 +1 ; //'카운트를 1씩증가시킨다.
If Var50==dayin And date<>date[1] And MarketPosition<>0 Then //'카운트가 지정한숫자가 되면
{
If Entryprice < dayopen Then //'진입가격보다 시가가 크면
exitlong("시가청산l",Atmarket) ; //'청산
If Entryprice > dayopen Then
exitshort("시가청산s",Atmarket) ;
}
}
5
Input: len(0.4), atrlen(3), profitlen(2), stoplen(4), len1(21), method(0);
Var1=high-low;
If NextBarOpen<=open then
buy("매수",Atstop,NextBarOpen+var1*len);
If NextBarOpen>open then
sell("매도",Atstop,NextBarOpen-var1*len);
If method == 1 then
{
If Marketposition <> Marketposition(1) Then
{
Var10 = 0;
Var11 = 0;
}
If Marketposition == 1 And NextBarOpen >= Entryprice+atr(atrlen)Then
Var10=var10+1;
Else If Marketposition == -1 And NextBarOpen <= Entryprice-atr(atrlen)Then
Var10=var10+1;
If Marketposition == 1 And NextBarOpen <= Entryprice Then
Var11=var11+1;
else If Marketposition==-1 And NextBarOpen >= Entryprice Then
Var11=var11+1;
If MarketPosition == 1 Then
{
If Var10 == profitlen Then
exitlong("시가청산L",Atmarket);
If Var11 == stoplen Then
exitlong("손실청산L",Atmarket);
exitlong("추적스탑L",Atstop,Highest(high,BarsSinceEntry+1)-atr(atrlen)*len1);
}
Else if MarketPosition == -1 Then
{
If Var10 == profitlen Then
exitshort("시가청산S",Atmarket);
If Var11 == stoplen Then
exitshort("손실청산S",Atmarket);
exitshort("추적스탑S",Atstop,Lowest(low,BarsSinceEntry+1)+atr(atrlen)*len1);
}
}
즐거운 하루되세요
> 목포댁 님이 쓴 글입니다.
> 제목 : CT를 YT로 변환 오류 검토 부탁드립니다.
> 항상 감사 드립니다.
아래 수식 두 개 검토 부탁드립니다.
/*
#======================================================#
# YT <수식 3-21> 분차트를 이용한 단기매매전략
# SS_RangeBreak(v 0.2)
# 10분봉, 2000/01/04 ~ 2003/09/30
#======================================================#
의문점
방향성 청산에 Var1 이 사용되었는데, Var1은 아래 식으로 한정이 되어 있다. 값을 가져 올 수 없다.
If method == 0 then Var1=dayhigh(1)-daylow(1) ; // 전일 range
미작동
매수 진입/청산만 작동하고 , 매도 진입/청산은 작동하지 않는다.
청산식이 매수추적스탑만 나온다 . 매도진입이 없으니 매도추적스탑은 당근 없고
시가청산, 당일청산loss 가 작동하지 않는다.
그러면,
원 수식의 블록{ } 지정 오류인 것인가
컨버젼의 블록{ } 지정 오류인 것인가
#======================================================#
# YT <수식 3-22> 일간차트를 이용한 단기매매 전략
# 이름: S_Rangebreak(v 0.2)
# 체크 대상 : Setbarback, open[-1], I_MarketPosition, i_Entryprice
#======================================================#
/*
# 체크 대상 : Setbarback, open[-1], I_MarketPosition, i_Entryprice
SetBarBack : [설명] 실시간에서 현재 봉 시가를 이용해 현재 봉에 주문실행이 가능하도록 설정
예문 : 미래값 참조(open(-1))
실시간 실전매매에서 일봉상의 금일저가보다 내일시가가 100원 떨어져서 시작하면 매수하라는 예
Setbarback
If low >= open(-1) + 100 Then
Call buy("매수", Atmarket)
End If
CT 에서는 Setbarback 함수가 있는데, YT에서는 없는 것 같다. 대체를 할 수 있는 함수나 문법스킬은 무엇인가,
1일봉전 참조하면 되지 않는가? (DATA2)
open[-1] : YT에서 미래봉 참조가 가능한가?
I_MarketPosition CT는 전체 수식 영역에서 사용가능하나, YT는 전략식에서는 사용불가 , 대체방법은?
전략식에서 MarketPosition 으로 충분하지 않은가, I_MarketPosition을 사용하는 이유는?
i_Entryprice
*/
/*
#======================================================#
# CT <수식 3-21> 분차트를 이용한 단기매매전략
# SS_RangeBreak(v 0.2)
# 10분봉, 2000/01/04 ~ 2003/09/30
#======================================================#
<수식 3-21> 분차트를 이용한 단기매매전략
영역: 전략
이름: SS_RangeBreak(v 0.2)
Input: len(0.37), atrlen(20), len1(3.2), entrystart(920), entrylimit(1430), dayin(3), method(0)
‘기본식-------------------------------------------------------------
Ifmethod=0 then
Var1=highd(1)-lowd(1)
Cond1=exitname(1)="매수추적스탑"Andtdate=exitdate(1)Andtdate=Entrydate(1)_ Andexitprice(1)>opend+Var1*len
Cond2=exitname(1)="매도추적스탑"Andtdate=exitdate(1)Andtdate=Entrydate(1)_ Andexitprice(1)<opend-Var1*len
Cond3=exitname(1)="매수추적스탑"Andtdate=exitdate(1)Andtdate<>Entrydate(1)_ Andexitprice(1)>opend+Var1*len
Cond4=exitname(1)="매도추적스탑"Andtdate=exitdate(1)Andtdate<>Entrydate(1)_ Andexitprice(1)<opend-Var1*len
If ttime>Entrystart And ttime<Entrylimit Then
IfCond1=False And Cond3=False Then
Callbuy("매수",Atstop,Def,opend+Var1*len) EndIf
IfCond2=False And Cond4=False Then
Callsell("매도",Atstop,Def,opend-Var1*len) EndIf
EndIf
If position<>0 Then
Callexitlong("매수추적스탑",Atstop,hhv(1,high,barnumsinceEntry+1)-atr(atrlen)*len1)
Callexitshort("매도추적스탑",Atstop,llv(1,low,barnumsinceEntry+1)+atr(atrlen)*len1)
EndIf
‘손실발생당일청산-----------------------------------------------------
Elseif method=1 or method=2 or method=3 then
If ttime =1450 And position<>0 Then ‘2시50분에포지션이 있다면
If position=1 And Entryprice > close Then ‘진입가격보다종가가낮다면
Callexitlong("당일청산",Atmarket) EndIf
Ifposition=-1 And Entryprice<close Then
Callexitshort("당일청산",Atmarket) EndIf
EndIf
‘방향성청산----------------------------------------------------------
Elseif method=2 or method=3 then
If ttime=1450 And position<>0 Then
Ifposition=1 And (opend-Var1*len>lowdOrEntryprice>close) Then
Callexitlong("당일청산",Atmarket)
EndIf
Ifposition=-1 and (opend+var1*len<highdorEntryprice<close)Then
Callexitshort("당일청산",Atmarket)
EndIf
EndIf
‘ProfitableOpenStop---------------------------------------------------
Elseif method=3 then
If position=0 Then ‘날짜변경을카운트하기위한식
Var50=0 ‘초기화
EndIf
If tdate<>tdate(1) And position<>0 Then ‘포지션이있으면서날짜가변경되면
Var50=Var50 +1 ‘카운트를 1씩증가시킨다.
EndIf
If Var50=dayin And tdate<>tdate(1) And position<>0 Then ‘카운트가 지정한숫자가 되면
If Entryprice < opend Then ‘진입가격보다시가가크면
Callexitlong("시가청산",Atmarket) ‘청산
EndIf
If Entryprice>opend Then
Callexitshort("시가청산",Atmarket)
EndIf
EndIf
EndIf
*/
#======================================================#
# YT <수식 3-21> 분차트를 이용한 단기매매전략
# SS_RangeBreak(v 0.2)
# 10분봉, 2000/01/04 ~ 2003/09/30
#======================================================#
Input: len(0.37), atrlen(20), len1(3.2), entrystart(092000), entrylimit(143000), dayin(3), method(0) ;
//'기본식-------------------------------------------------------------
//If method == 0 then
Var1=dayhigh(1)-daylow(1) ; // 전일 range
Condition1= exitname(1) == "매수추적스탑" And date == exitdate(1) And date == Entrydate(1) And exitprice(1)>dayopen+Var1*len ;
Condition2= exitname(1) == "매도추적스탑" And date == exitdate(1) And date == Entrydate(1) And exitprice(1)<dayopen-Var1*len ;
Condition3= exitname(1) == "매수추적스탑" And date == exitdate(1) And date <> Entrydate(1) And exitprice(1)>dayopen+Var1*len ;
Condition4= exitname(1) == "매도추적스탑" And date == exitdate(1) And date <> Entrydate(1) And exitprice(1)<dayopen-Var1*len ;
If Entrystart < time And time < Entrylimit Then {
If Condition1 == False And Condition3==False Then buy("매수",Atstop,dayopen+Var1*len) ;
If Condition2 == False And Condition4==False Then sell("매도",Atstop,dayopen-Var1*len) ;
}
If MarketPosition<>0 Then {
exitlong("매수추적스탑",Atstop,NthHighest(1,high,BarsSinceEntry+1)-atr(atrlen)*len1) ;
exitshort("매도추적스탑",Atstop,NthLowest(1,low,BarsSinceEntry+1)+atr(atrlen)*len1) ;
}
//'손실발생당일청산-----------------------------------------------------
//Else if method == 1 Or method == 2 Or method == 3 then {
if method == 1 Or method == 2 Or method == 3 then {
If time ==145000 And MarketPosition<>0 Then { //'2시50분에포지션이 있다면
If MarketPosition==1 And Entryprice > close Then //'진입가격보다종가가낮다면
exitlong("당일청산lloss",Atmarket) ;
If MarketPosition == -1 And Entryprice<close Then
exitshort("당일청산sloss",Atmarket) ;
}
}
//'방향성청산----------------------------------------------------------
Else if method == 2 Or method == 3 then {
If time==145000 And MarketPosition<>0 Then {
If MarketPosition == 1 And (dayopen-Var1*len>daylow Or Entryprice>close) Then exitlong("당일청산ldirection",Atmarket) ;
If MarketPosition == -1 And (dayopen+var1*len<dayhigh Or Entryprice<close) Then exitshort("당일청산sdirection",Atmarket) ;
}
}
//'ProfitableOpenStop---------------------------------------------------
Else if method == 3 then {
If MarketPosition==0 Then //'날짜변경을 카운트하기 위한 식
Var50=0 ; //'초기화
If date<>date[1] And MarketPosition<>0 Then //'포지션이 있으면서 날짜가 변경되면
Var50=Var50 +1 ; //'카운트를 1씩증가시킨다.
If Var50==dayin And date<>date[1] And MarketPosition<>0 Then { //'카운트가 지정한숫자가 되면
If Entryprice < dayopen Then //'진입가격보다 시가가 크면
exitlong("시가청산l",Atmarket) ; //'청산
If Entryprice > dayopen Then
exitshort("시가청산s",Atmarket) ;
}
}
/*
#======================================================##======================================================#
#======================================================#
# CT <수식 3-22> 일간차트를 이용한 단기매매 전략
# 이름: S_Rangebreak(v 0.2)
# 일봉, 2000/01/04 ~ 2003/09/30
#======================================================#
Input: len(0.4), atrlen(3), profitlen(2), stoplen(4), len1(21), method(0)
‘진입전략------------------------------------------------------------
Var1=high-low ‘시가고가의 거리= range
Setbarback ‘ 주문발생시점 한봉전으로
If open(-1)<=open then ‘내일시가가오늘 시가보다적거나같으면
Callbuy("매수",Atstop,Def,open(-1)+var1*len)
Endif
If open(-1)>open then ‘내일 시가가오늘시가보다크면
Callsell("매도",Atstop,Def,open(-1)-var1*len)
Endif
Ifmethod=1then
‘시가청산조건식-------------------------------------------------------
Ifi_position<>i_position(1)Then
Var10=0‘초기화
Var11=0‘초기화
EndIf
Ifi_position=1Andopen(-1)>=i_Entryprice+atr(atrlen)Then ‘현재매수상태이며진입이후 시가가진입가보다일정수준 이상이면
Var10=var10+1 ‘var10을1씩증가
ElseIfi_position=-1Andopen(-1)<=i_Entryprice-atr(atrlen)Then ‘현재매도상태이며진입이후 시가가진입가 보다일정수준 이하이면
Var10=var10+1 ‘var10을1씩증가
EndIf
Ifi_position=1Andopen(-1)<=i_Entryprice Then
‘현재매수상태이며진입이후 시가가진입가 보다일정수준 이하이면
Var11=var11+1 ‘var11을1씩증가
elseIfi_position=-1Andopen(-1)>=i_EntrypriceThen
‘현재매도상태이며진입이후 시가가진입가 보다일정수준 이상이면
Var11=var11+1 ‘var11을1씩증가
EndIf
‘수익발생시가청산-----------------------------------------------------
Ifposition=1Then
IfVar10=profitlenThen
Callexitlong("시가청산",Atmarket)
EndIf
Elseifposition=-1Then
IfVar10=profitlenThen
Callexitshort("시가청산",Atmarket)
EndIf
EndIf
‘손실발생시가청산-----------------------------------------------------
Ifposition=1Then
IfVar11=stoplenThen
Callexitlong("손실청산",Atmarket)
EndIf
Elseifposition=-1Then
IfVar11=stoplenThen
Callexitshort("손실청산",Atmarket)
EndIf
EndIf
‘ATR추적스탑--------------------------------------------------------
Ifposition=1Then
Callexitlong("추적스탑",Atstop,hhv(1,high,i_barnumsinceEntry+1)-atr(atrlen)*len1)
Elseifposition=-1Then
Callexitshort("추적스탑",Atstop,llv(1,low,i_barnumsinceEntry+1)+atr(atrlen)*len1)
EndIf
EndIf
*/
#======================================================#
# YT <수식 3-22> 일간차트를 이용한 단기매매 전략
# 이름: S_Rangebreak(v 0.2)
# 일봉, 2000/01/04 ~ 2003/09/30
# 체크 대상 : Setbarback, open[-1], I_MarketPosition, i_Entryprice
#======================================================#
Input: len(0.4), atrlen(3), profitlen(2), stoplen(4), len1(21), method(0) ;
//‘진입전략------------------------------------------------------------
Var1=high-low ; //‘시가고가의 거리= range
#Setbarback ; //‘ 주문발생시점 한 봉전으로
#Setbarback ; // YT에서 대체할 수 있는 방법은? 왜 쓰는가? 참조나 index로 제어가 안되는가?
### open[-1] YT에서 내일시가란 개념이 없는것 같은데
If open[-1] <= open then //‘내일시가가 오늘시가보다 적거나 같으면
buy("매수", Atstop, open[-1]+var1*len) ;
If open[-1] > open then //‘내일시가가 오늘시가보다 크면
sell("매도",Atstop, open[-1]-var1*len) ;
If method == 1 Then
{
//‘시가청산조건식-------------------------------------------------------
// If I_MarketPosition <> I_MarketPosition(1) Then {
If MarketPosition <> MarketPosition(1) Then {
Var10=0 ; //‘초기화
Var11=0 ; //‘초기화
}
/*
If I_MarketPosition == 1 And open[-1] >= i_Entryprice+atr(atrlen) Then //‘현재매수상태이며진입이후 시가가진입가보다일정수준 이상이면
Var10=var10+1 ; //‘var10을1씩증가
Else If I_MarketPosition ==-1 And open[-1] <= i_Entryprice-atr(atrlen) Then //‘현재매도상태이며진입이후 시가가진입가 보다일정수준 이하이면
Var10=var10+1 ; //‘var10을1씩증가
If I_MarketPosition == 1 And open[-1] <= i_Entryprice Then //‘현재매수상태이며진입이후 시가가진입가 보다일정수준 이하이면
Var11=var11+1 ; //‘var11을1씩증가
Else If I_MarketPosition ==-1 And open[-1] >= i_Entryprice Then //‘현재매도상태이며진입이후 시가가진입가 보다일정수준 이상이면
Var11=var11+1 ; //‘var11을1씩증가
*/
If MarketPosition == 1 And open[-1] >= Entryprice+atr(atrlen) Then //‘현재매수상태이며진입이후 시가가진입가보다일정수준 이상이면
Var10=var10+1 ; //‘var10을1씩증가
Else If MarketPosition ==-1 And open[-1] <= Entryprice-atr(atrlen) Then //‘현재매도상태이며진입이후 시가가진입가 보다일정수준 이하이면
Var10=var10+1 ; //‘var10을1씩증가
If MarketPosition == 1 And open[-1] <= Entryprice Then //‘현재매수상태이며진입이후 시가가진입가 보다일정수준 이하이면
Var11=var11+1 ; //‘var11을1씩증가
Else If MarketPosition ==-1 And open[-1] >= Entryprice Then //‘현재매도상태이며진입이후 시가가진입가 보다일정수준 이상이면
Var11=var11+1 ; //‘var11을1씩증가
//‘수익발생시가청산-----------------------------------------------------
If MarketPosition == 1 Then
If Var10 == profitlen Then exitlong("시가청산L",Atmarket) ;
Else If MarketPosition == -1 Then
If Var10 == profitlen Then exitshort("시가청산S",Atmarket) ;
//‘손실발생시가청산-----------------------------------------------------
If MarketPosition == 1 Then
If Var11 == stoplen Then exitlong("손실청산L",Atmarket) ;
Else If MarketPosition == -1 Then
If Var11 == stoplen Then exitshort("손실청산S",Atmarket) ;
//‘ATR추적스탑--------------------------------------------------------
If MarketPosition == 1 Then
exitlong("추적스탑L",Atstop,NthHighest(1,high,BarsSinceEntry+1)-atr(atrlen)*len1) ;
Else If MarketPosition == -1 Then
exitshort("추적스탑S",Atstop,NthLowest(1,low,BarsSinceEntry+1)+atr(atrlen)*len1) ;
}