커뮤니티

해외선물 시고저종

프로필 이미지
히익
2023-10-30 00:45:03
943
글번호 173510
답변완료
안녕하세요 주말 잘 지내셨는지요 아래 식은 해외선물 매매할때 햇갈려서 시간대 나누어서 해당 시간대의 고가를 만든 사용자 함수 입니다. Inputs : DaysAgo(Numeric); var : DD(0),Year(0),V1(0),V2(0),V3(0),V4(0),summer(False); var : ET1(0),XT1(0),ET2(0),XT2(0),Tcond(False); Array : HighArray[50](0); if sDate != sDate[1] Then { DD = DayOfWeek(sDate); Year = Floor(sDate/10000); V1 = (10000 * Year) + (100 * 3) + 1; V2 = 15 - dayofweek(v1); v3 = (10000 * Year) + (100 * 11) + 1; v4 = 8 - dayofweek(v3); Summer = Sdate > (10000 * Year) + (100 * 3) + v2 and Sdate < (10000 * Year) + (100 * 11) + v4; if summer == False Then { ET1 = 233000; XT1 = 232500; } Else { ET1 = 233000-10000; XT1 = 232500-10000; } } Condition98=False; If Int((sDate[1]-int(sDate[1]/10000)*10000)/100)==2 Then { If sDate[1]+73==sDate Then Condition98=True; Else Condition98=False; } If (sDate[1]+70==sDate Or sDate[1]+71==sDate) Then Condition99=True; Else Condition99=False; If DataCompress <= 2 Then { if ((sDate != sDate[1] and sTime >= XT1) or (sDate == sDate[1] and sTime >= XT1 and sTime[1] < XT1)) or (sDate[1]+2<=sDate && Condition99==False && Condition98==False) Then { Tcond = False; } if (sDate != sDate[1] and sTime >= ET1) or (sDate == sDate[1] and sTime >= ET1 and sTime[1] < ET1) Then { Tcond = true; For Var1 = 49 DownTo 1 { HighArray[Var1] = HighArray[Var1 - 1]; } HighArray[0] = High; } If Tcond==True Then { If High > HighArray[0] Then HighArray[0] = High; } If DaysAgo < 50 && HighArray[DaysAgo] != -1 Then GoldHighD = HighArray[DaysAgo]; } else { GoldHighD = High[DaysAgo]; } ------------------------------------------------------------------------ 이런식으로 해당 시간대의 시고저종 함수를 모두 만들었습니다. 보시다시피 HighD,LowD,CloseD,OpenD 함수를 보고 만든건데, 문제가 분봉에서의 일봉 ATR함수를 만들어도 값이 제대로 반환이 안되더라구요. 아래는 그 수식입니다. input : P(Numeric); var : TH(0),TL(0),Sum(0),TR(0),DayATR(0),cnt(0); sum = 0; for cnt = 0 to P-1{ If GoldCloseD(cnt+1) > GoldHighD(cnt) then TH = GoldCloseD(cnt+1); else TH = GoldHighD(cnt); If GoldCloseD(cnt+1) < GoldLowD(cnt) then TL = GoldCloseD(cnt+1); else TL = GoldLowD(cnt); TR = TH-TL; Sum = Sum+TR; } GoldATRminute = Sum/P; --------------------------------------------------------------- 그래서 국내시장으로 다시 테스트해서 HighD와 같은 함수로 일중 ATR을 구하면 값이 반환되지 않고 dayhigh 같은 함수를 통해서만 값이 제대로 반환된다는 것을 알게 되었습니다. 근데 dayhigh 를 사용하면 또 해당 시간대의 시,고,저,종을 반환하지 못하게 되는데.. 혹시 이를 해결할 수 있는 방법이 있을까요? 항상 도움주셔서 감사합니다.
사용자 함수
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2023-10-31 17:53:01

