커뮤니티

예스스팟 Q&A

답변완료

질문 올립니다.

안녕하세요. 항상 친절하신 답변 감사드립니다. 한 번 주문한 후, 그 것이 체결되어 청산되든, 아니면 조건이 안 맞아 체결 전에 취소하든, 이런 과정들을 아주 철저하게 주문번호를 연결고리로 하여 추적해 가며 관리하고 싶습니다. 그래서, 아래와 같은 스팟 식을 짜고 싶은데, 아직 잘 되질 않고 있어서 도움을 부탁드립니다. ////////// ////////// ////////// ////////// ////////// 아래: 신호에 따라 매수진입 주문(예: 20 이평 80 이평 교차 전략) 주문번호: 88번. (변수로는 가령 BuyNum이라 가정) 1. 이 매수주문이 체결되면: 1.1. 초기손절: 진입가격에서 9틱 하락하면 손절. ((위 주문 번호를 이용해서 코딩)) 1.2. 익절: 매수주문이 체결되면 50틱 위에서 익절하도록 익절 주문 냄. ((위 주문 번호를 이용해서 코딩)) 1.3. 추적스탑: 그 전까지는(즉 익절 목표에 달성하기 전까지는), 10틱 이상 오르고 2틱 내리면 손절하는 추적스탑. ((위 주문 번호를 이용해서 코딩)) 2. 미체결된 경우: 주문 취소: 매수진입 주문 후, 그 주문이 아직 체결되지 않은 상태에서, 시장의 가격이, 처음 매수주문한 가격으로부터, 5틱 오르거나 3틱 내리면 매수진입주문 취소. ((위 주문 번호를 이용해서 코딩)) ////////// ////////// ////////// ////////// ////////// 이상과 같은 것을, step과 같은 변수 등을 이용하지 않고, 최대한 주문 번호 자체를 이용해서, 즉 그 매수주문이 응답됐는지, 체결됐는지, 아직 안 됐으면 그 주문가격과 현재가격을 비교해서 현재가격이 너무 동떨어져 버렸으면 주문을 취소한다든지 하는 모든 과정을, 아주 철저하게 주문 번호 자체로 추적하며 관리할 수 있는 소스를 짜고자 하는데, 잘 안 되고 있습니다. 신호에 따라 매수주문 내고 하는 것은 별 문제없이 잘 되는데, 특히 잘 안 되는 부분은, 체결되고 난 후, 손절 익절 주문 등이 제가 짠 소스대로 잘 나가 주질 않고, 또 체결 전에 시장 가격이 많이 바뀌어서 주문을 취소해 버리고자 하는 부분도 제가 짠 소스에 의한 대로는 실행이 안 되고 있습니다. 그래서 아주 주문 번호 자체를 이용, 그 주문의 전 과정을 주문번호에 따라 밀착 추적해서 관리하는 방법을 배우고 싶습니다. 전문가님께서 도움을 제시해 주시면 대단히 감사하겠습니다.
프로필 이미지
즐겁게
2013-09-15
564
글번호 222578

매뉴얼 예제5. 합성선물의 결과를 엑셀로 출력하기

