커뮤니티

예스스팟 Q&A

답변완료

문의드립니다.

예제로 있는 수식보다가 궁금해졌는데요. 예스랭귀지 전략을 스팟에다 적용시키려면 이지랭귀지로 돼 있는 것을 다 자바스크립트 식으로 풀어서 작성해야 하나요? 비슷한 포맷인 웰스멘토도 마찬가지인가요? /*스크립트시작-----------------------------------------------------*/ var Start; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; } function C1_OnRiseSignal(Signal) { var dayma1 = C2.GetIndicatorData("이동평균 5_20_60", 1,0); var dayma2 = C2.GetIndicatorData("이동평균 5_20_60", 2,0); var dayma3 = C2.GetIndicatorData("이동평균 5_20_60", 3,0); var predayma1 = C2.GetIndicatorData("이동평균 5_20_60", 1,1); var slowK = C2.GetIndicatorData("Stochastics",1,0); if (Signal.signalKind == 1 && dayma1 > dayma2 && dayma2 > dayma3 && dayma1 > predayma1 && slowK <= 30) { A1.OrderBuy(Signal.code,Signal.count,SSE.Ask(2),0); Start = 1; } if (Signal.signalKind == 2 && Start == 1) { A1.OrderSell(Signal.code,Signal.count,SSE.Bid(2),0); } }
프로필 이미지
잡다백수
2018-02-11
2813
글번호 224340

파일럿 님에 의해서 삭제되었습니다.

프로필 이미지
파일럿
2018-02-11
3
글번호 224339

약쟁이 님에 의해서 삭제되었습니다.

프로필 이미지
약쟁이
2018-02-10
2
글번호 224338

약쟁이 님에 의해서 삭제되었습니다.

프로필 이미지
약쟁이
2018-02-10
0
글번호 224337
답변완료

오류 수정부탁드립니다.

