예스스탁
예스스탁 답변
2022-09-30 16:43:39
안녕하세요
예스스탁입니다.
1
올리신 내용 변환하면 아래와 같습니다.
input : size(9),offset(0.85),sigma(6);
var : data(0),ii(0),mm(0),ss(0),weight(0),norm(0),sum(0),alma(0);
data = close;
mm = offset * (size - 1);
ss = size / sigma;
norm = 0;
sum = 0;
for ii = 0 to size - 1
{
weight = exp(-1 * pow(ii - mm, 2) / (2 * pow(ss, 2)));
norm = norm + weight;
sum = sum + data[size - ii - 1] * weight;
}
alma = sum / norm;
plot1(alma);
2
하나의 지표식에서 다수 주기를 보고자 하시면 아래식 15분 차트에 적용하시면 됩니다.
15분차트에 적용하시면 30분, 60분, 일봉의 지표값을 계산해서 출력하게 됩니다.
수식에서 타주기 지표 구현의 경우에는 기본차트의 주기보다 배수로 큰 주기만 가능합니다.
랭귀지는 봉의 시고저종가만 사용할 수 있고 봉 내부의 특정시점의 값은 알 수 없습니다.
15분 차트에서 40분봉과 같이 배수가 아닌 주기는 계산할 수 없습니다.
input : size(9),offset(0.85),sigma(6);
input : 분1(30),분2(60);
var : ii(0),mm(0),ss(0);
var : weight(0),norm(0),sum(0),alma(0);
var : S1(0),D1(0),TM(0),TF1(0),TF2(0);
var : weight1(0),norm1(0),sum1(0),alma1(0);
var : weight2(0),norm2(0),sum2(0),alma2(0);
var : weight3(0),norm3(0),sum3(0),alma3(0);
Array : C1[100](0),C2[100](0);
mm = offset * (size - 1);
ss = size / sigma;
#기본차트 alma
norm = 0;
sum = 0;
for ii = 0 to size - 1
{
weight = exp(-1 * pow(ii - mm, 2) / (2 * pow(ss, 2)));
norm = norm + weight;
sum = sum + close[size - ii - 1] * weight;
}
alma = sum / norm;
if Bdate != Bdate[1] Then
{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
plot1(alma1,"기본차트");
if D1 > 0 then
{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
#타주기 분봉1 alma
TF1 = TM%분1;
if Bdate != Bdate[1] or
(Bdate == Bdate[1] and 분1 > 1 and TF1 < TF1[1]) or
(Bdate == Bdate[1] and 분1 > 1 and TM >= TM[1]+분1) or
(Bdate == Bdate[1] and 분1 == 1 and TM > TM[1]) Then
{
For ii = 99 DownTo 1
{
C1[ii] = C1[ii-1];
}
}
C1[0] = C;
norm1 = 0;
sum1 = 0;
for ii = 0 to size - 1
{
weight1 = exp(-1 * pow(ii - mm, 2) / (2 * pow(ss, 2)));
norm1 = norm1 + weight1;
sum1 = sum1 + C1[size - ii - 1] * weight1;
}
alma1 = sum1 / norm1;
plot2(alma1,"분1");
#타주기 분봉2 alma
TF2 = TM%분2;
if Bdate != Bdate[1] or
(Bdate == Bdate[1] and 분2 > 1 and TF2 < TF2[1]) or
(Bdate == Bdate[1] and 분2 > 1 and TM >= TM[1]+분2) or
(Bdate == Bdate[1] and 분2 == 1 and TM > TM[1]) Then
{
For ii = 99 DownTo 1
{
C2[ii] = C2[ii-1];
}
}
C2[0] = C;
norm2 = 0;
sum2 = 0;
for ii = 0 to size - 1
{
weight2 = exp(-1 * pow(ii - mm, 2) / (2 * pow(ss, 2)));
norm2 = norm2 + weight2;
sum2 = sum2 + C2[size - ii - 1] * weight2;
}
alma2 = sum2 / norm2;
plot3(alma2,"분2");
}
if DayClose(Size-1) > 0 Then
{
norm3 = 0;
sum3 = 0;
for ii = 0 to size - 1
{
weight3 = exp(-1 * pow(ii - mm, 2) / (2 * pow(ss, 2)));
norm3 = norm3 + weight3;
sum3 = sum3 + DayClose(size - ii - 1) * weight3;
}
alma3 = sum3 / norm3;
plot4(alma3,"일");
}
즐거운 하루되세요
> 고를 님이 쓴 글입니다.
> 제목 : 시간 프레임과 지표 문의
>
안녕하세요, 시간 프레임에 대해 궁금한 게 있습니다.
한가지 지표를 두고 여러 시간프레임을 사용할 수 있나요? 각각의 시간에 적용 시키는 방법은 알겠으나 다수의 시간대를 하나의 지표로 보는 방법을 찾지 못하겠습니다. 예를 들어 컨버젼스 전략을 쓴다고 치고 이 전략을 다수의 시간대(예. 15분, 30분, 1시간, 1일)에 적용을 시켜 하나의 지표로 보고 싶습니다.
그리고 alma (Arnaud Legoux moving average)라는 지표가 있는지 궁금합니다.
혹시몰라 파이썬 코드(alma) 첨부합니다.
def add_alma(df):
alma = pd.DataFrame(columns=["ALMA"])
close = df["close"]
size = len(close)
def ALMA(data, sigma=6, offset=0.90, size=40):
"""
Arnaud Legoux Moving Average
:param data: data array
:param sigma: filter
:param offset: responsiveness/smoothness in range [0.0 - 1.0]
:param size: window size
"""
try:
m = offset * (size - 1)
s = size / sigma
sum_ = 0
norm = 0
for i in range(size):
coeff = math.exp(- pow(i - m, 2) / 2 * pow(s, 2))
sum_ += data[size - i - 1] * coeff
norm += coeff
return sum_ / norm
except:
return math.nan
for i in reversed(close.index):
if i == 0:
subset = list(close)[::-1]
else:
subset = list(close)[:-i][::-1]
alma.loc[size - i - 1] = ALMA(subset)
df["ALMA"] = alma
return df