커뮤니티

수식 문의 드립니다

프로필 이미지
차사
2014-02-22 17:33:45
1558
글번호 222826
답변완료
수고가 많어십니다. 아래는 예스스팟에서 작성하신 프로그램수식입니다. 아래의 수식을 적용하는 과정에서 어려움을 겪어 수식문의 드립니다. 질문1 ; 아래의 최대10종목까지 적용된다고 하셨는데, 수식 작성자가 임의로 설정한 수량인가요?? 아님 예스스팟에서 사용할 수 있는 최대 수량인가요? 질문2 : 저의 경우는 선물 포지션 신호를 이용하여 선물/옵션 합성거래를 합니다. 이런 경우 합성포지션상에는 콜매수;콜매도; 풋매수;풋매도 및 선물이 섞이게 됩니다. 즉, 선물신호에 따라 특정 가격대의 옵션을 매수/매도 합니다. 아래의 수식에서 주식이 아니라 콜매수2종목/콜매도2종목/풋매수2종목/풋매도2종목/선물이 존재한다고 가정하고, 일정가격에 도달하면 스톱트레일링상 전종목 청산이 아니라 1/2만 청산하는 수식을 부탁드립니다. 나머지 물량은 선물신호상에서 청산 신호가 발생할때 청산할 것입니다. ## 예스스팟 제공 수식 아래는 계좌에 매수하여 종목이 추가되면 해당 종목에 대해 목표수익과 손절매, 트레일링스탑을 적용하는 식입니다. 최대 10종목까지 수행됩니다. 식작성하실 때 참고하시기 바랍니다. 스크립트 객체화면에 계좌객체가 필요합니다. 객체명 Account1 var Nth = 0; var ItemCode = new Array(10); var ItemObject = new Array(10); var ItemHigh = new Array(10); //종목객체 시세 업데이트 function Main_OnUp*dateMarket(sItemCode, lUp*dateID) // *제거 { //편입된 종목수 만&#53380;만 수행 for (var i = 1; i <= Nth; i++) { if (ItemObject[i].code == sItemCode && lUp*dateID == 20001) { Main.MessageList("-----------------------------------------------"); Main.MessageList(ItemObject[i].code,"업데이트"); //잔고셋팅 Account1.SetBalanceItem(ItemObject[i].code,0); //종목편입 이후의 최고가 계산 if (ItemObject[i].current > ItemHigh[i]) { ItemHigh[i] = ItemObject[i].current; } //매수잔고 if (Account1.Balance.position == 2) { //현재가가 평균단가 대비 10%이상 상승하면 매도 if (ItemObject[i].current >= Account1.Balance.avgUnitCost*1.10) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제"); } // 현재가가 평균단가 대비 10%이상 하락하면 매도 if (ItemObject[i].current <= Account1.Balance.avgUnitCost*0.90) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제"); } //현재가가 평균단가 대비 8% 이상 상승후 평균단가+5%까지 하락하면 매도주문 if (ItemHigh[i] >= Account1.Balance.avgUnitCost*1.08 && ItemObject[i].current <= Account1.Balance.avgUnitCost*1.05) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("TR청산 : ",ItemObject[i].code,"종목객체삭제"); } } Main.MessageList("-----------------------------------------------"); Main.MessageList("종 목 : ",ItemObject[i].code); Main.MessageList("평균단가 : ",Account1.Balance.avgUnitCost); Main.MessageList("현 재 가 : ",ItemObject[i].current); Main.MessageList("진입최고 : ",ItemHigh[i]); } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2014-03-03 18:30:57

