커뮤니티

예스스팟 Q&A

답변완료

문의드립니다.

수고하십니다. 장 종료후 계좌의 주식 현물 전 종목을 엑셀로 불러온 후에, 각 종목당 지정가 매도가격과 추가 매수가격을 기입해서 다음날 아침 8시 한번에 주문을 내는 식 부탁드립니다. 안녕하세요 예스스탁입니다. 아래 내용 참고하시기 바랍니다. 첨부된 그림과 같이 표시됩니다. 잔고객체에 종목명은 없어 별도로 종목개체 생성해서 사용하게 되어 있습니다. var V1 = []; var V2 = []; var V3 = []; var V4 = []; var V5 = []; var num; function Main_OnStart() { Main.SetTimer(1, 1000); } function Main_OnTimer(nEventID) { Main.KillTimer(1); num = Account1.GetTheNumberOfBalances(); Excel1.SetData(1, "A1","보유종목수"); Excel1.SetData(1, "B1",num); Excel1.SetData(1, "A2","종목명"); Excel1.SetData(1, "B2","종목코드"); Excel1.SetData(1, "C2","평단가"); Excel1.SetData(1, "D2","보유수량"); Excel1.SetData(1, "E2","현재가"); if (num > 0) { req = 0; Account1.SetBalance(req); V2[req] = Account1.Balance.code; V3[req] = Account1.Balance.avgUnitCost; V4[req] = Account1.Balance.count; V4[req] = Account1.Balance.current; Main.ReqMarketData(Account1.Balance.code,0,0); } } function Main_OnRcvMarketData(MarketData) { V1[req] = MarketData.name; req = req+1; if (req < num) { Account1.SetBalance(req); V2[req] = Account1.Balance.code; V3[req] = Account1.Balance.avgUnitCost; V4[req] = Account1.Balance.count; V4[req] = Account1.Balance.current; Main.ReqMarketData(Account1.Balance.code,0,0); } else { Excel1.SetArrayToCol(1,"A3",V1); Excel1.SetArrayToCol(1,"B3",V2); Excel1.SetArrayToCol(1,"C3",V3); Excel1.SetArrayToCol(1,"D3",V4); Excel1.SetArrayToCol(1,"E3",V4); } }
프로필 이미지
여세우
2018-06-20
2319
글번호 224472
답변완료

매도로직대로 실행이 안돼서 문의드립니다.

