항상 감사드립니다.
현재 캔들 기준 이전 n번째 캔들의 고가 돌파시 즉시 매수, 저가 돌파시 즉시 매도.
손절은 매수는 n번째 캔들의 저가를 돌파시,매도는 n번째 캔들의 고가를 돌파시.
그리고 현재캔들 기준인데, 거래시간 전의 캔들은 포함하지 않는 건지요?
제가 원하는 것은 거래시간 시작이후 첫 캔들이 n번째 이전 캔들의 고가 저가를 반영해서
로직대로 진행하는 것입니다.
수식을 작성했는데요.
안 맞는 부분이 있어서 수정 부탁드립니다.
감사합니다.
input : n1(n);
input : StartTime(235000),EndTime(060000);
input : 익절틱수(800),손절틱수(0),거래횟수(10);
var : Tcond(false), entry(0);
IF Endtime > starttime Then
SetStopEndofday(Endtime);
Else
{
if sDate != sDate[1] Then
SetStopEndofday(Endtime);
}
if (NextBarSdate != sdate and NextBarStime >= EndTime) or
(NextBarSdate == sdate and NextBarStime >= EndTime and stime < EndTime) Then
Tcond = False;
if (NextBarSdate != sdate and NextBarStime >= StartTime) or
(NextBarSdate == sdate and NextBarStime >= StartTime and stime < StartTime) Then
{
Tcond = true;
entry = 0;
IF Endtime <= starttime Then
{
SetStopEndofday(0);
}
}
if (MarketPosition != 0 and MarketPosition != MarketPosition[1]) or
(MarketPosition == MarketPosition[1] and TotalTrades > TotalTrades[1]) Then
entry = entry+1;
if Tcond == true Then
{
if MarketPosition <= 0 and NextBarOpen <= H[n1] and entry < 거래횟수 Then
Buy("b1",AtStop,H[n1]+PriceScale*1);
if MarketPosition >= 0 and NextBarOpen >= L[N1] and entry < 거래횟수 Then
Sell("s1",AtStop,L[N1]-PriceScale*1);
if MarketPosition == 1 Then
ExitLong("bx",AtStop,L[N1]-PriceScale*1);
if MarketPosition == -1 Then
ExitShort("sx",AtStop,H[n1]+PriceScale*1);
}
SetStopProfittarget(PriceScale*익절틱수,PointStop);
SetStopLoss(PriceScale*손절틱수,PointStop);
답변 1
예스스탁
예스스탁 답변
2021-11-23 15:55:32
안녕하세요
예스스탁입니다.
거래시간과 n1번째 값은 관계가 없습니다.
n1번째 값이 거래시간 이전의 봉이라도 관계가 없습니다.
n1번째 고가나 저가를 돌파시에 매수나 매도하는 식이 맞습니다.
다만 수식에서 미완성시에 즉시 신호에 대해 오해하시는 부분이 있는 것 같습니다.
아래 내용참고하셔서 수정해 보셔야 할것 같습니다.
직접적으로 수정해 드릴만한 부분이 없습니다.
1
예스랭귀지에서 즉시신호가 발생가능하게 하기위해서는
주문함수에 atstop이나 atlimit 신호타입을 사용합니다.
수식에 atstop만 사용되었으모 해당 신호타입만 설명을 드리면
atstop은
매수주문 함수(buy,exitshort)에 사용되면 봉완성시에 지정한 값을 셋팅하고 다음봉에서 셋팅된 값 이상의 시세가 발생하면 즉시 신호
매도주문 함수(sell,exitlong)에 사용되면 봉완성시에 지정한 값을 셋팅하고 다음봉에서 셋팅된 값 이하의 시세가 발생하면 즉시 신호
가 발생하게 됩니다.
해당 수식에서
봉완성시에 n1봉전 고가를 셋팅하고 다음봉에서 해당값 이상의 시세가 발생하면 매수진입
봉완성시에 n1봉전 저가를 셋팅하고 다음봉에서 해당값 이상의 시세가 발생하면 매도진입
을 하게 됩니다.
그러므로 신호가 표시되는 봉을 기준으로는 n1봉전이 아닌 n1+1봉전 고가나 저가와 비교해 신호가 발생하게 됩니다
신호가 표시되는 봉을 기준으로 n1봉전이면 기존에 지정한 값에서 1봉 작게 지정하시면 됩니다.
2
진입식에 보시면
매수식에 NextBarOpen <= H[n1] 조건때문에
시가가 n1번째 봉의 고가이하에서 시작후 n1번째 고가위로 올라가야 매수신호가 발생하고
매도식에 NextBarOpen >= L[n1] 조건떄문에
시가가 n1번째 봉의 저가이하에서 시작후 n1번째 저가아래로 내려가야 매도신호가 발생합니다.
해당 조건을 없애시면 시가위 위치와 관계없이
n1봉전 고가 이상의 시세만 발생하면 매수, n1봉전 저가 이하의 시세만 발생하면 매도가 되게 됩니다.
현재는 위 조건때문에 신호가 발생하지 않는 봉이 있을수 있습니다.
위 조건은 진입조건에 돌파라는 내용이 있어 추가된 내용입니다.
즐거운 하루되세요
> jesten77 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 항상 감사드립니다.
현재 캔들 기준 이전 n번째 캔들의 고가 돌파시 즉시 매수, 저가 돌파시 즉시 매도.
손절은 매수는 n번째 캔들의 저가를 돌파시,매도는 n번째 캔들의 고가를 돌파시.
그리고 현재캔들 기준인데, 거래시간 전의 캔들은 포함하지 않는 건지요?
제가 원하는 것은 거래시간 시작이후 첫 캔들이 n번째 이전 캔들의 고가 저가를 반영해서
로직대로 진행하는 것입니다.
수식을 작성했는데요.
안 맞는 부분이 있어서 수정 부탁드립니다.
감사합니다.
input : n1(n);
input : StartTime(235000),EndTime(060000);
input : 익절틱수(800),손절틱수(0),거래횟수(10);
var : Tcond(false), entry(0);
IF Endtime > starttime Then
SetStopEndofday(Endtime);
Else
{
if sDate != sDate[1] Then
SetStopEndofday(Endtime);
}
if (NextBarSdate != sdate and NextBarStime >= EndTime) or
(NextBarSdate == sdate and NextBarStime >= EndTime and stime < EndTime) Then
Tcond = False;
if (NextBarSdate != sdate and NextBarStime >= StartTime) or
(NextBarSdate == sdate and NextBarStime >= StartTime and stime < StartTime) Then
{
Tcond = true;
entry = 0;
IF Endtime <= starttime Then
{
SetStopEndofday(0);
}
}
if (MarketPosition != 0 and MarketPosition != MarketPosition[1]) or
(MarketPosition == MarketPosition[1] and TotalTrades > TotalTrades[1]) Then
entry = entry+1;
if Tcond == true Then
{
if MarketPosition <= 0 and NextBarOpen <= H[n1] and entry < 거래횟수 Then
Buy("b1",AtStop,H[n1]+PriceScale*1);
if MarketPosition >= 0 and NextBarOpen >= L[N1] and entry < 거래횟수 Then
Sell("s1",AtStop,L[N1]-PriceScale*1);
if MarketPosition == 1 Then
ExitLong("bx",AtStop,L[N1]-PriceScale*1);
if MarketPosition == -1 Then
ExitShort("sx",AtStop,H[n1]+PriceScale*1);
}
SetStopProfittarget(PriceScale*익절틱수,PointStop);
SetStopLoss(PriceScale*손절틱수,PointStop);