커뮤니티

예스스팟 Q&A

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

프로필 이미지
종호
2017-07-27
13
글번호 224198

토모즈 님에 의해서 삭제되었습니다.

프로필 이미지
토모즈
2017-07-18
14
글번호 224197

녹색전사 님에 의해서 삭제되었습니다.

프로필 이미지
녹색전사
2017-07-13
8
글번호 224196
답변완료

(글수정) 스팟 오류인것 같습니다.

글 수정합니다. 다른 질문을 올립니다. 스팟 오류를 발견한것 같습니다. 제가 Win7과 WinXP에서 매매를 하고 잇는데요. 같은 스팟 수식과 변수 설정으로 해놧는데 Win7에서는 오류없이 돌아가는데 WinXP는 오류가 납니다. 수식은 선물신호를 받아서 옵션 매수를 하는 수식입니다. 아래와 같습니다. ======================================================================= //계좌객체 추가 : Account1 //챠트객체 추가 : Chart1 //예트챠트명과 일치 //옵션데이타 추가 : Option //입력변수 추가 : Near //숫자형, 진입하고자 하는 가까운 옵션값 //입력변수 추가 : Vol // 진입수량 var T; var CC, CallOrderCode; var PP, PutOrderCode; var BC, BP; function Main_OnStart() { T = 0; Main.MessageList("옵션매수 전용시작"); } function Chart1_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { T = 1; Main.MessageList("Buy신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-Near); CallCode[i+LNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //종목을 찾았으면 if (CC < 99999999) { BC = CallOrderCode; Account1.OrderBuy(BC, Vol, Option.GetAskByCode(BC, 5), 0); } } if (T == 1 && Signal.signalKind == 2) { T = 0; Account1.OrderSell(BC, Vol, Option.GetBidByCode(BC, 5), 0); Main.MessageList("ExitLong신호 발생"); } if (Signal.signalKind == 3) { T = -1; Main.MessageList("Sell신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-Near); PutCode[i+UNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (PP < 99999999) { BP = PutOrderCode; Account1.OrderBuy(BP, Vol, Option.GetAskByCode(BP, 5), 0); } } if (T == -1 && Signal.signalKind == 4) { T = 0; Account1.OrderSell(BP, Vol, Option.GetBidByCode(BP, 5), 0); Main.MessageList("ExitShort신호 발생"); } } //동시호가 청산 function Main_OnStart() { Main.MessageLog("시작") Main.SetTimer(3, 5000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 3 && HHMMDD >= 153600) { Main.KillTimer(3); num = Account1.GetTheNumberOfBalances(); for(var i = 0; i < num; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } =============================================================== 모든 설정(차트객체, 계좌객체, 옵션객체, Near변수, Vol변수)을 양쪽 컴퓨터에 다 똑같이 했는데요 Win7에서는 정상 작동하고 WinXP에서는 Range Error: Invalid array length 에러가 납니다. 제가 XP 노트북에 자동주문을 틀어놓고 하는데요. 다른분들은 계속 수식이 정상작동 한다는데 저만 오류가 나서 Win7에 세팅을 하고 보니까 에러가 나지 않는 것입니다. 스팟 프로그램상의 오류가 아닌가 합니다. XP에서도 오류 안나게 할 수 있는 방법은 없나요? 이 컴퓨터에 여러가지 메크로 세팅등등을 해놔서 다른 컴퓨터에 또 세팅하는게 여간 힘든데....
프로필 이미지
궁금궁금123
2017-07-12
2799
글번호 224192

궁금궁금123 님에 의해서 삭제되었습니다.

프로필 이미지
궁금궁금123
2017-07-08
0
글번호 224191
답변완료

수식변경부탁합니다.

