커뮤니티

스팟 수식 수정 부탁드립니다

프로필 이미지
mirror05
2018-01-29 18:01:05
3262
글번호 224320
답변완료
/* 아래는 게시판에 올라와 있는 종목검색후 자동주문하는 스팟식입니다. 아래와 같은 내용을 업그레이드 부탁드립니다. 1. 매수 및 손절은 파워 검색 종목이용 2. 청산은 보유 종목 중 'BollingerBandUP 하향 이탈'시 시장가로 자동청산(파워종목 검색 이용하지 않음) 3. Stoptrailing을 수익감소 3%로 설정 해주시면 감사드리겠습니다 */ var EntryMoney; var ItemList,Count; var MObj; var Scode = [], Blist = [], Slist = []; var Blistcount, Slistcount; var Req = 0; var con; function array_diff(a, b) { var tmp = {}, res = []; for(var i =0; i < a.length; i++) tmp[a[i]]=1; for(var i =0; i < b.length; i++) {if(tmp[b[i]]) delete tmp[b[i]];} for(var k in tmp) res.push(k); return res; } //스팟시작 function Main_OnStart() { //타이머설정 Main.MessageList("시작"); Main.ReqPowerSearch("수익률상위BBand") Main.SetTimer(1, 300000);//간격(300초 5분) EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); } function Main_OnTimer(nEventID) { //타이머동작하면 사용자검색조건 실행 if (nEventID == 1) { Main.MessageList("종목검색시작"); Main.ReqPowerSearch("Stest"); EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); Req = 0; } if (nEventID == 2 && Req < Blistcount) { if(Req <Blistcount) { Main.ReqMarketData(Blist[Req], 0, 0); Req = Req+1; Main.MessageList(Blist[Req-1], Req, Blistcount, "매수"); } if(Req == Blistcount) { Main.KillTimer(2); Req = 0; Slist = array_diff(Scode, ItemList); Slistcount = Slist.length; Main.MessageList(Slistcount); Main.SetTimer(3, 250); //간격(1초) } } if(nEventID == 3 && Req < Slistcount) { if(Req <Slistcount) { con = 2; Main.ReqMarketData(Slist[Req], 0, 0); Req = Req+1; Main.MessageList(Slist[Req-1], Req, "매도"); } if(Req == Slistcount) { Main.KillTimer(3); } } } //종목검색이 완료 function Main_OnRcvItemList(aItemList, nCount) { //검색종목수가 1개 이상이면 if (nCount >= 1) { ItemList = aItemList; Bcode = []; var num = Account1.GetTheNumberOfBalances(); //잔고셋팅해서 보유종목이 아니면 for(var i = 0; i < num; i ++) { Account1.SetBalance(i); Scode.push(Account1.Balance.code); } Blist = array_diff(ItemList, Scode); Req = 0; Blistcount = Blist.length; Main.MessageList(Blistcount, "매수수량") ; con = 1 ; Main.SetTimer(2, 250); //간격(1초) } } //요청한 종목객체가 생성되면 function Main_OnRcvMarketData(MarketData) { var EntryVol = 0; MObj = MarketData; //1주 단위일 경우 if (con == 1) { if(MObj.Ask(2) > 100000) { EntryVol = 1; } else { EntryVol = Math.floor(EntryMoney / MObj.Ask(2)); } if(EntreVol > 0) { Account1.OrderBuy(MObj.code, EntryVol, MObj.Ask(2), 0); } } //10주 단위일 경우 if (con == 2) { Account1.SetBalanceItem(MObj.code, 0); Account1.OrderSell(MObj.code, Account1.Balance.count, MObj.Bid(2), 0) } Main.RemoveMarketData(MObj); }
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2018-02-06 16:03:43

