커뮤니티

예스스팟 Q&A

답변완료

확장챠트의 신호가...

확장챠틀를 두개이상 만들어서 신호의 조건에 따라 진입, 청산을 하는데 두챠트의 신호가 각각 구분되어 나오게 하는 것을 검토해 주세요... 참고로 아래의 수식은 ChartEx6에 ChartEx5의 신호까지 겹쳐서 나오네요.. var Start, CallStart, PutStart; var Code1Vol; var Code2Vol, CodeVol; var OrderCode, OrderCode1; var OrderCode2; var Nth = 0; var Balnum, AccVol; var CallStart; var PutStart; var CallOrderCode; var PutOrderCode; var BuyNum,SellNum; var BuyVol,BuyFillVol,BuyID, BuyStep = 0,BuyPrice ; var BuyLimitPrice,BuyLimitEnd = false, BuyResponse = false; var SellVol,SellFillVol,SellID, SellStep = 0,SellPrice ; var SellLimitPrice,SellLimitEnd = false, SellResponse = false; var Expr1, Expr2; var CVit, PVit, CGoal, PGoal, Ma5;// var ChartEx5; var ChartEx6; //스팟 시작시에 function Main_OnStart() { Start = 0; CallStart = 0; PutStart = 0; OrderCode1 = Main.GetOrderCode( MarketData1.code);//ATM단위로 사용할때 Account1.SetBalanceItem(OrderCode1, 0); if (Account1.Balance.code == OrderCode1) { CodeVol = Account1.Balance.count ; } Main.MessageList("코 드: ",OrderCode1,"잔고:",CodeVol); Main.ReqMarketData(OrderCode1, 10,0); Main.MessageList("종목객체요청"); var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시 5분에 if (Start == 0 && HHMMSS >= 083000)// && HHMMSS >= 90030 { UNum = Option.uppersATM; 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); for (var i = -LNum; i <= UNum; i++) { if (HHMMSS < 090000) { CallPrice[i+LNum] = Math.abs(Option.GetExpectedPrice(0, i)-2.0); } else if (HHMMSS >= 090000) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0); } CallCode[i+LNum] = Option.GetATMCallRecent(i); } CC = 99999999; // CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum]; } if (CallOrderCode == CallCode[i+LNum]) { CallOrderCode1 = CallCode[i+LNum-1]; CallOrderCode2 = CallCode[i+LNum+1]; CallOrderCode3 = CallCode[i+LNum+2]; } } for (var ii = -UNum; ii <= LNum; ii++) { if (HHMMSS < 090000) { PutPrice[ii+UNum] = Math.abs(Option.GetExpectedPrice(1, ii)-2.0); } else if (HHMMSS >= 090000) { PutPrice[ii+UNum] = Math.abs(Option.GetCurrent(1, ii)-2.0); } PutCode[ii+UNum] = Option.GetATMPutRecent(ii); } PP = 99999999; // PutOrderCode = -1; for (var ii = -UNum; ii < LNum; ii++) { if (PutPrice[ii+UNum] <= PP) { PP = PutPrice[ii+UNum]; PutOrderCode = PutCode[ii+UNum]; } if (PutOrderCode == PutCode[ii+UNum]) { PutOrderCode1 = PutCode[ii+UNum-1]; PutOrderCode2 = PutCode[ii+UNum+1]; PutOrderCode3 = PutCode[ii+UNum+2]; //PutOrderCode4 = PutCode[ii+UNum+3]; } } Main.MessageList("콜",CallOrderCode ,"풋",PutOrderCode); //확장 차트객체 요청 var ChartSet1 = new ReqChartItem(CallOrderCode,60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false); var ChartSet2 = new ReqChartItem(PutOrderCode,60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false); //시스템 설정 //var SystemInputSet = new Array(new YLInputVar("HP", OpHLPIn1),new YLInputVar("LP", OpHLPIn2)); var TradeSet = new SystemTradeInfo(TRADE_FIXCAPITAL,1, 10000000,1, // 자산 0.07, 0.07,CALCMETHOD_PERCENT, // 진입/청산 수수료 0.01, 0.01,CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ALL, // 피라미딩 설정여부 50, //1000, // 최대진입수량 4); // 최대진입횟수 //var StopSet = new SystemStopInfo(new StopEndOfDay(150300)); var SystemSet1 = new SystemInfo("Opover틱-단타data4추세",YL_TYPE_NORMAL,null,TradeSet,null); //var SystemSet2 = new SystemInfo("Opover틱-단타data4",YL_TYPE_NORMAL,null,TradeSet,null); //지표 설정 //지표명 MACD를 기간 10,20으로 설정해서 차트에 적용 I1 = new IndicatorInfo("옵션거래량마디_data4추세", YL_TYPE_NORMAL, null,null); var IndicatorSet = new Array(I1); //참조데이터 추가 var R11 = new ReqChartItem(PutOrderCode, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false); var R12 = new ReqChartItem(CallOrderCode2, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false); var R13 = new ReqChartItem(CallOrderCode1, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false); var ReferDataSet1 = new Array(R11,R12,R13); //참조데이터 추가 var R21 = new ReqChartItem(CallOrderCode, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false); var R22 = new ReqChartItem(PutOrderCode2, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false); var R23 = new ReqChartItem(PutOrderCode1, 60, CHART_PERIOD_TICK, 3000, CHART_REQCOUNT_BAR, false, false); var ReferDataSet2 = new Array(R21,R22,R23); //지정한 설정으로 챠트 생성을 요청 ChartEx5 = Main.ReqChartEx(ChartSet1, SystemSet1, IndicatorSet, ReferDataSet1); ChartEx6 = Main.ReqChartEx(ChartSet2, SystemSet1, IndicatorSet, ReferDataSet2); } } function Main_OnRcvChartEx(ChartEx) { if (ChartEx.GetCode(1) == CallOrderCode)//CallOrderCode == ChartEx.GetCode(1))// ChartEx.GetCode(1) == CallOrderCode) { ChartEx5 = ChartEx; CallStart = 1; Main.ReqMarketData(ChartEx5.GetCode(1), 20,0);//ATM단위로 사용할때 Main.MessageList("Cx코드",ChartEx5.GetCode(1)); } if (ChartEx.GetCode(1) == PutOrderCode)//PutOrderCode == ChartEx.GetCode(1))// ChartEx.GetCode(1) == PutOrderCode) { ChartEx6 = ChartEx; PutStart = 1; Main.ReqMarketData(ChartEx6.GetCode(1), 20,0);//ATM단위로 사용할때 Main.MessageList("Px코드",ChartEx6.GetCode(1)); } } function Main_OnRcvMarketData(MarketData) { Start = 1; Main.MessageList("종목객체수신",MarketData.code); //수신받은 종목객체의 종목코드와 직전에 요청한 종목과 같은지 확인 후에 if (MarketData.code == OrderCode1) { OrderCode1 = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장 Main.MessageList("종목객체생성완료 : ",OrderCode1); } if (MarketData.code == CallOrderCode) { CallOrderCode = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장 Main.MessageList("종목객체생성완료 : ",CallOrderCode); } if (MarketData.code == PutOrderCode) { PutOrderCode = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장 Main.MessageList("종목객체생성완료 : ",PutOrderCode); } } function Main_OnRiseSignal(ChartEx5,Signal) { //날자 및 시계계산 var d = new Date(); var HHMMSSTT = d.getHours()*10000000+d.getMinutes()*100000+d.getSeconds()*1000+d.getMilliseconds(); //CallStart = 2; CVit = C3.GetIndicatorData("중심가격3-7",1, 0);// PVit = C3.GetIndicatorData("중심가격3-7",2, 0);// CGoal = C3.GetIndicatorData("중심가격3-7",5, 0);// PGoal = C3.GetIndicatorData("중심가격3-7",6, 0);// Ma5 = C3.GetIndicatorData("중심가격3-7",13, 0);// if (ChartEx5.GetCode(1) == CallOrderCode && Signal.signalKind == 1) { Main.MessageList("CGoal",CGoal,HHMMSSTT); if ((CallStart == 1 && C3.GetClose(1, 0) >= CVit && C3.GetClose(1, 0) >= CGoal) || (CallStart == 1 && C3.GetClose(1, 0) > Ma5 && (C3.GetClose(1, 0) >= CVit || C3.GetClose(1, 0) >= CGoal))) { Main.MessageList("신호Ex11:",Signal.name,"가격",Signal.price,"시간",HHMMSSTT); BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), BuyVol, BuyPrice, 0); Main.MessageList("매수주문3 - ","주문아이디",BuyID,"주문가격",BuyPrice,"수량",BuyVol); Main.SetTimer(11, 60000);//60초 } else { } } } function Main_OnRiseSignal(ChartEx6,Signal) { //날자 및 시계계산 var d = new Date(); var HHMMSSTT = d.getHours()*10000000+d.getMinutes()*100000+d.getSeconds()*1000+d.getMilliseconds(); //CallStart = 2; CVit = C3.GetIndicatorData("중심가격3-7",1, 0);//C생명가반등 PVit = C3.GetIndicatorData("중심가격3-7",2, 0);//P생명가반등 CGoal = C3.GetIndicatorData("중심가격3-7",5, 0);//콜목 PGoal = C3.GetIndicatorData("중심가격3-7",6, 0);//풋목 Ma5 = C3.GetIndicatorData("중심가격3-7",13, 0);// if (ChartEx6.GetCode(1) == PutOrderCode && Signal.signalKind == 1) { Main.MessageList("PGoal",PGoal,HHMMSSTT); if ((PutStart == 1 && C3.GetClose(1, 0) <= PVit && C3.GetClose(1, 0) <= PGoal) || (PutStart == 1 && C3.GetClose(1, 0) < Ma5 && (C3.GetClose(1, 0) <= PVit || C3.GetClose(1, 0) <= PGoal))) { Main.MessageList("신호Ex21:",Signal.name,"가격",Signal.price,"시간",HHMMSSTT); SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), SellVol, SellPrice, 0); Main.MessageList("매도주문3","주문아이디",SellID,"주문가격",SellPrice,"수량",SellVol); Main.SetTimer(12, 60000);//60초 } else { } } }
프로필 이미지
파문일기
2016-06-15
1336
글번호 223928
답변완료