항상 고맙습니다. 이번에 보내주신 답변 잘 받았습니다. 그런데 테스트를 해 보니 4개의 차트 중에서 3번째 차트에서만 신호가 발생합니다. 혹시나 해서 3번차트의 신호를 삭제했더니 1,2,4번 차트에 신호가 적용이 되어 있는데도 주문이 이루어 지지 않네요. 제가 적용을 잘 못한 것인지 아님 수식의 오류인지 판단할 능력이 부족하여 다시 올립니다. 한번 더 검토해 주셨으면 합니다. **************************************************************************** 안녕하세요 예스스탁입니다. 1. 4개중의 하나의 차트에서 신호가 발생하면 신규 진입한다. 2. 진입시 계약 수 설정할 수 있었으면 합니다.(예 5계약 주문) 3, 하나의 차트에서 신호가 나와서 체결이 되었으면 즉, 포지션이 있으면 다른차트에서의 신규 진입은 무시한다. 4, 1번 차트에서 신호가 나와서 미체결 상태로 남아 있고 2번 차트에서 신호가 나왔다면 미체결 취소하고 2번차트 신호로 신규진입한다. 5, 청산신호가 나와서 포지션이 청산되고 3분뒤에 포지션을 확인해서 포지션이 남아 있으면 모두 시장가로 청산한다. 이 때, 모든 미체결도 모두 취소한다. 6, 아래식에서 정정취소가 제대로 안되는 것 같습니다. 또 청산이 제대로 안되어 포지션이 남아 있는 경우가 많습니다. 수정부탁드립니다. (모의투자에서 적용시) 올려주신 스팟수식으로는 분석이 어려워 위 내용으로 새로 작성해 드립니다. 모의투자는 시장가주문을 제공하지 않습니다 또한 지정가 주문후 바로 시장가로 정정주문은 가능하지 않습니다.' 주문취소 후 새로 시장가로 주문발생시켜야 합니다. 예스스팟은 수식 답변이 단순한 가이드 입니다. 저희가 완전 테스트해서 식을 올려드리지는 않습니다. 수식에 주석을 붙여드립니다. 아래 내용 참고하셔서 수정보완해서 사용하시기 바랍니다. var vol = 5;//진입수량 var OrderCode,pst; var BID,BXID,SID,SXID,BXCID,SXCID; var BEN,BXN,SEN,SXN; //스팟시작 function Main_OnStart() { //주문종목코드 OrderCode = Main.GetOrderCode(MarketData1.code); //차트포지션 신호종류 저장할 변수 pst = 0; //1번타이머 (150600 청산용) Main.SetTimer(1,30000); } //차트1 신호발생 function Chart1_OnRiseSignal(Signal) { //잔고셋팅 Account1.SetBalance(OrderCode, 0); //잔고가 0이고 pst변수도 0일때 매수신호이면 if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 1) { //pst는 1(차트1에서 매수발생의미) pst = 1; //매도1호가로 매수주문 BID = Account1.OrderBuy(OrderCode, vol, MarketData1.Ask(1), 0); } //pst가 1일때 매수포지션 청산신호 발생 if (pst == 1 && Signal.signalKind == 2) { //pst는 0 pst = 0; //매수진입신호 미체결객체 셋팅 Account1.SetUnfill(BEN); //미체결 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEN); } //잔고에 매수수량이 있고 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수1호가로 잔고수량만큼만 매&#49710;주문 BXID = Account1.OrderSell(OrderCode, Account1.Balance.count, MarketData1.Bid(1), 0); //타이머2번 설정, 3분 Main.SetTimer(2,180000); } } //잔고가 0이고 pst도 0이고 매도진입신호 발생 if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 3) { //pst는 -1 (차트1에서 매도발생 의미) pst = -1; //매수1호가로 매도주문 SID = Account1.OrderSell(OrderCode, vol, MarketData1.Bid(1), 0); } //pst가 -1일&#46468; 매도포지션 청산시호 발생 if (pst == -1 && Signal.signalKind == 4) { //pst는 0 pst = 0; //매도진입 미체결객체 셋팅 Account1.SetUnfill(SEN); //미체결 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEN); } //잔고에 매도수량이 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { //매도1호가로 잔고수량만큼 매수주문 SXID = Account1.OrderBuy(OrderCode, Account1.Balance.count, MarketData1.Ask(1), 0); //3번 타이머셋팅 3분 Main.SetTimer(3,180000); } } } //Chart2,Chart3,Chart4의 내용은 Char1과 같음 //pst값만 어떤 차트에서 나온신호인지 구분하기 위해 다른 값이 저장되어 있음 //Chat2는 매수진입 2,매도진입-2 //Chat3는 매수진입 3,매도진입-3 //Chat4는 매수진입 4,매도진입-4 function Chart2_OnRiseSignal(Signal) { Account1.SetBalance(OrderCode, 0); if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 1) { pst = 2; BID = Account1.OrderBuy(OrderCode, vol, MarketData1.Ask(1), 0); } if (pst == 2 && Signal.signalKind == 2) { pst = 0; Account1.SetUnfill(BEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEN); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(OrderCode, Account1.Balance.count, MarketData1.Bid(1), 0); Main.SetTimer(2,180000); } } if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 3) { pst = -2; SID = Account1.OrderSell(OrderCode, vol, MarketData1.Bid(1), 0); } if (pst == -2 && Signal.signalKind == 4) { pst = 0; Account1.SetUnfill(SEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEN); } if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(OrderCode, Account1.Balance.count, MarketData1.Ask(1), 0); Main.SetTimer(3,180000); } } } function Chart3_OnRiseSignal(Signal) { Account1.SetBalance(OrderCode, 0); if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 1) { pst = 3; BID = Account1.OrderBuy(OrderCode, vol, MarketData1.Ask(1), 0); } if (pst == 3 && Signal.signalKind == 2) { pst = 0; Account1.SetUnfill(BEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEN); } if (Account1.Balance.count == 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(OrderCode, Account1.Balance.count, MarketData1.Bid(1), 0); Main.SetTimer(2,180000); } } if (Account1.Balance.count > 0 && pst == 0 && Signal.signalKind == 3) { pst = -3; SID = Account1.OrderSell(OrderCode, vol, MarketData1.Bid(1), 0); } if (pst == -3 && Signal.signalKind == 4) { pst = 0; Account1.SetUnfill(SEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEN); } if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(OrderCode, Account1.Balance.count, MarketData1.Ask(1), 0); Main.SetTimer(3,180000); } } } function Chart4_OnRiseSignal(Signal) { Account1.SetBalance(OrderCode, 0); if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 1) { pst = 4; BID = Account1.OrderBuy(OrderCode, vol, MarketData1.Ask(1), 0); } if (pst == 4 && Signal.signalKind == 2) { pst = 0; Account1.SetUnfill(BEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEN); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(OrderCode, Account1.Balance.count, MarketData1.Bid(1), 0); Main.SetTimer(2,180000); } } if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 3) { pst = -4; SID = Account1.OrderSell(OrderCode, vol, MarketData1.Bid(1), 0); } if (pst == -4 && Signal.signalKind == 4) { pst = 0; Account1.SetUnfill(SEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEN); } if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(OrderCode, Account1.Balance.count, MarketData1.Ask(1), 0); Main.SetTimer(3,180000); } } } //주문응답수신 function Main_OnOrderResponse(OrderResponse) { //매수진입주문에 대한 응답이면 if (OrderResponse.orderID == BID) { //BEN에 주문번호 저장 BEN = OrderResponse.orderNum; } //매수청산주문에 대한 응답이면 if (OrderResponse.orderID == BXID) { //BXN에 주문번호 저장 BXN = OrderResponse.orderNum; } //매도진입주문에 대한 응답이면 if (OrderResponse.orderID == SID) { //SEN에 주문번호 저장 SEN = OrderResponse.orderNum; } //매도청산주문에 대한 응답이면 if (OrderResponse.orderID == SXID) { //SXN에 주문번호 저장 SXN = OrderResponse.orderNum; } //매수청산주문에 대한 취소주문이면 if (OrderResponse.orderID == BXCID) { //잔고셋팅하고 Account1.SetBalance(OrderCode, 0); //매수잔고에 대해 전량으시장가매도주문 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(OrderCode, Account1.Balance.count, 0, 1); } } //매도청산주문에 대한 취소주문이면 if (OrderResponse.orderID == SXCID) { //잔고셋팅하고 Account1.SetBalance(OrderCode, 0); //매도잔고에 대해 전량으시장가매도주문 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(OrderCode, Account1.Balance.count, 0, 1); } } } //타이머동작 function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //2번 타이머(매수청산주문후 3분경과) if (nEventID == 2) { //타이머 종료 Main.KillTimer(2); //매수청산주문에 대한 미체결객체 셋팅 Account1.SetUnfill(BXN); //미체결이 있으면 if (Account1.Unfill.count > 0) { //취소주문 BXCID = Account1.OrderCancel(BXN); } } //3번 타이머(매도청산주문후 3분경과) if (nEventID == 3) { //타이머종료 Main.KillTimer(3); //매도청산주문에 대한 미체결객체 셋팅 Account1.SetUnfill(SXN); //미체결이 있으면 if (Account1.Unfill.count > 0) { //취수주 SXCID = Account1.OrderCancel(SXN); } } //1번타이머 동작되고 15시 6분 이후이면 if (nEventID == 1 && HHMMDD >= 150600) { //타이머 종료 Main.KillTimer(1); //OrderCode로 남아있는 모든 미체결 주문 취소 var num = Account1.GetTheNumberOfUnfills() for(var i = 0; i < num; i++) { Account1.SetUnfill(i); if (Account1.Unfill.count > 0 && Account1.Unfill.code == OrderCode) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //OrderCode 잔고셋팅 Account1.SetBalance(OrderCode,0); //OrderCode로 보유잔고 있으면 시장가로 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(OrderCode, Account1.Balance.count, 0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderBuy(OrderCode, Account1.Balance.count,0,1); } } }
프로필 이미지
지킴이
2018-02-04
2854
글번호 224330
답변완료