안녕하세요. 제가 첨으로 예스스팟 게시판 보고 참고해서 프로그램을 완성했는데요. 파워종목 검색으로 주문 넣고 매수 후에 기준가에서 1% 씩 오를때마다 일정수량(10%)을 매도하는 프로그램을 만들었는데요. 종목 검색후 매수(20종목)까지는 무난하게 잘 돌아갑니다. 그런데 익절에서 기준가 대비 1% 상승시 보유수량에 10%, 2% 상승시 보유수량에 20%, 3% 상승시 보유수량에 20%, 4% 상승시 보유수량에 10%, 5% 상승시 보유수량에 10%를 매도하고 10시에 타임컷을 실행하려고 하는데요. 다 잘 돌아가는데 예를 들어 20종목을 매수했는데 어떤 종목은 위 매도로직에 의해 매도가 잘 되는 반면 어떤 종목은 매수가에서 3%까지 상승해도 매도가 안되는 경우가 생기고 해서 뭐가 잘못된건지 모르겠어요ㅜㅜ 매수 종목수가 많아서 그럴까요? 대략 목표치에 도달한 종목중에 10종목중 3종목 정도만 매도 로직대로 매도가 되고 나머지는 매도가 안되고 나중에 타임컷으로 매도가 되었어요. 에러가 뜨면 고치겠는데 에러 메시지가 뜨지도 않으니 뭐가 잘못되었는지 모르겠어요. 코드좀 한번 봐주시기 바랍니다. 그리고 로그 메시지가 따로 저장되는 파일이 존재하나요? 예스스팟에 디버깅이랑 오류창에서만 볼수 있는건가요? 답변좀 부탁드리겠습니다. 그리고 한가지 질문 더 드릴게요. 매도 로직을 하나 더 만들려고 합니다. 분봉을 이용해서 현재 가격 < 30분 and 20분 and 10분 가격 시에 매도하고 싶은데요. 챠트 객체를 이용해서 해야 하나요? 되신다면 간단한 예제좀 부탁드릴게요~ 예스스팟을 배운지 아직 얼마 안돼서 이곳 게시판 보면서 적용하기가 쉽지가 않습니다ㅜㅜ 시간 되시면 답변좀 꼬옥 부탁드려요^^ 감사합니다 function Main_OnU*dateMarket(sItemCode, lU*dateID) { if( lU*dateID == 20001 && RcvData >= 1 ) { for( var i = 0; i < EntryItem.length; i++ ) { if( sItemCode == EntryObject[i].code ) { A1.SetBalanceItem(EntryObject[i].code, 0); // 장중 최고가 세팅 if( EntryObject[i].current > EntryHH[i] ) EntryHH[i] = EntryObject[i].current; // 상한가 도달시 자동 청산 if( EntryObject[i].current >= EntryObject[i].limitUp ) { if( A1.Balance.count >= 1 ) { A1.OrderSell(A1.Balance.code, A1.Balance.count, EntryObject[i].Bid(1), 0); Main.MessageList("상한가 도달로 익절"); } } //1% 도달 - 매수수량의 10% 청산 if( BenefitCnt[i] == 0 && EntryObject[i].current >= A1.Balance.avgUnitCost * 1.01 ) { if( A1.Balance.count >= 1 ) { A1.OrderSell(A1.Balance.code, Math.floor(A1.Balance.count * 0.1), EntryObject[i].Ask(1), 0); Main.MessageList("종목명 : ", EntryObject[i].name, " 진입가에서 1.5% 상승하여 전체 금액의 10% 익절"); } BenefitCnt[i] = 1; } //2% 도달 - 매수수량의 20% 청산 if( BenefitCnt[i] == 1 && EntryObject[i].current >= A1.Balance.avgUnitCost * 1.02 ) { if( A1.Balance.count >= 1 ) { A1.OrderSell(A1.Balance.code, Math.floor(A1.Balance.count * 0.24), EntryObject[i].Ask(1), 0); Main.MessageList("종목명 : ", EntryObject[i].name, " 진입가에서 2% 상승하여 전체 금액의 10% 익절"); } BenefitCnt[i] = 2; } //3% 도달 - 매수수량의 20% 청산 if( BenefitCnt[i] == 2 && EntryObject[i].current >= A1.Balance.avgUnitCost * 1.03 ) { if( A1.Balance.count >= 1 ) { A1.OrderSell(A1.Balance.code, Math.floor(A1.Balance.count * 0.32), EntryObject[i].Ask(1), 0); Main.MessageList("종목명 : ", EntryObject[i].name, " 진입가에서 3% 상승하여 전체 금액의 10% 익절"); } BenefitCnt[i] = 3; } //4% 도달 - 매수수량의 10% 청산 if( BenefitCnt[i] == 3 && EntryObject[i].current >= A1.Balance.avgUnitCost * 1.04 ) { if( A1.Balance.count >= 1 ) { A1.OrderSell(A1.Balance.code, Math.floor(A1.Balance.count * 0.23), EntryObject[i].Ask(1), 0); Main.MessageList("종목명 : ", EntryObject[i].name, " 진입가에서 3% 상승하여 전체 금액의 10% 익절"); } BenefitCnt[i] = 4; } //5% 도달 - 매수수량의 10% 청산 if( BenefitCnt[i] == 4 && EntryObject[i].current >= A1.Balance.avgUnitCost * 1.05 ) { if( A1.Balance.count >= 1 ) { A1.OrderSell(A1.Balance.code, Math.floor(A1.Balance.count * 0.31), EntryObject[i].Ask(1), 0); Main.MessageList("종목명 : ", EntryObject[i].name, " 진입가에서 5% 상승하여 전체 금액의 10% 익절"); } BenefitCnt[i] = 5; } } } } }
프로필 이미지
도도당
2018-06-13
2436
글번호 224471
답변완료

거래량 상워종목 N개 검색식 언제 반영되나요?

지난주 중으로 반영하신다고 하셨는데, 언제쯤 사용가능한가요??
프로필 이미지
gutentak
2018-06-11
2374
글번호 224466
답변완료

하이투자증권에서 예스스팟 전략 제작도 해주나요?

스팟 매뉴얼 읽어보고 있습니다만 워낙 이쪽으로 초보라 쉽지 않습니다 하이투자증권에서 거래 예정인데 제가 원하는바를 이야기하면 제작해주는 부서는 없나요?
프로필 이미지
미수맨
2018-06-10
2362
글번호 224465
답변완료

문의드립니다.

수고하십니다. 장시작전에 지정가 AA에 매도를 XX주 , BB에 XX주 매도 주문을 내고 현재가가 AA에 오면 +NN호가 위에 XX주 매도 주문을 내고 지정가 AA에 걸어둔 XX주가 매도 체결이 되면 -MM호가 아래 XX주 매수주문을 내는 식 부탁드립니다. 항상 고맙습니다.
프로필 이미지
여세우
2018-06-14
2343
글번호 224464

훈sys 님에 의해서 삭제되었습니다.

프로필 이미지
훈sys
2018-06-07
6
글번호 224463
답변완료

문의드립니다.

항상 도움 주셔서 고맙습니다. 옵션이 아닌 Account1의 내용을 엑셀로 출력하고 싶습니다. 종목명, 종목코드,평단가,수량,현재가를 엑셀에 표시하고 싶습니다. var a = "A"; function Main_OnStart() { Main.SetTimer(1, 1000); } function Main_OnTimer(nEventID) { var ItemCode = new Array(6); var ItemPrice = new Array(6); ItemCode[0] = "종목코드" ItemPrice[0] = "평단가" for(var i = 1; i <= 5; i++) { ItemCode[i] = Option.GetATMCallRecent(i); ItemPrice[i] = Option.GetavgUnitCost(0, i); } //지정된 셀을 기준으로 우측으로 배열변수에 저장된 값을 순서대로 입력 Excel1.SetArrayToRow(1, "C1", ItemCode); //지정된 셀을 기준으로 우측으로 배열변수에 저장된 값을 순서대로 입력 Excel1.SetArrayToRow(1, "C2", ItemPrice); //지정된 셀을 기준으로 아래로 배열변수에 저장된 값을 순서대로 입력 Excel1.SetArrayToCol(1, "C4", ItemCode); //지정된 셀을 기준으로 아래로 배열변수에 저장된 값을 순서대로 입력 Excel1.SetArrayToCol(1, "D4", ItemPrice); Main.KillTimer(1); } 잘 부탁드립니다.
프로필 이미지
여세우
2018-06-11
2372
글번호 224460

여세우 님에 의해서 삭제되었습니다.

프로필 이미지
여세우
2018-06-09
5
글번호 224459

도도당 님에 의해서 삭제되었습니다.

프로필 이미지
도도당
2018-06-06
13
글번호 224458

스팟 강제청산로직 코딩관련

안녕하십니까. 운영자님 도움으로 자동매매를 잘 돌리고 있습니다. 자동매매를 좀 더 정교하게 다듬고 싶어서, 청산로직을 추가하려고 합니다. 아래는 지난 게시글을 검색하여 자동매매에 추가하였는데, 청산로직이 실행되지 않고 있습니다. "종목객체생성완료"메시지까지 뜨고 실거래에서는 청산이 안됩니다 그래서 코드를 살펴보다가 바로 아래의 코드처럼, 특정종목의 현재가와 계좌잔고전체의 평균단가를 비교하면서, 잔고에 있는 개별종목들이 STOPLOSS에 적용이 안되는가 싶어 문의드립니다. 바쁘신데 번거롭게 하는게 아닌지 죄송스럽습니다만, 잘 부탁드리겠습니다. if (ItemObject[i].current >= Account1.Balance.avgUnitCost*1.10) 게시판번호 669, 2013년 8월 9일자 작성글 //매수잔고 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,"종목객체삭제"); } ========================================================== 안녕하세요 예스스탁입니다. 예스스팟의 StopLoss, StopPrifitTarget, StopTrailing과 같은 객체들은 예스스팟에서 차트를 생성하고 차트에 시스템을 적용시 설정하는 객체입니다. 예스스팟에서 Main.ReqChartEx라는 함수로 차트를 만드실 수 있는데 Main.ReqChartEx에는 생성할 차트의 제반조건과 적용할 시스템, 지표, 참조데이터를 지정해서 차트를 생성하실 수 있습니다. 이때 시스템을 적용할 때 강제청산을 설정하고자 하면 해당 객체에 값을 지정해서 이용하는 것입니다. 기존에 차트에 시스템 적용할 때 시스템 트레이딩 설정창의 강제청산탭에서 원하는 강제청산을 설정하고 적용하는 것과 같습니다. 아래스팟식 참고하시기 바랍니다. function Main_OnStart() { //생성할 차트정보설정(종목명,주기,주기구분,조회건수,조회건수 구분,수정주가,갭보정) var Chart1 = new ReqChartItem("00000000", 1, CHART_PERIOD_MINUTE, 300, CHART_REQCOUNT_BAR, false, false); //차트에 적용할 시스템의 외부변수 정보(기본값과 다른값을 지정할때 변경할 값으로 지정가능) var Input = new Array(new YLInputVar("Period", "10"), new YLInputVar("Period1", "5")) //차트에 적용할 시스템의 트레이딩 설정정보 var Trade = new SystemTradeInfo(TRADE_FIXCOUNT, // 기본거래수량 1, // 거래수량 123456789, // 자산 1, // 단위수량 0.01,0.01, CALCMETHOD_PERCENT, // 진입/청산 수수료 0.025, 0.025, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ALL, // 피라미딩 설정여부 100000, // 최대진입수량 20); // 최대진입횟수 //차트에 적용할 강제청산 정보 //손절매,트레일링스탑,목표수익,최소가격변화,당일청산,청산시점) var Stop = new SystemStopInfo(new StopLoss(1, CALCMETHOD_PERCENT), // 손절매 new StopTrailing(2, 3, CALCMETHOD_PERCENT, 0), // 최대수익대비하락 new StopProfitTarget(4, CALCMETHOD_PERCENT), // 목표수익 new StopInactivity(5, 6, CALCMETHOD_PERCENT), // 최소가격변화 new StopEndOfDay(151400), // 당일청산 STOP_INSTANT); //차트에 적용할 시스템 설정 //(적용할 시스템명,파일종류,외부변수정보,트레이딩기본정보,강제청산정보); var System = new SystemInfo("Stochastics", YL_TYPE_NORMAL,Input,Trade,Stop); //적용할 지표설정 var Indicator = new Array(new IndicatorInfo("Stochastics",YL_TYPE_NORMAL, new Array(new YLInputVar("Period", "10"),new YLInputVar("Period1", "5")))); //적용할 참조데이터 설정 var Data = new Array(new ReqChartItem("00000000", 5, CHART_PERIOD_MINUTE, 300, CHART_REQCOUNT_BAR, false, false), new ReqChartItem("000660", 5, CHART_PERIOD_MINUTE, 300, CHART_REQCOUNT_BAR, false, false), new ReqChartItem("005930", 10, CHART_PERIOD_MINUTE, 300, CHART_REQCOUNT_BAR, false, false)); Main.ReqChartEx(Chart1,System,Indicator,Data); } 위 수식과 같이 잔고의 종목들에 대해 손절매나 목표수익, 트레일링 스탑을 적용하는 것은 아니고 차트에 시스템 적용할 때 강제청산에 대해 설정값을 지정하는 객체들입니다. 아래는 계좌에 매수하여 종목이 추가되면 해당 종목에 대해 목표수익과 손절매, 트레일링스탑을 적용하는 식입니다. 최대 10종목까지 수행됩니다. 식작성하실 때 참고하시기 바랍니다. 스크립트 객체화면에 계좌객체가 필요합니다. 객체명 Account1 식상 게시판 금칙어가 있습니다 영문 업데이트가 Up*date로 작성이 되어 있으므로 * 제거하시기 바랍니다. var Nth = 0; var ItemCode = new Array(10); var ItemObject = new Array(10); var ItemHigh = new Array(10); //종목추가(주식)) function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)//*제거 { if (lUp*dateID == 30001)//*제거 { Nth = Nth+1;//횟수 ItemCode[Nth] = sItemCode; Main.ReqMarketData(ItemCode[Nth], 0,0);//종목객체 생성요청 Main.MessageList("⊙.⊙",Nth,"번째","신규종목편입 ",ItemCode,"▶종목객체요청"); } } //종목객체 생성완료 function Main_OnRcvMarketData(MarketData) { if (MarketData.code == ItemCode[Nth]) { ItemObject[Nth] = MarketData; ItemHigh[Nth] = 0; Main.MessageList(Nth,"번째","종목객체생성완료 : ",ItemObject[Nth].code); } } //종목객체 시세 업데이트 function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { //편입된 종목수 만킄만 수행 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]); } } } 즐거운 하루되세요 > 즐겁게 님이 쓴 글입니다. > 제목 : 문의 드립니다. > 항상 상세하시고 친절하신 답변에 감사드립니다. 예스스팟에서 손절 익절 추적스탑 등을 구현하는 방법을 공부하려고 하는데, 예스스팟의 "객체정보" 화면에서 보면, StopLoss, StopPrifitTarget, StopTrailing이라는 객체들이 보입니다. YesLanguage의 SetStopLoss, SetStopPrifitTarget, SetStopTrailing이라는 강제청산함수들과 기능이 매우 유사할 것으로 짐작이 되는데, 이 객체들의 실제 적용례를 부탁드립니다. 1. StopLoss, StopPrifitTarget, StopTrailing 객체들의 실제 사용례를, 아주 간단하게라도 예문을 각각 보여 주시면 대단히 감사하겠습니다. 2. 특히, 이 객체들의 properties 중에 보면 "color"라고 하는 프라퍼티가 있어서, 화면상에 손절선, 익절선, 추적스탑선 등을 색깔로 표시해 주는 좋은 기능일 것으로 짐작이 되는데, 시뮬레이션 등을 할 수 없는 예스스팟에서 색깔로라도 그 것들을 볼 수 있으면 크게 도움이 될 거 같습니다. 이 color의 사용례도 (소스 코드 문장 중에) 보여 주시면 대단히 감사하겠습니다. (3. 더불어서, StopEndOfDay, StopInactivity 객체들의 예문도 짧게라도 보여 주시면 감사하겠습니다) 감사합니다.
프로필 이미지
아름다운사람들
2018-06-02
1816
글번호 224454