커뮤니티

도움 요청 드립니다.

프로필 이미지
잼스딘
2024-06-19 11:26:06.0
591
글번호 226037
답변완료
## 검색종목이 보유종목 이고, +/- 조건일 경우 불타기/물타기 하려 합니다. 여러 수식들을 참고해 조건 수식 작성했는데,나머지는 잘 동작하는데 이 부분만 오랜 시간 수정하며 작동 했는데 안되서 도움 요청 드립니다. var Req; var BL = [] ; // 보유종목 코드 저장 리스트 var MK = [], MKreq; var MKCnt = []; var MKItem = []; //종목검색이 완료 function Main_OnRcvItemList(aItemList, nCount) { var num = Account1.GetTheNumberOfBalances(); //검색종목수가 1개 이상이면 if (nCount >= 1 ) { ItemList = aItemList; Count = nCount; Main.MessageList("검색완료",ItemList); //종목객체 생성 요청 Main.MessageList("요청전 EntryItem",EntryItem); var include = false; for (var i = 0; i < num.length; i++ ) { //잔고를 셋팅 Account1.SetBalanceItem(i); if ( Account1.Balance.code == ItemList[Req] ) // 검색종목이 보유종목 { include = true; } } if (include == true ) { Account1.SetBalanceItem(ItemList[Req] ,0); var cond = false; for (var i = 0; i < MKItem.length; i++) { if (MKItem[i] == ItemList[Req]) { cond = true; } } if (MKCnt[i] == 0 && Account1.Balance.count > 0 ) { Account1.SetBalance(MK[i].code, 0); Vol1 = Math.floor(추가매수금액/MK[i].Bid(1)); if (cond == true && Account1.Balance.current <= Account1.Balance.avgUnitCost * 0.8 ) { Main.MessageList(Account1.Balance.code,"|보유종목 -20% 이하 추가 물타기 매수 "); MKCnt[i] = 1; Account1.OrderBuy(MK[i].code, Vol1, MK[i].Ask(2), 0); } if (cond == true && Account1.Balance.current >= Account1.Balance.avgUnitCost * 1.05 ) { Main.MessageList(Account1.Balance.code,"|보유종목 +5% 이상 추가 불타기 매수 "); MKCnt[i] = 1; Account1.OrderBuy(MK[i].code, Vol1,MK[i].Ask(2), 0); } } } if (include == false) // 검색종목이 보유종목 아님 { Account1.SetBalanceItem(ItemList[Req] ,0); var Entry = false; for(var z = 0; z < EntryItem.length; z++) { if (EntryItem[z] == ItemList[Req]) { Entry = true; } } if (Entry == false ) { if (Account1.Balance.count == 0) { Main.ReqMarketData(ItemList[Req], 0, 0); Main.MessageList("요청",ItemList[Req],Req); } } if (Entry == true) { Main.MessageList("요청x",ItemList[Req]); } } Req = Req+1; Main.SetTimer(2, 3000);//간격(4초) } else { Main.MessageList("검색종목 없어 3초후 재검색"); Search = false; } } //요청한 종목객체가 생성되면 function Main_OnRcvMarketData(MarketData) { //요청한 종목객체 생성이 완료되면 if (MarketData.code == BL[MKreq])//a MK[MKreq] = MarketData 담기 { Main.MessageList("종목객체생성 : ",MarketData.code); //MK배열변수에 종목객체 저장 MK[MKreq] = MarketData; MKItem[MKreq] = MarketData.code; MKCnt[MKreq] = 0 ; MKreq = MKreq+1; if (MKreq < BL.length) { Main.MessageList("ReqMarket : ",MKreq,BL[MKreq]); S = Main.ReqMarketData(BL[MKreq]); if (S == -1) { Main.MessageList("종목객체 생성제한 : ", Main.GetLimitedTime(0)); Main.SetTimer(4, 16000);// 타이머 4 15초 이후 간격(16초) } } else { Main.MessageList("BL종목객체요청완료"); } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2024-08-05 17:46:27.0

