커뮤니티

예스스팟 Q&A

답변완료

안녕하세요 예스트레이더 사용중인데요

아래 설명드리는 형태의 매매로 개발이 가능할려나요?? 키움 사용자인데 키움 검색식을 통한 매매를 하고 있습니다. 좀 더 저에게 맞는 검색식을 통한 매매를 하고 싶어 예스트레이더를 사용할려고하는데요 키움에서 사용하는 검색식과 동일한 내용으로 수식화하여 자동매매를 진행할수있나요 ?? 저같은 경우 기본검색식을 만들고 제가 정한 포트폴리오 안에서 검색조건에 맞는것만 매수는 시장가 매도는 매수3호가로 매매하게 되어있습니다. 그리고 위내용을 기본으로 예스트레이더 에서는 특정지수의 평균수치를 잡아내서 매매 비중조절, 일부 지표에 따른 오버나잇등을 설정해볼려고 하는데 혹시 위에 적은대로 예스트레이더에서 구현이 가능할까요??? 구현이 된다면 그 내용을 시뮬레이션도 가능하나요 ? 답변 부탁드립니다 . 감사합니다.
프로필 이미지
alphagee
2018-03-14
3015
글번호 224354

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

프로필 이미지
wl
2018-03-14
0
글번호 224353
답변완료

재무검색

안녕하세요 예스스팟으로 영업이익률 상위 10 종목 중 피봇(30분봉) 기준선 돌파하는 종목을 매수, 1차 저항선 하락 돌파시 매도하는 전략을 구현하려고 합니다 파워종목 검색에서 재무검색의 기준시점이 재무비율은 전전년말 대비 전년말 기준인 것으로 알고 있습니다 스팟이나 파워종목 검색에서 영업이익율((분기영업이익/전년 동분기 영업이익-1)*100) 상위 10 종목을 선택할 수 있는 방법이 있을 까요?(전전년말 대비 전년말 기준이 아님) 스팟 예제 코드나 파워종목 검색하는 방법 또는 다른 방법이 있다면 부탁 드립니다
프로필 이미지
mirror05
2018-03-12
2774
글번호 224351
답변완료

확장차트 객체를 삭제할 수 있나요?

종목코드 배열을 만들고 순차적으로 종목에 해당되는 확장차트 객체를 생성한 후 사용하는데 100번 넘어가면 더이상 차트객체를 생성할 수 없다는 오류 메세지가 뜨네요.. 사용이 끝난 차트 객체는 삭제하고 싶은데 어떻게 하면 되나요? 만약 삭제가 안된다면... 순차적으로 종목별 차트 객체를 생성하여 사용할 수 있는 다른 방법이 있는지요?
프로필 이미지
gutentak
2018-03-08
2603
글번호 224350
답변완료

주문함수를 전역변수에 담아 그 전역변수이름으로 쓸수 있나요?

안녕하세요? 수고 많으십니다. 시장상황에 따라 매수주문 또는 매도주문이 나가는 전략인데요 매 경우의 수마다 매수, 매도 주문을 구분하여 각각 코딩하려니깐 너무 길어지고 가독성이 떨어집니다 아래의 예처럼 주문함수를 변수에 담아 쓸 수 있을까요? 첵에 보면 bind 메소드를 이용하여 Function오브젝트를 생성하면 된다는데... 잘 안되는군요. 꼭 부탁드립니다 감사합니다. 꾸벅! < 코딩예 > 외부입력변수: inpBuyOrSell var ordFnc; //주문함수를 그때그때 복사해서 쓸 전역변수 function Main_OnStart() { if(inpBuyOrSell == "Buy"){ ordFnc = Account1.OrderBuy; //또는 Account1.OrderBuy.bind(); }else if(inpBuyOrSell == "Sell"){ ordFnc = Account1.OrderSell; } Main.SetTimer(1, 60000); } function Main_OnTimer(nEventID) { if(nEventID == 1){ ordFnc(Option1.GetATMCallRecent(0, 0), 1, Option1.GetCurrent(0, 0), 0); } }
프로필 이미지
brucehan
2018-03-04
2590
글번호 224349
답변완료

문의 드립니다.

모의투자 진행 중입니다. 오늘 차트에서 기본적인 청산 신호인 ExitShort("청산"); 발생하여 예스스팟에서 청산 로직이 실행이 되었습니다. 그런데 ExitShort("청산", AtStop, lowest(L, BarsSinceEntry+1) + atr(var1)*var2); 청산신호가 차트에서 뜨면 예스스팟의 Chart_OnRiseSignal(Signal) 까지는 타고 가는데 Signal.signalKind == 4 로직을 실행 시키지 못했습니다. (모의투자에서) AtStop 문제인가요? 아니면 다른 문제인가요? 28일 이전에는 AtStop 신호가 제대로 청산이 되었습니다.
프로필 이미지
달무드
2018-03-02
2536
글번호 224347
답변완료

봉의 시작시간