안녕하세요 아래 수식은 매수만 되고 매수청산, 매도, 매도청산, 손절매도 안됩니다. 당일매매이며 매수,매도 신호 후 주문수량을 5초 간격으로 1개씩 증가시켜 총 주문 수량을 5개로 한정되게 해주세요. 청산과 손절매는 전체 잔량을 한번에 청산 원합니다. var Start; var CallOrderCode,PutOrderCode; function C1_OnRiseSignal(Signal) { if (Signal.signalKind == 1 ) { Main.MessageList("매수신호발생"); Start = 1; var UNum = Option.uppersATM; var LNum = Option.lowersATM; var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-3.0); CallCode[i+LNum] = Option.GetATMCallRecent(i); } var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-3.0); PutCode[i+UNum] = Option.GetATMPutRecent(i); } var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (CC < 99999999 && PP < 99999999) { A1.OrderSell(CallOrderCode, 1, 0, 2); A1.OrderSell(PutOrderCode, 1, 0, 2); } if (Start == 1 && Signal.signalKind == 2 ) { Start = 0; Main.MessageList("매수청산발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; A1.OrderBuy(CallOrderCode, 1, 0, 2); A1.OrderBuy(PutOrderCode, 1, 0, 2); } //차트가 매도신호 if (Signal.signalKind == 3 ) { Main.MessageList("매도신호발생"); Start = -1; var UNum = Option.uppersATM; var LNum = Option.lowersATM; } var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-3.0); CallCode[i+LNum] = Option.GetATMCallRecent(i); } var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-3.0); PutCode[i+UNum] = Option.GetATMPutRecent(i); } var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (CC < 99999999 && PP < 99999999) { A1.OrderSell(CallOrderCode, 1, 0, 2); A1.OrderSell(PutOrderCode, 1, 0, 2); Main.SetUserValue("CallOrderCode", CallOrderCode); Main.SetUserValue("PutOrderCode", PutOrderCode); } } } if (Start == -1 && Signal.signalKind == 4 ) { Start = 0; Main.MessageList("매도청산발생"); A1.OrderBuy(CallOrderCode, 1, 0, 2); A1.OrderBuy(PutOrderCode, 1,0, 2); } //5초단위로 잔고 체크 function Main_OnTimer(nEventID) { var U1 = 0; var P1 = 0; var V1 = 0; var Z1 = 0; var U2 = 0; var P2 = 0; var V2 = 0; var Z2 = 0; //최근 buy발생상태이면 if (Start == 1) { A1.SetBalanceItem(CallOrderCode,0); if (A1.Balance.count > 0 && A1.Balance.position == 1) { U1 = A1.Balance.avgUnitCost; P1 = A1.Balance.current; V1 = A1.Balance.count; Z1 = ((U1-P1)*V1)*250000; } A1.SetBalanceItem(PutOrderCode,0); if (A1.Balance.count > 0 && A1.Balance.position == 2) { U2 = A1.Balance.avgUnitCost; P2 = A1.Balance.current; V2 = A1.Balance.count; Z2 = ((P2-U2)*V2)*250000; } if ((Z1+Z2) <= loss) { A1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 0); A1.OrderBuy(PutOrderCode, 2, Option.GetBidByCode(PutOrderCode, 2), 0); } } //최근 SEll발생상태이면 if (Start == -1) { A1.SetBalanceItem(PutOrderCode,0); if (A1.Balance.count > 0 && A1.Balance.position == 1) { U1 = A1.Balance.avgUnitCost; P1 = A1.Balance.current; V1 = A1.Balance.count; Z1 = ((U1-P1)*V1)*250000; } A1.SetBalanceItem(CallOrderCode,0); if (A1.Balance.count > 0 && A1.Balance.position == 2) { U2 = A1.Balance.avgUnitCost; P2 = A1.Balance.current; V2 = A1.Balance.count; Z2 = ((P2-U2)*V2)*250000; } if ((Z1+Z2) <= loss) { Start = 0; A1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 2), 0); A1.OrderBuy(CallOrderCode, 2, Option.GetBidByCode(CallOrderCode, 2), 0); } } }
프로필 이미지
팡팡
2017-07-06
2697
글번호 224190
답변완료

스팟수식 작성 문의

안녕하세요~ 답변 늘 감사히 사용하고 있습니다. 워낙 코딩실력이 부족하다 보니 게시판 보면서 하나하나 해보고 있는데 잘되지 않아 문의드립니다. 바쁘시더라도 답변 꼭 부탁드립니다. 문의사항은 두개입니다. 질문1) 아래수식은 예트에서 선물신호 받아서 선물거래하는 당일 거래횟수 제한 수식인데요 여기에 다음과 같은 내용을 포함하고 싶습니다. ㅁ진입 후 2.5P 이익시 익절 ㅁ진입 후 0.8P 손실시 손절 ㅁ진입 후 1.5P 이상 최대수익에서 0.5P 이상 수익반납시 청산(최대수익대비 하락청산) //------------------------------------------------------------------------------------- var T,daycount,YYYYMMDD; //스팟시작시 function Main_OnStart() { T = 0; var d = new Date(); YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();//오늘날짜 //오늘날짜를 당일진입횟수를 저장하는 변수로 이용 //내부변수에서 변수(오늘날짜)에 저장된 값을 불러와 //값이 없으면 daycount에 0, 있으면 해당 값을 저장 if (Main.GetUserValue(YYYYMMDD) == "") daycount = 0; else daycount = Main.GetUserValue(YYYYMMDD); } function Chart1_OnRiseSignal(Signal) { //매수신호가 발생하고 당일 진입횟수가 3회이내일때 if (Signal.signalKind == 1 && daycount < 3) { T = 1; Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); //daycount를 1증가 daycount = daycount+1; //변수(오늘날짜)에 daycount 저장 Main.SetUserValue(YYYYMMDD, daycount); } if (T == 1 && Signal.signalKind == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } if (Signal.signalKind == 3 && daycount < 3) { T = -1; Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); //daycount를 1증가 daycount = daycount+1; //변수(오늘날짜)에 daycount 저장 Main.SetUserValue(YYYYMMDD, daycount); } if (T == -1 && Signal.signalKind == 4) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); } } //------------------------------------------------------------------------------------------------ 질문2) 아래 수식에서 다음 부분을 추가해 주시면 감사하겠습니다. if(nEventID == 1 && MarketData1.current <= BPrice - 0.15) 에서 현재 : 예트 진입신호 발생시 MarketData1.code의 가격에서 0.15P 낮을때 진입 변경 : 예트 진입신호 발생시 MarketData1.code가 3봉 이내이면서 0.15P 낮을때 진입 예스랭귀지의 "BarsSinceEntry <= 3 and"표현하고 싶은데 안되서 그렇습니다. //------------------------------------------------------------------------------------------------------ var T; var Entry; var BPrice; function Main_OnStart() { Main.MessageList("시작"); T = 0; Entry = false; BPrice = 0; } function Chart1_OnRiseSignal(Signal) { if(Signal.signalKind == 1 && T == 0 && Entry == false) { T = 1; BPrice = Math.round(MarketData1.current*100)/100; Main.MessageList("매수신호 발생"); Main.SetTimer(1,500); } if(Signal.signalKind == 2 && T == 1) { Main.KillTimer(1); T = 0; Main.MessageList("진입조건 미발생", "매도신호로 리셋"); if(Entry == true) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Vol, MarketData1.Bid(5), 0); Main.MessageList("선물매수청산"); T = 0; Entry = false; } } } function Main_OnTimer(nEventID) { if(nEventID == 1 && MarketData1.current <= BPrice - 0.15) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Vol, MarketData1.Ask(5), 0); Main.MessageList("선물매수진입"); Entry = true; Main.KillTimer(1); } } //--------------------------------------------------------------------------------------------------------- 답변에 대해 미리 진심으로 감사드립니다.
프로필 이미지
탄젠트80
2017-07-04
2641
글번호 224189
답변완료

문의드립니다

안녕하세요 스팟을 이용해서 계좌의 정보를 받아보려고 합니다. 우리선물을 이용하고 있고 모의투자로 스팟을 테스트해보고 있습니다. 스팟 메뉴얼에 의해 GetBalanceETCinfo(nKind)의 1~13까지 메세지를 찍어보았는데, hts상의 계좌정보와 많이 다릅니다. 예를들면, 9번이 인출가능금액으로 나와있는데, 실제로 찍어보면 총계정 자산가치인거 같고요. 11번이 당일손익인데, 값이 안찍히고요.. 그리고 평가손익이 바뀔때 총계정자산가치가 바뀌어야하는데 그것도 바뀌지 않고요.. 1초마다 찍히게 ontimer를 적용했는데도 작동이 안됩니다. 계좌조회에 대한 메뉴얼을 다시 부탁드리고요.. 실시간으로 작동이 되는지 여부도 알려주세요~
프로필 이미지
왕왕
2017-06-19
2472
글번호 224186

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

프로필 이미지
arges
2017-06-14
60
글번호 224185
답변완료

전략 취합 방법 문의 드립니다.

안녕하세요? 예스스팟을 이용하여 예스랭귀지로 짜여진 전략을 취합하는 방법과 로그를 기록하는 방법에 대한 예제를 얻고 싶어서 이렇게 문의 드립니다. 이를 풀어서 다시 말씀드리면, (1) 예스랭귀지로 작성된 다수의 전략을 예스스팟에서 취합하여 주문을 내는 방법에 관해 알고싶습니다. 예를 들어 어떤 시점에서 "전략1"에서 매수 시그널이 나오고 "전략2"와 "전략3"에서 매도 시그널이 나오는 경우 각각의 전략이 걸려있는 차트에서 매수 1개 / 매도 2개의 주문이 나가는 것이 아니라, 이를 취합하여 1개의 매도 주문만 나가게 하는 스크립트에 대한 예제가 있으시면 부탁드립니다. (2) 또한 주문이 나온 전략명과 시그널을 (텍스트 또는 엑셀) 파일 형태의 로그를 남기는 방법에 대해서도 알고 싶습니다. 이 또한 가능하다면 도움 좀 부탁 드리겠습니다. 감사합니다. 즐거운 하루 되십시오.
프로필 이미지
롱감마
2017-06-12
2074
글번호 224183