안녕하세요 예스스탁입니다. 올리신 수식에 직접 수정하신 내용들이 혼합되어 있어 식을 수정을 해드리기가 어렵습니다. 종목검색 후에 기존 검색되어 보유 종목이면 수익/손실 체크해서 추가 매수하고 보유종목이 아니면 해당 종목들의 종목코드를 별도로 모아 종목객체를 생성해서 주문하게 수정해 드립니다. 아래식 참고하셔서 수정보완해 이용하시기 바랍니다. var Req; var BL = [] ; // 보유종목 코드 저장 리스트 var MK = [], MKreq; var MKCnt = []; var MKItem = []; //종목검색이 완료 function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("검색완료",aItemList); BL = []; //검색종목수가 1개이고 이상이면 if (nCount > 0 ) { for (var i = 0; i < aItemList.length; i++ ) { //잔고를 셋팅 Account1.SetBalanceItem(aItemList[i],0); if (Account1.Balance.count > 0) // 검색종목이 보유종목 { if (MK.length > 0) { for (var x = 0; x < MK.length; x++ ) { //기존 만들어진 종목객체 중 동일 종목이 있으면 if (Account1.Balance.code == MK[x].code) { //추가매수수량 Vol1 = Math.floor(추가매수금액/MK[x].Bid(1)); //평단가대비 -20% 이하이면 추가매수 if (Account1.Balance.current <= Account1.Balance.avgUnitCost * 0.8 ) { Main.MessageList(Account1.Balance.code,"|보유종목 -20% 이하 추가 물타기 매수 "); Account1.OrderBuy(Account1.Balance.code, Vol1, MK[x].Ask(2), 0); } //평단가대비 +5% 이상이면 추가매수 if (cond == true && Account1.Balance.current >= Account1.Balance.avgUnitCost * 1.05 ) { Main.MessageList(Account1.Balance.code,"|보유종목 +5% 이상 추가 불타기 매수 "); Account1.OrderBuy(Account1.Balance.code,Vol1,MK[x].Ask(2), 0); } } } } } else //보유종목이 아니면 BL에 종목코드 저장 { BL.push(aItemList[i]); } } if (BL > 0) { MKreq = 0; Main.ReqMarketData(BL[MKReq], 0, 0); Main.MessageList("요청",BL[MKReq],Req); } } else { Main.MessageList("검색종목 없어 3초후 재검색"); Main.SetTimer(2, 3000); } } //요청한 종목객체가 생성되면 function Main_OnRcvMarketData(MarketData) { //요청한 종목객체 생성이 완료되면 if (MarketData.code == BL[MKreq]) { Main.MessageList("종목객체생성 : ",MarketData.code); //MK배열변수에 종목객체 저장 MK[MKreq] = MarketData; MKItem[MKreq] = MarketData.code; MKCnt[MKreq] = 0 ; MKreq = MKreq+1; if (MKreq < BL.length) { Main.MessageList("ReqMarket : ",MKreq,BL[MKreq]); S = Main.ReqMarketData(BL[MKreq]); if (S == -1) { Main.MessageList("종목객체 생성제한 : ", Main.GetLimitedTime(0)); Main.SetTimer(4, 16000);// 타이머 4 15초 이후 간격(16초) } } } else { Main.MessageList("BL종목객체요청완료"); Main.SetTimer(2, 3000); } } 즐거운 하루되세요 > 잼스딘 님이 쓴 글입니다. > 제목 : 도움 요청 드립니다. > ## 검색종목이 보유종목 이고, +/- 조건일 경우 불타기/물타기 하려 합니다. 여러 수식들을 참고해 조건 수식 작성했는데,나머지는 잘 동작하는데 이 부분만 오랜 시간 수정하며 작동 했는데 안되서 도움 요청 드립니다. var Req; var BL = [] ; // 보유종목 코드 저장 리스트 var MK = [], MKreq; var MKCnt = []; var MKItem = []; //종목검색이 완료 function Main_OnRcvItemList(aItemList, nCount) { var num = Account1.GetTheNumberOfBalances(); //검색종목수가 1개 이상이면 if (nCount >= 1 ) { ItemList = aItemList; Count = nCount; Main.MessageList("검색완료",ItemList); //종목객체 생성 요청 Main.MessageList("요청전 EntryItem",EntryItem); var include = false; for (var i = 0; i < num.length; i++ ) { //잔고를 셋팅 Account1.SetBalanceItem(i); if ( Account1.Balance.code == ItemList[Req] ) // 검색종목이 보유종목 { include = true; } } if (include == true ) { Account1.SetBalanceItem(ItemList[Req] ,0); var cond = false; for (var i = 0; i < MKItem.length; i++) { if (MKItem[i] == ItemList[Req]) { cond = true; } } if (MKCnt[i] == 0 && Account1.Balance.count > 0 ) { Account1.SetBalance(MK[i].code, 0); Vol1 = Math.floor(추가매수금액/MK[i].Bid(1)); if (cond == true && Account1.Balance.current <= Account1.Balance.avgUnitCost * 0.8 ) { Main.MessageList(Account1.Balance.code,"|보유종목 -20% 이하 추가 물타기 매수 "); MKCnt[i] = 1; Account1.OrderBuy(MK[i].code, Vol1, MK[i].Ask(2), 0); } if (cond == true && Account1.Balance.current >= Account1.Balance.avgUnitCost * 1.05 ) { Main.MessageList(Account1.Balance.code,"|보유종목 +5% 이상 추가 불타기 매수 "); MKCnt[i] = 1; Account1.OrderBuy(MK[i].code, Vol1,MK[i].Ask(2), 0); } } } if (include == false) // 검색종목이 보유종목 아님 { Account1.SetBalanceItem(ItemList[Req] ,0); var Entry = false; for(var z = 0; z < EntryItem.length; z++) { if (EntryItem[z] == ItemList[Req]) { Entry = true; } } if (Entry == false ) { if (Account1.Balance.count == 0) { Main.ReqMarketData(ItemList[Req], 0, 0); Main.MessageList("요청",ItemList[Req],Req); } } if (Entry == true) { Main.MessageList("요청x",ItemList[Req]); } } Req = Req+1; Main.SetTimer(2, 3000);//간격(4초) } else { Main.MessageList("검색종목 없어 3초후 재검색"); Search = false; } } //요청한 종목객체가 생성되면 function Main_OnRcvMarketData(MarketData) { //요청한 종목객체 생성이 완료되면 if (MarketData.code == BL[MKreq])//a MK[MKreq] = MarketData 담기 { Main.MessageList("종목객체생성 : ",MarketData.code); //MK배열변수에 종목객체 저장 MK[MKreq] = MarketData; MKItem[MKreq] = MarketData.code; MKCnt[MKreq] = 0 ; MKreq = MKreq+1; if (MKreq < BL.length) { Main.MessageList("ReqMarket : ",MKreq,BL[MKreq]); S = Main.ReqMarketData(BL[MKreq]); if (S == -1) { Main.MessageList("종목객체 생성제한 : ", Main.GetLimitedTime(0)); Main.SetTimer(4, 16000);// 타이머 4 15초 이후 간격(16초) } } else { Main.MessageList("BL종목객체요청완료"); } }