예스스탁
예스스탁 답변
2025-03-06 13:16:41
안녕하세요
예스스탁입니다.
랭귀가 봉완성기준으로 값을 사용하고 조건을 체크합니다.
참조데이터가 일봉이면 매일 당일봉은 미완성봉이므로 전일값을 기준으로 조건이 체크됩니다.
분봉차트 자체에서 일봉의 MACD 오실레이터를 계산해서 신호가 발생되게 작성해 드립니다.
다만 MACD와 같은 지수이평이 근간이 되는 계산법의 경우
과거 봉수가 값계산에 영향을 주게 되므로
되도록 분봉 주기는 크게 지정하시고 최대인 1만봉 조회해서 보시기 바랍니다.
지표식도 같이 작성해 드립니다.
1 시스템
input : shortPeriod(12),longPeriod(26),Period(9);
Input : P1(12),P2(26),P3(9);
Input : H1(10),L1(10);
Var : macdv1(0),macds1(0),macdo1(0);
var : mav(0);
var : Didx(0),dEP1(0),dEP2(0),dEP3(0);
Var : dJISU1(0), PredJISU1(0);
Var : dJISU2(0), PredJISU2(0);
var : dMACDV(0), predMACDV(0);
Var : dMACDS(0), PredMACDS(0);
var : dMACDO(0), predMACDO(0);
#일봉 MACD OSC
dEp1 = 2/(P1+1);
dEp2 = 2/(P2+1);
dEp3 = 2/(P3+1);
if bdate != bdate[1] Then
{
Didx = Didx + 1;
PredJISU1 = dJISU1[1];
PredJISU2 = dJISU2[1];
PredMACDV = dMACDV[1];
PredMACDS = dMACDS[1];
PredMACDO = dMACDO[1];
}
if Didx <= 1 then
{
dJISU1 = C;
dJISU2 = C;
dMACDV = dJISU1-dJISU2;
dMACDS = dMACDV;
dMACDO = dMACDV-dMACDS;
}
else{
dJISU1 = C * dEP1 + PredJISU1 * (1-dEP1);
dJISU2 = C * dEP2 + PredJISU2 * (1-dEP2);
dMACDV = dJISU1-dJISU2;
dMACDS = dMACDV * dEP3 + PredMACDS * (1-dEP3);
dMACDO = dMACDV-dMACDS;
}
macdv1 = MACD(shortPeriod, longPeriod);
macds1 = ema(macdv1,Period);
macdo1 = macdv1-macds1;
mav = ema(C,26);
if marketposition == 0 and
macdo1 > 0 and
dmacdo > 0 and
(C >= mav+data1(PriceScale*H1)) Then
Buy("L");
if marketposition == 0 and
macdo1 < 0 and
dmacdo < 0 and
(C <= mav-data1(PriceScale*L1)) Then
Sell("S");
### ATR Trailing LX(매수청산)###
Inputs: ATRs_L(3);
Variables: PosHigh(0,Data1), ATRVal_L(0,Data1);
ATRVal_L = data1(ATR(10) * ATRs_L);
If BarsSinceEntry() == 0 Then
PosHigh = High;
If MarketPosition() == 1 Then Begin
If High > PosHigh Then
PosHigh = High;
ExitLong ("ATRS", AtStop, PosHigh - ATRVal_L);
End
else
ExitLong("ATR ebs", AtStop, High - ATRVal_L);
### ATR Trailing SX(매도청산)###
Inputs: ATRs_S(3);
Variables: PosLow(0,Data1), ATRVal_S(0,Data1);
ATRVal_S = data1(ATR(10) * ATRs_S);
If BarsSinceEntry() == 0 Then
PosLow = Low;
If MarketPosition() == -1 Then Begin
If Low < PosLow Then
PosLow = Low;
ExitShort ("ATRL", AtStop, PosLow + ATRVal_S);
End
else
ExitShort ("ATR ebL", AtStop, Low + ATRVal_S);
2 지표
input : shortPeriod(12),longPeriod(26),Period(9);
Input : P1(12),P2(26),P3(9);
Input : H1(10),L1(10);
Var : macdv1(0),macds1(0),macdo1(0);
var : mav(0);
var : Didx(0),dEP1(0),dEP2(0),dEP3(0);
Var : dJISU1(0), PredJISU1(0);
Var : dJISU2(0), PredJISU2(0);
var : dMACDV(0), predMACDV(0);
Var : dMACDS(0), PredMACDS(0);
var : dMACDO(0), predMACDO(0);
dEp1 = 2/(P1+1);
dEp2 = 2/(P2+1);
dEp3 = 2/(P3+1);
if bdate != bdate[1] Then
{
Didx = Didx + 1;
PredJISU1 = dJISU1[1];
PredJISU2 = dJISU2[1];
PredMACDV = dMACDV[1];
PredMACDS = dMACDS[1];
PredMACDO = dMACDO[1];
}
if Didx <= 1 then
{
dJISU1 = C;
dJISU2 = C;
dMACDV = dJISU1-dJISU2;
dMACDS = dMACDV;
dMACDO = dMACDV-dMACDS;
}
else{
dJISU1 = C * dEP1 + PredJISU1 * (1-dEP1);
dJISU2 = C * dEP2 + PredJISU2 * (1-dEP2);
dMACDV = dJISU1-dJISU2;
dMACDS = dMACDV * dEP3 + PredMACDS * (1-dEP3);
dMACDO = dMACDV-dMACDS;
}
Plot1(dMACDO,"일봉MACD오실레이터");
PlotBaseLine1(0);
즐거운 하루되세요
> ryan1 님이 쓴 글입니다.
> 제목 : 시스템이 원하는 신호가 안나옵니다.(2)
> 안녕하세요?
일전에 친절한 안내 잘 받았습니다(91686번글). 바쁘실텐데 항상 친절하고 성심 성의껏 응대 해주셔서 항상 감사합니다.
말씀하신대로 data1을 구별하여 시스템을 적용시켜 보았는데, 처음에는 청산식이 없는 것 같아, 신호가 안나오는 듯하여 청산식으로 ATR을 사용하여 만들어 보았더니 시스템이 작동하는 듯하였습니다.
그런데 제가 원하는 시스템은
data2의 macd 오실래이터가 양수일때,data1의 macd 오실래이터가 양수인 경우 매수신호가,
macd 오실래이터가 음수일때,data1의 macd 오실래이터가 음수인 경우 매도신호가,
나오는 것인데,
data2의 macd 오실래이터가 양수일때,data1의 macd 오실래이터가 음수인 경우에도 매수신호가,계속 나옵니다.혹은 그 반대의 경우에도 다른 신호가 계속 나옵니다.
코딩이 뭐가 잘 못 된것인지 다시 한번 봐 주시면 감사하겠습니다,
미리 감사 인사 올립니다.
input : shortPeriod(12),longPeriod(26),Period(9);
input : P1(12),P2(26),P3(9);
Input : H1(10),L1(10);
Var : macdv1(0,Data1),macds1(0,Data1),macdo1(0,Data1);
var : macdv2(0,data2),macds2(0,data2),macdo2(0,Data2);
var : mav(0,Data1);
macdv1 = data1(MACD(shortPeriod, longPeriod));
macds1 = data1(ema(macdv1,Period));
macdo1 = macdv1-macds1;
macdv2 = data2(MACD(P1,P2));
macds2 = data2(ema(macdv2,P3));
macdo2 = macdv2-macds2;
mav = data1(ema(C,26));
if marketposition == 0 and
macdo1 > 0 and
macdo2 > 0 and
(C >= mav+data1(PriceScale*H1)) Then
Buy("L");
if marketposition == 0 and
macdo1 < 0 and
macdo2 < 0 and
(C <= mav-data1(PriceScale*L1)) Then
Sell("S");
### ATR Trailing LX(매수청산)###
Inputs: ATRs_L(3);
Variables: PosHigh(0,Data1), ATRVal_L(0,Data1);
ATRVal_L = data1(ATR(10) * ATRs_L);
If BarsSinceEntry() == 0 Then
PosHigh = High;
If MarketPosition() == 1 Then Begin
If High > PosHigh Then
PosHigh = High;
ExitLong ("ATRS", AtStop, PosHigh - ATRVal_L);
End
else
ExitLong("ATR ebs", AtStop, High - ATRVal_L);
### ATR Trailing SX(매도청산)###
Inputs: ATRs_S(3);
Variables: PosLow(0,Data1), ATRVal_S(0,Data1);
ATRVal_S = data1(ATR(10) * ATRs_S);
If BarsSinceEntry() == 0 Then
PosLow = Low;
If MarketPosition() == -1 Then Begin
If Low < PosLow Then
PosLow = Low;
ExitShort ("ATRL", AtStop, PosLow + ATRVal_S);
End
else
ExitShort ("ATR ebL", AtStop, Low + ATRVal_S);