요즘 예스스팟 기능을 익히고 있는데 사용할수록 굉장하다는 생각이 절로 듭니다. 훌륭한 프로그램을 만들어 주셔서 감사드립니다. 게다가 예스스팟 매뉴얼이 워낙 잘 만들어져 있어서 연습하는데 그리 어렵지 않네요. 다만 사전식으로 만들어져 있어서 예제에 없는 부분은 활용하기가 난감한 면이 있습니다. 그래서 엑셀에 로그를 출력하는 방법을 찾느라 좀 헤맸습니다. 무엇보다도 모의투자가 지원되지 않는 종목은 위 그림처럼 출력해서 전진분석을 하시면 될 겁니다. 예스랭귀지의 print문처럼 엑셀에 로그를 출력하려면 SetRowData를 사용하면 되는데 예제가 없길래 제가 만든 예제를 올려드립니다. 마지막행 다음 행에 로그를 찍는 간단 예제입니다. BuyCallXlRow = xls1.GetRowCount(1) + 1; xls1.SetRowData(1, "A" + BuyCallXlRow, tm, BuyCallCode, "매수", BuyCallPrice, vol); 예제5.합성선물의 내용을 엑셀로 출력하도록 수정한 내용입니다. /*스크립트시작-----------------------------------------------------*/ var Start; var BuyCallCode; var BuyPutCode; var SellCallCode; var SellPutCode; var BuyCallXlRow; var BuyPutXlRow; var SellCallRow; var SellPutRow; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; var sData = xls1.GetData(1, "A1"); if (sData != "거래일시") { xls1.SetRowData(1, "A1","거래일시","거래상품","매매구분","단가","수량","총매매금액","수익"); } } function C1_OnRiseSignal(Signal) { Main.MessageLog("신호완성/"+Signal.signalKind); D = new Date(); YYYY = D.getFullYear(); MM = D.getMonth() + 1; DD = D.getDate(); hh = D.getHours(); mm = D.getMinutes(); tm = YYYY+"/"+MM+"/"+DD+" "+hh+":"+mm; if (Signal.signalKind == 1 ) { Start = 1; BuyCallCode = Option.GetATMCallRecent(0,0); BuyPutCode = Option.GetATMPutRecent(0,0); var BuyCallPrice = Option.GetAskByCode(BuyCallCode,2); var BuyPutPrice = Option.GetBidByCode(BuyPutCode,2); A1.OrderBuy(BuyCallCode, Vol, BuyCallPrice, 0); A1.OrderSell(BuyPutCode, Vol, BuyPutPrice, 0); Main.MessageLog("합성선물매수"); BuyCallXlRow = xls1.GetRowCount(1) + 1; xls1.SetRowData(1, "A" + BuyCallXlRow, tm, BuyCallCode, "매수", BuyCallPrice, vol, BuyCallPrice * vol * 500000); BuyCallXlRow = BuyCallXlRow + 1; xls1.SetRowData(1, "A" + BuyCallXlRow, tm, BuyCallCode, "평가"); BuyPutXlRow = BuyCallXlRow + 1; xls1.SetRowData(1, "A" + BuyPutXlRow, tm, BuyPutCode, "매수", BuyPutPrice, vol, BuyPutPrice * vol * 500000); BuyPutXlRow = BuyPutXlRow + 1; xls1.SetRowData(1, "A" + BuyPutXlRow, tm, BuyPutCode, "평가"); } if (Start == 1 && Signal.signalKind == 2 ) { var BxCallPrice = Option.GetBidByCode(BuyCallCode, 2); var BxPutPrice = Option.GetAskByCode(BuyPutCode, 2); A1.OrderSell(BuyCallCode, Vol, BxCallPrice, 0); A1.OrderBuy(BuyPutCode, Vol, BxPutPrice, 0); Main.MessageLog("합성선물매수청산"); xls1.SetRowData(1, "A" + BuyCallXlRow, tm, BuyCallCode, "매수청산", BxCallPrice, vol); xls1.SetRowData(1, "F" + BuyCallXlRow, BxCallPrice * vol * 500000,BxCallPrice - BuyCallPrice); xls1.SetRowData(1, "A" + BuyPutXlRow, tm, BuyPutCode, "매수청산", BxPutPrice, vol); xls1.SetRowData(1, "F" + BuyPutXlRow, BxPutPrice * vol * 500000,BxPutPrice - BuyPutPrice); } if (Signal.signalKind == 3 ) { Start = 1; SellCallCode = Option.GetATMCallRecent(0,0); SellPutCode = Option.GetATMPutRecent(0,0); var SellCallPrice = Option.GetBidByCode(SellCallCode,2); var SellPutPrice = Option.GetAskByCode(SellPutCode,2); A1.OrderSell(SellCallCode, Vol, SellCallPrice , 0); A1.OrderBuy(SellPutCode, Vol, SellPutPrice, 0); Main.MessageLog("합성선물매도"); SellCallXlRow = xls1.GetRowCount(1) + 1; xls1.SetRowData(1, "A" + SellCallXlRow, tm, SellCallCode, "매도", SellCallPrice, vol, SellCallPrice * vol * 500000); SellCallXlRow = SellCallXlRow + 1; xls1.SetRowData(1, "A" + SellCallXlRow, tm, SellCallCode, "평가"); SellPutXlRow = SellCallXlRow + 1; xls1.SetRowData(1, "A" + SellPutXlRow, tm, SellPutCode, "매도", SellPutPrice, vol, SellPutPrice * vol * 500000); SellPutXlRow = SellPutXlRow + 1; xls1.SetRowData(1, "A" + SellPutXlRow, tm, SellPutCode, "평가"); } if (Start == 1 && Signal.signalKind == 4 ) { var SxCallPrice = Option.GetAskByCode(SellCallCode, 2); var SxPutPrice = Option.GetBidByCode(SellPutCode, 2); A1.OrderBuy(SellCallCode, Vol, SxCallPrice, 0); A1.OrderSell(SellPutCode, Vol, SxPutPrice, 0); Main.MessageLog("합성선물매도청산"); xls1.SetRowData(1, "A" + SellCallXlRow, tm, SellCallCode, "매도청산", SxCallPrice, vol); xls1.SetRowData(1, "F" + SellCallXlRow, SxCallPrice * vol * 500000, SellCallPrice - SxCallPrice); xls1.SetRowData(1, "A" + SellPutXlRow, tm, SellPutCode, "매도청산", SxPutPrice, vol); xls1.SetRowData(1, "F" + SellPutXlRow, SxPutPrice * vol * 500000, SellPutPrice - SxPutPrice); } } /*스크립트끝-------------------------------------------------------*/
프로필 이미지
수식지왕
2013-09-13
769
글번호 222577