안녕하세요 예스스탁입니다. 'BollingerBandUP 하향 이탈'시를 종목객체의 일간데이터를 호출해서 계산하는 내용으로 추가해 드립니다. ReqMarketData의 두번째 매개변수가 일간데이터를 요청하는 부분입니다. 필요한 기간만큼 지정해 주시면 됩니다. Main.ReqMarketData(Slist[Req], 25, 0); 수식에서는 이전일이 필요하므로 일간 봉갯수는 넉넉히 25로 지정했습니다. 볼밴기간은 20, 배수는 2입니다. 현재 올려주신 수식 흐름에 영향이 없게 내용을 추가해 드리기 좀 어려워 식을 2개 올려드립니다. 1번식은 기존 매도수식을 해당내용으로 수정한 부분이고 2번식은 별도의 식입니다. 2번식은 단순히 1분 간격으로 계좌잔고의 종목의 볼밴을 계산해 전일은 종가가 위에 있다가 당일 아래로 내려오면 시장가로 청산하는 식입니다. 스팟은 꼭 모든 내용이 하나의 스팟식에 다 있을 필요는 없습니다. 단순 잔고파악해 청산하는 내용이면 별도로 작성해 각각 적용하셔도 됩니다. 올려드린 내용참고하셔서 수정보완해 사용하시기 바랍니다. 1번 var EntryMoney; var ItemList,Count; var MObj; var Scode = [], Blist = [], Slist = []; var Blistcount, Slistcount; var Req = 0; var con; function array_diff(a, b) { var tmp = {}, res = []; for(var i =0; i < a.length; i++) tmp[a[i]]=1; for(var i =0; i < b.length; i++) {if(tmp[b[i]]) delete tmp[b[i]];} for(var k in tmp) res.push(k); return res; } //스팟시작 function Main_OnStart() { //타이머설정 Main.MessageList("시작"); Main.ReqPowerSearch("수익률상위BBand"); Main.SetTimer(1, 300000);//간격(300초 5분) EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); } function Main_OnTimer(nEventID) { //타이머동작하면 사용자검색조건 실행 if (nEventID == 1) { Main.MessageList("종목검색시작"); Main.ReqPowerSearch("Stest"); EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); Req = 0; } if (nEventID == 2 && Req < Blistcount) { if(Req < Blistcount) { Main.ReqMarketData(Blist[Req], 0, 0); Req = Req+1; Main.MessageList(Blist[Req-1], Req, Blistcount, "매수"); } if(Req == Blistcount) { Main.KillTimer(2); Req = 0; Slist = array_diff(Scode, ItemList); Slistcount = Slist.length; Main.MessageList(Slistcount); Main.SetTimer(3, 250); //간격(1초) } } if(nEventID == 3 && Req < Slistcount) { if(Req < Slistcount) { con = 2; Main.ReqMarketData(Slist[Req], 21, 0); Req = Req+1; Main.MessageList(Slist[Req-1], Req, "매도"); } if(Req == Slistcount) { Main.KillTimer(3); } } } //종목검색이 완료 function Main_OnRcvItemList(aItemList, nCount) { //검색종목수가 1개 이상이면 if (nCount >= 1) { ItemList = aItemList; Bcode = []; var num = Account1.GetTheNumberOfBalances(); //잔고셋팅해서 보유종목이 아니면 for(var i = 0; i < num; i ++) { Account1.SetBalance(i); Scode.push(Account1.Balance.code); } Blist = array_diff(ItemList, Scode); Req = 0; Blistcount = Blist.length; Main.MessageList(Blistcount, "매수수량") ; con = 1 ; Main.SetTimer(2, 250); //간격(1초) } } //요청한 종목객체가 생성되면 function Main_OnRcvMarketData(MarketData) { var EntryVol = 0; MObj = MarketData; if (con == 1) { if(MObj.Ask(2) > 100000) { EntryVol = 1; } else { EntryVol = Math.floor(EntryMoney / MObj.Ask(2)); } if(EntryVol > 0) { Account1.OrderBuy(MObj.code, EntryVol, MObj.Ask(2), 0); } } if (con == 2) { Account1.SetBalanceItem(MObj.code, 0); if (Account1.Balance > 0 && MObj.GetPrevCount() >= 20) { //당일과 전일기준 이평계산 var sum0 = MObj.current; var sum1 = 0; for (var i = 1; i <= 20;i++) { if (i < 20) { sum0 = sum0 + MObj.GetPrevClose(i); } sum1 = sum1 + MObj.GetPrevClose(i); } var mav0 = sum0/20; var mav1 = sum1/20; //당일과 전일기준 표준편차 계산 var SumSqrt0 = (MObj.current - mav0)*(MObj.current - mav0); var SumSqrt1 = 0; for (var i = 1; i <= 20;i++) { if (i < 20) { SumSqrt0 = SumSqrt0 + (MObj.GetPrevClose(i) - mav0)*(MObj.GetPrevClose(i) - mav0); } SumSqrt1 = SumSqrt1 + (MObj.GetPrevClose(i) - mav1)*(MObj.GetPrevClose(i) - mav1); } var std0 = Math.sqrt(SumSqrt0/20); var std1 = Math.sqrt(SumSqrt1/20); //볼밴상단 계산 var BBup0 = mav0+std0*2; var BBup1 = mav1+std1*2; //현재가는 상단아래 , 전일은 종가거 상단위 if (MObj.current < BBup0 && MObj.GetPrevClose(i) > BBup1) { Account1.OrderSell(MObj.code, Account1.Balance.count, MObj.Bid(2), 0) } } } Main.RemoveMarketData(MObj); } 2번 var Xnum = 0,DataRcv = false; var Xreq; var BuyList = []; function Main_OnStart() { Main.SetTimer(11, 60000); //간격 60초분 } function Main_OnTimer(nEventID) { if (DataRcv == false && nEventID == 11) { Xnum = Account1.GetTheNumberOfBalances() if (Xnum > 0) { DataRcv = true; //보유종목 종목코드 BuyList = []; for (var i = 0; i < Xnum;i++) { Account1.SetBalance(i); BuyList.push(Account1.Balance.code); } Xreq = 0; Main.MessageList("보유종목 종목객체 요청",BuyList[Xreq]); Main.ReqMarketData(BuyList[Xreq], 25,0); } } } function Main_OnRcvMarketData(MarketData) { var XData = MarketData; if (DataRcv == true && XData.GetPrevClose(20) > 0) { //당일과 전일기준 이평계산 var sum0 = XData.current; var sum1 = 0; for (var i = 1; i <= 20;i++) { if (i < 20) { sum0 = sum0 + XData.GetPrevClose(i); } sum1 = sum1 + XData.GetPrevClose(i); } var mav0 = sum0/20; var mav1 = sum1/20; //당일과 전일기준 표준편차 계산 var SumSqrt0 = (XData.current - mav0)*(XData.current - mav0); var SumSqrt1 = 0; for (var i = 1; i <= 20;i++) { if (i < 20) { SumSqrt0 = SumSqrt0 + (XData.GetPrevClose(i) - mav0)*(XData.GetPrevClose(i) - mav0); } SumSqrt1 = SumSqrt1 + (XData.GetPrevClose(i) - mav1)*(XData.GetPrevClose(i) - mav1); } var std0 = Math.sqrt(SumSqrt0/20); var std1 = Math.sqrt(SumSqrt1/20); //볼밴상단 계산 var BBup0 = mav0+std0*2; var BBup1 = mav1+std1*2; Main.MessageList("|현재가 : ",XData.current,"|당일볼밴 :",BBup0,"|전일종가 : ",XData.GetPrevClose(1),"|전일볼밴 : ",BBup1); //현재가는 상단아래 , 전일은 종가가 상단위 if (XData.current < BBup0 && XData.GetPrevClose(1) > BBup1) { Account1.OrderSell(XData.code, Account1.Balance.count,0,1); } } Main.RemoveMarketData(XData); Xreq = Xreq +1; if (Xreq < Xnum) { Main.MessageList("보유종목 종목객체 요청",BuyList[Xreq]); Main.ReqMarketData(BuyList[Xreq], 25,0); } if (Xreq == Xnum) { DataRcv = false; Main.MessageList("보유종목 종목객체 볼밴처리끝"); } } 즐거운 하루되세요 > mirror05 님이 쓴 글입니다. > 제목 : 스팟 수식 수정 부탁드립니다 > /* 아래는 게시판에 올라와 있는 종목검색후 자동주문하는 스팟식입니다. 아래와 같은 내용을 업그레이드 부탁드립니다. 1. 매수 및 손절은 파워 검색 종목이용 2. 청산은 보유 종목 중 'BollingerBandUP 하향 이탈'시 시장가로 자동청산(파워종목 검색 이용하지 않음) 3. Stoptrailing을 수익감소 3%로 설정 해주시면 감사드리겠습니다 */ var EntryMoney; var ItemList,Count; var MObj; var Scode = [], Blist = [], Slist = []; var Blistcount, Slistcount; var Req = 0; var con; function array_diff(a, b) { var tmp = {}, res = []; for(var i =0; i < a.length; i++) tmp[a[i]]=1; for(var i =0; i < b.length; i++) {if(tmp[b[i]]) delete tmp[b[i]];} for(var k in tmp) res.push(k); return res; } //스팟시작 function Main_OnStart() { //타이머설정 Main.MessageList("시작"); Main.ReqPowerSearch("수익률상위BBand") Main.SetTimer(1, 300000);//간격(300초 5분) EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); } function Main_OnTimer(nEventID) { //타이머동작하면 사용자검색조건 실행 if (nEventID == 1) { Main.MessageList("종목검색시작"); Main.ReqPowerSearch("Stest"); EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); Req = 0; } if (nEventID == 2 && Req < Blistcount) { if(Req <Blistcount) { Main.ReqMarketData(Blist[Req], 0, 0); Req = Req+1; Main.MessageList(Blist[Req-1], Req, Blistcount, "매수"); } if(Req == Blistcount) { Main.KillTimer(2); Req = 0; Slist = array_diff(Scode, ItemList); Slistcount = Slist.length; Main.MessageList(Slistcount); Main.SetTimer(3, 250); //간격(1초) } } if(nEventID == 3 && Req < Slistcount) { if(Req <Slistcount) { con = 2; Main.ReqMarketData(Slist[Req], 0, 0); Req = Req+1; Main.MessageList(Slist[Req-1], Req, "매도"); } if(Req == Slistcount) { Main.KillTimer(3); } } } //종목검색이 완료 function Main_OnRcvItemList(aItemList, nCount) { //검색종목수가 1개 이상이면 if (nCount >= 1) { ItemList = aItemList; Bcode = []; var num = Account1.GetTheNumberOfBalances(); //잔고셋팅해서 보유종목이 아니면 for(var i = 0; i < num; i ++) { Account1.SetBalance(i); Scode.push(Account1.Balance.code); } Blist = array_diff(ItemList, Scode); Req = 0; Blistcount = Blist.length; Main.MessageList(Blistcount, "매수수량") ; con = 1 ; Main.SetTimer(2, 250); //간격(1초) } } //요청한 종목객체가 생성되면 function Main_OnRcvMarketData(MarketData) { var EntryVol = 0; MObj = MarketData; //1주 단위일 경우 if (con == 1) { if(MObj.Ask(2) > 100000) { EntryVol = 1; } else { EntryVol = Math.floor(EntryMoney / MObj.Ask(2)); } if(EntreVol > 0) { Account1.OrderBuy(MObj.code, EntryVol, MObj.Ask(2), 0); } } //10주 단위일 경우 if (con == 2) { Account1.SetBalanceItem(MObj.code, 0); Account1.OrderSell(MObj.code, Account1.Balance.count, MObj.Bid(2), 0) } Main.RemoveMarketData(MObj); }
프로필 이미지

