예스스탁
예스스탁 답변
2016-03-18 16:25:59
안녕하세요
예스스탁입니다.
매도함수(sell,exitlong)에서 atlimit은
지정한 가격까지 상승하면 신호가 발생합니다.
작성하신식은
시가가 지정한 가격보다 크면 시가에 매수
시가가 지정한 가격보다 작으면 시가에 매수입니다.
if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치1차 Then
exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1);
Else
exitlong("1차매도2",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
시가가 지정한 가격보다 크면 지정한 가격이상의 시세가 발생하면 매수청산하는데
이미 시가가 지정한 가격보다 크므로 시가에 바로 매도됩니다.
부등호가 반대가 되어야 합니다.
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차 Then
2차매도1과 2도 마찬가지로 if문의 부등호가 반대가 되어야 합니다.
위 내용과 추가하신 내용 포함한 식입니다.
## 일봉상 일목균형표의 120일 기준선을 참조하여 3분봉에서 매매함.
## 2분할매수, 2분할매도 시스템식
## 외부변수 설정 ##
input : 전략시작일자(20160105), 전략시작시간(090000), 전략매수금액(1000);
input : 매수위치1차(2), 매수위치2차(3);
input : 매도위치1차(1.5), 매도위치2차(2);
input : 매수비중1차(50), 매수비중2차(50);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략진입횟수(1);
input : 최종손절위치(10),최종익절위치(1);
input : Period(26);
## 내부변수 설정 ##
var : CL(0),V0.5(0),V1(0),V2(0),V3(0);
var : mid(0),V4(0),V5(0),V6(0),V7(0),V8(0),V9(0);
var : diff(0),TF(0),cnt(0),value(0);
var : entrycond1(false),entrycond2(false),entrycond3(false);
# Period 전기간 최고가의 값이 있으면
if dayhigh(Period) > 0 Then {
var1 = dayhigh(0); # 당일최고가 (Period 기간동안 최고가를 계산하기 위한 초기값)
var2 = daylow(0); # 당일최저가 (Period 기간동안 최고가를 계산하기 위한 초기값)
var11 = dayhigh(1); # 전일최고가 (전일기준 Period 기간동안 최고가를 계산하기 위한 초기값)
var12 = daylow(1); # 전일최저가 (전일기준 Period 기간동안 최고가를 계산하기 위한 초기값)
# 0일부터 Period전일까지 최고가와 최저가를 불러와
# Period 기간동안 최고가/최저가를 계산
# 전일기준은 0을 제외하고 Period 기간이므로 +1
for cnt = 0 to Period-1 {
if DayHigh(cnt) > var1 Then
var1 = DayHigh(cnt);
if dayhigh(cnt+1) > var11 Then
var11 = dayhigh(cnt+1);
if daylow(cnt) < var2 Then
var2 = daylow(cnt);
if daylow(cnt+1) < var21 Then
var21 = daylow(cnt+1);
}
# Period기간동안 최고가가 전일보다 상승하면
# CL에 당일 중간값 저장
if var11 < var1 Then
CL = (var1+var2)/2;
V0.5 = var1-((var1-CL)/5)*1;
V1 = var1-((var1-CL)/5)*2; ## "빨"타점-1타점
V2 = var1-((var1-CL)/5)*3; ## "주"타점-2타점
V3 = var1-((var1-CL)/5)*4; ## "노"타점-3타점
mid = (var1+var2)/2; ## 중간선
V4 = var1-((var1-CL)/5)*5; ## "초"타점-4타점
V5 = var1-((var1-CL)/5)*6; ## "파"타점-5타점
V6 = var1-((var1-CL)/5)*7; ## "남"타점-6타점
V7 = var1-((var1-CL)/5)*8; ## "보"타점-7타점
V8 = var1-((var1-CL)/5)*9; ## "점"타점-8타점
V9 = var1-((var1-CL)/5)*9; ## "검"타점-9타점
value = abs(var1-V0.5);
#######################################################
if sdate >= 전략시작일자 and # 지정일 이후
TotalTrades < 전략진입횟수 and # 최대 진입횟수 이전
MarketPosition == 0 and # 현재 무포지션
stime >= 전략시작시간 and # 지정시간 이후
EntryCond1 == false and # EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨)
DayHigh(0) < var1 Then { # 당일고가가 period신고가를 돌파하지 않을 경우만 매수하기 위한 조건
# (1차매수1),(1차매수2)은 가격이 하락해서 1차매수가격을 터치한 것인지
# 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지
# 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다.
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수1)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수2)
if stime <= 145500 Then {
if NextBarOpen > var1-value*(매수위치1차+1) Then
buy("1차매수1",atlimit,var1-value*(매수위치1차+1),Floor((전략매수금액*10000*(매수비중1차/100))/C));
Else
buy("1차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중1차/100))/C));
}
if stime == 150000 Then {
if L <= var1[1]-value[1]*(매수위치1차+1) Then
buy("1차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중1차/100))/C));
}
}
# 매수진입이후
if MarketPosition == 1 then {
# 추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화
if CurrentContracts > CurrentContracts[1] Then
Condition1 = false;
# 매수시점의 var1와 V0.5의 차이값을 diff에 저장
diff = abs(var1[BarsSinceEntry]-V0.5[BarsSinceEntry]);
if MaxEntries == 1 and # 최대진입횟수가1이고(첫진입 한번만 발생한 상황)
L >= var1-value*(매수위치2차+1) and # 저가가 2차매수가격 이상이고
EntryCond2 == false Then { # EntryCond2은 false일때(2차매수가 발생하면 true로 변경되어 한번만 진입하게 됨)
# 다음봉에서 2차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수)
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(2차매수1)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(2차매수2)
if stime <= 145500 or stime == 150000 Then {
if NextBarOpen > var1-value*(매수위치2차+1) Then
buy("2차매수1",atlimit,var1-value*(매수위치2차+1),Floor((전략매수금액*10000*(매수비중2차/100))/C));
Else
buy("2차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C));
}
if stime == 150000 and L <= var1[1]-value[1]*(매수위치2차+1) Then
buy("2차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C));
}
# Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수
# 포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true
if CurrentContracts < CurrentContracts[1] and
(LatestExitName(0) == "1차매도1" or LatestExitName(0) == "1차매도2" or LatestExitName(0) == "1차매도3") Then
Condition1 = true;
# 포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true
if CurrentContracts < CurrentContracts[1] and
(LatestExitName(0) == "2차매도1" or LatestExitName(0) == "2차매도2" or LatestExitName(0) == "2차매도3") Then
Condition2 = true;
# Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태)
# 당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큼 청산
if Condition1 == false then {
if stime <= 145500 Then {
if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치1차 Then
exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1);
Else
exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치1차 Then
exitlong("1차매도3",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
if Condition1 == true and CurrentContracts < MaxContracts then {
if stime <= 145500 Then
exitlong("최종익절1",AtStop,LatestExitPrice(0)-diff*최종익절위치);
if stime == 150000 and L <= LatestExitPrice(0)-diff*최종익절위치 Then
exitlong("최종익절2",AtMarket);
}
# Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태)
# 당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큼 청산
if Condition2 == false then {
if stime <= 145500 Then {
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치2차 Then
exitlong("2차매도1",AtLimit,lowest(L,BarsSinceEntry)+diff*매도위치2차);
Else
exitlong("2차매도2",AtMarket);
}
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치2차 Then
exitlong("2차매도3",AtMarket);
}
# 당일최고가에서 value*(최종손절위치+1)만큰 하락하면 전량청산
# 3분봉에서 정규장마지막봉 전봉까지만 만족했을때 신호발생
if stime < 145700 Then
exitlong("최종손절1",AtStop,var1-value*(최종손절위치+1));
# 정규장 마지막봉에서 조건만족하면 다음봉(다음날)시가에 청산
if stime == 150000 and L <= var1[1]-value[1]*(최종손절위치+1) Then
exitlong("최종손절2",AtMarket);
}
Else { # 매수포지션이 아니면 모두 false로 초기화
Condition1 = false;
Condition2 = false;
}
}
# 매수진입 후 1차매수1이나 1차매수2, 1차매수3 진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "1차매수1" or LatestEntryName(0) == "1차매수2" or LatestEntryName(0) == "1차매수3") Then
entrycond1 = true;
# 매수진입 후 2차매수1이나 2차매수2, 2차매수3 진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "2차매수1" or LatestEntryName(0) == "2차매수2" or LatestEntryName(0) == "2차매수3") Then
entrycond2 = true;
# 무포지션이면 false로 초기화
if MarketPosition == 0 Then {
entrycond1 = false;
entrycond2 = false;
}
즐거운 하루되세요
> 종풍화성 님이 쓴 글입니다.
> 제목 : 시스템식 검토 부탁드립니다.
> 안녕하세요..
# 1차매도1,1차매도2는 가격이 상승해서 1차매도 가격을 터치한 것인지
시가가 갭으로 1차매도가격 이상에서 바로 시작해서 신호가 발생한것인지
구분하기 위해서 1차매도를 2개의 함수로 작성한 것입니다.
# 시가가 지정한 가격보다 아래에서 시작하여 상승해서 지정한 가격 터치시 매도(1차매도1)
# 시가가 지정한 가격보다 이상에서 바로 시작하면 시가에 바로 매도(1차매도2)로 하였습니다.
# 2차매도1, 2차매도2도 마찬가지로 작성하였는데 신호가 제대로 잡히질 않네요..
# 추가질문으로 1차매도2의 경우 시가에 바로 매도하지 않고 시가의 1호가 아래에서 매도하는
수식도 부탁드립니다.
검토부탁드립니다.
전체 시스템식은 다음과 같습니다.
--------------------------------------------------------------------------
## 일봉상 일목균형표의 120일 기준선을 참조하여 3분봉에서 매매함.
## 2분할매수, 2분할매도 시스템식
## 외부변수 설정 ##
input : 전략시작일자(20160105), 전략시작시간(090000), 전략매수금액(1000);
input : 매수위치1차(2), 매수위치2차(3);
input : 매도위치1차(1.5), 매도위치2차(2);
input : 매수비중1차(50), 매수비중2차(50);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략진입횟수(1);
input : 최종손절위치(10),최종익절위치(1);
input : Period(26);
## 내부변수 설정 ##
var : CL(0),V0.5(0),V1(0),V2(0),V3(0);
var : mid(0),V4(0),V5(0),V6(0),V7(0),V8(0),V9(0);
var : diff(0),TF(0),cnt(0),value(0);
var : entrycond1(false),entrycond2(false),entrycond3(false);
# Period 전기간 최고가의 값이 있으면
if dayhigh(Period) > 0 Then {
var1 = dayhigh(0); # 당일최고가 (Period 기간동안 최고가를 계산하기 위한 초기값)
var2 = daylow(0); # 당일최저가 (Period 기간동안 최고가를 계산하기 위한 초기값)
var11 = dayhigh(1); # 전일최고가 (전일기준 Period 기간동안 최고가를 계산하기 위한 초기값)
var12 = daylow(1); # 전일최저가 (전일기준 Period 기간동안 최고가를 계산하기 위한 초기값)
# 0일부터 Period전일까지 최고가와 최저가를 불러와
# Period 기간동안 최고가/최저가를 계산
# 전일기준은 0을 제외하고 Period 기간이므로 +1
for cnt = 0 to Period-1 {
if DayHigh(cnt) > var1 Then
var1 = DayHigh(cnt);
if dayhigh(cnt+1) > var11 Then
var11 = dayhigh(cnt+1);
if daylow(cnt) < var2 Then
var2 = daylow(cnt);
if daylow(cnt+1) < var21 Then
var21 = daylow(cnt+1);
}
# Period기간동안 최고가가 전일보다 상승하면
# CL에 당일 중간값 저장
if var11 < var1 Then
CL = (var1+var2)/2;
V0.5 = var1-((var1-CL)/5)*1;
V1 = var1-((var1-CL)/5)*2; ## "빨"타점-1타점
V2 = var1-((var1-CL)/5)*3; ## "주"타점-2타점
V3 = var1-((var1-CL)/5)*4; ## "노"타점-3타점
mid = (var1+var2)/2; ## 중간선
V4 = var1-((var1-CL)/5)*5; ## "초"타점-4타점
V5 = var1-((var1-CL)/5)*6; ## "파"타점-5타점
V6 = var1-((var1-CL)/5)*7; ## "남"타점-6타점
V7 = var1-((var1-CL)/5)*8; ## "보"타점-7타점
V8 = var1-((var1-CL)/5)*9; ## "점"타점-8타점
V9 = var1-((var1-CL)/5)*9; ## "검"타점-9타점
value = abs(var1-V0.5);
#######################################################
if sdate >= 전략시작일자 and # 지정일 이후
TotalTrades < 전략진입횟수 and # 최대 진입횟수 이전
MarketPosition == 0 and # 현재 무포지션
stime >= 전략시작시간 and # 지정시간 이후
EntryCond1 == false and # EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨)
DayHigh(0) < var1 Then { # 당일고가가 period신고가를 돌파하지 않을 경우만 매수하기 위한 조건
# (1차매수1),(1차매수2)은 가격이 하락해서 1차매수가격을 터치한 것인지
# 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지
# 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다.
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수1)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수2)
if stime <= 145500 Then {
if NextBarOpen > var1-value*(매수위치1차+1) Then
buy("1차매수1",atlimit,var1-value*(매수위치1차+1),Floor((전략매수금액*10000*(매수비중1차/100))/C));
Else
buy("1차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중1차/100))/C));
}
if stime == 150000 Then {
if L <= var1[1]-value[1]*(매수위치1차+1) Then
buy("1차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중1차/100))/C));
}
}
# 매수진입이후
if MarketPosition == 1 then {
# 추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화
if CurrentContracts > CurrentContracts[1] Then
Condition1 = false;
# 매수시점의 var1와 V0.5의 차이값을 diff에 저장
diff = abs(var1[BarsSinceEntry]-V0.5[BarsSinceEntry]);
if MaxEntries == 1 and # 최대진입횟수가1이고(첫진입 한번만 발생한 상황)
L >= var1-value*(매수위치2차+1) and # 저가가 2차매수가격 이상이고
EntryCond2 == false Then { # EntryCond2은 false일때(2차매수가 발생하면 true로 변경되어 한번만 진입하게 됨)
# 다음봉에서 2차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수)
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(2차매수1)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(2차매수2)
if stime <= 145500 or stime == 150000 Then {
if NextBarOpen > var1-value*(매수위치2차+1) Then
buy("2차매수1",atlimit,var1-value*(매수위치2차+1),Floor((전략매수금액*10000*(매수비중2차/100))/C));
Else
buy("2차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C));
}
if stime == 150000 and L <= var1[1]-value[1]*(매수위치2차+1) Then
buy("2차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C));
}
# Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수
# 포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true
if CurrentContracts < CurrentContracts[1] and
(LatestExitName(0) == "1차매도1" or LatestExitName(0) == "1차매도2" or LatestExitName(0) == "1차매도3") Then
Condition1 = true;
# 포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true
if CurrentContracts < CurrentContracts[1] and
(LatestExitName(0) == "2차매도1" or LatestExitName(0) == "2차매도2" or LatestExitName(0) == "2차매도3") Then
Condition2 = true;
# Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태)
# 당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큼 청산
if Condition1 == false then {
if stime <= 145500 Then {
if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치1차 Then
exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1);
Else
exitlong("1차매도2",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치1차 Then
exitlong("1차매도3",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
if Condition1 == true and CurrentContracts < MaxContracts then {
if stime <= 145500 Then
exitlong("최종익절1",AtStop,LatestExitPrice(0)-diff*최종익절위치);
if stime == 150000 and L <= LatestExitPrice(0)-diff*최종익절위치 Then
exitlong("최종익절2",AtMarket);
}
# Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태)
# 당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큼 청산
if Condition2 == false then {
if stime <= 145500 Then {
if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치2차 Then
exitlong("2차매도1",AtLimit,lowest(L,BarsSinceEntry)+diff*매도위치2차);
Else
exitlong("2차매도2",AtMarket);
}
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치2차 Then
exitlong("2차매도3",AtMarket);
}
# 당일최고가에서 value*(최종손절위치+1)만큰 하락하면 전량청산
# 3분봉에서 정규장마지막봉 전봉까지만 만족했을때 신호발생
if stime < 145700 Then
exitlong("최종손절1",AtStop,var1-value*(최종손절위치+1));
# 정규장 마지막봉에서 조건만족하면 다음봉(다음날)시가에 청산
if stime == 150000 and L <= var1[1]-value[1]*(최종손절위치+1) Then
exitlong("최종손절2",AtMarket);
}
Else { # 매수포지션이 아니면 모두 false로 초기화
Condition1 = false;
Condition2 = false;
}
}
# 매수진입 후 1차매수1이나 1차매수2, 1차매수3 진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "1차매수1" or LatestEntryName(0) == "1차매수2" or LatestEntryName(0) == "1차매수3") Then
entrycond1 = true;
# 매수진입 후 2차매수1이나 2차매수2, 2차매수3 진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "2차매수1" or LatestEntryName(0) == "2차매수2" or LatestEntryName(0) == "2차매수3") Then
entrycond2 = true;
# 무포지션이면 flase로 초기화
if MarketPosition == 0 Then {
entrycond1 = false;
entrycond2 = false;
}