커뮤니티

예스스팟 Q&A

답변완료

질문드립니다.

var ItemList; var Count; var ReqCount; function Main_OnStart() { Main.MessageLog("스팟시작"); Main.MessageLog("종목검색시작"); Main.ReqPowerSearch("급등주검색"); } function Main_OnRcvItemList(aItemList, nCount) { ItemList = aItemList; Count = nCount; Main.SetTimer(1, 1000); ReqCount = 0; } function Main_OnTimer(nEventID) { if (nEventID == 1) { var StopSet = new SystemStopInfo(new StopLoss(5, CALCMETHOD_PERCENT, 0), new StopTrailing(5, 7, CALCMETHOD_PERCENT, 0), new StopProfitTarget(10, CALCMETHOD_PERCENT, 0), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93), new StopEndOfDay(230000)); var ChartSet = new ReqChartItem(ItemList[ReqCount],2,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("##단타", YL_TYPE_NORMAL, null, null, null); Main.ReqChartEx(ChartSet,SystemSet); Main.MessageLog("확장차트생성_"+ItemList[ReqCount]); ReqCount = ReqCount+1; if (ReqCount == Count) { Main.KillTimer(1); Main.MessageLog("종목검색완료"); } } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //매수신호이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.current),0,1); Main.MessageLog("매수주문"); } if (Signal.signalKind == 2) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //미체결종목이 신호종목과 같고 미체결수량이 있으면 if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고수량만큼만 매도 1. 위와같이 구성할 경우 종목검색도 끝마치고, 확장차트까지 불러와줍니다. 근데 그 이후 수량을 선택하지 않았다며 주문이 나가질 않네요. 저는 수량보다 주문금액으로 처리하고싶습니다만... 어디가 문제인지요? 2. 위 수식에 종목검색을 3분주기로 계속 하며 검색을 할 수 있는 로직이 추가되었으면 좋겠습니다.
프로필 이미지
stockric
2018-12-26
2809
글번호 224681

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

프로필 이미지
kosto
2018-12-10
0
글번호 224677
답변완료

수식 공부중인데 어려워서 도움 부탁드립니다^^

조건검색식 연구해봐서 실행중인데 시스템 자동매매에 적용해보고 싶은데 프로그램 만드는 부분이 어려워서 고수분들 계심 도움 부탁드립니다^^ 1)이평이격도: 1분봉기준 0봉전 6일 이평에 0.3%이내 근접 1회이상 2)당일 거래량: 6만주이상 거래량 발생 3)전일 대비 주가등락률 순위 상위 100위권 이내 종목 검색 4)10분봉기준 0봉전 이평선 10이평을 1봉이내 박스안에서 종가가 1회이상 상한선 상향돌파 5)시가총액 300억 이상~2000억이내 6)주가범위 : 1000원이상 100000만원 이하 7)기간내 등락률 10분봉기준으로 1봉전 기준 200봉이내에서 저가대비 고가 5%이상 조건 8)주가등락률: 일봉기준 0봉전기준 시가대비 0봉전 종가등락률 -5%이상 9)검색 포착 시간 10시~10시 10분 사이에 위에 조건식으로 차례로 검색되는 종목들을 매수 가능 금액에 비중 10프로 시장가 매수 --->> 10시 9분에 100% 시장가 매도 10)매수 시점 기준으로 1>자동익절 5% 2>자동손절 -2% 이렇게 설정을 하려고 하는데 가능할까요?^^ 도움 부탁드립니다.
프로필 이미지
황금타점
2018-12-03
3047
글번호 224676
답변완료

청산이 제대로 안되네요 ㅠㅠ

