커뮤니티

예스스팟 Q&A

답변완료

문의

안녕하세요. 예스트레이더 로직으로 해외선물 2종목을 거래하고 2종목합산 수익이 났을때 에스트레이더에서는 동시 정확하게 청산할 방법이 없습니다. 예스트레이더에서는 매수매도가 잘 일어나고 있습니다. 에스트레이더 로직에서 매수와 매도가 들어가고 예스스팟에서 합산 순수 수익이 났을 때 스팟에서 동시청산 처리하고 싶습니다.스팟에서 청산 수식과 예스트레이더와 연계방법을 알려 주시기를 부탁드립니다. 두가지 경우로 하고 싶습니다. 1번 1계죄에서 2종목 거래시 합산 순수익 날 때 동시청산수식과 합산 순손실이 날때 스팟의 동시 청산 수식 2번 2계좌에서 1종목씩 거래시 합산 순수익 날때 동시청산수식과 합산 순손실시 스팟의 동시 청산 수식 을 부탁드립니다. 추가질문1 3번질문: 잔고를 늘 감시하다가 한종목의 잔고가 0일때 현재가에서 시장가 매수가 들어가고 그현재가 근처에서 매수단가가 형성되었다면 그단가를 기준으로 상방향으로 현재가+3틱 현재가+6틱 현재가+9틱 현재가+12틱 처럼 계속 3틱단위로 상방향으로 매수가 되게 하고 싶습니다. 스팟수식으로 부탁드립니다. 스팟이 꺼지고 다시 재접속할 때 변수가 초기화 되는 문제가 해결되도록 코딩을 요청드립니다. 추가질문2 4번질문 :위의 3번질문에서 잔고를 감시하다가 잔고가 0일때 시장가 매수가 들어가서 그 체결가로 기준가로 정하지 않고요. 스팟 가동후 잔고가 최초로 0 이었을 때의 최초현재가= 최초기준가 로 정하고요. 그 이후에는 잔고들이 있다가 청산되어서 다시 0 이 되는 순간의 현재가 = 새로운 기준가 로 하고 싶습니다. 최초기준가 는 매수 안들어가고요. 상방향으로 현재가가 흘러가면 최초기준가 지켜봄 최초기준가+3틱 매수 최초기준가+6틱 매수 최초기준가+9틱 매수 ~~~~~이하생략 청산후 잔고 0 이 되는 순간의 현재가를 새로운 기준가로 생성 기준가는 지켜보고요 지준가 지켜봄 기준가+3틱 매수 기준가+6틱 매수 기준가+9틱 매수 ~~~ 이하 생략 으로 부탁드립니다. 스팟이 꺼지고 다시 재접속할 때 변수가 초기화 되어서 문제를 일으키는데 그문제가 해결되도록 코딩을 요청드립니다. 제가 실력이 없어서 열심히 공부하고 궁리해도 코딩이 나오지를 않습니다. 시간이 흐르다 보니 3번 질문과 4번 질문이 가장 중요한 질문이 되었습니다. 자꾸 부탁이 늘게 되어서 죄송합니다.
프로필 이미지
종호
2017-08-10
2785
글번호 224199

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

프로필 이미지
종호
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
2777
글번호 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
2671
글번호 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
2614
글번호 224189
답변완료

문의드립니다

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

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

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