유선상으로 질문드린내용인데 구체적으로 써보면
예스스탁에서 배열변수를 이용해서 이동평균을 구하는 식입니다.
선물 시세가 수신될때마다
시세가 직전시세보다 높으면 변수 a1에 그 거래량을 저장하고
1. 이 거래량의 30, 100, 이동평균과
2. 시스템 시작후 수집된 a1데이터의 전체평균을 구하는 겁니다. (수만건이 될수도 있습니다.)
변수를 배열변수로 지정하고 for문을 쓰면 된다고 하셨는데 우둔한 머리로 힘드네요.
수식을 부탁드리겠습니다.
답변 1
예스스탁
예스스탁 답변
2018-11-15 17:14:48
안녕하세요
예스스탁입니다.
1
1번 내용은 이전에 답변드린 아래 내용 참고하시기 바랍니다.
//배열변수 선언
var arr = [];
function Main_OnStart()
{
//조건 발생횟수 카운트
Accur = 0;
//1번 타이머(1초간격)
Main.SetTimer(1, 1000);
}
function Main_OnTimer(nEventID)
{
//1번 타이머 동작
if (nEventID == 1)
{
//새로운 이벤트가 발생하면 새로운 값을 0번방에 저장하기 전에
//기존의 각 배열방의 값을 다음방으로 이전
//예를 들어 현재 5번째 조건이 만족했다면
//arr[5]에는 arr[4]에 저장된값
//arr[4]에는 arr[3]에 저장된값
//arr[3]에는 arr[2]에 저장된값
//arr[2]에는 arr[1]에 저장된값
//arr[1]에는 arr[0]에 저장된값
//반드시 높은값에서 1까지 1씩 내려가면서 저장하게 하셔야 합니다.
//최대 100이평까지 계산한다면 배열방도 100이상은 저장하지 않게 제어해 주시는게 좋습니다.
//Accur와 100중에 작은값까지만 for루프가 수행되게 작성되어 있습니다.
//당일발생횟수마다 모두 저장하고자 하시면 Math.min(Accur,100) 대신에 Accur만 지정하셔도 됩니다.
//다만 메모리를 많이 사용하게 되므로 필요한 만큼만 저장해서 사용하시기를 권장해 드립니다.
for (var i = Math.min(Accur,100); i >= 1; i--)
{
arr[i] = arr[i-1];
}
//발생횟수 카운트 1증가
//카운트 증가계산식이 for문보다 아래 있는것은
//첫번째 조건만족시에는 0번방에만 값을 저장하면 되므로
//값을 넘기는 for문로직보다 아래에 위치시킴
Accur = Accur+1;
//0번방에 현재값 저장
//배열방은 0번방부터 존재합니다.
arr[0] = MarketData1.volume;
Main.MessageList("배열에 값 저장된 갯수 : ",arr.length,"::",arr);
//총 30개(0~29번방)이상 값이 저장되어 있고
if (arr.length >= 30)
{
//0번방에서 29번방 까지 값을 가져와 sum에 누적
var sum1 = 0;
var mavl
for (var i = 0; i <= 29; i++)
{
sum1 = sum1 + arr[i];
}
mav1 = sum1/30;
Main.MessageList("30이평 : ",mav1);
}
//총 100개(0~99번방)이상 값이 저장되어 있고
if (arr.length >= 100)
{
//0번방에서 29번방 까지 값을 가져와 sum에 누적
var sum2 = 0;
var mav2
for (var i = 0; i <= 29; i++)
{
sum2 = sum2 +arr[i];
}
mav2 = sum2/100;
Main.MessageList("100이평 : ",mav2);
}
}
}
2
시스템 시작후 a1의 평균은
일정갯수를 카운트할필요가 없어 오히려더 간단합니다.
영문 업데이트가 게시판 금칙어라 중간에 *이 추가되어 있습니다.
삭제하시기 바랍니다.
var sumv, sumi,mav;
var c1,c2;
function Main_OnStart()
{
Main.MessageList("시작");
sumv = 0;
sumi = 0;
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID) //*제거
{
if (lUp*dateID == 30001 && MarketData1.code == sItemCode) //*제거
{
pre = curr;
curr = MarketData1.current;
if (pre > 0 && curr > pre)
{
sumv = sumv + MarketData1.volume;
sumi = sumi + 1;
mav = sumv/sumi;
Main.MessageList("평균 : ",mav);
}
}
}
즐거운 하루되세요
> 뚱띵 님이 쓴 글입니다.
> 제목 : 수식질문드립니다.
> 유선상으로 질문드린내용인데 구체적으로 써보면
예스스탁에서 배열변수를 이용해서 이동평균을 구하는 식입니다.
선물 시세가 수신될때마다
시세가 직전시세보다 높으면 변수 a1에 그 거래량을 저장하고
1. 이 거래량의 30, 100, 이동평균과
2. 시스템 시작후 수집된 a1데이터의 전체평균을 구하는 겁니다. (수만건이 될수도 있습니다.)
변수를 배열변수로 지정하고 for문을 쓰면 된다고 하셨는데 우둔한 머리로 힘드네요.
수식을 부탁드리겠습니다.