input : GapUP(0.5), GapDN(0.5),BAD(10),GOOD(10); if sDate != sDate[1] Then { if O > C[1] * (1+GapUP/100) then { if C >= O AND data2(O) < Data2(C) Then buy("Gap-run-buy", atStop, C); Else If C < O AND data2(O) > Data2(C) Then Sell("Gap-fill-sell", atStop, C); } if O < C[1] * (1-GapDN/100) then { if C >= O AND DATA2(C) > DATA2(O) Then buy("Gapfill-buy", atStop, C); Else if C < O AND DATA2(C) < DATA2(O) Then Sell("Gap-run-sell", atStop, C); } } setstoploss(2,pointstop); SETSTOPTRAILING(BAD,GOOD,PERCENTSTOP); setstopendofday; -------------------------------------------------------------------------------------- setstoploss가 제대로 구동 안되고... setstoptrailing을 저렇게 하는게 맞는지 여쭤볼 수 있을까요.. ㅜ ㅜㅜ 식은 외국인선물순매수금액이랑 갭런필 전략을 합쳐서 진입을 더 엄격하게 설정한 것입니다.
프로필 이미지
지녕
2018-11-27
2750
글번호 224673
답변완료

질문드립니다.

아래와 같은 yeslanguage 전략을 이용하는 걸 테스트 중인데요. 예스 검색식에서 만들어서 파워검색식이나 종목검색식에서는 결과가 잘 나옵니다. 그런데 스팟의 아래식에 test 종목(만든것) 이름을 넣어서 해보니, "파일을 열 수 없습니다." 라는 에러가 뜨면서 안됩니다. 해결방법을 알려주시면 감사하겠습니다. 아래 업데이트는 *처리 하였습니다. var cond,rcvChart,rcvMK, RcvChartEnd = false; var item,itemcnt; //아래 배열변수를 사용하는 이유는 동일종목의 정보는 배열변수의 동일방번호에 저장하기 위함입니다. var CT = [];//차트객체 저장할 배열변수 var MK = [];//종목객체 저장할 배열변수 var IS = [];//미완성 신호횟수 저장할 배열변수 var VV = [];//주문수량 저장할 변수 var C1 = [];//첫 매수가격을 저장할 변수 var CC = [];//다음 하락시 가격을 저장할 변수 //스팟 시작시 종목검색 요청 function Main_OnStart() { Main.ReqPowerSearch("test");//사용자검색조건명 지정 var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); rcvChart = 0; } //종목검색 완료(aItemList : 종목리스트), (nCount : 종목수) function Main_OnRcvItemList(aItemList, nCount) { item = aItemList; itemcnt = nCount; RcvChart = 0; RcvChartEnd = false; //확장 챠트요청(최대 100개까지만 가능) // 확장챠트의 생성과 적용될 시스템의 세부 설정 var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 20); // 최대진입횟수 //종목검색된 종목의 차트와 종목객체 요청 for (var i = 0; i < Math.min(itemcnt,100); i++) { //생성할 차트 셋팅 var C1 = new ReqChartItem(item[i], 1, CHART_PERIOD_DAILY, 499,CHART_REQCOUNT_BAR,false, false); //차트에 적용할 시스템명 및 설정 var S1 = new SystemInfo("DMI스팟",YL_TYPE_NORMAL,null,TradeSet,null); Main.ReqChartEx(C1,S1); Main.ReqMarketData(item[i]); } } //차트객체 수신받으면 //해당 종목의 종목검색순번과 같은 번호의 배열방에 차트객체저장 function Main_OnRcvChartEx(ChartEx) { for (var i = 0; i < Math.min(itemcnt,100); i++) { if (ChartEx.code == item[i]) { CT[i] = ChartEx; } } } //차트객체 수신받으면 //해당 종목의 종목검색순번과 같은 번호의 배열방에 종목객체저장 function Main_OnRcvMarketData(MarketData) { for (var i = 0; i < Math.min(itemcnt,100); i++) { if (MarketData.code == item[i]) { MK[i] = MarketData; } } } //각 차트의 새로운 봉이 생성 function Main_OnBarAppended(ChartEx, nData) { //차트와 종목객체 전체가 수신이 완료된 상태이고 if (CT.length == Math.min(itemcnt,100) && MK.length == Math.min(itemcnt,100) ) { //새로운봉이 생성된 종목과 CT배열의 종목과 비교해 //같은 종목을 찾으면 미완성신호를 카운트 하는 배열변수의 동일방번호를 0으로 초기화 for (i = 0; i < Math.min(itemcnt,100); i++) { if (ChartEx.code == CT[i].code) { IS[i] = 0; } } } } //확장챠트에서 발생한 신호에 의해 주문을 넣는 단계 function Main_OnRiseIncompleteSignal(ChartEx, IncompleteSignal) { //차트와 종목객체 전체가 수신이 완료된 상태이고 if (CT.length == Math.min(itemcnt,100) && MK.length == Math.min(itemcnt,100) ) { //잔고세팅 A1.SetBalance(IncompleteSignal.code, nPosition); //buy신호 발생 if (IncompleteSignal.signalKind == 1) { //해당 종목의 방번호를 찾아서 for (i = 0; i < Math.min(itemcnt,100); i++) { if (ChartEx.code == CT[i].code && ChartEx.code == MK[i].code) { //카운트 1증가 IS[i] = IS[i]+1; //현재 미완성신호 발생하고 해당종목의 잔고가 0이고 첫번째 매수미완성신호이면 매수 if (A1.Balance.count == 0 && IS[i] == 1) { // 매수주문 A1.OrderBuy(IncompleteSignal.code, IncompleteSignal.count , MK[i].Ask(3), 0); //수량과 가격 저장 C1[i] = IncompleteSignal.price ;//최초매수가 CC[i] = 0.1;//하락시 가격 계산할 변수 VV[i] = (IncompleteSignal.price * IncompleteSignal.count)*0.1;//최초매수금의 10% } } } } //잔고에 수량이 있고 청산신호 발생하면 청산 if (A1.Balance.count > 0 && IncompleteSignal.signalKind == 2) { // 매도주문 A1.OrderSell(IncompleteSignal.code, A1.Balance.count, MK[i].Bid(3), 0); } } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { //체결데이터 수신 업데이트 if (lUp*dateID == 20001) { //루프를 돌아 생성된 종목중 어떤 종목인지 파악 for (i = 0; i < Math.min(itemcnt,100); i++) { //어떤 배열방의 종목인지 찾았으면 if (sItemCode == MK[i]) { //해당 종목 잔고셋팅 A1.SetBalance(MK[i].code, 0); //잔고 수량이 있을때만 if (A1.Balance.count > 0) { //최초 매수가격의 2% 이상 상승하면 전량청산 if (MK[i].current >= C1[i]*1.02) { A1.OrderSell(MK[i].code,A1.Balance.count, MK[i].Bid(3), 0); } //하락시 매수할 가격이하이면 추가매수 if (MK[i].current <= Ci[i]*(1-CC[i])) { A1.OrderBuy(MK[i].code,Math.floor(VV[i]/MK[i].Ask(3)),MK[i].Ask(3), 0); CC[i] = CC[i]+0.1;//0.1을 추가해줌 } } } } } }
프로필 이미지
절제9단
2018-11-27
2907
글번호 224672
답변완료