mirror05

2018-02-07 16:54:45

통화한 내용 이상으로 수정을 잘 해 주셔서 감사드립니다 수고하세요 > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 스팟 수식 수정 부탁드립니다 > 안녕하세요 예스스탁입니다. 'BollingerBandUP 하향 이탈'시를 종목객체의 일간데이터를 호출해서 계산하는 내용으로 추가해 드립니다. ReqMarketData의 두번째 매개변수가 일간데이터를 요청하는 부분입니다. 필요한 기간만큼 지정해 주시면 됩니다. Main.ReqMarketData(Slist[Req], 25, 0); 수식에서는 이전일이 필요하므로 일간 봉갯수는 넉넉히 25로 지정했습니다. 볼밴기간은 20, 배수는 2입니다. 현재 올려주신 수식 흐름에 영향이 없게 내용을 추가해 드리기 좀 어려워 식을 2개 올려드립니다. 1번식은 기존 매도수식을 해당내용으로 수정한 부분이고 2번식은 별도의 식입니다. 2번식은 단순히 1분 간격으로 계좌잔고의 종목의 볼밴을 계산해 전일은 종가가 위에 있다가 당일 아래로 내려오면 시장가로 청산하는 식입니다. 스팟은 꼭 모든 내용이 하나의 스팟식에 다 있을 필요는 없습니다. 단순 잔고파악해 청산하는 내용이면 별도로 작성해 각각 적용하셔도 됩니다. 올려드린 내용참고하셔서 수정보완해 사용하시기 바랍니다. 1번 var EntryMoney; var ItemList,Count; var MObj; var Scode = [], Blist = [], Slist = []; var Blistcount, Slistcount; var Req = 0; var con; function array_diff(a, b) { var tmp = {}, res = []; for(var i =0; i < a.length; i++) tmp[a[i]]=1; for(var i =0; i < b.length; i++) {if(tmp[b[i]]) delete tmp[b[i]];} for(var k in tmp) res.push(k); return res; } //스팟시작 function Main_OnStart() { //타이머설정 Main.MessageList("시작"); Main.ReqPowerSearch("수익률상위BBand"); Main.SetTimer(1, 300000);//간격(300초 5분) EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); } function Main_OnTimer(nEventID) { //타이머동작하면 사용자검색조건 실행 if (nEventID == 1) { Main.MessageList("종목검색시작"); Main.ReqPowerSearch("Stest"); EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); Req = 0; } if (nEventID == 2 && Req < Blistcount) { if(Req < Blistcount) { Main.ReqMarketData(Blist[Req], 0, 0); Req = Req+1; Main.MessageList(Blist[Req-1], Req, Blistcount, "매수"); } if(Req == Blistcount) { Main.KillTimer(2); Req = 0; Slist = array_diff(Scode, ItemList); Slistcount = Slist.length; Main.MessageList(Slistcount); Main.SetTimer(3, 250); //간격(1초) } } if(nEventID == 3 && Req < Slistcount) { if(Req < Slistcount) { con = 2; Main.ReqMarketData(Slist[Req], 21, 0); Req = Req+1; Main.MessageList(Slist[Req-1], Req, "매도"); } if(Req == Slistcount) { Main.KillTimer(3); } } } //종목검색이 완료 function Main_OnRcvItemList(aItemList, nCount) { //검색종목수가 1개 이상이면 if (nCount >= 1) { ItemList = aItemList; Bcode = []; var num = Account1.GetTheNumberOfBalances(); //잔고셋팅해서 보유종목이 아니면 for(var i = 0; i < num; i ++) { Account1.SetBalance(i); Scode.push(Account1.Balance.code); } Blist = array_diff(ItemList, Scode); Req = 0; Blistcount = Blist.length; Main.MessageList(Blistcount, "매수수량") ; con = 1 ; Main.SetTimer(2, 250); //간격(1초) } } //요청한 종목객체가 생성되면 function Main_OnRcvMarketData(MarketData) { var EntryVol = 0; MObj = MarketData; if (con == 1) { if(MObj.Ask(2) > 100000) { EntryVol = 1; } else { EntryVol = Math.floor(EntryMoney / MObj.Ask(2)); } if(EntryVol > 0) { Account1.OrderBuy(MObj.code, EntryVol, MObj.Ask(2), 0); } } if (con == 2) { Account1.SetBalanceItem(MObj.code, 0); if (Account1.Balance > 0 && MObj.GetPrevCount() >= 20) { //당일과 전일기준 이평계산 var sum0 = MObj.current; var sum1 = 0; for (var i = 1; i <= 20;i++) { if (i < 20) { sum0 = sum0 + MObj.GetPrevClose(i); } sum1 = sum1 + MObj.GetPrevClose(i); } var mav0 = sum0/20; var mav1 = sum1/20; //당일과 전일기준 표준편차 계산 var SumSqrt0 = (MObj.current - mav0)*(MObj.current - mav0); var SumSqrt1 = 0; for (var i = 1; i <= 20;i++) { if (i < 20) { SumSqrt0 = SumSqrt0 + (MObj.GetPrevClose(i) - mav0)*(MObj.GetPrevClose(i) - mav0); } SumSqrt1 = SumSqrt1 + (MObj.GetPrevClose(i) - mav1)*(MObj.GetPrevClose(i) - mav1); } var std0 = Math.sqrt(SumSqrt0/20); var std1 = Math.sqrt(SumSqrt1/20); //볼밴상단 계산 var BBup0 = mav0+std0*2; var BBup1 = mav1+std1*2; //현재가는 상단아래 , 전일은 종가거 상단위 if (MObj.current < BBup0 && MObj.GetPrevClose(i) > BBup1) { Account1.OrderSell(MObj.code, Account1.Balance.count, MObj.Bid(2), 0) } } } Main.RemoveMarketData(MObj); } 2번 var Xnum = 0,DataRcv = false; var Xreq; var BuyList = []; function Main_OnStart() { Main.SetTimer(11, 60000); //간격 60초분 } function Main_OnTimer(nEventID) { if (DataRcv == false && nEventID == 11) { Xnum = Account1.GetTheNumberOfBalances() if (Xnum > 0) { DataRcv = true; //보유종목 종목코드 BuyList = []; for (var i = 0; i < Xnum;i++) { Account1.SetBalance(i); BuyList.push(Account1.Balance.code); } Xreq = 0; Main.MessageList("보유종목 종목객체 요청",BuyList[Xreq]); Main.ReqMarketData(BuyList[Xreq], 25,0); } } } function Main_OnRcvMarketData(MarketData) { var XData = MarketData; if (DataRcv == true && XData.GetPrevClose(20) > 0) { //당일과 전일기준 이평계산 var sum0 = XData.current; var sum1 = 0; for (var i = 1; i <= 20;i++) { if (i < 20) { sum0 = sum0 + XData.GetPrevClose(i); } sum1 = sum1 + XData.GetPrevClose(i); } var mav0 = sum0/20; var mav1 = sum1/20; //당일과 전일기준 표준편차 계산 var SumSqrt0 = (XData.current - mav0)*(XData.current - mav0); var SumSqrt1 = 0; for (var i = 1; i <= 20;i++) { if (i < 20) { SumSqrt0 = SumSqrt0 + (XData.GetPrevClose(i) - mav0)*(XData.GetPrevClose(i) - mav0); } SumSqrt1 = SumSqrt1 + (XData.GetPrevClose(i) - mav1)*(XData.GetPrevClose(i) - mav1); } var std0 = Math.sqrt(SumSqrt0/20); var std1 = Math.sqrt(SumSqrt1/20); //볼밴상단 계산 var BBup0 = mav0+std0*2; var BBup1 = mav1+std1*2; Main.MessageList("|현재가 : ",XData.current,"|당일볼밴 :",BBup0,"|전일종가 : ",XData.GetPrevClose(1),"|전일볼밴 : ",BBup1); //현재가는 상단아래 , 전일은 종가가 상단위 if (XData.current < BBup0 && XData.GetPrevClose(1) > BBup1) { Account1.OrderSell(XData.code, Account1.Balance.count,0,1); } } Main.RemoveMarketData(XData); Xreq = Xreq +1; if (Xreq < Xnum) { Main.MessageList("보유종목 종목객체 요청",BuyList[Xreq]); Main.ReqMarketData(BuyList[Xreq], 25,0); } if (Xreq == Xnum) { DataRcv = false; Main.MessageList("보유종목 종목객체 볼밴처리끝"); } } 즐거운 하루되세요 > mirror05 님이 쓴 글입니다. > 제목 : 스팟 수식 수정 부탁드립니다 > /* 아래는 게시판에 올라와 있는 종목검색후 자동주문하는 스팟식입니다. 아래와 같은 내용을 업그레이드 부탁드립니다. 1. 매수 및 손절은 파워 검색 종목이용 2. 청산은 보유 종목 중 'BollingerBandUP 하향 이탈'시 시장가로 자동청산(파워종목 검색 이용하지 않음) 3. Stoptrailing을 수익감소 3%로 설정 해주시면 감사드리겠습니다 */ var EntryMoney; var ItemList,Count; var MObj; var Scode = [], Blist = [], Slist = []; var Blistcount, Slistcount; var Req = 0; var con; function array_diff(a, b) { var tmp = {}, res = []; for(var i =0; i < a.length; i++) tmp[a[i]]=1; for(var i =0; i < b.length; i++) {if(tmp[b[i]]) delete tmp[b[i]];} for(var k in tmp) res.push(k); return res; } //스팟시작 function Main_OnStart() { //타이머설정 Main.MessageList("시작"); Main.ReqPowerSearch("수익률상위BBand") Main.SetTimer(1, 300000);//간격(300초 5분) EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); } function Main_OnTimer(nEventID) { //타이머동작하면 사용자검색조건 실행 if (nEventID == 1) { Main.MessageList("종목검색시작"); Main.ReqPowerSearch("Stest"); EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); Req = 0; } if (nEventID == 2 && Req < Blistcount) { if(Req <Blistcount) { Main.ReqMarketData(Blist[Req], 0, 0); Req = Req+1; Main.MessageList(Blist[Req-1], Req, Blistcount, "매수"); } if(Req == Blistcount) { Main.KillTimer(2); Req = 0; Slist = array_diff(Scode, ItemList); Slistcount = Slist.length; Main.MessageList(Slistcount); Main.SetTimer(3, 250); //간격(1초) } } if(nEventID == 3 && Req < Slistcount) { if(Req <Slistcount) { con = 2; Main.ReqMarketData(Slist[Req], 0, 0); Req = Req+1; Main.MessageList(Slist[Req-1], Req, "매도"); } if(Req == Slistcount) { Main.KillTimer(3); } } } //종목검색이 완료 function Main_OnRcvItemList(aItemList, nCount) { //검색종목수가 1개 이상이면 if (nCount >= 1) { ItemList = aItemList; Bcode = []; var num = Account1.GetTheNumberOfBalances(); //잔고셋팅해서 보유종목이 아니면 for(var i = 0; i < num; i ++) { Account1.SetBalance(i); Scode.push(Account1.Balance.code); } Blist = array_diff(ItemList, Scode); Req = 0; Blistcount = Blist.length; Main.MessageList(Blistcount, "매수수량") ; con = 1 ; Main.SetTimer(2, 250); //간격(1초) } } //요청한 종목객체가 생성되면 function Main_OnRcvMarketData(MarketData) { var EntryVol = 0; MObj = MarketData; //1주 단위일 경우 if (con == 1) { if(MObj.Ask(2) > 100000) { EntryVol = 1; } else { EntryVol = Math.floor(EntryMoney / MObj.Ask(2)); } if(EntreVol > 0) { Account1.OrderBuy(MObj.code, EntryVol, MObj.Ask(2), 0); } } //10주 단위일 경우 if (con == 2) { Account1.SetBalanceItem(MObj.code, 0); Account1.OrderSell(MObj.code, Account1.Balance.count, MObj.Bid(2), 0) } Main.RemoveMarketData(MObj); }