커뮤니티

문의 드립니다.

프로필 이미지
즐겁게
2014-05-14 13:17:53
861
글번호 222971
답변완료
항상 친절하시고 상세하신 답변 감사드립니다. 수식작성 Q&A 36191 글(아래에 복사해 넣었습니다)에 답해 주신 내용과 관련하여 문의드리고자 합니다. 1. 예스글로벌에서 가령 원유와 브라질상품(보베스파 등) 이렇게 두 품목을 거래할 경우, 원유는 일반해외선물용 계좌(00000-00-001)로, 브라질상품은 브라질상품용 계좌(00000-00-002)로 거래하도록 되어 있습니다. 두 품목을 동시에 거래하는 경우, Account1은 001계좌, Account2는 002계좌로 하고 싶은데, 그럴 경우 아래 식은 어떻게 수정되어야 하는지요? (계좌가 복수이면 계좌 관련해서도 배열과 loop를 사용해야 할 것 같습니다만...) 2. 아래 식은 여러 품목을 매매하는 경우를 위한 것이라서 종목객체들을 구하기 위해 배열을 이용하여 loop를 돌리는 식입니다만, 만일 가장 간단하게, "단 한 품목만 매매"할 때에는 아래 식을 어떻게 단순화해서 사용할 수 있을지 부탁드립니다. 감사합니다! 아래: 수식작성 Q&A 36191 글 답글 내용: var Nth = 0; var ItemCode = []; var ItemObject = []; var ItemHigh = []; var Bnum; function Main_OnStart() { Nth = 0; Bnum = Account1.GetTheNumberOfBalances() Main.MessageList("잔고종목수",Bnum); if (Bnum > 0) { Account1.SetBalanceIndex(Nth);//잔고는 순번이 0부터 시작 //셋팅된 잔고의 수량이 0이상이면 if (Account1.Balance.count > 0) { //1번째 종목객체 생성요청 Main.ReqMarketData(Account1.Balance.code, 0,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]) { ItemObject[Nth] = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장 ItemHigh[Nth] = 0; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최고값 계산해 저장할 변수) Main.MessageList(Nth,"번째","종목객체생성완료 : ",ItemObject[Nth].code); //순번은 1 증가 Nth = Nth+1; //종목객체 수신완료되면 다음 종목 종목객체 요청 if (Bnum > 0) { //계좌의 잔고리스트에서 다음 순번 잔고 셋팅 Account1.SetBalanceIndex(Nth); //셋팅된 잔고의 수량이 0이상이면 if (Account1.Balance.count > 0) { //Nth번째 종목객체 생성요청 Main.ReqMarketData(Account1.Balance.code, 0,0); //ItemCode의 [Nth]번째 방에 종목코드 저장 ItemCode[Nth] = Account1.Balance.code; Main.MessageList("종목객체요청",Account1.Balance.code); } } } } //종목객체 시세 업데이트 function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*삭제 { if (Nth == Bnum-1) { //편입된 종목수 만&#53380;만 수행 for (var i = 0; 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) { //현재가가 평균단가 대비 +1이상 수익나면 청산 if (ItemObject[i].current >= Account1.Balance.avgUnitCost+1) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제"); } // 현재가가 평균단가 대비 1이상 손실나하면 청산 if (ItemObject[i].current <= Account1.Balance.avgUnitCost-1) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제"); } //현재가가 평균단가 0.7포인트 이상 수익후 +0.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,"종목객체삭제"); } } //매도잔고 if (Account1.Balance.position == 1) { //현재가가 평균단가 대비1포인트이상 수익나면 청산 if (ItemObject[i].current <= Account1.Balance.avgUnitCost-1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제"); } // 현재가가 평균단가 대비 1이상 손실나면 청산 if (ItemObject[i].current >= Account1.Balance.avgUnitCost+1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제"); } //현재가가 평균단가 대비 0.7포인트 이상 수익 후 0.5까지 수익이 감소하면 청산 if (ItemHigh[i] <= Account1.Balance.avgUnitCost-0.7 && ItemObject[i].current <= Account1.Balance.avgUnitCost-0.5) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("TR청산 : ",ItemObject[i].code,"종목객체삭제"); } } } } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2014-05-16 18:11:46

안녕하세요 예스스탁입니다. 스팟은 기본적으로 사용자분이 구현하셔야 합니다. 저희가 답변드리는 내용은 단순 가이드라인입니다. 테스트 등을 모두 하고 올려드리는 내용이 아니므로 식작성의 흐름을 판단하는 용도일 뿐입니다. 이용에 참과하시기 바랍니다. 1. 종목이 고정되지 않으면 어떤종목이 어떤 계좌와 매칭이 되는지 알수 없으므로 만약 고정된 2개의 종목을 거래할 경우에는 해당 식과는 다르게 작성하셔야 합니다. 종목이 정해져 있으므로 수식에서 종목을 생성할 필요가 없고 스크립트객체에 종목객체로 추가한 후에 사용하시면 됩니다. 또한 계좌를 2개 사용하시면 계좌객체를 2개 추가하신 후에 각각 계좌번호 지정해 사용하시면 됩니다. 아래 스팟식 참고하시기 바랍니다. 스크립트 객체화면에서 종목객체추가 --> 속성에서 객체명을 MarketData1, 종목은 원유로 지정 종목객체추가 --> 속성에서 객체명을 MarketData2, 종목은 브라질상품으로 지정 계좌객체추가 --> 속성에서 객체명을 Account1, 계좌번호는 001계좌로 지정 계좌객체추가 --> 속성에서 객체명을 Account2, 계좌번호는 002계좌로 지정 var Entry1,H1,L1; function Main_OnStart() { Entry1 = false; } function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) { //Account1계좌에 MarketData1종목이 신규로 들어오면 if (sAccntNum == Account1.number && lUp*dateID == 30001 && MarketData1.code == sItemCode) { Entry1 = true; H1 = MarketData1.current; L1 = MarketData1.current; Account1.SetBalanceItem(MarketData1.code, 0); } //Account2계좌에 MarketData2종목이 신규로 들어오면 if (sAccntNum == Account2.number && lUp*dateID == 30001 && MarketData1.code == sItemCode) { Entry2 = true; H2 = MarketData2.current; L2 = MarketData2.current; Account2.SetBalanceItem(MarketData2.code, 0); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { //MarketData1종목 진입이후 최고가/최저가 계산 if (Entry1 == true && sItemCode == MarketData1.code && lUp*dateID == 20001) { if (MarketData1.current > H1); H1 = MarketData1.current; if (MarketData1.current < L1); L1 = MarketData1.current; //매수포지션 if (Account1.Balance.position == 2) { //1% 익절 if (MarketData1.current >= Account1.Balance.avgUnitCost *1.04) { Entry1 = false; Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2); } //1% 손절 if (MarketData1.current <= Account1.Balance.avgUnitCost *0.99) { Entry1 = false; Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2); } //3%이상 상승후 최고가격에서 1% 하락하면 청산 if (H1 >= Account1.Balance.avgUnitCost *1.03 && MarketData1.current <= H1*0.99 ) { Entry1 = false; Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2); } } //매도포지션 if (Account1.Balance.position == 2) { //4% 익절 if (MarketData1.current <= Account1.Balance.avgUnitCost *0.96) { Entry1 = false; Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2); } //1% 손절 if (MarketData1.current >= Account1.Balance.avgUnitCost *1.01) { Entry1 = false; Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2); } //3%이상 하락후 최저가격에서 1% 상승하면 청산 if (L1 <= Account1.Balance.avgUnitCost *0.97 && MarketData1.current >= L1*1.01 ) { Entry1 = false; Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2); } } } // MarketData2종목 진입이후 최고가 최저가 계산 if (Entry2 == true && sItemCode == MarketData2.code && lUp*dateID == 20001) { if (MarketData2.current > H2); H2 = MarketData2.current; if (MarketData2.current < L2); L2 = MarketData2.current; //매수포지션 if (ACcount2.Balance.position == 2) { //1% 익절 if (MarketData2.current >= ACcount2.Balance.avgUnitCost *1.04) { Entry1 = false; ACcount2.OrderSell(MarketData2.code, ACcount2.Balance.count, MarketData2.Bid(1), 2); } //1% 손절 if (MarketData2.current <= ACcount2.Balance.avgUnitCost *0.99) { Entry1 = false; ACcount2.OrderSell(MarketData2.code, ACcount2.Balance.count, MarketData2.Bid(1), 2); } //3%이상 상승후 최고가격에서 1% 하락하면 청산 if (H2 >= ACcount2.Balance.avgUnitCost *1.03 && MarketData2.current <= H2*0.99 ) { Entry1 = false; ACcount2.OrderSell(MarketData2.code, ACcount2.Balance.count, MarketData2.Bid(1), 2); } } //매도포지션 if (ACcount2.Balance.position == 2) { //4% 익절 if (MarketData2.current <= ACcount2.Balance.avgUnitCost *0.96) { Entry1 = false; ACcount2.OrderBuy(MarketData2.code, ACcount2.Balance.count, MarketData2.Bid(1), 2); } //1% 손절 if (MarketData2.current >= ACcount2.Balance.avgUnitCost *1.01) { Entry1 = false; ACcount2.OrderBuy(MarketData2.code, ACcount2.Balance.count, MarketData2.Bid(1), 2); } //3%이상 하락후 최저가격에서 1% 상승하면 청산 if (L2 <= ACcount2.Balance.avgUnitCost *0.97 && MarketData2.current >= L2*1.01 ) { Entry1 = false; ACcount2.OrderBuy(MarketData2.code, ACcount2.Balance.count, MarketData2.Bid(1), 2); } } } } 2. 위 내용이 고정 2품목이므로 한품목은 위내용 Account2과 MarketData2를 사용한 내용은 없애시면 됩니다. 즐거운 하루되세요 > 즐겁게 님이 쓴 글입니다. > 제목 : 문의 드립니다. > 항상 친절하시고 상세하신 답변 감사드립니다. 수식작성 Q&A 36191 글(아래에 복사해 넣었습니다)에 답해 주신 내용과 관련하여 문의드리고자 합니다. 1. 예스글로벌에서 가령 원유와 브라질상품(보베스파 등) 이렇게 두 품목을 거래할 경우, 원유는 일반해외선물용 계좌(00000-00-001)로, 브라질상품은 브라질상품용 계좌(00000-00-002)로 거래하도록 되어 있습니다. 두 품목을 동시에 거래하는 경우, Account1은 001계좌, Account2는 002계좌로 하고 싶은데, 그럴 경우 아래 식은 어떻게 수정되어야 하는지요? (계좌가 복수이면 계좌 관련해서도 배열과 loop를 사용해야 할 것 같습니다만...) 2. 아래 식은 여러 품목을 매매하는 경우를 위한 것이라서 종목객체들을 구하기 위해 배열을 이용하여 loop를 돌리는 식입니다만, 만일 가장 간단하게, "단 한 품목만 매매"할 때에는 아래 식을 어떻게 단순화해서 사용할 수 있을지 부탁드립니다. 감사합니다! 아래: 수식작성 Q&A 36191 글 답글 내용: var Nth = 0; var ItemCode = []; var ItemObject = []; var ItemHigh = []; var Bnum; function Main_OnStart() { Nth = 0; Bnum = Account1.GetTheNumberOfBalances() Main.MessageList("잔고종목수",Bnum); if (Bnum > 0) { Account1.SetBalanceIndex(Nth);//잔고는 순번이 0부터 시작 //셋팅된 잔고의 수량이 0이상이면 if (Account1.Balance.count > 0) { //1번째 종목객체 생성요청 Main.ReqMarketData(Account1.Balance.code, 0,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]) { ItemObject[Nth] = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장 ItemHigh[Nth] = 0; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최고값 계산해 저장할 변수) Main.MessageList(Nth,"번째","종목객체생성완료 : ",ItemObject[Nth].code); //순번은 1 증가 Nth = Nth+1; //종목객체 수신완료되면 다음 종목 종목객체 요청 if (Bnum > 0) { //계좌의 잔고리스트에서 다음 순번 잔고 셋팅 Account1.SetBalanceIndex(Nth); //셋팅된 잔고의 수량이 0이상이면 if (Account1.Balance.count > 0) { //Nth번째 종목객체 생성요청 Main.ReqMarketData(Account1.Balance.code, 0,0); //ItemCode의 [Nth]번째 방에 종목코드 저장 ItemCode[Nth] = Account1.Balance.code; Main.MessageList("종목객체요청",Account1.Balance.code); } } } } //종목객체 시세 업데이트 function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*삭제 { if (Nth == Bnum-1) { //편입된 종목수 만&#53380;만 수행 for (var i = 0; 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) { //현재가가 평균단가 대비 +1이상 수익나면 청산 if (ItemObject[i].current >= Account1.Balance.avgUnitCost+1) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제"); } // 현재가가 평균단가 대비 1이상 손실나하면 청산 if (ItemObject[i].current <= Account1.Balance.avgUnitCost-1) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제"); } //현재가가 평균단가 0.7포인트 이상 수익후 +0.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,"종목객체삭제"); } } //매도잔고 if (Account1.Balance.position == 1) { //현재가가 평균단가 대비1포인트이상 수익나면 청산 if (ItemObject[i].current <= Account1.Balance.avgUnitCost-1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제"); } // 현재가가 평균단가 대비 1이상 손실나면 청산 if (ItemObject[i].current >= Account1.Balance.avgUnitCost+1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제"); } //현재가가 평균단가 대비 0.7포인트 이상 수익 후 0.5까지 수익이 감소하면 청산 if (ItemHigh[i] <= Account1.Balance.avgUnitCost-0.7 && ItemObject[i].current <= Account1.Balance.avgUnitCost-0.5) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count, 0,1); //주문 후 해당 종목객체 삭제 Main.RemoveMarketData(ItemObject[i]); Main.MessageList("TR청산 : ",ItemObject[i].code,"종목객체삭제"); } } } } } }