커뮤니티

수식질문드립니다.

프로필 이미지
뚱띵
2018-11-02 12:19:54
2713
글번호 224651
답변완료
유선상으로 질문드린내용인데 구체적으로 써보면 예스스탁에서 배열변수를 이용해서 이동평균을 구하는 식입니다. 선물 시세가 수신될때마다 시세가 직전시세보다 높으면 변수 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문을 쓰면 된다고 하셨는데 우둔한 머리로 힘드네요. 수식을 부탁드리겠습니다.