답변완료
행복; 지표식 작성 바랍니다
한국의 금융산업 발전을 위해 불철주야 애쓰시는 귀하의 노고를 높이 평가합니다
지표식 관련입니다
<질문>
- 2023년 1월 25일부터 바뀌는 호가체계로 인하여
상한가를 어떻게 표시해야 하는가에 대한 질문과 답변을 보았습니다
- 2023년 1월 19일에 있는 답변이 <아래>와 같습니다
- 근데 오류가 있는 것 같습니다
- if close == 상한가 then
plot1(close); // 막대그래프로 표시
- 이 때 2023년 2월 8일의 상한가 종목인 케이피엠테크(487원), 한일진공(550원), 텔콘RF제약(1,544원)과 2023년 2월 9일의 상한가 종목인 웅진(1898원)에서는 표시가 되지 않고 있습니다
- 확인 부탁드립니다
- 수고하십시요^^
###################< 아래 >##############################
============<변경된 상한가 시작>====================================
var : 상한가(0), UpLimit(0);
var : up1(0), up2(0), up3(0), up4(0), up5(0),up6(0),Up7(0);
if date >= 19981207 then
{
if date < 20050328 && CodeCategory() == 2 then
UpLimit = (BP[0] * 1.12);
Else if date >= 20050328 and date < 20150615 Then
UpLimit = (BP[0] * 1.15);
Else
UpLimit = (BP[0] * 1.30);
if date >= 20230125 Then
{
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
Else
{
if CodeCategory() == 2 then
{
if date >= 20030721 then
{
up1 = int(UpLimit/100+0.00001)*100;
up2 = int(UpLimit/100+0.00001)*100;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
else
{
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/10+0.00001)*10;
up7 = int(UpLimit/1+0.00001)*1;
}
}
Else
{
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
}
if CodeCategory() == 1 || CodeCategory() == 2 then
{
if date >= 20230125 Then
{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 200000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=200000, up2, up3);
Else If BP >= 20000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=20000, up4, up5);
Else If BP >= 2000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=2000, up6, up6);
}
Else
{
if sdate < 20101004 Then
{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 100000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=100000, up2, up3);
Else If BP >= 10000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=10000, up4, up5);
Else If BP >= 1000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=1000, up6, up6);
}
Else
{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 100000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=100000, up2, up3);
Else If BP >= 10000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=10000, up4, up5);
Else If BP >= 1000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=1000, up6, up7);
}
}
}
else if CodeCategory() == 8 || CodeCategory() == 9 then { // ETF
상한가 = up6;
}
}
============<변경된 상한가 끝>====================================
2023-02-09
1336
글번호 166162
지표
답변완료
문의드립니다.
지그재그차트에서 상단고점 꼭지점 수평라인은 유지하고
하단 저점 변곡점 수평라인은 삭제 요청합니다.
Input:전환비율(5);
Var:j(0),jj(0),HH(0),LL(0),hiBar(0),loBar(0),최종꼭지점(""),처리구분(""), TL1(0),Text1(0),ADXV1(0);
Array:고[10,4](0),저[10,4](0);
HH = H;
LL = L;
If Index == 0 Then
{
고[1,1] = HH;
고[1,2] = 0;
고[1,3] = sDate;
고[1,4] = sTime;
저[1,1] = LL;
저[1,2] = 0;
저[1,3] = sDate;
저[1,4] = sTime;
}
If Index > 0 Then
{
hiBar = hiBar + 1;
loBar = loBar + 1;
}
If HH[hiBar] < HH Then hiBar = 0;
If LL[loBar] > LL Then loBar = 0;
Condition1 = 저[1,1] * (1 + (전환비율/100)) < HH and hiBar == 0;
Condition2 = 고[1,1] * (1 - (전환비율/100)) > LL and loBar == 0;
처리구분 = "";
If Condition1 and Condition2 Then // 고점과 저점 조건 동시 만족
{
If 최종꼭지점 == "저점" Then
{
If 저[1,1] > LL Then 처리구분 = "저점처리";
Else 처리구분 = "고점처리";
}
Else If 최종꼭지점 == "고점" Then
{
If 고[1,1] < HH Then 처리구분 = "고점처리";
Else 처리구분 = "저점처리";
}
}
Else If Condition1 Then 처리구분 = "고점처리";
Else If Condition2 Then 처리구분 = "저점처리";
If 처리구분 == "고점처리" Then
{
If 최종꼭지점 == "저점" Then
{
For j = 10 DownTo 2
{
For jj = 1 To 4
{
고[j,jj] = 고[j-1,jj];
}
}
고[1,1] = HH[hiBar];
고[1,2] = Index - hiBar;
고[1,3] = sDate[hiBar];
고[1,4] = sTime[hiBar];
hiBar= -1;
loBar= -1;
TL1 = TL_New(저[1,3],저[1,4],저[1,1],고[1,3],고[1,4],고[1,1]);
TL_SetSize(TL1,1);
TL_SetColor(TL1,RED);
}
Else If 고[1,1] < HH[hiBar] Then// 1번 고점보다 높은 고가 출현
{
고[1,1] = HH[hiBar];
고[1,2] = Index - hiBar;
고[1,3] = sDate[hiBar];
고[1,4] = sTime[hiBar];
hiBar= -1;
loBar= -1;
TL_SetEnd(TL1,고[1,3],고[1,4],고[1,1]);
}
최종꼭지점 = "고점";
}
If 처리구분 == "저점처리" Then
{
If 최종꼭지점 == "고점" Then
{
For j = 10 DownTo 2
{
For jj = 1 To 4
{
저[j,jj] = 저[j-1,jj];
}
}
저[1,1] = LL[loBar];
저[1,2] = Index - loBar;
저[1,3] = sDate[loBar];
저[1,4] = sTime[loBar];
hiBar= -1;
loBar= -1;
TL1 = TL_New(고[1,3],고[1,4],고[1,1],저[1,3],저[1,4],저[1,1]);
TL_SetSize(TL1,1);
TL_SetColor(TL1,BLUE);
}
Else If 저[1,1] > LL[loBar] Then
{
저[1,1] = LL[loBar];
저[1,2] = Index - loBar;
저[1,3] = sDate[loBar];
저[1,4] = sTime[loBar];
hiBar= -1;
loBar= -1;
TL_SetEnd(TL1,저[1,3],저[1,4],저[1,1]);
}
최종꼭지점 = "저점";
}
2023-02-10
1269
글번호 166161
지표
답변완료
수식 문의
항상 친절한 답변 감사드립니다.
아래와 같은 수식을 구하고 싶습니다.
미리 요약 ::
- 시그널이 발생하면 상,하단선을 만든다.
- 상하단 레인지를 이용해 익절폭을 정한다.
- 레인지 안에서는 중복신호 안 낸다.
- 시그널 - 손,익절되면 레인지도 사라진다.
- 레인지를 거꾸로 벗어나면 스위칭을 낸다.
- 스위칭은 손/익절 전까지 중복 안 한다.
(다른 시그널과는 중복가능)
=========================
어떤 시그널 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*고가폭);
#시그널 레인지를 벗어나면 손절 하는 대신 즉시 반대신호를 냄.
#단, 손절대신 낸 신호는 같은 레인지 안에서 중복될 수 있음.
2023-02-10
653
글번호 166156
시스템