확장차트에 시스템전략 적용시 문제

아래와 같은 조건의 확장차트에 시스템전략을 적용하였습니다 차트주기 : 300틱 600틱 등 다양 참조데이터 : 선물30분봉 2000개 그런데 확장차트 외에 예스트레이더 차트에 동일한 전략(차트주기, 참조데이터 적용 동일)을 적용해놓고 실시간 신호를 관찰해보면 확장차트에서 발생하는 신호와 예스트레이더 차트에서 발생하는 신호가 10회중 2~3회 정도 신호 발생 시점 차이가 납니다 1~2분 정도 시차가 아닌 30분 이상 신호 차이가 발생합니다 이런 현상의 원인이 뭔지 문의드립니다
프로필 이미지
훈sys
2018-02-02
2903
글번호 224327

Main.GetUserValue로 불러온 값이 정확한 숫자가 되도록 부탁드립니다..

아래수식에서 Main.GetUserValue("매수가격"); 불러온 값이 1900 이라면 숫자1900으로 인식 못하고 있습니다. var 매수가격; //스팟시작 function Main_OnStart() { Main.SetTimer(1, 5000)//5초, 1000이 1초 //내부파일에 변수 매수가격에 적어놓은 값을 가져와 다시 변수 aa에 저장 var aa = Main.GetUserValue("매수가격"); if (aa == "" ) {매수가격 = 0;} else {매수가격 = aa; } } 중략 ~~~~~ Main.SetUserValue("매수가격",매수가격); } ~ ~~~ 아래 함수수식 중에서 var 매수가격1= (매수가격 + 20) ; 일 때 실제 매수가격이 1900 이라면 매수가격1 =1900 + 20 =1920 이 나오지 않고 190020 이라는 값으로 나옵니다. 어떻게 해야 1920 으로 나올 수 있는지 알려 주시면 고맙겠습니다.
프로필 이미지
종호
2018-02-03
3077
글번호 224323

엑셀데이터 끌어오기관련