루이001 님에 의해서 삭제되었습니다.

프로필 이미지
루이001
2013-09-13
30
글번호 222576
답변완료

복수계좌 연동

안녕하세요~ 다음 YesSpot 수식 부탁드리겠습니다. 12-31-0011(시스템 거래), 12-31-0022(손매매), 12-31-0033(앞의 두계좌 연동), 이렇게 총 3계좌를 운용한다고 가정했을 때 12-31-0033 계좌는 12-31-0011과 12-31-0022 계좌에서 포지션 변동이 있다면 즉시 주문이 실행되기를 원합니다. 포지션 변동은 선물,옵션 모두 해당이 되는데, 만약 옵션 변동분은 어렵다면 선물만이라도 좋습니다. 수식 및 설정부분에서 유의해야 할 사항 등이 있다면 내용 부탁드리겠습니다. ----------------------- 추가로 현재 YT 및 YesSpot은 32비트 컴퓨터에서만 가능한지요? 64비트에서는 안된다는 말을 들은 적이 있는데 맞는지 모르겠습니다. 그럼 즐거운 주말 되시고, 아울러 풍성한 추석 맞이하시기를 바라겠습니다. 감사합니다 !!!
프로필 이미지
새로운세상
2013-09-16
738
글번호 222575
답변완료

문의드립니다.

안녕하세요. 수식 관련하여 문의드립니다. "당일 시가가 어제 종가 대비 +-0.5%이내일 경우 매수 또는 매도한다" 상기 조건을 수식으로 변환 부탁드립니다. 감사합니다.
프로필 이미지
극동해
2013-09-12
748
글번호 222573
답변완료

문의 드립니다.

안녕하세요. "신호 발생시 등가+1 종목 콜옵션 5개를 매수하라"라는 식을 아래와 같이 작성을 해보았는데요. Callcode = Option.GetATMCallRecent(1); Account1.OrderBuy(Callcode, 5, Option.GetAskByCode(Callcode, 3), 0); 질문) "신호 발생시 등가+1 종목 콜옵션 500만원만큼의 수량을 매수하라"라는 식은 어떻게 작성하여야 하나요? 매번 자세한 답변 감사드립니다.
프로필 이미지
극동해
2013-09-10
745
글번호 222567
답변완료

문의 올립니다.

