예스스탁
예스스탁 답변
2023-02-10 14:05:23
안녕하세요
예스스탁입니다.
input : P(20),dv(2),LENGTH(10),n(5),RSIP(14);
VAR : TCHAN(0), BCHAN(0);
var : bbup(0),bbdn(0);
var : RSIv(0);
var : upv(0),dnv(0),RR(0),BH(0),SL(0);
RSIV = RSI(RSIP);
if MarketPosition == 0 and CrossUp(RSIV,30) Then
Buy("b");
if MarketPosition == 0 and CrossDown(RSIV,70) Then
Sell("s");
bbup = BollBandUp(P,dv);
bbdn = BollBandDown(P,dv);
TCHAN = HIGHEST(HIGH, LENGTH)[1]+n;
BCHAN = LOWEST(LOW, LENGTH)[1]-n;
if MarketPosition == 1 Then
{
bh = highest(H,BarsSinceEntry);
if IsEntryName("b") == true Then
{
upv = min(bbup[BarsSinceEntry],TCHAN[BarsSinceEntry]);
dnv = min(bbdn[BarsSinceEntry],BCHAN[BarsSinceEntry]);
RR = upv-dnv;
ExitLong("bp",AtLimit,upv+RR*0.5);
Sell("bs",AtStop,dnv-RR*0.5);
}
Else
{
ExitLong("sbp",AtLimit,EntryPrice+(highest(H,2)[BarsSinceEntry]-lowest(L,2)[BarsSinceEntry]));
ExitLong("sbl",AtStop,sl);
}
}
if MarketPosition == -1 Then
{
sl = lowest(L,BarsSinceEntry);
if IsEntryName("b") == true Then
{
upv = max(bbup[BarsSinceEntry],TCHAN[BarsSinceEntry]);
dnv = max(bbdn[BarsSinceEntry],BCHAN[BarsSinceEntry]);
RR = upv-dnv;
ExitShort("sp",AtLimit,upv+RR*0.5);
Buy("sb",AtStop,upv+RR*0.5);
}
Else
{
ExitShort("bsp",AtLimit,EntryPrice-(highest(H,2)[BarsSinceEntry]-lowest(L,2)[BarsSinceEntry]));
ExitShort("bsl",AtStop,bh);
}
}
즐거운 하루되세요
> 흑수돌 님이 쓴 글입니다.
> 제목 : 수식 문의
> 항상 친절한 답변 감사드립니다.
아래와 같은 수식을 구하고 싶습니다.
미리 요약 ::
- 시그널이 발생하면 상,하단선을 만든다.
- 상하단 레인지를 이용해 익절폭을 정한다.
- 레인지 안에서는 중복신호 안 낸다.
- 시그널 - 손,익절되면 레인지도 사라진다.
- 레인지를 거꾸로 벗어나면 스위칭을 낸다.
- 스위칭은 손/익절 전까지 중복 안 한다.
(다른 시그널과는 중복가능)
=========================
어떤 시그널 var1 var2 이 발생 했다고 했을 때,
(ex : var1 = rsi 30 crossup 매수
var2 = rsi 70 crossdn 매도
## 일단 레인지를 찾습니다.
지표 1 : 볼린저 밴드 상단/ 하단선
지표 2 : price channel 상단+n틱 / 하단선-n틱
var1 매수시그널 발생 캔들 기준 :
하단선 : 밴드하단선과 price channel 하단선-n틱 중 더 낮은 가격
상단선 : 밴드상단선과 price channel 상단+n틱 중 더 낮은 가격
var2 매도 시그널 발생 캔들 기준 :
상단선 : 밴드상단선과 price channel 상단+n틱 중 더 높은 가격
하단선 : 밴드하단선과 price channel 하단선-n틱 중 더 높은 가격
레인지값 :
상단선 - 하단선
===레인지의 활용 ====
a. var1 : (상단선) + (레인지값 * 0.5)에 도달 시 수익청산
b. var2 : (하단선) - (레인지값 * 0.5)에 도달 시 수익 청산
c. 추가 진입 금지 :
1. var1 또는 var2 포지션이 있고
2. 종가가 레인지 안에 있다면
3. 어떤 시그널도 추가로 발생시키지 않습니다.
d. 단, 포지션이 없다면 레인지도 사라지고 시그널은 다시 발생.
=== 손절과 스위칭 ===
e. var1 매수 시그널의 손절과 스위칭 :
(하단선)과 (현재가기준 볼린저밴드 하단선) 중 더 낮은 가격을 이탈하면
-> 매수는 손절하고 매도 스위칭.
-> var1 매수 포지션은 사라졌으므로 레인지도 사라짐.
-> (e. 스위칭 시그널)은 var1, var2 시그널이 아니므로 레인지 생성 안함.
-> 즉, var1 or var2는 중복 발생 가능
익절 : 진입가에서 (진입가봉+직전봉)의 최고최저가 진폭) 만큼 빠지면 청산.
손절 : 직전 var1 시그널 고가 돌파 시 손절
★ (e. 시그널) 은 손절되거나 익절되기 전까지 중복 생성 안함.
k. var2 시그널은 그 반대
-> var2 : 상단선 과 현재가 기준 볼린저밴드 상단선) 중 더 높은 가격을 돌파
-> var2매도는 손절하고 매수 진입.
-> var2 포지션 사라졌으므로 레인지도 사라짐.
-> (k. 스위칭 시그널)은 var1, var2 시그널이 아니므로 레인지 생성 안함.
-> 즉, var1 or var2는 중복 발생 가능
익절 : 진입가에서 (진입가봉+직전봉)의 최고최저가 진폭) 만큼 오르면 청산.
손절 : 직전 var2 시그널 저가 이탈 시 손절
★ (e. 시그널) 은 손절되거나 익절되기 전까지 중복 생성 안함.
--------------------------
도움이 되실지 모르겠는데
일전에 도움 주신 비슷한 수식을 첨부드립니다.
(그런데 작동은 안하더라고요)
Input : Vector(9), Period(14), 매수선(30), 매도선(70);
input : 저가봉(5),고가봉(5),저가폭(10),고가폭(10);
Input : shortPeriod(12), longPeriod(26);
Var : rsi_(0), rsi_signal(0) ;
var : ll(0),hh(0),eh(0),el(0),BuyEntry(False),SellEntry(False);
Var : MACDv(0), MACDsig(0), macdosc(0);
rsi_ = RSI(Period);
rsi_signal = MA(RSI(Period), Vector);
ll = lowest(l,저가봉);
hh = highest(h,고가봉);
if MarketPosition != 0 Then
{
if MarketPosition != MarketPosition[1] or CurrentContracts > CurrentContracts[1] Then
{
eh = hh;
el = ll;
}
}
/*
시그널 레인지를 만듬 :::
eh = @@ 매수 신호가 발생한 캔들을 기준으로 (저가봉) 기간 중 최저가를 찾아서 n틱을 빼줌.
el = @@ 매도 신호가 발생한 캔들을 기준으로 (고가봉) 기간 중 최고가를 찾아서 n1틱을 더해줌
*/
BuyEntry = true;
SellEntry = true;
if MarketPosition == 0 Then
{
if MarketPosition(1) == 1 and (C > ll[BarsSinceEntry(1)]-PriceScale*저가폭 and C < HH[BarsSinceEntry(1)]+PriceScale*고가폭) Then
BuyEntry = False;
if MarketPosition(1) == -1 and (C > ll[BarsSinceEntry(1)]-PriceScale*저가폭 and C < HH[BarsSinceEntry(1)]+PriceScale*고가폭) Then
SellEntry = False;
}
else
{
if MarketPosition == 1 and C > el-PriceScale*저가폭 and C < eh+PriceScale*고가폭 Then
BuyEntry = false;
if MarketPosition == -1 and C > el-PriceScale*저가폭 and C < eh+PriceScale*고가폭 Then
SellEntry = false;
}
/*
( eh + 고가폭) 보다 아래에 있으면서 (el + 저가폭 ) 위에 있는 신호는 걸러낸다.
시그널 레인지 안에서 발생한 시그널은 제외시킴 = (신호가 발생한 캔들 기준으로 N봉 기간) 의
최고가와 최저가에서 N틱을 더해서 레인지를 만들고,
그 레인지 안에 발생한 신호는 걸러낸다.
*/
if macdosc > 0 &&
#rsi_signal < 매수선 &&
rsi_ > 매수선 && rsi_[1] < 매수선 Then
{
if BuyEntry == true Then
Buy("B1");
}
if macdosc < 0 &&
#rsi_signal > 매도선 &&
rsi_ < 매도선 && rsi_[1] > 매도선 Then
{
if SellEntry == true Then
Sell("S1");
}
if MarketPosition == 1 Then
Sell("Bx",AtStop,ll[BarsSinceEntry]-PriceScale*저가폭);
if MarketPosition == -1 Then
BUY("Sx",AtStop,hh[BarsSinceEntry]+PriceScale*고가폭);
#시그널 레인지를 벗어나면 손절 하는 대신 즉시 반대신호를 냄.
#단, 손절대신 낸 신호는 같은 레인지 안에서 중복될 수 있음.