안녕하세요? 예스스팟 이제막 매뉴얼보기 시작했습니다. 어느 곳에 질문을 해야할지 모르겠는데요 파이썬등으로 계산된 결과를, 엑셀의 특정셀에 시계열이 아닌, 0,1,2 등 한개의 단순수치로 저장할때에, 저장되는 그 시점에 , 그 한개의 수치를 예스스팟이나,데이터매니저로 즉시 자동적으로 끌어와서, 예스랭귀지로 미리 만들어 놓은 전략에, 중요변수로 즉시 입력시켜 해당봉의 1분봉종가에 그 수치에 따라 매수,매도주문을 내는 방법이 있을까요? 예스스팟의 엑셀객체가 그 역할을 하는 것 같은데, 자바스크립트를 모르고, 예스스팟이 처음이다 보니,어떻게 스팟전략을 짜야할지 모르겠습니다. Q&A 찾아보니, 비슷한 예제를 찾을 수가 없어, 질문을 올렸습니다. 예제나 방법을 알려주시면 감사하겠습니다.
프로필 이미지
친구
2018-01-31
3206
글번호 224322
답변완료

스팟 수식 수정 부탁드립니다

/* 아래는 게시판에 올라와 있는 종목검색후 자동주문하는 스팟식입니다. 아래와 같은 내용을 업그레이드 부탁드립니다. 1. 매수 및 손절은 파워 검색 종목이용 2. 청산은 보유 종목 중 'BollingerBandUP 하향 이탈'시 시장가로 자동청산(파워종목 검색 이용하지 않음) 3. Stoptrailing을 수익감소 3%로 설정 해주시면 감사드리겠습니다 */ var EntryMoney; var ItemList,Count; var MObj; var Scode = [], Blist = [], Slist = []; var Blistcount, Slistcount; var Req = 0; var con; function array_diff(a, b) { var tmp = {}, res = []; for(var i =0; i < a.length; i++) tmp[a[i]]=1; for(var i =0; i < b.length; i++) {if(tmp[b[i]]) delete tmp[b[i]];} for(var k in tmp) res.push(k); return res; } //스팟시작 function Main_OnStart() { //타이머설정 Main.MessageList("시작"); Main.ReqPowerSearch("수익률상위BBand") Main.SetTimer(1, 300000);//간격(300초 5분) EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); } function Main_OnTimer(nEventID) { //타이머동작하면 사용자검색조건 실행 if (nEventID == 1) { Main.MessageList("종목검색시작"); Main.ReqPowerSearch("Stest"); EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)/10); Req = 0; } if (nEventID == 2 && Req < Blistcount) { if(Req <Blistcount) { Main.ReqMarketData(Blist[Req], 0, 0); Req = Req+1; Main.MessageList(Blist[Req-1], Req, Blistcount, "매수"); } if(Req == Blistcount) { Main.KillTimer(2); Req = 0; Slist = array_diff(Scode, ItemList); Slistcount = Slist.length; Main.MessageList(Slistcount); Main.SetTimer(3, 250); //간격(1초) } } if(nEventID == 3 && Req < Slistcount) { if(Req <Slistcount) { con = 2; Main.ReqMarketData(Slist[Req], 0, 0); Req = Req+1; Main.MessageList(Slist[Req-1], Req, "매도"); } if(Req == Slistcount) { Main.KillTimer(3); } } } //종목검색이 완료 function Main_OnRcvItemList(aItemList, nCount) { //검색종목수가 1개 이상이면 if (nCount >= 1) { ItemList = aItemList; Bcode = []; var num = Account1.GetTheNumberOfBalances(); //잔고셋팅해서 보유종목이 아니면 for(var i = 0; i < num; i ++) { Account1.SetBalance(i); Scode.push(Account1.Balance.code); } Blist = array_diff(ItemList, Scode); Req = 0; Blistcount = Blist.length; Main.MessageList(Blistcount, "매수수량") ; con = 1 ; Main.SetTimer(2, 250); //간격(1초) } } //요청한 종목객체가 생성되면 function Main_OnRcvMarketData(MarketData) { var EntryVol = 0; MObj = MarketData; //1주 단위일 경우 if (con == 1) { if(MObj.Ask(2) > 100000) { EntryVol = 1; } else { EntryVol = Math.floor(EntryMoney / MObj.Ask(2)); } if(EntreVol > 0) { Account1.OrderBuy(MObj.code, EntryVol, MObj.Ask(2), 0); } } //10주 단위일 경우 if (con == 2) { Account1.SetBalanceItem(MObj.code, 0); Account1.OrderSell(MObj.code, Account1.Balance.count, MObj.Bid(2), 0) } Main.RemoveMarketData(MObj); }
프로필 이미지
mirror05
2018-01-29
3270
글번호 224320

데이터베이스 객체 문의드립니다.

데이터베이스 객체를 사용해서 스팟 작성을 하는 도중 오류가 떠서 어떤게 문제인지 알 수 있을까요? 오류 내용은 "지정된 DSN은 드라이버와 응용 프로그램 간 아키텍처 불일치를 포함합니다." 라고 뜨네요...
프로필 이미지
도비
2018-01-25
3032
글번호 224317