예스스탁
예스스탁 답변
2021-05-27 16:07:42
안녕하세요
예스스탁입니다.
1
배열변수가 가장최근 조건만족한 값은 MV[0,0],MV[1,0],MV[2,0]과 같이 방번호 0에 저장됩니다.
input : NCOs(4);
HighestHi = -1;
LowestLo = 9999;
For counter = 0 to NCOs-1
Begin
If MV[ 1 , counter ] > HighestHi then
HighestHi = MV[ 1 , counter ];
If MV[ 2 , counter ] < LowestLo then
LowestLo = MV[ 2 , counter ];
End;
위와 같이 최근 4(NCOs)개의 값을 이용해
이용하는 값은 최고와 최저를 구한다고 하면
MV[1,0],MV[1,1],MV[1,2],MV[1,3]
MV[2,0],MV[2,1],MV[2,2],MV[2,3]
위와 같이 0~3번방까지만 호출이 되어야 합니다.
-1이 없으면 아래와 같이 이용하는 값이 총 5개가 됩니다.
MV[1,0],MV[1,1],MV[1,2],MV[1,3],MV[1,4]
MV[2,0],MV[2,1],MV[2,2],MV[2,3],MV[2,4]
일반적으로 모든 시스템언어애서 현재봉 혹은 첫봉은 0으로 시작을 하게 됩니다.
그러므로 몇개를 지정해 데이타를 이용할 때 현재값의 인덱스가 0이므로
NCOs -1와 같이 지정하게 되는 것입니다.
2
NCos은 외부변수입니다.
언제든지 값을 변경할 수 있습니다. 갑변경에 대비하기 위해 잡혀있는것입니다.
만약 NCos이 4라고 해서
Array: MV[2,4](0);로 지정하고 For counter = 0 to 3으로 변경하면
이후에 NCos을 변경하면 수식내에서 배열크기도 직접 또 변경해야 합니다.
해당 부분은 NCos의 값변동이 없으면 배열크기를 더 작게 잡아도 관계는 없습니다.
해당 부분은 사용자분이 본인의 쓰임새에 맞춰 조정하시면 되는 부분입니다.
3
For counter = 0 to NCOs-1
{
실행문
}
FOR문은 최초값(0)부터 최종값(NCOs-1)까지 순차적으로 counter변수에 값을 할당하게 됩니다
counter변수에 값을 할당할때마다 하단의 내용을 수행하게 됩니다.
counter변수에 최종값까지 할당한 이후에는 해당 for문을 빠져나가게 됩니다.
counter에 0이 할당되면
MV[1,0]이 HighestHi보다 작으면 HighestHi변수에 MV[1,0]을 저장
MV[2,0]이 LowestLo보다 크면 LowestLo변수에 MV[2,0]을 저장
counter에 1이 할당되면
MV[1,1]이 HighestHi보다 크면 HighestHi변수에 MV[1,1]을 저장
MV[2,1]이 LowestLo보다 작으면 LowestLo변수에 MV[2,1]을 저장
counter에 2가 할당되면
MV[1,2]이 HighestHi보다 크면 HighestHi변수에 MV[1,2]를 저장
MV[2,2]이 LowestLo보다 작으면 LowestLo변수에 MV[2,2]를 저장
counter에 3가 할당되면
MV[1,3]이 HighestHi보다 크면 HighestHi변수에 MV[1,3]을 저장
MV[2,3]이 LowestLo보다 작으면 LowestLo변수에 MV[2,3]을 저장
위 내용으로 수행해서 최종 0~3번방의 값중 최고와 최저값을 계산하게 됩니다.
즐거운 하루되세요
> 부동여산 님이 쓴 글입니다.
> 제목 : 2차원배열 질문입니다
> 아래식은 2차원배열을 이용한 MACD매매인데요
Input: FastMA(20),SlowMA(30),MacdMA(40), NCos(4), NBars(60), AtrMult(0.0), Trailbar(30), stopPer(1.0);
Vars: MVal(0), MAvg(0), MDif(0),counter(0), MVunter(0), TotalBars(0), HighestHi(0), LowestLo(0);
Array: MV[2,50](0);
MVal = MACD(FastMA,SlowMA);
MAvg = ema(MACD(FastMA,SlowMA),MacdMA);
MDif = MVal - MAvg;
counter = 0;
If CrossUp(MDif , 0) OR CrossDown(MDIF , 0) Then Begin
For counter = 0 to 49 Begin
MV[ 0 , 50 - Counter ] = MV[ 0 , 49 - Counter ];
MV[ 1 , 50 - Counter ] = MV[ 1 , 49 - Counter ];
MV[ 2 , 50 - Counter ] = MV[ 2 , 49 - Counter ];
End;
MV[ 0 , 0 ] = Index;
MV[ 1, 0 ] = High;
MV[ 2, 0 ] = Low;
End;
HighestHi = -1;
LowestLo = 9999;
For counter = 0 to NCOs-1 Begin
If MV[ 1 , counter ] > HighestHi then
HighestHi = MV[ 1 , counter ];
If MV[ 2 , counter ] < LowestLo then
LowestLo = MV[ 2 , counter ];
End;
Totalbars = Index - MV[ 0 , NCOs - 1];
if date <> date[1] then var1 = date[1];
If TotalBars < NBars and exitdate(1) != var1 and stime < 150000 then Begin
Buy("B",atstop, HighestHi + ATR(30)*AtrMult) ;
Sell("S",atstop, LowestLo - ATR(30)*AtrMult) ;
End;
ExitLong("EL", atstop, Lowest( Low , TrailBar ));
ExitShort("ES", atstop, Highest( High , TrailBar));
SetStopLoss(StopPer);
SetStopEndofday(150000);
여기서 이해가 안가는 점이
HighestHi = -1;
LowestLo = 9999;
For counter = 0 to NCOs-1 Begin
If MV[ 1 , counter ] > HighestHi then
HighestHi = MV[ 1 , counter ];
If MV[ 2 , counter ] < LowestLo then
LowestLo = MV[ 2 , counter ];
End;
요 단락입니다.
1. 왜 굳이 NCOs -1 인가요? 그냥 처음부터 NCOs값을 한단계 줄여주면 되는거 아닌지?(NCOs를 4가아닌 3으로 설정한다던가..) 그냥 개인 스타일인지 문법적으로 이유가 있는건지 궁금합니다.
2. 애초에 최근 4개시점을 찾는데 왜 50개씩이나 저장해놓는건지 궁금합니다. NCOs값을 변경할수도 있으니 그냥 50개까지 저장해놓는건가요?
3. 해당단락에서 주석에 의하면 가장 높은 고가와 저가를 찾는것이라고 써져있는데, HighestHi 값이나 LowestLo 값을 보면 counter값은 무조건 3에서 끝나는거 아닌가요? 해당식이 어떤식으로 최근4개값중 가장 저가 고가를 골라내는것인지 궁금합니다
언제나 감사합니다 예스스탁화이팅!!