안녕하세요 예스스탁입니다. 1. 예 임의로 지정한 갯수입니다. 배열방 갯수를 늘리시됩니다. 2. 스팟수식은 모두 실제 주문과 관계됨으로 저희쪽에서 완전히 테스트해 올려드릴 수는 없습니다. 답변드리는 내용은 가이드입니다. 아래식 참고하셔서 수정 보완해 사용하시기 바랍니다. 스팟수식안에 게시판의 금칙어가 있습니다. 영문 업데이트가 Up*date와 같이 중간에 *가 들어가 있습니다. *제거 하시고 사용하셔야 합니다. var Nth = 0; var ItemCode = new Array(100);//갯수 var ItemObject = new Array(100);//갯수 var ItemHigh = new Array(100);//갯수 var ItemLow = new Array(100);//갯수 function Main_OnStart() { Main.MessageList("스팟시작") } //잔고에 종목이 추가된다면 function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) //*삭제 { if (sAccntNum == Account1.number && lUp*dateID == 30001) //*삭제 { //잔고 추가 순서 Nth = Nth+1; //Nth번째 종목객체 생성요청 Main.ReqMarketData(Account1.Balance.code,20,0); //ItemCode의 [Nth]번째 방에 종목코드 저장 ItemCode[Nth] = Account1.Balance.code; Main.MessageList("종목객체요청",Account1.Balance.code); } } //요청한 종목객체 수신되면 function Main_OnRcvMarketData(MarketData) { Main.MessageList("종목객체수신",MarketData.code); //수신받은 종목객체의 종목코드와 직전에 요청한 종목과 같은지 확인 후에 if (MarketData.code == ItemCode[Nth]) { Main.MessageList(Nth,"번째","종목객체생성완료 : ",ItemObject[Nth].code); ItemObject[Nth] = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장 ItemHigh[Nth] = 0; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최고값 계산해 저장할 변수) ItemLow[Nth] = 99999; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최저값 계산해 저장할 변수) } } //종목객체 시세 업데이트 function Main_OnUp*dateMarket(sItemCode, lUp*dateID)// *제거 { //편입된 종목수 만&#53380;만 수행 for (var i = 0; i < Nth; i++) { if (ItemObject[i].code == sItemCode && lUp*dateID == 20001)// *제거 { Main.MessageList("-----------------------------------------------"); Main.MessageList(ItemObject[i].code,"업데이트"); //종목편입 이후의 최고가 계산 if (ItemObject[i].current > ItemHigh[i]) { ItemHigh[i] = ItemObject[i].current; } //종목편입 이후의 최저가 계산 if (ItemObject[i].current < ItemLow[i]) { ItemLow[i] = ItemObject[i].current; } //잔고셋팅 Account1.SetBalanceItem(ItemObject[i].code,0); //매수포지션 일 경우 if (Account1.Balance.position == 2) { //현재가가 평균단가 대비 10%이상 상승하면 목표이익 청산 if (ItemObject[i].current >= Account1.Balance.avgUnitCost*1.10) { Account1.OrderSell(Account1.Balance.code,Math.floor(Account1.Balance.count*0.5), 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제"); } // 현재가가 평균단가 대비 5%이상 하락하면 손절청산 if (ItemObject[i].current <= Account1.Balance.avgUnitCost*0.95) { Account1.OrderSell(Account1.Balance.code,Math.floor(Account1.Balance.count*0.5), 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제"); } //현재가가 평균단가 대비 7% 이상 상승후 평균단가+5%까지 하락하면 청산 if (ItemHigh[i] >= Account1.Balance.avgUnitCost*1.07 && ItemObject[i].current <= Account1.Balance.avgUnitCost*1.05) { Account1.OrderSell(Account1.Balance.code,Math.floor(Account1.Balance.count*0.5), 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("TR청산 : ",ItemObject[i].code,"종목객체삭제"); } } //매도포지션일 경우 if (Account1.Balance.position == 1) { //현재가가 평균단가 대비 10%이상 하락하면 목표이익청산 if (ItemObject[i].current <= Account1.Balance.avgUnitCost*0.90) { Account1.OrderSell(Account1.Balance.code,Math.floor(Account1.Balance.count*0.5), 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제"); } // 현재가가 평균단가 대비 5%이상 상승하면 손절매도 if (ItemObject[i].current >= Account1.Balance.avgUnitCost*1.05) { Account1.OrderSell(Account1.Balance.code,Math.floor(Account1.Balance.count*0.5), 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제"); } //현재가가 평균단가 대비 -7% 이상 하락후 평균단가-5%까지 상승하면 매도주문 if (ItemLow[i] <= Account1.Balance.avgUnitCost*0.93 && ItemObject[i].current >= Account1.Balance.avgUnitCost*0.95) { Account1.OrderSell(Account1.Balance.code,Math.floor(Account1.Balance.count*0.5), 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("TR청산 : ",ItemObject[i].code,"종목객체삭제"); } } } } Main.MessageList("-----------------------------------------------"); Main.MessageList("종 목 : ",ItemObject[i].code); Main.MessageList("평균단가 : ",Account1.Balance.avgUnitCost); Main.MessageList("현 재 가 : ",ItemObject[i].current); Main.MessageList("진입최고 : ",ItemHigh[i]); } 즐거운 하루되세요 > 차사 님이 쓴 글입니다. > 제목 : 수식 문의 드립니다 > 수고가 많어십니다. 아래는 예스스팟에서 작성하신 프로그램수식입니다. 아래의 수식을 적용하는 과정에서 어려움을 겪어 수식문의 드립니다. 질문1 ; 아래의 최대10종목까지 적용된다고 하셨는데, 수식 작성자가 임의로 설정한 수량인가요?? 아님 예스스팟에서 사용할 수 있는 최대 수량인가요? 질문2 : 저의 경우는 선물 포지션 신호를 이용하여 선물/옵션 합성거래를 합니다. 이런 경우 합성포지션상에는 콜매수;콜매도; 풋매수;풋매도 및 선물이 섞이게 됩니다. 즉, 선물신호에 따라 특정 가격대의 옵션을 매수/매도 합니다. 아래의 수식에서 주식이 아니라 콜매수2종목/콜매도2종목/풋매수2종목/풋매도2종목/선물이 존재한다고 가정하고, 일정가격에 도달하면 스톱트레일링상 전종목 청산이 아니라 1/2만 청산하는 수식을 부탁드립니다. 나머지 물량은 선물신호상에서 청산 신호가 발생할때 청산할 것입니다. ## 예스스팟 제공 수식 아래는 계좌에 매수하여 종목이 추가되면 해당 종목에 대해 목표수익과 손절매, 트레일링스탑을 적용하는 식입니다. 최대 10종목까지 수행됩니다. 식작성하실 때 참고하시기 바랍니다. 스크립트 객체화면에 계좌객체가 필요합니다. 객체명 Account1 var Nth = 0; var ItemCode = new Array(10); var ItemObject = new Array(10); var ItemHigh = new Array(10); //종목객체 시세 업데이트 function Main_OnUp*dateMarket(sItemCode, lUp*dateID) // *제거 { //편입된 종목수 만&#53380;만 수행 for (var i = 1; i <= Nth; i++) { if (ItemObject[i].code == sItemCode && lUp*dateID == 20001) { Main.MessageList("-----------------------------------------------"); Main.MessageList(ItemObject[i].code,"업데이트"); //잔고셋팅 Account1.SetBalanceItem(ItemObject[i].code,0); //종목편입 이후의 최고가 계산 if (ItemObject[i].current > ItemHigh[i]) { ItemHigh[i] = ItemObject[i].current; } //매수잔고 if (Account1.Balance.position == 2) { //현재가가 평균단가 대비 10%이상 상승하면 매도 if (ItemObject[i].current >= Account1.Balance.avgUnitCost*1.10) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제"); } // 현재가가 평균단가 대비 10%이상 하락하면 매도 if (ItemObject[i].current <= Account1.Balance.avgUnitCost*0.90) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제"); } //현재가가 평균단가 대비 8% 이상 상승후 평균단가+5%까지 하락하면 매도주문 if (ItemHigh[i] >= Account1.Balance.avgUnitCost*1.08 && ItemObject[i].current <= Account1.Balance.avgUnitCost*1.05) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("TR청산 : ",ItemObject[i].code,"종목객체삭제"); } } Main.MessageList("-----------------------------------------------"); Main.MessageList("종 목 : ",ItemObject[i].code); Main.MessageList("평균단가 : ",Account1.Balance.avgUnitCost); Main.MessageList("현 재 가 : ",ItemObject[i].current); Main.MessageList("진입최고 : ",ItemHigh[i]); } } }