커뮤니티

스팟 수식인데 제대로 된것인지 확인 부탁드립니다.

프로필 이미지
nadogaja
2014-03-11 01:34:17
251
글번호 73378
답변완료
/* 예전에 예스스탁 님이 만들어 주신 수식에 정정 취소 주문등을 넣었는데.. 제대로 작동할지 확인부탁드립니다. 챠트 아디 call/ 선물 기준 옵션 거래를 하고자 합니다. 변수 limit 는 옵션 가격 제한 입력변수로 2.0 으로 맞추었습니다. 완성 신호가 나올시 콜 옵션 2 이하의 옵션을 매수 진입 그리고 청산시에는 물론 매수한 옵션을 청산 하게됩니다.. 확인 부탁드립니다. */ var CPrice = new Array(101); var CCode = new Array(101); var PPrice = new Array(101); var PCode = new Array(101); var MaxCall; var MaxCallCode; var MaxPut; var MaxPutCode; var buycode=0,sellcode=0; var bcheck,bnum,bnumber,buyfill,cnt; var scheck,snum,smunber,sellfill,cns; function Main_OnStart() { bcheck = 0; scheck = 0; buyfill = 0; sellfill = 0; cnt = 0; cns = 0; Main.MessageLog("콜시작") } function callchart_OnRiseSignal(Signal) { //ATM 위 행사가 갯수 UNum = Option.uppersATM; //ATM 위 행사가 갯수 LNum = Option.lowersATM; //배열변수 준비(가격, 종목코드) CallCode = new Array(UNum+LNum+1); PutCode = new Array(UNum+LNum+1); CallPrice = new Array(UNum+LNum+1); PutPrice = new Array(UNum+LNum+1); //3.0이하의 가격을 가지는 콜종목은 해당 값과 종목코드 저장 //3.0을 초과하는 콜종목은 가격과 종목코드를 모두 -1 처리 for (var i = -LNum; i <= UNum; i++) { if (Option.GetCurrent(0, i) <= limit) { CallPrice[i+LNum] = Option.GetCurrent(0, i); CallCode[i+LNum] = Option.GetATMCallRecent(i); } else { CallPrice[i+LNum] = -1; CallCode[i+LNum] = -1; } // Main.MessageLog(i+"콜종목코드:"+CallCode[i+LNum]+"/가격:"+CallPrice[i+LNum]); } //3.0이하의 가격을 가지는 풋종목은 해당 값과 종목코드 저장 //3.0을 초과하는 풋종목은 가격과 종목코드를 모두 -1 처리 for (var ii = -UNum; ii <= LNum; ii++) { if (Option.GetCurrent(1, ii) <= limit) { PutPrice[ii+UNum] = Option.GetCurrent(1, ii); PutCode[ii+UNum] = Option.GetATMPutRecent(ii); } else { PutPrice[ii+UNum] = -1; PutCode[ii+UNum] = -1; } // Main.MessageLog(ii+"풋종목코드:"+PutCode[ii+UNum]+"/가격:"+PutPrice[ii+UNum]); } //각 배열에 저장된 값중 가장 큰 값을 찾음 var CC = -1; var CallOrderCode = -1; for (var iii = -LNum; iii <= UNum; iii++) { if (CallPrice[iii+LNum] > CC) { CC = CallPrice[iii+LNum]; CallOrderCode = CallCode[iii+LNum]; } } var PP = -1; var PutOrderCode = -1; for (var iiii = -UNum; iiii <= LNum; iiii++) { if (PutPrice[iiii+UNum] > PP) { PP = PutPrice[iiii+UNum]; PutOrderCode = PutCode[iiii+UNum]; } } // Main.MessageLog("--------------------------------------------"); // Main.MessageLog("콜주문종목코드:"+CallOrderCode+"/가격:"+CC); // Main.MessageLog("풋주문종목코드:"+PutOrderCode+"/가격:"+PP); Main.MessageLog("--------------------------------------------"); if (Signal.signalKind == 1) //buy 매수신호시 { cnt = cnt + 1; if (cnt == 1 && buyfill == 0 ) { // Main.MessageLog("cnt:"+cnt) Main.MessageLog("콜 진입 - 주문종목코드:"+CallOrderCode+"/가격:"+CC); bnum = a1.OrderBuy(CallOrderCode,Signal.count, Option.GetAskByCode(CallOrderCode, 3), 0) buycode = CallOrderCode; bcheck = 1; check = 0; } } if (Signal.signalKind == 2 && bcheck == 1 )// exitlong 청신신호시 { cns = cns +1; if (buyfill == 1 && cns == 1 ) { snum = a1.OrderSell(buycode,Signal.count, Option.GetBidByCode(buycode, 3),0) bcheck = 0; scheck = 1; Main.MessageLog("콜 청산 - 주문종목코드:"+buycode+"/가격:"+CC); } if (buyfill == 0 && cns == 1 ) { a1.OrderCancel(bnumber); } } } function Main_OnOrderResponse(OrderResponse) { if (bcheck == 1 && OrderResponse.orderID == bnum) // buy 주문응답 { bnumber = OrderResponse.orderNum; } if (scheck == 1 && OrderResponse.orderID == snum) // exitlong 주문응답 { snumber = OrderResponse.orderNum; Main.SetTimer(2, 3000) } } function Main_OnTimer(nEventID) // 시간응답 { if (nEventID == 2) { snumber = a1.OrderReplacePrice(snumber, Option.GetBidByCode(buycode, 3)) //정정주문 Main.KillTimer(2) } } function Main_OnNotifyFill(NotifyFill) { if (bcheck == 1 && NotifyFill.orderNum == bnumber) //buy 체결통보 { buyfill = 1; sellfill = 0; cns = 0; } else buyfill = 0; if (scheck == 1 && NotifyFill.orderNum == snumber) //exitlong 체결통보 { sellfill = 1; buyfill = 0; cnt = 0; Main.KillTimer(2); } else sellfill = 0; }
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2014-03-11 17:18:49

안녕하세요 예스스탁입니다. 1. 예스스팟은 주문이후의 동작등이 많아 저희족에서 수식에 대해 검증해 드리기 어렵습니다. 저희가 답변드리는 내용 가이드일뿐입니다. 사용자분이 직접테스트 하시면서 수정보완해 전략을 만들어 가셔야 합니다. 2. 옵션종목을 찾는 부분은 정상작동합니다. 다만 현재 종목을 찾고 매수신발생시에 다른 변수로 종목코드를 따로 저장하지 않으므로 콜옵션의 종목을 찾는 부분을 if (Signal.signalKind == 1) 위 if문 안으로 포함하셔야 합니다. 현재 식으로는 매수신호시 2.0이하의 종목을 찾아 CallOrderCode나 PutOrderCode에 저장하고 청산신호시 다시 찾기때문에 진입과 청산이 다른종목일수 있습니다. function callchart_OnRiseSignal(Signal) { if (Signal.signalKind == 1) //buy 매수신호시 { //ATM 위 행사가 갯수 UNum = Option.uppersATM; //ATM 위 행사가 갯수 LNum = Option.lowersATM; //배열변수 준비(가격, 종목코드) CallCode = new Array(UNum+LNum+1); PutCode = new Array(UNum+LNum+1); CallPrice = new Array(UNum+LNum+1); PutPrice = new Array(UNum+LNum+1); //3.0이하의 가격을 가지는 콜종목은 해당 값과 종목코드 저장 //3.0을 초과하는 콜종목은 가격과 종목코드를 모두 -1 처리 for (var i = -LNum; i <= UNum; i++) { if (Option.GetCurrent(0, i) <= limit) { CallPrice[i+LNum] = Option.GetCurrent(0, i); CallCode[i+LNum] = Option.GetATMCallRecent(i); } else { CallPrice[i+LNum] = -1; CallCode[i+LNum] = -1; } // Main.MessageLog(i+"콜종목코드:"+CallCode[i+LNum]+"/가격:"+CallPrice[i+LNum]); } //3.0이하의 가격을 가지는 풋종목은 해당 값과 종목코드 저장 //3.0을 초과하는 풋종목은 가격과 종목코드를 모두 -1 처리 for (var ii = -UNum; ii <= LNum; ii++) { if (Option.GetCurrent(1, ii) <= limit) { PutPrice[ii+UNum] = Option.GetCurrent(1, ii); PutCode[ii+UNum] = Option.GetATMPutRecent(ii); } else { PutPrice[ii+UNum] = -1; PutCode[ii+UNum] = -1; } // Main.MessageLog(ii+"풋종목코드:"+PutCode[ii+UNum]+"/가격:"+PutPrice[ii+UNum]); } //각 배열에 저장된 값중 가장 큰 값을 찾음 var CC = -1; var CallOrderCode = -1; for (var iii = -LNum; iii <= UNum; iii++) { if (CallPrice[iii+LNum] > CC) { CC = CallPrice[iii+LNum]; CallOrderCode = CallCode[iii+LNum]; } } var PP = -1; var PutOrderCode = -1; for (var iiii = -UNum; iiii <= LNum; iiii++) { if (PutPrice[iiii+UNum] > PP) { PP = PutPrice[iiii+UNum]; PutOrderCode = PutCode[iiii+UNum]; } } // Main.MessageLog("--------------------------------------------"); // Main.MessageLog("콜주문종목코드:"+CallOrderCode+"/가격:"+CC); // Main.MessageLog("풋주문종목코드:"+PutOrderCode+"/가격:"+PP); Main.MessageLog("--------------------------------------------"); cnt = cnt + 1; if (cnt == 1 && buyfill == 0 ) { // Main.MessageLog("cnt:"+cnt) Main.MessageLog("콜 진입 - 주문종목코드:"+CallOrderCode+"/가격:"+CC); bnum = a1.OrderBuy(CallOrderCode,Signal.count, Option.GetAskByCode(CallOrderCode, 3), 0) buycode = CallOrderCode; bcheck = 1; check = 0; } } if (Signal.signalKind == 2 && bcheck == 1 )// exitlong 청신신호시 { cns = cns +1; if (buyfill == 1 && cns == 1 ) { snum = a1.OrderSell(buycode,Signal.count, Option.GetBidByCode(buycode, 3),0) bcheck = 0; scheck = 1; Main.MessageLog("콜 청산 - 주문종목코드:"+buycode+"/가격:"+CC); } if (buyfill == 0 && cns == 1 ) { a1.OrderCancel(bnumber); } } } 3. 예스스팟에 관련된 문의는 예스스팟Q&A에 올려주시기 바랍니다. 즐거운 하루되세요 > nadogaja 님이 쓴 글입니다. > 제목 : 스팟 수식인데 제대로 된것인지 확인 부탁드립니다. > /* 예전에 예스스탁 님이 만들어 주신 수식에 정정 취소 주문등을 넣었는데.. 제대로 작동할지 확인부탁드립니다. 챠트 아디 call/ 선물 기준 옵션 거래를 하고자 합니다. 변수 limit 는 옵션 가격 제한 입력변수로 2.0 으로 맞추었습니다. 완성 신호가 나올시 콜 옵션 2 이하의 옵션을 매수 진입 그리고 청산시에는 물론 매수한 옵션을 청산 하게됩니다.. 확인 부탁드립니다. */ var CPrice = new Array(101); var CCode = new Array(101); var PPrice = new Array(101); var PCode = new Array(101); var MaxCall; var MaxCallCode; var MaxPut; var MaxPutCode; var buycode=0,sellcode=0; var bcheck,bnum,bnumber,buyfill,cnt; var scheck,snum,smunber,sellfill,cns; function Main_OnStart() { bcheck = 0; scheck = 0; buyfill = 0; sellfill = 0; cnt = 0; cns = 0; Main.MessageLog("콜시작") } function callchart_OnRiseSignal(Signal) { //ATM 위 행사가 갯수 UNum = Option.uppersATM; //ATM 위 행사가 갯수 LNum = Option.lowersATM; //배열변수 준비(가격, 종목코드) CallCode = new Array(UNum+LNum+1); PutCode = new Array(UNum+LNum+1); CallPrice = new Array(UNum+LNum+1); PutPrice = new Array(UNum+LNum+1); //3.0이하의 가격을 가지는 콜종목은 해당 값과 종목코드 저장 //3.0을 초과하는 콜종목은 가격과 종목코드를 모두 -1 처리 for (var i = -LNum; i <= UNum; i++) { if (Option.GetCurrent(0, i) <= limit) { CallPrice[i+LNum] = Option.GetCurrent(0, i); CallCode[i+LNum] = Option.GetATMCallRecent(i); } else { CallPrice[i+LNum] = -1; CallCode[i+LNum] = -1; } // Main.MessageLog(i+"콜종목코드:"+CallCode[i+LNum]+"/가격:"+CallPrice[i+LNum]); } //3.0이하의 가격을 가지는 풋종목은 해당 값과 종목코드 저장 //3.0을 초과하는 풋종목은 가격과 종목코드를 모두 -1 처리 for (var ii = -UNum; ii <= LNum; ii++) { if (Option.GetCurrent(1, ii) <= limit) { PutPrice[ii+UNum] = Option.GetCurrent(1, ii); PutCode[ii+UNum] = Option.GetATMPutRecent(ii); } else { PutPrice[ii+UNum] = -1; PutCode[ii+UNum] = -1; } // Main.MessageLog(ii+"풋종목코드:"+PutCode[ii+UNum]+"/가격:"+PutPrice[ii+UNum]); } //각 배열에 저장된 값중 가장 큰 값을 찾음 var CC = -1; var CallOrderCode = -1; for (var iii = -LNum; iii <= UNum; iii++) { if (CallPrice[iii+LNum] > CC) { CC = CallPrice[iii+LNum]; CallOrderCode = CallCode[iii+LNum]; } } var PP = -1; var PutOrderCode = -1; for (var iiii = -UNum; iiii <= LNum; iiii++) { if (PutPrice[iiii+UNum] > PP) { PP = PutPrice[iiii+UNum]; PutOrderCode = PutCode[iiii+UNum]; } } // Main.MessageLog("--------------------------------------------"); // Main.MessageLog("콜주문종목코드:"+CallOrderCode+"/가격:"+CC); // Main.MessageLog("풋주문종목코드:"+PutOrderCode+"/가격:"+PP); Main.MessageLog("--------------------------------------------"); if (Signal.signalKind == 1) //buy 매수신호시 { cnt = cnt + 1; if (cnt == 1 && buyfill == 0 ) { // Main.MessageLog("cnt:"+cnt) Main.MessageLog("콜 진입 - 주문종목코드:"+CallOrderCode+"/가격:"+CC); bnum = a1.OrderBuy(CallOrderCode,Signal.count, Option.GetAskByCode(CallOrderCode, 3), 0) buycode = CallOrderCode; bcheck = 1; check = 0; } } if (Signal.signalKind == 2 && bcheck == 1 )// exitlong 청신신호시 { cns = cns +1; if (buyfill == 1 && cns == 1 ) { snum = a1.OrderSell(buycode,Signal.count, Option.GetBidByCode(buycode, 3),0) bcheck = 0; scheck = 1; Main.MessageLog("콜 청산 - 주문종목코드:"+buycode+"/가격:"+CC); } if (buyfill == 0 && cns == 1 ) { a1.OrderCancel(bnumber); } } } function Main_OnOrderResponse(OrderResponse) { if (bcheck == 1 && OrderResponse.orderID == bnum) // buy 주문응답 { bnumber = OrderResponse.orderNum; } if (scheck == 1 && OrderResponse.orderID == snum) // exitlong 주문응답 { snumber = OrderResponse.orderNum; Main.SetTimer(2, 3000) } } function Main_OnTimer(nEventID) // 시간응답 { if (nEventID == 2) { snumber = a1.OrderReplacePrice(snumber, Option.GetBidByCode(buycode, 3)) //정정주문 Main.KillTimer(2) } } function Main_OnNotifyFill(NotifyFill) { if (bcheck == 1 && NotifyFill.orderNum == bnumber) //buy 체결통보 { buyfill = 1; sellfill = 0; cns = 0; } else buyfill = 0; if (scheck == 1 && NotifyFill.orderNum == snumber) //exitlong 체결통보 { sellfill = 1; buyfill = 0; cnt = 0; Main.KillTimer(2); } else sellfill = 0; }