안녕하세요 예스스탁입니다. 국내 64비트 버전에서는 해당 함수로 정상적으로 사용이 가능하지만 해외선물은 32비트 버전으로 사용자함수는 매개변수를 변동주기로 사용할 경우 정상적으로 값반환이 되지 않습니다. 사용자함수가 아닌 수식내에서 값을 구현해서 사용하셔야 합니다. input : P(10); var : TH(0),TL(0),Sum(0),TR(0),DayATR(0),cnt(0),GoldATRminute(0); var : DD(0),Year(0),V1(0),V2(0),V3(0),V4(0),summer(False); var : ET1(0),XT1(0),ET2(0),XT2(0),Tcond(False); Array : HighArray[50](0),LowArray[50](0),closeArray[50](0); if sDate != sDate[1] Then { DD = DayOfWeek(sDate); Year = Floor(sDate/10000); V1 = (10000 * Year) + (100 * 3) + 1; V2 = 15 - dayofweek(v1); v3 = (10000 * Year) + (100 * 11) + 1; v4 = 8 - dayofweek(v3); Summer = Sdate > (10000 * Year) + (100 * 3) + v2 and Sdate < (10000 * Year) + (100 * 11) + v4; if summer == False Then { ET1 = 233000; XT1 = 232500; } Else { ET1 = 233000-10000; XT1 = 232500-10000; } } Condition98=False; If Int((sDate[1]-int(sDate[1]/10000)*10000)/100)==2 Then { If sDate[1]+73==sDate Then Condition98=True; Else Condition98=False; } If (sDate[1]+70==sDate Or sDate[1]+71==sDate) Then Condition99=True; Else Condition99=False; If DataCompress <= 2 Then { if ((sDate != sDate[1] and sTime >= XT1) or (sDate == sDate[1] and sTime >= XT1 and sTime[1] < XT1)) or (sDate[1]+2<=sDate && Condition99==False && Condition98==False) Then { Tcond = False; } if (sDate != sDate[1] and sTime >= ET1) or (sDate == sDate[1] and sTime >= ET1 and sTime[1] < ET1) Then { Tcond = true; For Var1 = 49 DownTo 1 { HighArray[Var1] = HighArray[Var1 - 1]; LowArray[Var1] = LowArray[Var1 - 1]; CloseArray[Var1] = CloseArray[Var1 - 1]; } HighArray[0] = High; LowArray[0] = Low; CloseArray[0] = Close; } If Tcond==True Then { If High > HighArray[0] Then HighArray[0] = High; If low < LowArray[0] Then LowArray[0] = Low; CloseArray[0] = c; } if CloseArray[P] > 0 Then { sum = 0; for cnt = 0 to P-1{ If CloseArray[cnt+1] > HighArray[cnt] then TH = CloseArray[cnt+1]; else TH = HighArray[cnt]; If CloseArray[cnt+1] < LowArray[cnt] then TL = CloseArray[cnt+1]; else TL = LowArray[cnt]; TR = TH-TL; Sum = Sum+TR; } GoldATRminute = Sum/P; plot1(GoldATRminute); } } 즐거운 하루되세요 > 히익 님이 쓴 글입니다. > 제목 : 해외선물 시고저종 > 안녕하세요 주말 잘 지내셨는지요 아래 식은 해외선물 매매할때 햇갈려서 시간대 나누어서 해당 시간대의 고가를 만든 사용자 함수 입니다. Inputs : DaysAgo(Numeric); var : DD(0),Year(0),V1(0),V2(0),V3(0),V4(0),summer(False); var : ET1(0),XT1(0),ET2(0),XT2(0),Tcond(False); Array : HighArray[50](0); if sDate != sDate[1] Then { DD = DayOfWeek(sDate); Year = Floor(sDate/10000); V1 = (10000 * Year) + (100 * 3) + 1; V2 = 15 - dayofweek(v1); v3 = (10000 * Year) + (100 * 11) + 1; v4 = 8 - dayofweek(v3); Summer = Sdate > (10000 * Year) + (100 * 3) + v2 and Sdate < (10000 * Year) + (100 * 11) + v4; if summer == False Then { ET1 = 233000; XT1 = 232500; } Else { ET1 = 233000-10000; XT1 = 232500-10000; } } Condition98=False; If Int((sDate[1]-int(sDate[1]/10000)*10000)/100)==2 Then { If sDate[1]+73==sDate Then Condition98=True; Else Condition98=False; } If (sDate[1]+70==sDate Or sDate[1]+71==sDate) Then Condition99=True; Else Condition99=False; If DataCompress <= 2 Then { if ((sDate != sDate[1] and sTime >= XT1) or (sDate == sDate[1] and sTime >= XT1 and sTime[1] < XT1)) or (sDate[1]+2<=sDate && Condition99==False && Condition98==False) Then { Tcond = False; } if (sDate != sDate[1] and sTime >= ET1) or (sDate == sDate[1] and sTime >= ET1 and sTime[1] < ET1) Then { Tcond = true; For Var1 = 49 DownTo 1 { HighArray[Var1] = HighArray[Var1 - 1]; } HighArray[0] = High; } If Tcond==True Then { If High > HighArray[0] Then HighArray[0] = High; } If DaysAgo < 50 && HighArray[DaysAgo] != -1 Then GoldHighD = HighArray[DaysAgo]; } else { GoldHighD = High[DaysAgo]; } ------------------------------------------------------------------------ 이런식으로 해당 시간대의 시고저종 함수를 모두 만들었습니다. 보시다시피 HighD,LowD,CloseD,OpenD 함수를 보고 만든건데, 문제가 분봉에서의 일봉 ATR함수를 만들어도 값이 제대로 반환이 안되더라구요. 아래는 그 수식입니다. input : P(Numeric); var : TH(0),TL(0),Sum(0),TR(0),DayATR(0),cnt(0); sum = 0; for cnt = 0 to P-1{ If GoldCloseD(cnt+1) > GoldHighD(cnt) then TH = GoldCloseD(cnt+1); else TH = GoldHighD(cnt); If GoldCloseD(cnt+1) < GoldLowD(cnt) then TL = GoldCloseD(cnt+1); else TL = GoldLowD(cnt); TR = TH-TL; Sum = Sum+TR; } GoldATRminute = Sum/P; --------------------------------------------------------------- 그래서 국내시장으로 다시 테스트해서 HighD와 같은 함수로 일중 ATR을 구하면 값이 반환되지 않고 dayhigh 같은 함수를 통해서만 값이 제대로 반환된다는 것을 알게 되었습니다. 근데 dayhigh 를 사용하면 또 해당 시간대의 시,고,저,종을 반환하지 못하게 되는데.. 혹시 이를 해결할 수 있는 방법이 있을까요? 항상 도움주셔서 감사합니다.