커뮤니티

예스스팟 Q&A

답변완료

프로그램 순매수 참조데이터 관련 문의

안녕하세요 담당자님. 항상 도움주셔서 감사드리며, 새해 복 많이 받으십시요. 다름이아니라 예스트레이더 전략실행 차트에서 종목추가 참조데이터 추가를 통해서 해당 종목의 수급정보를 차트에 표시할 수 있습니다. 1. 예스스팟으로 개별 종목에 대한 수급정보를 확장차트에 표시할수 있는방법이 있을지 문의드립니다. 제가 필요한 정보는 개별 종목의 일일 (실시간) 프로그램 순매수 데이터이며, 이를 Data2로 활용하여 전략에 활용하고자 합니다. 2. 만약 현재 예스스팟에 종목별 수급데이터 활용이 어렵다면 혹시 기능을 추가해주실 수 있으실지 문의드립니다. 3. 당장 계획이 없으시다면, Data Manager를 통해서 별도의 종목별 수급데이터를 불러들여서 예스스팟 확장차트 data2에 표시되도록하여 사용하고자 합니다. 매뉴얼이나 기존 Q&A에서 관련정보를 찾을수 없는것같은데, Data Manager의 데이터를 확장차트에 표시하기 위한 객체와 예시 코드를 간략히 작성해주실수 있으시다면 대단히 감사할것같습니다. 항상 도움주셔서 감사드립니다.
프로필 이미지
기사단장
2024-01-08
603
글번호 225918
답변완료

문의

데이트레이딩 양매수 수식입니다. 진입 1. 개장 후 콜등가격과 풋등가격의 양합이 1.5 이하로 내려오고 2. 두 가격의 차이가 절대값(콜등가격 - 풋등가격) 3틱 이내가 되면 양매수 ex1) 콜 0.76 풋 0.79, 양합은 1.5이고 차이는 3틱 청산 1. 진입 시 콜미결제와 풋미결제의 합(1.5)에서 +1 포인트(2.5)면 모두 청산(익절) 2. 진입 시 콜미결제와 풋미결제의 합(1.5)에서 -1 포인트(0.5)면 모두 청산(손절) - 1계좌에 여러 미결제가 혼재되어 있으므로 정확히 양매수 미결제 건만 청산하고 싶습니다. 수식 부탁드립니다.
프로필 이미지
좌오비우오비
2024-01-04
497
글번호 225917
답변완료

수식질문 드립니다 도와주세요~~~

var ItemList; var Count; var ReqCount; var X1 = false var OrderList = []; var MKList = []; var req; var OrderCode; function Main_OnStart() { Main.SetTimer(1, 3000); } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시01분~15시20분 사이 if (nEventID == 1 && HHMMSS >= 90100 && HHMMSS < 152000) { Main.MessageLog("스팟시작"); Main.MessageLog("종목검색시작"); Main.ReqPowerSearch("하이업 지표5선") } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); } } function Main_OnRcvItemList(aItemList, nCount) { Main.KillTimer(1); OrderList = []; if (nCount >= 1) { if (MKList.length == 0) { OrderList = aItemList; } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (aItemList[a] == MKList[b].code) { Add = false; } } if (Add == true) { OrderList.push(aItemList[a]); } } } } if (OrderList.length == 0) { Main.SetTimer(1, 3000); } else { req = 0; Main.ReqMarketData(OrderList[req]); } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == OrderList[req]) { var MM = Account1.GetBalanceETCinfo(0); MKList.push(MarketData); Account1.OrderBuy(MarketData.code,Math.floor((MM*0.99)/ MarketData.Ask(1)),MarketData.Ask(1),0); req = req+1; if (req < OrderList.length) { var aa = Main.ReqMarketData(OrderList[req]); if (aa == -1) { Main.SetTimer(2, 3000); } } else { Main.SetTimer(1, 3000); } if (Account1.Balance.count >= 1) Main.KillTimer(1); if (X1 == false && Account1.Balance.count > 0 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.033) { X1 = true; Account1.OrderSell(Account1.Balance.code,Math.floor(Account1.Balance.current),MarketData.Bid(1),0); } } } 위 스팟수식을 만들어서 사용중인데 매수후 3.3% 이상이면 매도를 해야하는데 안합니다. 어디가 잘못된걸까요??? 그리고 1종목 이상 검색이되면 스팟을 멈추고 싶어요
프로필 이미지
철판때기
2024-01-03
653
글번호 225916
답변완료