15초에 15번 이상 매매 발생시 해당 신호가 정지가 되나요?

제가 알고 잇는것이 맞는지 확인차 문의드립니다. 그러니까 15초의 기간동안 1초에 1번 이상 매매 신호가 발생하면 해당 스팟 신호를 제한하는것 같은데 명확하지가 않습니다. 어디에도 그런 내용이 없구요. 그런데 어떨땐 정지가 되고 또 어떨땐 정지가 안되는 거 같아서 명확한 답변을 듣고 싶습니다.
프로필 이미지
궁금궁금123
2018-11-20
2751
글번호 224671
답변완료

매수매도 청산

매수신호: ATM 5초간격 콜매수 매수청산 신호: 종목관계 없이 잔고가 있으면 5초간격 콜매도 청산 매도신호: 어떤 종목 5초간격 풋매수 매도청산 신호: 종목관계 없이 잔고가 있으면 5초간격 풋매도 청산 var CallCode,PutCode; var BEcnt,BXcnt,SEcnt,SXcnt; var MaxEntryVol = 3; var MaxExitVol; function C1_OnRiseSignal(Signal) { if (Signal.signalKind == 1 ) { Main.MessageList("매수신호발생"); CallCode = Option.GetATMCallRecent(0); var CallPrice = Option.GetAskByCode(CallCode,2); A1.OrderBuy(CallCode, 1, CallPrice, 0); BEcnt = 1; //1번 타이머 5초 셋팅 Main.SetTimer(1,5000); } if (Signal.signalKind == 2 ) { Main.MessageList("매수청산신호발생"); var BxPrice = Option.GetBidByCode(CallCode, 2); A1.OrderSell(CallCode, 1, BxPrice, 0); BXcnt = 1; //보유수량이 2계약 이상이면 if (MaxExitVol >= 2) //2번 타이머 5초 셋팅 Main.SetTimer(2,5000); } if (Signal.signalKind == 3 ) { Main.MessageList("매도신호발생"); PutCode = Option.GetATMPutRecent(0); var PutPrice = Option.GetAskByCode(PutCode, 2); A1.OrderBuy(PutCode, 1, PutPrice, 0); SEcnt = 1; //3번 타이머 5초 셋팅 Main.SetTimer(3,5000); } if (Signal.signalKind == 4 ) { Main.MessageList("매도청산발생"); var SxPrice = Option.GetAskByCode(PutCode, 2); A1.OrderSell(PutCode, Vo, SxPrice, 0); SXcnt = 1; //보유수량이 2계약 이상이면 if (MaxExitVol >= 2) //4번 타이머 5초 셋팅 Main.SetTimer(4,5000); } } //타이머 동작 function Main_OnTimer(nEventID) { //1번 타이머 동작할 때마다 if (nEventID == 1) { //카운트 BEcnt = BEcnt+1; //카운트가 최대진입수량 이하이면 if (BEcnt <= MaxEntryVol) { //1계약씩 추가매수 A1.OrderBuy(Code, 1, Option.GetAskByCode(Code,2), 0); } //최대진입수량에 도달하면 타이머종료 if (BEcnt == MaxEntryVol) { Main.KillTimer(1); } } //2번타이머 동작할때마다 if (nEventID == 2) { //카운트 BXcnt = BXcnt+1; //카운트가 보유수량 이하이면 if (BXcnt <= MaxExitVol) { //1계약씩 매도주문 A1.OrderSell(Code, 1, Option.GetBidByCode(Code,2), 0); } //카운트가 보유수량에 도달하면 타이머 종료 if (BXcnt == MaxExitVol) { Main.KillTimer(2); } } if (nEventID == 3) { SEcnt = SEcnt+1; if (SEcnt <= MaxEntryVol) { A1.OrderBuy(Code, 1, Option.GetAskByCode(Code,2), 0); } if (SEcnt == MaxEntryVol) { Main.KillTimer(3); } } if (nEventID == 4) { SXcnt = SXcnt+1; if (SXcnt <= MaxExitVol) { A1.OrderSell(Code, 1, Option.GetBidByCode(Code,2), 0); } if (SXcnt == MaxExitVol) { Main.KillTimer(4); } } }
프로필 이미지
팡팡
2018-12-09
2922
글번호 224670
답변완료

양매도 수식 추가

안녕하세요 양매도 진입 수식에 다음 2가지 방식의 추가수식 부탁드립니다. << 방식1. 전일data 조건 추가 >> 1) 전일 종가기준으로 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산 2) 당일 진입봉 시점에서 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산 3) 진입수식에 2)값이 1)값보다 작을 때라는 조건 추가 <--- 진입봉 startN '전일 콜풋 동일 행사가의 양합최저치 > 당일 진입시점 콜풋 동일 행사가의 양합최저치' 입니다. << 방식2. 이전봉data 조건 추가 >> 1) 당일 진입봉 이전3개봉 각각의 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산한 후, 3개값의 평균을 구함 2) 당일 진입봉 시점에서 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산 3) 진입수식에 2)값이 1)값보다 작을 때라는 조건 추가 <--- 진입봉 startN '당일 진입봉이전 3개봉 콜풋 동일 행사가 각각의 양합최저치의 평균 > 당일 진입시점 동일 행사가의 양합최저치' 입니다. ** 마지막으로, 현재 진입후 E1 = 0 에서 청산시 E1 = 1 로 전환되는데 이럴경우 실제로 진입수량이 없음에도 불구하고 청산이 발생하고 있습니다. 1) 진입수량이 완전히 체결된 경우만 청산이 발생하도록 하고 2) 청산수량이 완전히 체결된 후, 조건에 의해서 재진입이 가능하도록 수식 변경 부탁드립니다. 3) 동일계좌에 여러 시스템이 운용되고 있어서, 해당 시스템 수량에 한합니다. ** 글쓰기가 안되서, OnUp*ateMarket, lUp*ateID 로 표시했습니다. 이상입니다. 감사합니다 !! ---------------------------- // YT 'dayindex' 지표 사용 //내부변수지정 var C1,E1; var SellC_code; var SellP_code; //ATM-50~+50까지 옵션종목의 가격과 코드를 담을 배열변수 var CPrice = new Array(101); var CCode = new Array(101); var PPrice = new Array(101); var PCode = new Array(101); //가격 0.00이상~UpLt이하의 옵션중 최고가 콜옵션,풋옵션 저장변수 var MaxCall; var MaxCallCode; var MaxPut; var MaxPutCode; //콜옵션,풋옵션 베팅수량변수 var CVol; var PVol; // 현재가 추적 var Chart1,ChartReq; function Main_OnStart() { //차트설정 MarketData1종목 1분봉 1개 var SetChart = new ReqChartItem(MarketData1.code, 1, CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false, false); //지표설정 (dayindex라는 이름의 지표적용) var SetInd = new IndicatorInfo("dayindex"); //차트생성 Main.ReqChartEx(SetChart,null,new Array(SetInd)); ChartReq = false; Main.MessageLog("Start"); } function Main_OnRcvChartEx(ChartEx) { Chart1 = ChartEx; ChartReq = true; } function Main_OnBarAppended(ChartEx, nData) { Main.MessageList("봉완성",ChartEx.GetIndicatorData("dayindex",1,0)); if (ChartEx.GetCode(1) == MarketData1.code) { //startN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == startN && MarketData1.time < 1500000000) { C1 = Chart1.GetClose(1,1); //UpLt보다 작은 종목의 코드와 가격을 배열에 저장 ---------------------> start for(var i = -50; i <= 50; i++) { if (Option.GetCurrent(0,i) < UpLt && Option.GetCurrent(0,i) > 0) //---> UpLt { CPrice[50+i] = Option.GetCurrent(0,i); CCode[50+i] = Option.GetATMCallRecent(i); } else { CPrice[50+i] = -1; CCode[50+i] = -1; } if (Option.GetCurrent(1,i) < UpLt && Option.GetCurrent(1,i) > 0) //---> UpLt { PPrice[50+i] = Option.GetCurrent(1,i); PCode[50+i] = Option.GetATMPutRecent(i); } else { PPrice[50+i] = -1; PCode[50+i] = -1; } } //저장된 CPrice,PPrice값중 최고값 계산 MaxCall = -1; MaxCallcode = -1; MaxPut = -1; MaxPutcode = -1; for(var A = 0; A <= 100; A++) { if (CPrice[A] > MaxCall) { MaxCall = CPrice[A]; MaxCallcode = CCode[A]; } if (PPrice[A] > MaxPut) { MaxPut = PPrice[A]; MaxPutcode = PCode[A]; } } //-------------------------------------------------------------------> end SellC_code = MaxCallcode; var SellC_price = MaxCall; CVol = Math.floor(SeedMoney/(SellC_price*100000*MultiN)); //---> SeedMoney이내 콜매도 var SellCC_price = Option.GetBidByCode(SellC_code,5); //---> Call 5호가 매도 SellP_code = MaxPutcode; var SellP_price = MaxPut; PVol = Math.floor(SeedMoney/(SellP_price*100000*MultiN)); //---> SeedMoney이내 풋매도 var SellPP_price = Option.GetBidByCode(SellP_code,5); //---> Put 5호가 매도 if (MaxCall > 1 && MaxPut > 1 && MaxCall+MaxPut > 2.5) { Account1.OrderSell(SellC_code, CVol, SellCC_price-0.3, 0); Account1.OrderSell(SellP_code, PVol, SellPP_price-0.3, 0); } Main.MessageList("양매도 진입"); E1 = 0; } //endN번째봉 청산 if (ChartEx.GetIndicatorData("dayindex",1,0) == endN && E1 == 0) { E1 = 1; Main.MessageList("End 청산"); var xC_price = Option.GetAskByCode(SellC_code,5); //---> Call 5호가 청산 Account1.OrderBuy(SellC_code, CVol, xC_price+0.3, 0); var xP_price = Option.GetAskByCode(SellP_code,5); //---> Put 5호가 청산 Account1.OrderBuy(SellP_code, PVol, xP_price+0.3, 0); } } } function Main_OnUp*ateMarket(sItemCode, lUp*ateID) { if (ChartReq == true && Chart1.GetCode(1) == MarketData1.code && lUp*ateID == 20001) { //startN~endN번째봉 가격차 청산 - 현재가 기준 if (Chart1.GetIndicatorData("dayindex",1,0) > startN && Chart1.GetIndicatorData("dayindex",1,0) < endN && Math.abs(MarketData1.current-C1) >= 가격차 && E1 == 0) { E1 = 1; Main.MessageList("가격차 청산"); var xC_price = Option.GetAskByCode(SellC_code,5); //---> Call 5호가 청산 Account1.OrderBuy(SellC_code, CVol, xC_price+0.3, 0); var xP_price = Option.GetAskByCode(SellP_code,5); //---> Put 5호가 청산 Account1.OrderBuy(SellP_code, PVol, xP_price+0.3, 0); } } }
프로필 이미지
새로운세상
2018-12-13
2858
글번호 224669
답변완료

질문있습니다.

봉완성시에 주문이 나가는 전략이 있다면 예스스팟으로 봉완성 3초전에 주문이 나가게 할 수 있나요? 가능하다면 수식 좀 부탁드립니다. 감사합니다.
프로필 이미지
쥬롱
2018-11-19
2709
글번호 224668
답변완료

예스스팟에서 텍스트 파일을 읽고 쓰는 방법

안녕하세요. 예스랭귀지로 작성한 전략식을 예스스팟으로 옮기기 위해 열심히 공부 중입니다. 예스스팟에서 텍스트 파일을 읽고 쓰는 방법에 대해 문의드립니다. 읽고자 하는 파일은 숫자 몇개가 콤마로 구분되어 있는 두어줄 정도의 크기입니다. 이런 텍스트 파일을 예스스팟에서 읽어들일 방법이 있는지요? 안된다면 엑셀을 이용하는 방법은 없을까요? 답변 부탁드립니다. 감사합니다.
프로필 이미지
좋은밤
2018-11-16
2622
글번호 224666