커뮤니티

변수의 과거값 참조

프로필 이미지
teargas
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;