예스스탁
예스스탁 답변
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 를 사용하면 또 해당 시간대의 시,고,저,종을 반환하지 못하게 되는데.. 혹시 이를 해결할 수 있는 방법이 있을까요? 항상 도움주셔서 감사합니다.