커뮤니티

예스스팟 Q&A

답변완료

수식변경부탁합니다.

안녕하세요 아래 수식은 매수만 되고 매수청산, 매도, 매도청산, 손절매도 안됩니다. 당일매매이며 매수,매도 신호 후 주문수량을 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
2662
글번호 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
2601
글번호 224189
답변완료

문의드립니다

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

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

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

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

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

종목 선정 문의

안녕하세요 항상 주신 답변 잘 활용하고 있습니다. 미리 감사드립니다. 아래는 이용중인 스팟전략 중 일부로 종목 선정 부분입니다. 여기에 다음과 같은 조건을 추가하고 싶습니다 ㅇ 현재 : 9시 35초에 설정된 2.7에 가까운 콜풋 종목 선정 ㅇ 추가내용 : 9시 35초에 2.7에 가까은 콜풋, 2.1에 가까운 콜풋 종목을 각각 선정하여 2.7에 가까운 콜풋종목의 절대값의 차이가 0.8 이상이면 2.1에 가까운 콜풋종목으로 최종 거래종목을 선정 현재의 수식은 아래와 같습니다. ========================================================================== var Start = 0; var BC; var BP; var SC; var SP; var CPEntryPrice = 0; var PEntryPrice = 0; var CEntryPrice = 0; var CPLsum = 0; var PLsum = 0; var CLsum = 0; var EntryPercent = 0; var Entry1; var Entry2; var InHMS; var SCP1; var SCP2; var SCP3; var SCP4; var SPP1; var SPP2; var SPP3; var SPP4; var CPLsumin = 0; function Main_OnStart() { Start = 0; Main.MessageList("시작"); Entry1 = false; Entry2 = false; //타이머 셋팅(1번,5초) Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //1번 타이머 동작 if (nEventID == 1 && HHMMSS >= 090035 && Entry1 == false) { //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션중 2.7에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장 for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.7); 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] } } //풋종목 찾기 //풋옵션중 2.7에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장 for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.7); 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) { Start = 1; SC = CallOrderCode; SP = PutOrderCode; CEntryPrice = Option.GetCurrentByCode(SC); PEntryPrice = Option.GetCurrentByCode(SP); CPEntryPrice = Math.round(CEntryPrice*100 + PEntryPrice*100)/100; Entry1 = true; Main.MessageList("콜종목:", SC, "풋종목:", SP, "기준양합:", CPEntryPrice); //청산신호발생했으므로 타이머 종료 Main.KillTimer(1); //타이머 셋팅(2번,5초) Main.SetTimer(2, 5000); } }
프로필 이미지
탄젠트80
2017-06-15
2293
글번호 224181
답변완료

옵션 합성

안녕하세요? 아래와 같은 조건을 만족하는 시스템을 작성하고자 합니다. 0. 콜과 풋의 가격이 1.0 ~ 2.0인 양 옵션 종목을 사용한다. 1. 진입1: 장 시작 후 콜과 풋이 교차(수렴)할 때, 교차가 + 1틱에 먼저 도달하는 옵션(상승 종목)을 매수한다 2. 진입2: 잠시 후 양옵션이 등락하여 반대 옵션(하락 종목)이 교차가 + 1틱에 도달하는 경우 이 종목도 매수한다. 이 때는 양매수 상태가 된다. 3. 손절1: 하락종목이 반등하여 교차가를 넘지 못하고 직저(반등시 저가)를 이탈할 때 스탑한다. 이 때 상승 종목만 남는다. 4. 손절2: 하락 종목이 상대(상승종목)의 최저가를 이탈 시 스탑한다. 이 때 상승 종목만 남는다. 만일 이탈 가격를 돌파하면 재매수 한다. 5. 상승 종목이 목표가 도달 시(시초가 + 1.25 P) 또는 가격 = 2.5 P에서 익절한다. 6. 당일 장 마감시 청산 한다. 감사합니다.
프로필 이미지
리턴
2017-05-31
2174
글번호 224179
답변완료

함수 작성 방법 검토 부탁드립니다.

아래 예와 같이 전역변수 C2_f_rsi1, C2_f_rsi2, C2_f_rsi4에 차트에 적용된 indicator 값을 받아오는 코딩을 하려고 하는데요... case3는 잘동작하는데, 사용자정의 모듈 함수로 처리하고자 할 때 case1, case2 어떤 방식이 맞는 건가여? var C2_f_rsi1, C2_f_rsi2, C2_f_rsi4; function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) { // case1 CollectIndicators_Test1(); Main.MessageList("test1", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2)); // case2 CollectIndicators_Test2(C2_f_rsi1, C2_f_rsi2, C2_f_rsi4); Main.MessageList("test2", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2)); // case3 C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0); C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0); C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0); Main.MessageList("test3", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2)); } CollectIndicators_Test1() { C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0); C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0); C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0); } CollectIndicators_Test2(_C2_f_rsi1, _C2_f_rsi2, _C2_f_rsi4) { _C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0); _C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0); _C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0); }
프로필 이미지
개똥이
2017-05-31
2208
글번호 224178
답변완료

장시간 이후에 예스스팟을 테스트 어떻케 하나요 ?

수고가 많으십니다. 1. 시험적용 과 자동주문에 차이는 무엇인가여? 2. 장시간 이후에 예스스팟을 테스트 어떻케 하나요? 자동주문을 선택하고 장시간 이후에는 매수,매도 할경우 장마감시간이라고 메시지 뜨면서 매수.매도가 안되던데. 꼭 장시간에만 테스트를 할수 있는건지? 장시간 이후에도 별도로 테스트 할수 있는 방법좀 알려주세요.
프로필 이미지
찬홍아빠
2017-05-29
2237
글번호 224176

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

프로필 이미지
somun
2017-05-29
3
글번호 224174