안녕하십니까. 항상 친절하신 답변 감사드립니다. 미체결, 미결제가 없는 상태에서만 신규매수진입이 되도록 하기 위해 Step이라는 변수를 설정해서 이용하고자 하는데, 아래의 소스에서 보듯이, Q&A 예문 등에서 일반적으로 보이는 바와 같이, 함수 바깥에서 Step을 선언해 주고, function Main_OnStart() 에서 초기값 0을 대입해 주고, function Chart1_OnRiseSignal(Signal) 에서, 이 값이 0일 경우에만 매수진입 주문이 나갈 수 있도록 하였는데, function Chart1_OnRiseSignal(Signal) 속의 { } 속 맨 처음에 MessageLog로 이 Step의 값을 체크해 보면, 0이 아니라 undefined로 나옵니다. 어떤 부분을 제가 잘못한 건지, 어떻게 고쳐야 하는 건지 알려 주시면 대단히 감사하겠습니다. ((아래 소스는, 간단히 볼 수 있게 하기 위해, 다른 거 다 지우고 Step과 직결되는 것들만 남겨 보았습니다)) var ID_1B; var Step; function Main_OnStart() { Step = 0; Main.MessageLog("OnStart / Step = "+Step+" / Signal.name = "+Signal.name+" / Signal.price ="+Signal.price); } // 차트에서 매수신호 발생 function Chart1_OnRiseSignal(Signal) { // Main.MessageLog("OnRiseSignal / Step = "+Step+" / Signal.name = "+Signal.name+" / Signal.price ="+Signal.price); // 여기서 이미 Step은 undefined로 나옴... if (Step == 0 && Signal.name == "1B") { var ChartCode = Main.GetOrderCode(Chart1.GetCode(1)); var P_1B = Signal.price; var ID_1B = Account1.OrderBuy(ChartCode, Signal.count, P_1B, 0); var Step = 1; } } 대단히 감사합니다!
프로필 이미지
즐겁게
2013-09-08
801
글번호 222565
답변완료

MessageBox

늘 수고 하십니다. 수식을 작성하다 문의가 있어서 이렇게 글을 올립니다. <질문사항> 1. MessageBox가 별도의 창에 띄워지지 않고, 디버깅창에만 출력이 됩니다. (제 컴퓨터 OS Window7 64) 2. 부동소수점 관련해서 아래 샘플 수식에서 처럼 어떤 수식을 계산해서 값의 차이가 선물 1틱(0.05) 이면 이라는 수식을 작성해서 주문을 낸다고 가정했을때, 실제 많은 로그에서 0.0499000000 이런식으로 찍힌다던가해서 실제로 조건이 만족을해도 주문이 나 가지 않는 경우가 있습니다. 아래처럼 toFixed(2)를 사용해서 조건을 비교하면 정상적으로 비교할 수 있으나, toFixed 를 사용할때 가끔 값이 빈 Null이 발생할때 오류 보고창에 에러가 발생하는데, (1) 원래 의도한 0.05 보다 작은 0.0499000000 이런식으로 계산이 되는 이유와 해결책 (선물의 가격을 단순히 차감한 가격에서 오류가 안났으면 합니다) (2) toFixed를 사용했을때 값이 없을때의 오류처리 구문 function Main_OnStart() { var diff; Main.MessageBox("HI"); // 박스로 띄워지지가 않음 // 부동소수점문제 Test diff = 256.25 -Futures.current ; // 당시 선물 현재가 256.20 Main.MessageList("선물현재",Futures.current,"Test시세",256.15,"차이",diff); Main.MessageList("선물현재",Futures.current,"Test시세",256.15,"차이",diff.toFixed(2)); if(diff == 0.05) { Main.MessageList("결과값 만족 ") ; } if(diff.toFixed(2) == 0.05) { Main.MessageList("결과값 만족 toFixed") ; } }
프로필 이미지
히말라야
2013-09-07
818
글번호 222564
답변완료

계좌간 자금이체

계좌간 자금이체를... 자동화 할 수 있는 방법이 예스스팟에 존재하나요? 예스스팟에 없다면~ 이체를 자동화할 수 있는 방법에는 어떠한 것이 있을까요?
프로필 이미지
러브게임
2013-09-05
793
글번호 222559
답변완료

문의드립니다.

자세한 답변 감사드립니다. 추가로 두 가지만 더 문의드립니다. 1. 주문가능한 콜옵션을 아래와 같이 계산을 한 후에.. Callcode = Option.GetATMCallRecent(2,0); var Entryvol = Math.floor(Account1.GetBalanceETCinfo(30)/(Option.GetAskByCode(Callcode, 3)*500000)); Account1.OrderBuy(Callcode, Entryvol, Option.GetAskByCode(Callcode, 3), 0); 아래와 같은 청산식으로 정리할려고 하는데요. 12개가 아닌 현재 잔고보유량으로 청산을 할려면 어떻게 해야 하나요? Account1.OrderSell(Callcode, 12, Option.GetBidByCode(Callcode, 3), 0); 2. 매수신호 발생 시 현재 잔고 보유금액의 매수가능수량이 아니라 5백만원어치 콜 수량을 살려면 어떻게 해야 하나요?
프로필 이미지
극동해
2013-09-05
795
글번호 222558