아래의 수식을 var T; function Main_OnStart() { T = 0; Main.MessageLog("시작"); OrderCode = Main.GetOrderCode(KP.code); } function C1_OnRiseIncompleteSignal(IncompleteSignal) { Main.MessageLog("미완성신호/"+IncompleteSignal.signalKind); A1.SetBalance(Main.GetOrderCode(IncompleteSignal.code)) 이하생략 } 매 영업일 09시 05분 이후부터 영업일 종료시간까지 발생하는 미완성신호만을 적용하고자 할 때의 수식으로 변경하여 주시면 감사하겠습니다.
프로필 이미지
너무조아
2018-03-03
2618
글번호 224346
답변완료

문의드립니다.

선물옵션 거래시 옵션 양매도를 할경우 가격교차지점에서 양매도 포지션을 진입하거나, 일정시간즉 매일 11시에 양매도 진입하고, 양합이 50틱 수익 발생시 일괄청산하거나, 매일 15에 일괄청산하는 수식을 부탁드려도 될까요?
프로필 이미지
하늘북
2018-03-01
2711
글번호 224345

달무드 님에 의해서 삭제되었습니다.

프로필 이미지
달무드
2018-02-23
15
글번호 224344
답변완료

질문입니다.

현재 선물 1계약을 운용하고 있습니다. 예스트레이더로 시스템을 작성하였고, 예스스팟으로 주문을 컨트롤하고 있습니다. 간단히 설명을 드리면 다음과 같습니다. 예스스팟 구동시 현재의 계좌상황을 파악하게됩니다. 현재 포지션이 없는지 있는지, 있다면 롱포지션인지 숏포지션인지 판단합니다. 그리고 예스트레이더에서 신호가 발생하면, 예스스팟으로 실행합니다. 만약 체결되지 않는다면 5초마다 정정거래를 발생시킵니다. 여기까지 적성되어 있습니다. 질문입니다. 예스트레이더 선물거래시스템을 3계약으로 늘릴려고합니다. 피라미딩으로 말이죠. 예를들어 1계약 매수진입 후 추가조건을 만족하면 1계약추가진입하고(총2계약), 또다시 추가조건진입을 만족하면 1계약추가진입합니다(총3계약). 매도쪽도 마찬가지입니다. 예스트레이더 시스템은 완성하였습니다. 이를 예스스팟으로 신호를 컨트롤하고자 합니다. 예스스팟 로직은 다음과 같이 구성하고 싶습니다. 처음 예스스팟 구동 시 현재 포지션의 상황을 파악합니다. 포지션이 없는지 있는지, 있다면 롱포지션인지 숏포지션인지, 그리고 추가사항이 현재포지션에서 진입한 계약수가 몇개인지 파악하고 싶습니다. 그리고 피라미딩 진입도 예스스팟으로 컨트롤하고 싶습니다. 예를들어 매수1계약 진입을 "Long1"으로 명명한다면, 추가1계약진입 시 "Long2"로 명명하고, 여기서 추가1계약진입 시 "Long3"로 명명하고 싶습니다. 매수청산도 각각 "Exit Long1", "Exit Long2", "Exit Long3"으로 명명하고 싶습니다. 매도쪽도 마찬가지입니다. 피라미딩 진입도 초기1계약진입과 마찬가지로 정정주문을 5초마다 현재가를 갱신하며 정정하고 싶습니다. 현재사용하고 있는 예스스팟을 올립니다. 아직 예스스팟에 익숙치못해 그러니, 상세한 주석과 함께 부탁드립니다. 감사합니다. 예스스팟 //yT7 var Position; var OrderCode; var BID, BXID, SID, SXID; var BNum, BXNum, SNum, SXNum; function Main_OnStart() { //"OnStart" 출력. //Main.MessageLog("Start"); //시스템을 연결선물에 적용. 따라서 주문용 종목코드를 리턴받아 OrderCode에 저장. OrderCode = Main.GetOrderCode(MarketData1.code); //OrderCode종목 잔고셋팅. Account1.SetBalance(OrderCode, 0); //현재 포지션이 매도나 매수가 아니라면, if (Account1.Balance.position != 1 && Account1.Balance.position != 2) { //Position에 0 대입. Position = 0; //"Current Zero" 출력. Main.MessageLog("Current Zero"); } //현재 포지션이 매도라면, if (Account1.Balance.position == 1) { //Position에 -1 대입. Position = -1; //"Current Short" 출력. Main.MessageLog("Current Short"); } //현재 포지션이 매수라면, if (Account1.Balance.position == 2) { //Position에 1 대입. Position = 1; //"Current Long" 출력. Main.MessageLog("Current Long"); } } function Chart1_OnRiseSignal(Signal) { //완성된 시그널 출력. //Main.MessageLog("Signal : "+Signal.signalKind); //Position가 0이고, 시그널 종류가 매수라면, if (Position == 0 && Signal.signalKind == 1) { //Position에 1 대입. Position = 1; //주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Buy 주문, BID에 주문식별번호 저장. BID = Account1.OrderBuy(OrderCode, Signal.count, MarketData1.current, 0); //"Long" 출력 Main.MessageLog("Long"); } //Position이 1이고, 시그널 종류가 매수청산이라면, if (Position == 1 && Signal.signalKind == 2) { //Position에 0 대입. Position = 0; //주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Sell 주문, BXID에 주문식별번호 저장. BXID = Account1.OrderSell(OrderCode, Signal.count, MarketData1.current, 0); //"ExitLong" 출력 Main.MessageLog("ExitLong"); } //Position이 0이고, 시그널 종류가 매도라면, if (Position == 0 && Signal.signalKind == 3) { //Position에 -1 대입. Position = -1; //주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Sell 주문, SID에 주문식별번호 저장. SID = Account1.OrderSell(OrderCode, Signal.count, MarketData1.current, 0); //"Short" 출력 Main.MessageLog("Short"); } //Position이 -1이고, 시그널 종류가 매도청산이라면, if (Position == -1 && Signal.signalKind == 4) { //Position에 0 대입 Position = 0; //주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Buy 주문, SXID에 주문식별번호 저장. SXID = Account1.OrderBuy(OrderCode, Signal.count, MarketData1.current, 0); //"ExitShort" 출력 Main.MessageLog("ExigShort"); } } function Main_OnOrderResponse(OrderResponse) { //해당 주문응답이 Long신호에 대한 주문응답이라면, if (OrderResponse.orderID == BID) { //BNum에 주문응답객체의 주문번호를 저장하고, BNum = OrderResponse.orderNum; //1번 타이머 실행(5초 간격). Main.SetTimer(1, 5000); } //해당 주문응답이 ExitLong신호에 대한 주문응답이라면, if (OrderResponse.orderID == BXID) { //BXNum에 주문응답객체의 주문번호를 저장하고, BXNum = OrderResponse.orderNum; //2번 타이머 실행(5초 간격). Main.SetTimer(2, 5000); } //해당 주문응답이 Short신호에 대한 주문응답이라면, if (OrderResponse.orderID == SID) { //SNum에 주문응답객체의 주문번호를 저장하고, SNum = OrderResponse.orderNum; //3번 타이머 실행(5초 간격). Main.SetTimer(3, 5000); } //해당 주문응답이 ExitShort신호에 대한 주문응답이라면, if (OrderResponse.orderID == SXID) { //SXNum에 주문응답객체의 주문번호를 저장하고, SXNum = OrderResponse.orderNum; //4번 타이머 실행(5초 간격). Main.SetTimer(4, 5000); } } function Main_OnTimer(nEventID) { //1번 타이머 실행. if (nEventID == 1) { //1번 타이머 종료. Main.KillTimer(1); //BNum 주문번호의 미체결객체 셋팅. Account1.SetUnfillOrderNumber(BNum); //현재가 저장 var CC = MarketData1.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BNum 새로 갱신하고 타이머 재셋팅. BID = Account1.OrderReplacePrice(BNum, CC); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 1번 타이머 재셋팅. Main.SetTimer(1, 5000); } } //2번 타이머 실행. if (nEventID == 2) { //2번 타이머 종료. Main.KillTimer(2); //BXNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BXNum); //현재가 저장 var CC = MarketData1.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BXNum새로 갱신하고 타이머 재셋팅. BXID = Account1.OrderReplacePrice(BXNum, MarketData1.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 2번 타이머 재셋팅. Main.SetTimer(2, 5000); } } //3번 타이머 실행 if (nEventID == 3) { //3번 타이머 종료 Main.KillTimer(3); //SNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SNum); //현재가 저장 var CC = MarketData1.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문후 주문응답시 SNum새로 갱신하고 타이머 재셋팅. SID = Account1.OrderReplacePrice(SNum, MarketData1.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 3번 타이머 재셋팅. Main.SetTimer(3, 5000); } } //4번 타이머 실행 if (nEventID == 4) { //4번 타이머 종료 Main.KillTimer(4); //SXNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SXNum); //현재가 저장 var CC = MarketData1.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 SXNum새로 갱신하고 타이머 재셋팅. SXID = Account1.OrderReplacePrice(SXNum, MarketData1.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 4번 타이머 재셋팅. Main.SetTimer(4, 10000); } } } function Main_OnNotifyFill(NotifyFill) { //"NotifyFill" 출력. //Main.MessageLog("NotifyFill"); //BNum 주문 체결되면, if (NotifyFill.orderNum == BNum) { //1번 타이머 종료. Main.KillTimer(1); //BNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BNum); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify Long" 출력. Main.MessageLog("N.Long"); } } //BXNum 주문 체결되면, if (NotifyFill.orderNum == BXNum) { //2번 타이머 종료. Main.KillTimer(2); //BXNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BXNum); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify ExitLong" 출력. Main.MessageLog("N.ExitLong"); } } //SNum 주문 체결되면, if (NotifyFill.orderNum == SNum) { //1번 타이머 종료. Main.KillTimer(3); //SNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SNum); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify Short" 출력. Main.MessageLog("N.Short"); } } //SXNum 주문 체결되면, if (NotifyFill.orderNum == SXNum) { //4번 타이머 종료. Main.KillTimer(4); //SXNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SXNum); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify ExitShort" 출력. Main.MessageLog("N.ExitShort"); } } }
프로필 이미지
yanartas
2018-02-20
2818
글번호 224341