수식 수정 문의드립니다.

안녕하세요 항상 답변에 감사드리고 있습니다. 아래 수식은 선물매수시 스팟에서 콜매수, 풋매도 진입하고 선물매도시 스팟에서 풋매수,콜매도 옵션을 주문하는 합성선물 수식입니다. 이 합성선물 수식을 수정하여 아래와 같은 수식으로 변경하고자 합니다. 주내용은 선물신호발생하여 옵션주문시 당초 양합보다 (+)시에는(양매수장) 옵션매수를 하고 양합 (-)시에는(양매도) 옵션매도 판단하여 주문하는 수식입니다. ㅁ선물신호 발생 --->(양합이 1% 이상일때) 콜매수 또는 풋매수 ㅁ선물신호 발생 --->(양합이 1% 미만일때) 콜매도 또는 풋매도 최종 합성선물수식은 아니고 방향성 수식이며 선물에서 신호발생시 스팟에서 양합에 따라 매수, 매도를 결정하여 한 종목만 네이키드 진입함 당일 9시1분 등가의 콜과 풋의 종목을 기억하고 콜값, 풋값과 그 양합을 구함 (당일 시초가 등가는 장이 시작되야 알기에 1분으로 함) 선물매수신호가 나오면 9시1분 기억한 종목의 양합을 체크하여 양합이 9시1분보다 1% 이상에 있을때는 콜매수하고 1%보다 낮을때는 풋매도 진입 선물매도신호가 나오면 9시 1분에 기억한 종목의 양합을 체크하여 현재의 양합이 9시1분보다 1% 이상에 있을때는 풋매수, 그렇지 않을때는 콜매도 진입 미리 답변에 감사드립니다. 주신답변 실전에 잘 응용해서 써먹고 있습니다. 아래는 합성선물 수식입니다. ================================================================================ var T; var CC, CallOrderCode; var PP, PutOrderCode; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { T = 1; Main.MessageList("--------------------------------------------"); Main.MessageList("Buy신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; //콜옵션중 2.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 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)-2.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] } } //풋옵션중 2.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 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)-2.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) { Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0); Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0); } } if (T == 1 && Signal.signalKind == 2) { Main.MessageList("--------------------------------------------"); Main.MessageList("ExitLong신호 발생"); T = 0; Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0); Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0); } if (T >= 0 && Signal.signalKind == 3) { T = -1; Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; //콜옵션중 2.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 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)-2.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] } } //풋옵션중 2.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 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)-2.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) { Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0); Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0); } } if (T == -1 && Signal.signalKind == 4) { Main.MessageList("--------------------------------------------"); Main.MessageList("ExitShort신호 발생"); T = 0; Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0); Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0); } } ==================================================================================
프로필 이미지
탄젠트80
2016-06-13
1268
글번호 223925

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

프로필 이미지
aaaaa
2016-06-10
12
글번호 223924

자오지환웅 님에 의해서 삭제되었습니다.

프로필 이미지
자오지환웅
2016-06-10
19
글번호 223923
답변완료

문의드립니다.

NH선물 모의투자로 예스스팟 테스트 중인데요 function Main_OnU*pdateMarket(sItemCode, lU*pdateID) { Account1.SetBalanceItem(OrderCode1, 0); if (Account1.Balance.count == 0) { 진입주문 } ... ... } 이렇게 작성을 했는데요, 진입 조건이 맞아 처음 진입한 이후에는 Account1.Balance.count가 0보다 크게 나와야 하는게 정상 아닌가요? 0으로 나와서 계속 진입을 합니다. 어떻게 처리해야 할까요? 답변 부탁드립니다. 감사합니다.
프로필 이미지
우니쮸니
2016-05-24
1119
글번호 223919
답변완료

문의드립니다.

스팟으로 식 문의드립니다. 제계좌에 있는 옵션 매수포지션,매도포지션 혼합된 종목들중(a.b.c.d.e.f종목) 특정 종목만(a.b종목) 지정해서 종목의 수량에 관계없이 평가액기준으로 그 종목(a.b종목)의 합이 +5만원이상이 되면 청산(a.b종목만적용) -3만원이상이 되면 청산(a.b종목만적용) 청산은 시장가로 즉시 적용되도록 부탁드립니다.
프로필 이미지
스누피독
2016-06-06
1081
글번호 223914

스누피독 님에 의해서 삭제되었습니다.

프로필 이미지
스누피독
2016-05-23
0
글번호 223913

선물꾼 님에 의해서 삭제되었습니다.

프로필 이미지
선물꾼
2016-05-20
13
글번호 223912
답변완료

미체결 종류 구분

안녕하세요. 현대선물 사용중이며, 해외선물에서 미체결 내역 확인시 신규 진입 미체결인지 아니면 청산 미체결인지 확인하여 달리 처리를 하고 싶은데 어떻게 구분해야 하나요? 그리고 Unfill.orderNum과 Unfill.orgOrderNum의 차이는 무엇인가요? 항상 같은 값으로 확인되는게 맞는건가요? 감사합니다.
프로필 이미지
빌딩오너
2016-05-19
998
글번호 223911

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

프로필 이미지
simtang3
2016-05-18
63
글번호 223904