커뮤니티
변수의 과거값 참조
2006-09-06 20:04:26
1553
글번호 10777
안녕하세요?
아래와 같은 Hilbert Cycle Function을 만들려고 합니다.
원래 코드는 TS용입니다만, 이것을 예스랭귀지로 이식함이 목적입니다.
그런데 중간쯤의 변수 i2와 Q2의 과거값을 참조하는 부분을 MessageLog를
찍어보면 N/A로 나오더군요 ㅡㅡ;
i2 = 0.15 * i2 + 0.85 * i2[Factor];
^^^^^^^^^^
Q2 = 0.15 * Q2 + 0.85 * Q2[Factor];
^^^^^^^^^^
겉보기에 전혀 이상이 없어 보이고, 이외의 다른 과거값을 참조하는 부분에서는
문제가 없습니다. 여러모로 디버깅해보았지만 답을 찾을 수 없어
문의 드립니다. 수정 부탁드립니다.
그리고 한가지 더하자면,
예스랭귀지의 변수는 선언시에 할당한 초기값으로 초기화가 되는것으로 알고 있습니다.
그런데 중간에 N/A로 되는 경우가 있던데,, 어떤 경우에 이렇게 되는지
알고 싶습니다.
** input 변수는 1과 close를 사용하여 테스트하고 있습니다.
Inputs: Factor( numeric ), Price(numeric);
Vars: Smoother(0), Detrender(0), i1(0),Q1(0),j1(0),Jq(0),i2(0),Q2(0),
x1(0),x2(0),y1(0),Y2(0),Re(0),iM(0),Period(0), p1(0), inphase( 0 ), Phase( 0 ), dp( 0 ), dp2( 0 ), quad( 0 );
vars: t1(0), t2(0);
If index+1 > 5 * Factor AND MTF( Factor ) then
Begin
Smoother = ( 4 * Price + 3 * Price[ Factor ] + 2 * Price[ 2 * Factor ] + Price[ 3 * Factor ] ) / 10;
Detrender = ( 0.25 * Smoother + 0.75 * Smoother[ 2 * Factor ] - 0.75 * Smoother[ 4 * Factor ]- 0.25 * Smoother[ 6 * Factor ]) * ( 0.046 * Period[ Factor ] + 0.332 );
//{Compute InPhase and Quadrature components}
Q1= ( 0.25 * Detrender + 0.75 * Detrender[ 2 * Factor ] - 0.75 * Detrender[ 4 * Factor ] - 0.25 * Detrender[ 6 * Factor ]) * (.046 * Period[ Factor ] + 0.332 );
i1 = Detrender[ 3 * Factor ];
//{Advance the phase of i1 and Q1 by 90 degrees}
j1 = 0.25 * i1 + 0.75 * i1[ 2 * Factor ] - 0.75 * i1[ 2 * Factor ] - 0.25 * i1[ 2 * Factor ];
jQ = 0.25 * Q1 + 0.75 * Q1[ 2 * Factor ] - 0.75 * Q1[ 2 * Factor ] - 0.25 * Q1[ 2 * Factor ];
//{Phasor addition to equalize amplitude due to
// quadrature calculations (and 3 bar averaging}
i2 = i1 - jQ;
Q2 = Q1 + j1;
//{Smooth the i and Q components before applying the discrinator}
i2 = 0.15 * i2 + 0.85 * i2[Factor];
Q2 = 0.15 * Q2 + 0.85 * Q2[Factor];
//{Homodyne Discriminator}
//{Complex Conjugate Multiply}
X1 = i2 * i2[ Factor ];
x2 = i2 * Q2[ Factor ];
Y1 = Q2 * Q2[ Factor ];
Y2 = Q2 * i2[ Factor ];
Re = X1 + Y1;
im = X2 - Y2;
//{Smooth to remove undesired cross products}
Re = 0.2 * Re + 0.8 * Re[ Factor ];
im = 0.2 * im + 0.8 * im[ Factor ];
//{Compute Cycle Period}
If im != 0 AND Re != 0 then
Period = Div( 360, ATan( im / Re ) );
If Period > 1.5 * Period[ Factor ] then
Period = 1.5 * Period[ Factor ];
If Period < 0.67 * Period[ Factor ] then
Period = 0.67*Period[ Factor ];
If Period < 6 then
Period = 6;
If Period > 50 then
Period =50;
Period = 0.2 * Period + 0.8 * Period[ Factor ];
//{end core code}
Hilbert=Period;
end;
else
Hilbert=Period;
답변 2
예스스탁 예스스탁 답변
2006-09-07 15:50:33
안녕하세요
예스스탁입니다.
현재 사용자함수 안에 또다른 사용자 함수가 있는관계로
정확히 테스트를 할 수 없습니다.
다만 N/A는 계산할수 없는 영역을 뜻합니다.
식상에 자기값을 참조하는 부분이 있거나..혹은
이전값 참조시 이전값을 참조할 수 없는 과거봉을 사용할 경우
(예를 들어 당일 첫봉에서 3봉전 가격)
등일 경우 n/a가 나올수 있습니다.
즐거운 하루되세요
> teargas 님이 쓴 글입니다.
> 제목 : 변수의 과거값 참조
> 안녕하세요?
아래와 같은 Hilbert Cycle Function을 만들려고 합니다.
원래 코드는 TS용입니다만, 이것을 예스랭귀지로 이식함이 목적입니다.
그런데 중간쯤의 변수 i2와 Q2의 과거값을 참조하는 부분을 MessageLog를
찍어보면 N/A로 나오더군요 ㅡㅡ;
i2 = 0.15 * i2 + 0.85 * i2[Factor];
^^^^^^^^^^
Q2 = 0.15 * Q2 + 0.85 * Q2[Factor];
^^^^^^^^^^
겉보기에 전혀 이상이 없어 보이고, 이외의 다른 과거값을 참조하는 부분에서는
문제가 없습니다. 여러모로 디버깅해보았지만 답을 찾을 수 없어
문의 드립니다. 수정 부탁드립니다.
그리고 한가지 더하자면,
예스랭귀지의 변수는 선언시에 할당한 초기값으로 초기화가 되는것으로 알고 있습니다.
그런데 중간에 N/A로 되는 경우가 있던데,, 어떤 경우에 이렇게 되는지
알고 싶습니다.
** input 변수는 1과 close를 사용하여 테스트하고 있습니다.
Inputs: Factor( numeric ), Price(numeric);
Vars: Smoother(0), Detrender(0), i1(0),Q1(0),j1(0),Jq(0),i2(0),Q2(0),
x1(0),x2(0),y1(0),Y2(0),Re(0),iM(0),Period(0), p1(0), inphase( 0 ), Phase( 0 ), dp( 0 ), dp2( 0 ), quad( 0 );
vars: t1(0), t2(0);
If index+1 > 5 * Factor AND MTF( Factor ) then
Begin
Smoother = ( 4 * Price + 3 * Price[ Factor ] + 2 * Price[ 2 * Factor ] + Price[ 3 * Factor ] ) / 10;
Detrender = ( 0.25 * Smoother + 0.75 * Smoother[ 2 * Factor ] - 0.75 * Smoother[ 4 * Factor ]- 0.25 * Smoother[ 6 * Factor ]) * ( 0.046 * Period[ Factor ] + 0.332 );
//{Compute InPhase and Quadrature components}
Q1= ( 0.25 * Detrender + 0.75 * Detrender[ 2 * Factor ] - 0.75 * Detrender[ 4 * Factor ] - 0.25 * Detrender[ 6 * Factor ]) * (.046 * Period[ Factor ] + 0.332 );
i1 = Detrender[ 3 * Factor ];
//{Advance the phase of i1 and Q1 by 90 degrees}
j1 = 0.25 * i1 + 0.75 * i1[ 2 * Factor ] - 0.75 * i1[ 2 * Factor ] - 0.25 * i1[ 2 * Factor ];
jQ = 0.25 * Q1 + 0.75 * Q1[ 2 * Factor ] - 0.75 * Q1[ 2 * Factor ] - 0.25 * Q1[ 2 * Factor ];
//{Phasor addition to equalize amplitude due to
// quadrature calculations (and 3 bar averaging}
i2 = i1 - jQ;
Q2 = Q1 + j1;
//{Smooth the i and Q components before applying the discrinator}
i2 = 0.15 * i2 + 0.85 * i2[Factor];
Q2 = 0.15 * Q2 + 0.85 * Q2[Factor];
//{Homodyne Discriminator}
//{Complex Conjugate Multiply}
X1 = i2 * i2[ Factor ];
x2 = i2 * Q2[ Factor ];
Y1 = Q2 * Q2[ Factor ];
Y2 = Q2 * i2[ Factor ];
Re = X1 + Y1;
im = X2 - Y2;
//{Smooth to remove undesired cross products}
Re = 0.2 * Re + 0.8 * Re[ Factor ];
im = 0.2 * im + 0.8 * im[ Factor ];
//{Compute Cycle Period}
If im != 0 AND Re != 0 then
Period = Div( 360, ATan( im / Re ) );
If Period > 1.5 * Period[ Factor ] then
Period = 1.5 * Period[ Factor ];
If Period < 0.67 * Period[ Factor ] then
Period = 0.67*Period[ Factor ];
If Period < 6 then
Period = 6;
If Period > 50 then
Period =50;
Period = 0.2 * Period + 0.8 * Period[ Factor ];
//{end core code}
Hilbert=Period;
end;
else
Hilbert=Period;
teargas
2006-09-07 19:07:38
앗 미안합니다. 빠진애들이 간단한 함수들이어서 잊어먹었습니다.^^
빠진 부분을 추가하오니 검토 부탁드립니다.
아래 말씀하신 부분과 연관지어 저도 다시 살펴보고 있습니다.
그럼, 수고하십시요.
** function Div
Inputs: Divend( numeric ), Divisor( numeric );
If Divend != 0 AND Divisor != 0 Then
Div = Divend / Divisor;
Else
Div = 0;
** function MTF
Inputs: Factor( numeric );
If FracPortion( Div( index+1, Factor ) ) == 0 Then
MTF = True;
Else
MTF = False;
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 변수의 과거값 참조
> 안녕하세요
예스스탁입니다.
현재 사용자함수 안에 또다른 사용자 함수가 있는관계로
정확히 테스트를 할 수 없습니다.
다만 N/A는 계산할수 없는 영역을 뜻합니다.
식상에 자기값을 참조하는 부분이 있거나..혹은
이전값 참조시 이전값을 참조할 수 없는 과거봉을 사용할 경우
(예를 들어 당일 첫봉에서 3봉전 가격)
등일 경우 n/a가 나올수 있습니다.
즐거운 하루되세요
> teargas 님이 쓴 글입니다.
> 제목 : 변수의 과거값 참조
> 안녕하세요?
아래와 같은 Hilbert Cycle Function을 만들려고 합니다.
원래 코드는 TS용입니다만, 이것을 예스랭귀지로 이식함이 목적입니다.
그런데 중간쯤의 변수 i2와 Q2의 과거값을 참조하는 부분을 MessageLog를
찍어보면 N/A로 나오더군요 ㅡㅡ;
i2 = 0.15 * i2 + 0.85 * i2[Factor];
^^^^^^^^^^
Q2 = 0.15 * Q2 + 0.85 * Q2[Factor];
^^^^^^^^^^
겉보기에 전혀 이상이 없어 보이고, 이외의 다른 과거값을 참조하는 부분에서는
문제가 없습니다. 여러모로 디버깅해보았지만 답을 찾을 수 없어
문의 드립니다. 수정 부탁드립니다.
그리고 한가지 더하자면,
예스랭귀지의 변수는 선언시에 할당한 초기값으로 초기화가 되는것으로 알고 있습니다.
그런데 중간에 N/A로 되는 경우가 있던데,, 어떤 경우에 이렇게 되는지
알고 싶습니다.
** input 변수는 1과 close를 사용하여 테스트하고 있습니다.
Inputs: Factor( numeric ), Price(numeric);
Vars: Smoother(0), Detrender(0), i1(0),Q1(0),j1(0),Jq(0),i2(0),Q2(0),
x1(0),x2(0),y1(0),Y2(0),Re(0),iM(0),Period(0), p1(0), inphase( 0 ), Phase( 0 ), dp( 0 ), dp2( 0 ), quad( 0 );
vars: t1(0), t2(0);
If index+1 > 5 * Factor AND MTF( Factor ) then
Begin
Smoother = ( 4 * Price + 3 * Price[ Factor ] + 2 * Price[ 2 * Factor ] + Price[ 3 * Factor ] ) / 10;
Detrender = ( 0.25 * Smoother + 0.75 * Smoother[ 2 * Factor ] - 0.75 * Smoother[ 4 * Factor ]- 0.25 * Smoother[ 6 * Factor ]) * ( 0.046 * Period[ Factor ] + 0.332 );
//{Compute InPhase and Quadrature components}
Q1= ( 0.25 * Detrender + 0.75 * Detrender[ 2 * Factor ] - 0.75 * Detrender[ 4 * Factor ] - 0.25 * Detrender[ 6 * Factor ]) * (.046 * Period[ Factor ] + 0.332 );
i1 = Detrender[ 3 * Factor ];
//{Advance the phase of i1 and Q1 by 90 degrees}
j1 = 0.25 * i1 + 0.75 * i1[ 2 * Factor ] - 0.75 * i1[ 2 * Factor ] - 0.25 * i1[ 2 * Factor ];
jQ = 0.25 * Q1 + 0.75 * Q1[ 2 * Factor ] - 0.75 * Q1[ 2 * Factor ] - 0.25 * Q1[ 2 * Factor ];
//{Phasor addition to equalize amplitude due to
// quadrature calculations (and 3 bar averaging}
i2 = i1 - jQ;
Q2 = Q1 + j1;
//{Smooth the i and Q components before applying the discrinator}
i2 = 0.15 * i2 + 0.85 * i2[Factor];
Q2 = 0.15 * Q2 + 0.85 * Q2[Factor];
//{Homodyne Discriminator}
//{Complex Conjugate Multiply}
X1 = i2 * i2[ Factor ];
x2 = i2 * Q2[ Factor ];
Y1 = Q2 * Q2[ Factor ];
Y2 = Q2 * i2[ Factor ];
Re = X1 + Y1;
im = X2 - Y2;
//{Smooth to remove undesired cross products}
Re = 0.2 * Re + 0.8 * Re[ Factor ];
im = 0.2 * im + 0.8 * im[ Factor ];
//{Compute Cycle Period}
If im != 0 AND Re != 0 then
Period = Div( 360, ATan( im / Re ) );
If Period > 1.5 * Period[ Factor ] then
Period = 1.5 * Period[ Factor ];
If Period < 0.67 * Period[ Factor ] then
Period = 0.67*Period[ Factor ];
If Period < 6 then
Period = 6;
If Period > 50 then
Period =50;
Period = 0.2 * Period + 0.8 * Period[ Factor ];
//{end core code}
Hilbert=Period;
end;
else
Hilbert=Period;
다음글
이전글