커뮤니티

수식 문의드립니다.

프로필 이미지
이엘성투
2021-03-17 22:22:08
2828
글번호 225449
답변완료
안녕하세요 예스랭귀지에서 예스스팟으로 영역을 확대하려고 하는데... 이건 또 신세계네요 ㅠㅠ 예스랭귀지에 'PowerSearch1', 'PowerSearch2' 2개로 생성된 사용자검색조건 항목을 만들었습니다. 해당 이름으로 검색된 종목들을 3회 분할 매수하는 조건으로 예스스팟을 작성하고 싶습니다. - 1번 진입 : 50만원 - 2번 진입 : 10% 하락시 50만원 추가 진입 - 3번 진입 : 10% 추가 하락시 50만원 최종 진입 청산시에는 평균매수가 대비 100% 상승시 청산하는 조건으로 예스스팟 가이드 부탁드려도 될까요? 기본 가이드 제공해 주시면 수정해보면서 개선해 나가보겠습니다. 감사합니다 ^^
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2021-04-07 09:59:28

안녕하세요 예스스탁입니다. 1 아래 가이드수식을 참고하셔서 수정보완해 사용하시기 바랍니다. 9시 이후에 5분간격으로 종목검색을 하고 종목이 검색되면 주문가격등의 지정을 위해 종목객체를 생성하고 지정한금액으로 매수주문을 하게 됩니다. 1회이상 매수가 되면 10초간격으로 잔고체크해서 추가매수 혹은 익절매도하게 됩니다. 타이머의 간격이 너무 짧으면 부하가 많이 걸릴수 있으므로 적용해 보시고 적당한 시간가격을 지정해 주시면 됩니다. 2 스크립트객체설정 계좌객체 추가 --> 속성에서 객체명 Account1, 계좌번호 지정 var MKList = []; var MK = []; var OrderCount = []; var BuyPrice = []; var req; var MM = 500000; function Main_OnStart() { Main.SetTimer(1, 300000);//1번타이머, 주기 5분(종목검색간격) Main.SetTimer(2, 10000);//2번타이머, 주기 10초 (추가매수 타이밍 및 익절을 체크하는 시간간격) } //타이머동작 function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //1번타이머 if (nEventID == 1) { //9시 이후이면 if (HHMMSS >= 90000) { //타이머중지 Main.KillTimer(1); //종목검색실행 Main.ReqPowerSearch("사용자검색조건명"); } } //2번타이머 if (nEventID == 2 && HHMMSS >= 90000) { //2번타이머 중지 Main.KillTimer(2); //생성된 종목객체가 없으면(매수주문한 종목이 없다는 의미) if (MK.length == 0) { Main.SetTimer(2, 5000);//2번타이머 재동작 } else //생성된 종목객체가 있으면(1종목이상 매수주문상태) { for (var i = 0; i < MK.length; i++) { Account1.SetBalance(MK[i].code,0); if (Account1.Balance.count > 0 && BuyPrice[i] > 0) { if (OrderCount[i] < 3 && MK[i].current <= BuyPrice[i]*0.90) { //주문할 가격지정 var OrderPrice = MK[i].Ask(3); //50만원 매수주문 Account1.OrderBuy(MK[i].code,Math.floor(MM/OrderPrice),OrderPrice,0); Main.MessageList("추가매수주문",MK[i].code,OrderPrice); //매수주문횟수는 1 증가 OrderCount[i] = OrderCount[i]+1; //매수주문 가격 변경 BuyPrice[i] = OrderPrice; } //현재가가 평단가 대비 100% 이상이면 모두 청산 if (MK[i].current >= Account1.Balance.avgUnitCost*2.00) { Main.MessageList("매도주문",MK[i].code,MK[i].current,Account1.Balance.avgUnitCost); Account1.OrderSell(MK[i].code,Account1.Balance.count,MK[i].Bid(3),0); //청산후 해당 종목의 BuyPrice는 0으로 셋팅해 해당 종목으로 더이상 주문이 없게 함 BuyPrice[i] = 0; } } } } //2번 타이머 재가동 Main.SetTimer(2, 10000); } //3번 타이머 if (nEventID == 3 ) { //종료 Main.KillTimer(3); //다음종목 요청 Main.ReqMarketData(MKList[req]); Main.MessageList(req,"종목객체요청",MKList[req]); } } //종목검색완료 function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("검색된 종목수",nCount); //검색된 종목수가 1개 이상이면 if (nCount >= 1) { MKList = []; //첫검색이면 if (MK.length == 0) { //해당 종목코드 모두 종목객체요청 리스트에 추가 MKList = aItemList; } else //첫검색이 아니면 { //기존종목객체요청리스트에 없는 종목만 선별 for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MK.length; b++) { if (aItemList[a] == MK[b].code) { Add = false; } } if (Add == true) { MKList.push(aItemList[a]); } } } Main.MessageList("종목객체를 요청할 종목수:",MKList.length,"|리스트 :",MKList); //종목객체 요청할 종목수가 없으면 종목검색을 위해 타이머 다시 동작 if (MKList.length == 0) { Main.SetTimer(1, 300000);//종목검색타이머 재가동 } else //종목객체 요청할 종목수가 1이상이면 { //요청횟수는 초기값 0 req = 0; Main.MessageList(req,"종목객체요청",MKList[req]); //요청시작 Main.ReqMarketData(MKList[req]); } } } //요청산 종목객체가 만들어지먼 function Main_OnRcvMarketData(MarketData) { if (MarketData.code == MKList[req]) { Main.MessageList(req,"종목객체생성",MarketData.code); //MK배열변수에 순서대로 종목객체저장 MK.push(MarketData); //주문할 가격지정 var OrderPrice = MarketData.Ask(3); //50만원 매수주문 Account1.OrderBuy(MarketData.code,Math.floor(MM/OrderPrice),OrderPrice,0); Main.MessageList(req,"매수주문",MarketData.code,MarketData.Ask(1)); //매수주문 횟수 저장할 배열변수에 1저장 OrderCount.push(1); //매수주문 가격을 저장할 배열변수에 주문가격 저장 BuyPrice.push(OrderPrice); //요청횟수 1증가 req = req+1; //요청횟수가 요청할종목수 미만이면 if (req < MKList.length) { //다음종목 요청 Main.MessageList(req,"종목객체요청",MKList[req]); var S = Main.ReqMarketData(MKList[req]); //종목객체 제한시간에 걸리면(15초에 60개) if (S == -1) { //3번타이머 15초 셋팅 Main.SetTimer(3, 15000); } } else //모두 요청했으면 { //종목객체생성 끝 Main.MessageList(req,"종목객체생성끝"); //종목검색을 위해 타이머 다시 동작 Main.SetTimer(1, 300000);//종목검색타이머 재가동 } } } 즐거운 하루되세요 > 이엘성투 님이 쓴 글입니다. > 제목 : 수식 문의드립니다. > 안녕하세요 예스랭귀지에서 예스스팟으로 영역을 확대하려고 하는데... 이건 또 신세계네요 ㅠㅠ 예스랭귀지에 'PowerSearch1', 'PowerSearch2' 2개로 생성된 사용자검색조건 항목을 만들었습니다. 해당 이름으로 검색된 종목들을 3회 분할 매수하는 조건으로 예스스팟을 작성하고 싶습니다. - 1번 진입 : 50만원 - 2번 진입 : 10% 하락시 50만원 추가 진입 - 3번 진입 : 10% 추가 하락시 50만원 최종 진입 청산시에는 평균매수가 대비 100% 상승시 청산하는 조건으로 예스스팟 가이드 부탁드려도 될까요? 기본 가이드 제공해 주시면 수정해보면서 개선해 나가보겠습니다. 감사합니다 ^^