미완성 신호 거래 등에 대한 수식 수정 부탁드립니다.

안녕하세요. 전에 작성해 주신 수식을 일부 수정하여 현재 반자동화된 거래를 진행하는데 너무 잘 활용하고 있습니다. 최근에 거래 로직을 수정하면서 조금 더 자동화된 형태로 거래하고 싶어서 재차 도움을 구합니다. 기존 사용하던 yesspot 수식을 재차 수정해서 올렸으니 가이드를 주시면 참고해서 다시 열심히 매매에 임하겠습니다. 거래에 큰 도움을 주셔서 항상 감사드립니다. 연말 마무리 잘 하시고 새해 복 많이 받으세요. --------------------------------------------------------------------------------------------- [거래순서] * yespot 실행 시 관심종목리스트에 있는 종목을 대상으로 차트객체 생성 * 장 중(시초거래 및 장 중 거래)에 매수/매도 진행(미체결된 경우 10초 단위로 현재가 +(-)한호가씩 변경하며 계약 체결) - 매수 신호가 b2일 경우에는 무조건 매수 - 매수 신호가 b2가 아닌 경우에는 계좌에 같은 종목이 없는 경우에만 매수 * 152000 파워종목검색 실행 * 검색된 종목 중 관심종목리스트에 없는 종목에 대해 차트객체 추가하고 관심종목리스트에 추가 * 관심종목리스트를 대상으로 동시호가에 완성신호 또는 미완성신호로 매수/매도 거래 (분할 매수(매도) 로직이 포함되어 있어서, 종가에 완성신호 및 미완성 신호가 발생합니다. 현재는 미완성신호 거래가 생각대로 잘안돼서 익일 시초가 매매로 돌려서 거래 중인데 동시호가 거래나 미체결 시 장후시간외 거래로 거래 방식을 수정하고 싶습니다) - 매수 신호가 b2일 경우에는 무조건 매수 - 매수 신호가 b2가 아닌 경우에는 계좌에 같은 종목이 없는 경우에만 매수 ---------------------------------------------------------------------------- var ItemList; var Count; var daycount; var daycount1=0; var daycount2=0; var YYYYMMDD; var ReqCount; var d; var H; var S_price; var ps; var value1 = 0; var HHMMSS; function Main_OnStart() { Main.MessageLog("스팟시작"); d = new Date(); h=d.getDate(); YYYYMMDD = d.getFullYear()*10000 +(d.getMonth()+1)*100+d.getDate(); if (Main.GetUserValue(YYYYMMDD) == "") { daycount = 0; } else { daycount = Main.GetUserValue(YYYYMMDD); } //지정한 관심그룹의 종목수(관심그룹지정 필요) Count = Main.GetItemCountOfInterest("관심종목1"); Main.MessageList("지정관심그룹 종목수 : ", Count); ItemList = []; //관심그룹 종목코드를 ItemList로 옮김 for(var i = 0 ; i < Count ; i++) { //관심그룹지정 필요 ItemList.push(Main.GetItemCodeInInterest("관심종목1", i)); } ReqCount = 0; if (Count > 0) { Main.SetTimer(1, 500); } } function Main_OnTimer(nEventID) { if (nEventID == 1) { var TradeSet = new SystemTradeInfo(TRADE_FIXCAPITAL, 1, // 거래수량 500000, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부(다른진입신호만 허용) 100000, // 최대진입수량 20); // 최대진입횟수 var ChartSet = new ReqChartItem(ItemList[ReqCount],1,CHART_PERIOD_DAILY,600,CHART_REQCOUNT_BAR,true,false); /////SystemInfo(name,kind,inputVar,tradeInfo,stopInfo) var SystemSet = new SystemInfo("거래(관심종목1)", YL_TYPE_NORMAL, null, TradeSet); Main.ReqChartEx(ChartSet,SystemSet); Main.MessageList("확장차트생성요청:",ItemList[ReqCount]); ReqCount = ReqCount+1; if (ReqCount == Count) { Main.KillTimer(1); Main.MessageList("종목객체생성완료"); } } HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); ///// if (HHMMSS > 152000) ///// { Main.MessageList("start(종목검색))"); Main.KillTimer(1);// Main.ReqPowerSearch("종목검색_일봉거래"); } } function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("종목검색 완료 nCount : ",nCount,MK.length); Main.MessageList("종목검색 완료 aItemList : ",aItemList); ////////////////////////////////////////// // 종목 검색 후 관심종목리스트에 없는 종목은 확장차트 생성 후, 관심종목에 등록. ////////////////////////////////////////// if (nCount > 0) { Main.SendInterests("관심종목1", aItemList,false); Main.MessageList("관심종목 등록"); } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //계좌 보유 종목 수 var num1 = Account1.GetTheNumberOfBalances(); //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); if (Signal.price < 1000) { ps = 1; S_price = Math.floor(Signal.price/ps)*ps; } if (Signal.price >= 1000 && Signal.price < 5000) { ps = 5; S_price = Math.floor(Signal.price/ps)*ps; } if (Signal.price >= 5000 && Signal.price < 10000) { ps = 10; S_price = Math.floor(Signal.price/ps)*ps; } if (Signal.price >= 10000 && Signal.price < 50000) { ps = 50; S_price = Math.floor(Signal.price/ps)*ps; } if (Signal.price >= 50000 && Signal.price < 100000) { ps = 100; S_price = Math.floor(Signal.price/ps)*ps; } if (Signal.price >= 100000) { ps = 1000; S_price = Math.floor(Signal.price/ps)*ps; } //매수신호이고 잔고가 없을때만 매수 &#61672;수정 if (Signal.signalKind == 1) ////// && Account1.Balance.count == 0) { if (Signal.name != "b2" && num1<=50 && Account1.Balance.count == 0 && daycount1 < 5) // 매수신호가 b2가 아닌 경우 기존 잔고가 없는 경우에만 매수하고, 일 5종목까지만 매수 { Account1.OrderBuy(Main.GetOrderCode(Signal.code), 1, S_price + ps*2, 0); Account1.OrderBuy(Main.GetOrderCode(Signal.code), Signal.count-1, S_price + ps*2, 0); daycount1 = daycount1+1; Main.MessageList("매수주문8"); Main.MessageLog("1차매수 후 매도 "+S_price); } if (Signal.name == "b2" && num1<=50 && daycount2 < 5)//매수신호가 b2인 경우에는 기매수되지 않았더라도 일 5종목까지 매수 { Account1.OrderBuy(Main.GetOrderCode(Signal.code), 2, S_price + ps*2, 0); Account1.OrderBuy(Main.GetOrderCode(Signal.code), Signal.count-2, S_price + ps*2, 0); daycount2 = daycount2+1; Main.MessageList("매수주문9"); Main.MessageLog("2차매수 후 매도 "+S_price); } } if (Signal.signalKind == 2) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.GetTotalAmount(nCategory, nTradeKind) Account1.SetUnfill(i); //미체결종목이 신호종목과 같고 미체결수량이 있으면 if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } ////////------------->미체결 또는 부분체결 시 10초 단위로 현재가 +(-)1호가씩 변경하며 거래체결하는 로식 삽입 } if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code), 1, S_price - ps*2, 0); Account1.OrderSell(Main.GetOrderCode(Signal.code), Signal.count-1, S_price - ps*2, 0); Main.MessageList("매도주문"); ///////------------>미체결 또는 부분체결된 경우 잔여 물량에 대해 장후 시간외 거래하는 로직 추가 } } } //신호발생 function Main_OnRiseIncompleteSignal(ChartEx, IncompleteSignal) { if (HHMMSS > 152000) ///// { //계좌 보유 종목 수 var num1 = Account1.GetTheNumberOfBalances(); //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(IncompleteSignal.code),0); if (IncompleteSignal.price < 1000) { ps = 1; S_price = Math.floor(IncompleteSignal.price/ps)*ps; } if (IncompleteSignal.price >= 1000 && IncompleteSignal.price < 5000) { ps = 5; S_price = Math.floor(IncompleteSignal.price/ps)*ps; } if (IncompleteSignal.price >= 5000 && IncompleteSignal.price < 10000) { ps = 10; S_price = Math.floor(IncompleteSignal.price/ps)*ps; } if (IncompleteSignal.price >= 10000 && IncompleteSignal.price < 50000) { ps = 50; S_price = Math.floor(Signal.price/ps)*ps; } if (IncompleteSignal.price >= 50000 && IncompleteSignal.price < 100000) { ps = 100; S_price = Math.floor(IncompleteSignal.price/ps)*ps; } if (IncompleteSignal.price >= 100000) { ps = 1000; S_price = Math.floor(IncompleteSignal.price/ps)*ps; } if (IncompleteSignal.signalKind == 1) { if (IncompleteSignal.name != "b2" && num1<=50 && Account1.Balance.count == 0 && daycount1 < 5) // 매수신호가 b2가 아닌 경우 기존 잔고가 없는 경우에만 매수하고, 일 5종목까지만 매수 { Account1.OrderBuy(Main.GetOrderCode(IncompleteSignal.code), 2, S_price + ps*2, 0); Account1.OrderBuy(Main.GetOrderCode(IncompleteSignal.code),Signal.count-2, S_price + ps*2, 0); daycount1 = daycount1+1; Main.MessageList("매수주문10"); Main.MessageLog("1차매수 후 매도 "+S_price); ///////------------>미체결 또는 부분체결된 경우 잔여 물량에 대해 장후 시간외 거래하는 로직 추가 } if (IncompleteSignal.name == "b2" && num1<=50 && daycount2 < 5)// 매수신호가 b2인 경우에는 기매수되지 않았더라도 일 5종목까지 매수 { Account1.OrderBuy(Main.GetOrderCode(IncompleteSignal.code), 2, S_price + ps*2, 0); // 2호가 위 매수 Account1.OrderBuy(Main.GetOrderCode(IncompleteSignal.code), IncompleteSignal.count-2, S_price + ps*2, 0); daycount2 = daycount2+1; Main.MessageList("매수주문10"); Main.MessageLog("2차매수 후 매도 "+S_price); ///////------------>미체결 또는 부분체결된 경우 잔여 물량에 대해 장후 시간외 거래하는 로직 추가 } if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(IncompleteSignal.code), 1, S_price - ps*2, 0); Account1.OrderSell(Main.GetOrderCode(IncompleteSignal.code), IncompleteSignal.count-1, S_price - ps*2, 0); ///////------------>미체결 또는 부분체결된 경우 잔여 물량에 대해 장후 시간외 거래하는 로직 추가 } } } }
프로필 이미지
깜피
2023-12-30
803
글번호 225915

좌오비우오비 님에 의해서 삭제되었습니다.

프로필 이미지
좌오비우오비
2023-12-28
8
글번호 225910

악센 님에 의해서 삭제되었습니다.

프로필 이미지
악센
2023-12-27
0
글번호 225909
답변완료

예스스팟에서 종목 검색 시 결과 값을 전달 받을 방법

안녕하세요 예스스팟에서 아래와 같이 종목 검색을 진행하는데요, 실제 검색에서는 Find(검색결과값); 을 반환하도록 하는데, 예스스팟에서 검색된 종목 코드 뿐 아니라 검색결과값을 받아올 수 없을가요? Main.ReqPowerSearch("종목검색"); function Main_OnRcvItemList(altemList, nCount) { }
프로필 이미지
edan
2023-12-22
611
글번호 225908
답변완료

문의

아래 수식으로 콜매도 진입한 후 차트에서 신호를 이용하여 청산하는 수식 요청드립니다. 1. 종목을 하나로 정해서 진입하는 경우는 청산할 때 진입한 종목과 청산할 종목간의 매칭에 어려움이 없습니다. 하지만 아래 수식처럼 진입시 가격의 범위로 종목을 정하면 청산할 때 매칭하는 수식이 쉽지 않습니다. 2. 하나의 계좌에 다른 진입건들의 미결제와 혼재되어 있는 상황에서 아래 수식으로 진입한 미결제만 정확히 청산하고 싶습니다. 3. 아래 수식의 진입은 콜매도 3개 입니다. 차트에서 청산신호가 발생하는 조건에서 청산은 2개만 하고 1개를 남기고 싶습니다. 위 3가지 사항을 만족하는 수식을 요청드립니다. 항상 고맙습니다. **************************************************************************************** var UNum; var LNum; var CallCode; var CallPrice; var CC; var CallOrderCode; var CallExit; function Main_OnStart() { CallExit = false; Main.SetTimer(1, 5000); } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매수신호이면 if (Signal.signalKind == 1) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호 발생"); //1.0이하 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 UNum = Option1.uppersATM; //ATM아래 행사가 갯수 LNum = Option1.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 CallPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 1.0이하이면 if (Option1.GetCurrent(0, i) < 1.0) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option1.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option1.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//1.0보다 크면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 CC = -1; CallOrderCode = -1; for (var iii = -LNum; iii <= UNum; iii++) { if (CallPrice[iii+LNum] > CC) { CC = CallPrice[iii+LNum]; CallOrderCode = CallCode[iii+LNum] } } Main.MessageList("--------------------------------------------"); Main.MessageList("콜종목코드:",CallOrderCode,"/콜현재가 :",CC); //콜옵션종목 매도 if (CallExit == false) { //지정가 Account1.OrderSell(CallOrderCode, 3, Option1.GetBidByCode(CallOrderCode, 5), 0); //시장가 //Account1.OrderSell(CallOrderCode, 3, 0, 1); } } }
프로필 이미지
좌오비우오비
2024-01-06
530
글번호 225907
답변완료

질문드립니다.

안녕하세요. 다음의 옵션 거래를 수식으로 부탁드립니다. 초보자라 죄송합니다. "1차트에서 매수신호 발생하면, 콜옵션 종목 중 현재 가격 1.0 미만의 종목 중 가격이 가장 큰 종목을 선택하여 계좌의 주문가능 수량만큼을 주문한다." "1차트에서 매도신호 발생하면, 풋옵션 종목 중 현재 가격 0.3 초과의 종목 중 가격이 가장 작은 종목을 선택하여 계좌의 주문가능 수량만큼을 주문한다." 답변 해주셔서 감사드립니다.
프로필 이미지
지나리
2023-12-21
496
글번호 225906
답변완료

예스스팟에서 검색으로 불러올때

안녕하세요, 예스스팟에서 검색식으로 불러오는 것 관련하여 궁금한게 있어서요. 예) Main.ReqPowerSearch("종목_검색"); 만약 "종목_검색"이 5분봉 기준으로 되어있다면, 1) 9시54분에 Main.ReqPowerSearch 로 종목 검색이 되도록 하면 완성된 봉 기준, 즉 9시50분까지 봉으로 수식이 동작하여 검색결과가 나올까요? 아니면 현재 진행중인 봉(9시54분) 까지 수식이 동작하고 검색결과가 나올까요? 예를 들어, 검색식이 Close > 3000 이고, 9시 50분 완성된 봉은 2900원인데, 9시 54분 진행 중인 봉이 3050원이면, 예스스팟에 Main_OnRcvItemList 로 조건 충족되어 검색결과가 나오는지 궁금합니다. 2) 완성된 봉이 나오는 시점에 맞춰 검색을 하고 결과를 받고자 한다면, 어떤 방법을 써야 할까요? PC 시간이 아닌 실제 봉이 완성되는 시점에 결과를 받고 싶은데, 5초에 한번씩 Main.ReqPowerSearch를 호출해도 결국 시간차는 존재하기때문에 1분봉이든, 5분봉이든 완성 되는시점에 검색이 들어갈수 있는 방법은 없을까 싶어서요. (물론 검색해서 결과를 가져오는데 딜레이는 있겠지만) 3) 검색이 들어가고 결과를 받아오는데 걸리는 시간은 보유하고 있는 PC 성능에 좌우되나요? 아니면 서버 상태와 관계있나요? 테스트로 돌려보면 9시 장시작하고 일정시간은 종목 검색을 시도해도 몇분간은 아예 응답을 안하는것 같습니다. 장시작시점에 종목검색을 원할하게 받을수 있는 방법이 있을까요?
프로필 이미지
edan
2023-12-18
520
글번호 225905