커뮤니티

옵션매매 문의드립니다.

프로필 이미지
피니트
2017-03-03 16:05:01
2516
글번호 224136
답변완료
항상 도움 주셔서 감사히 공부하고 있습니다. 선물신호로 옵션매수후 청산하고 있는데. 한계약일 경우에는 문제가 전혀 없는데 피라미딩으로 하나의 차트에서 2계약 이상 매수할 때, 행사가가 다른 옵션 매수후 청산할 경우에는 마지막 행사가로만 청산이 되어 계좌에 매도계약이 남게 되어 질문드립니다. 예를 들면 P 272.5 1계약 매수후 P270.0 1계약 추가 매수후 청산이 될 때 P270.0 2계약 매도 신호가 나옵니다. 결국 완전청산이 되지않고 P 272.5 1계약 매수 , P272.0 1계약 매도 상태가 됩니다. 완전한 청산을 위해서 스팟식을 어떻게 바꾸면 좋을 지 조언 부탁 드립니다. var ChartName = "pyramiding"; var d = new Date(); var OpPrice = 1.00; //진입가격대, OpPrice에 가장 근접한 값 주문 var LowPrice = 0.40; //최소가격대 이상일때로 제한하는 변수 var HighPrice = 9.90; //최대가격대 이하일때로 제한하는 변수 var OrderGap = 0.30; //주문시 체결가격 설정(현재가 + OrderGap) var ForPrice; // 옵션값후보 var Delta; var MaxCall; // 콜을 여기에 저장 var MaxCallcode; // 콜의 코드를 여기에 저장 var MaxPut; var MaxPutcode; function Main_OnStart() { Delta = 100; for(var i = -5; i <= 5; i++) { ForPrice = Option.GetCurrent(0,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxCallcode = Option.GetATMCallRecent(i); MaxCall = Option.GetCurrentByCode(MaxCallcode); } } Delta = 100; for(var i = -10; i <= 10; i++) { ForPrice = Option.GetCurrent(1,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxPutcode = Option.GetATMPutRecent(i); MaxPut = Option.GetCurrentByCode(MaxPutcode); } } Main.MessageLog("<< "+ChartName+" >> 콜 : "+MaxCall+" ("+MaxCallcode+") , 풋 : "+MaxPut+" ("+MaxPutcode+") ----- 구동시각 "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" , 잔존일 "+Option.GetRemainDays(0,0)+"일"); } //////////////////////////////////////////////////////// 신호 뜰때 매매 /////////////////////////////////////////// function Chart1_OnRiseSignal(Signal) { var EntryVol = Signal.count; // 선물신호 수량 d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if ( HHMMSS >= 90001 ) { ////////////////////////////////////////////// if (Signal.signalKind == 1) // Call 매수 { Delta = 100; for(var i = -5; i <= 5; i++) { ForPrice = Option.GetCurrent(0,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxCallcode = Option.GetATMCallRecent(i); MaxCall = Option.GetCurrentByCode(MaxCallcode); } } OrderPrice = parseInt((MaxCall+OrderGap)*100)/100; //부동소수점 오류방지 ACC.OrderBuy(MaxCallcode, EntryVol, OrderPrice, 0); //괄호 의미는 (코드, 수량, 가격, 지정가) Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 콜 매수진입) 종목명:"+MaxCallcode+", 수량:"+EntryVol+", 현재가:"+MaxCall+", 주문가:"+OrderPrice +" CCC"); } ////////////////////////////////////////////// if (Signal.signalKind == 2) // Call 청산 { ExitPrice = Option.GetCurrentByCode(MaxCallcode); OrderPrice = parseInt((ExitPrice - OrderGap)*100)/100; //부동소수점 오류방지 ACC.OrderSell(MaxCallcode, EntryVol, OrderPrice, 0); Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 콜 청산주문) 종목명:"+MaxCallcode+", 수량:"+EntryVol+", 현재가:"+ExitPrice+", 주문가:"+OrderPrice+ " c"); } ///////////////////////////////////////////// if (Signal.signalKind == 3) // Put 매수 { Delta = 100; for(var i = -10; i <= 10; i++) { ForPrice = Option.GetCurrent(1,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxPutcode = Option.GetATMPutRecent(i); MaxPut = Option.GetCurrentByCode(MaxPutcode); } } OrderPrice = parseInt((MaxPut+OrderGap)*100)/100; //부동소수점 오류방지 ACC.OrderBuy(MaxPutcode, EntryVol, OrderPrice , 0); Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 풋 매수진입) 종목명:"+MaxPutcode+", 수량:"+EntryVol+", 현재가:"+MaxPut+", 주문가:"+OrderPrice +" PPP"); } ///////////////////////////////////////////// if (Signal.signalKind == 4) // Put 청산 { ExitPrice = Option.GetCurrentByCode(MaxPutcode); OrderPrice = parseInt((ExitPrice - OrderGap)*100)/100; //부동소수점 오류방지 ACC.OrderSell(MaxPutcode, EntryVol, OrderPrice, 0); Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 풋 청산주문) 종목명:"+MaxPutcode+", 수량:"+ EntryVol+", 현재가:"+ExitPrice+", 주문가:"+OrderPrice+" p" ); } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2017-03-24 15:54:36

안녕하세요 예스스탁입니다. 매수청산신호가 발생하면 계좌의 모든 콜매수잔고에 대해 청산하고 매도청산신호가 발생하면 계좌의 모든 풋매수잔고에 대해 청산하게 하시면 됩니다. 하이투자증권과 NH투자증권이 종목코드체계가 다르므로 청산쪽에 주석 참고하시기 바랍니다. var ChartName = "pyramiding"; var d = new Date(); var OpPrice = 1.00; //진입가격대, OpPrice에 가장 근접한 값 주문 var LowPrice = 0.40; //최소가격대 이상일때로 제한하는 변수 var HighPrice = 9.90; //최대가격대 이하일때로 제한하는 변수 var OrderGap = 0.30; //주문시 체결가격 설정(현재가 + OrderGap) var ForPrice; // 옵션값후보 var Delta; var MaxCall; // 콜을 여기에 저장 var MaxCallcode; // 콜의 코드를 여기에 저장 var MaxPut; var MaxPutcode; function Main_OnStart() { Delta = 100; for(var i = -5; i <= 5; i++) { ForPrice = Option.GetCurrent(0,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxCallcode = Option.GetATMCallRecent(i); MaxCall = Option.GetCurrentByCode(MaxCallcode); } } Delta = 100; for(var i = -10; i <= 10; i++) { ForPrice = Option.GetCurrent(1,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxPutcode = Option.GetATMPutRecent(i); MaxPut = Option.GetCurrentByCode(MaxPutcode); } } Main.MessageLog("<< "+ChartName+" >> 콜 : "+MaxCall+" ("+MaxCallcode+") , 풋 : "+MaxPut+" ("+MaxPutcode+") ----- 구동시각 "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" , 잔존일 "+Option.GetRemainDays(0,0)+"일"); } //////////////////////////////////////////////////////// 신호 뜰때 매매 /////////////////////////////////////////// function Chart1_OnRiseSignal(Signal) { var EntryVol = Signal.count; // 선물신호 수량 d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if ( HHMMSS >= 90001 ) { ////////////////////////////////////////////// if (Signal.signalKind == 1) // Call 매수 { Delta = 100; for(var i = -5; i <= 5; i++) { ForPrice = Option.GetCurrent(0,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxCallcode = Option.GetATMCallRecent(i); MaxCall = Option.GetCurrentByCode(MaxCallcode); } } OrderPrice = parseInt((MaxCall+OrderGap)*100)/100; //부동소수점 오류방지 ACC.OrderBuy(MaxCallcode, EntryVol, OrderPrice, 0); //괄호 의미는 (코드, 수량, 가격, 지정가) Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 콜 매수진입) 종목명:"+MaxCallcode+", 수량:"+EntryVol+", 현재가:"+MaxCall+", 주문가:"+OrderPrice +" CCC"); } ////////////////////////////////////////////// if (Signal.signalKind == 2) // Call 청산 { //계좌 보유종목수 var num = ACC.GetTheNumberOfBalances(); //1개 이상이면 if (num > 0) { //차례대로 종목잔고 설정 for (var i = 0; i < num; i++) { //잔고셋팅 ACC.SetBalance(i); //계좌잔고가 콜옵션 매수포지션이면 전량청산 //NH투자증권이면 종목코드 앞 2자리로 판단 ACC.Balance.code.substring(0,2) == "12" if (ACC.Balance.count > 0 && ACC.Balance.position == 2 && ACC.Balance.code.substring(0,1) == "2") { //종목코드 지정해 ExitPrice와 OrderPrice계산 var ExitPrice = Option.GetCurrentByCode(ACC.Balance.code); var OrderPrice = parseInt((ExitPrice - OrderGap)*100)/100; //부동소수점 오류방지 //주문 ACC.OrderSell(ACC.Balance.code, ACC.Balance.count, OrderPrice, 0); //메세지출력 Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 콜 청산주문) 종목명:"+ACC.Balance.code+", 수량:"+ACC.Balance.count+", 현재가:"+ExitPrice+", 주문가:"+OrderPrice+ " c"); } } } } ///////////////////////////////////////////// if (Signal.signalKind == 3) // Put 매수 { Delta = 100; for(var i = -10; i <= 10; i++) { ForPrice = Option.GetCurrent(1,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxPutcode = Option.GetATMPutRecent(i); MaxPut = Option.GetCurrentByCode(MaxPutcode); } } OrderPrice = parseInt((MaxPut+OrderGap)*100)/100; //부동소수점 오류방지 ACC.OrderBuy(MaxPutcode, EntryVol, OrderPrice , 0); Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 풋 매수진입) 종목명:"+MaxPutcode+", 수량:"+EntryVol+", 현재가:"+MaxPut+", 주문가:"+OrderPrice +" PPP"); } ///////////////////////////////////////////// if (Signal.signalKind == 4) // Put 청산 { //계좌 보유종목수 var num = ACC.GetTheNumberOfBalances(); //1개 이상이면 if (num > 0) { //차례대로 종목잔고 설정 for (var i = 0; i < num; i++) { //잔고셋팅 ACC.SetBalance(i); //계좌잔고가 풋옵션 매수포지션이면 전량청산 //NH투자증권이면 종목코드 앞 2자리로 판단 ACC.Balance.code.substring(0,2) == "13" if (ACC.Balance.count > 0 && ACC.Balance.position == 2 && ACC.Balance.code.substring(0,1) == "3") { //종목코드 지정해 ExitPrice와 OrderPrice계산 var ExitPrice = Option.GetCurrentByCode(ACC.Balance.code); var OrderPrice = parseInt((ExitPrice - OrderGap)*100)/100; //부동소수점 오류방지 //주문 ACC.OrderSell(ACC.Balance.code, ACC.Balance.count, OrderPrice, 0); //메세지출력 Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 풋 청산주문) 종목명:"+ACC.Balance.code+", 수량:"+ ACC.Balance.count+", 현재가:"+ExitPrice+", 주문가:"+OrderPrice+" p" ); } } } } } } 즐거운 하루되세요 > 피니트 님이 쓴 글입니다. > 제목 : 옵션매매 문의드립니다. > 항상 도움 주셔서 감사히 공부하고 있습니다. 선물신호로 옵션매수후 청산하고 있는데. 한계약일 경우에는 문제가 전혀 없는데 피라미딩으로 하나의 차트에서 2계약 이상 매수할 때, 행사가가 다른 옵션 매수후 청산할 경우에는 마지막 행사가로만 청산이 되어 계좌에 매도계약이 남게 되어 질문드립니다. 예를 들면 P 272.5 1계약 매수후 P270.0 1계약 추가 매수후 청산이 될 때 P270.0 2계약 매도 신호가 나옵니다. 결국 완전청산이 되지않고 P 272.5 1계약 매수 , P272.0 1계약 매도 상태가 됩니다. 완전한 청산을 위해서 스팟식을 어떻게 바꾸면 좋을 지 조언 부탁 드립니다. var ChartName = "pyramiding"; var d = new Date(); var OpPrice = 1.00; //진입가격대, OpPrice에 가장 근접한 값 주문 var LowPrice = 0.40; //최소가격대 이상일때로 제한하는 변수 var HighPrice = 9.90; //최대가격대 이하일때로 제한하는 변수 var OrderGap = 0.30; //주문시 체결가격 설정(현재가 + OrderGap) var ForPrice; // 옵션값후보 var Delta; var MaxCall; // 콜을 여기에 저장 var MaxCallcode; // 콜의 코드를 여기에 저장 var MaxPut; var MaxPutcode; function Main_OnStart() { Delta = 100; for(var i = -5; i <= 5; i++) { ForPrice = Option.GetCurrent(0,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxCallcode = Option.GetATMCallRecent(i); MaxCall = Option.GetCurrentByCode(MaxCallcode); } } Delta = 100; for(var i = -10; i <= 10; i++) { ForPrice = Option.GetCurrent(1,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxPutcode = Option.GetATMPutRecent(i); MaxPut = Option.GetCurrentByCode(MaxPutcode); } } Main.MessageLog("<< "+ChartName+" >> 콜 : "+MaxCall+" ("+MaxCallcode+") , 풋 : "+MaxPut+" ("+MaxPutcode+") ----- 구동시각 "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" , 잔존일 "+Option.GetRemainDays(0,0)+"일"); } //////////////////////////////////////////////////////// 신호 뜰때 매매 /////////////////////////////////////////// function Chart1_OnRiseSignal(Signal) { var EntryVol = Signal.count; // 선물신호 수량 d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if ( HHMMSS >= 90001 ) { ////////////////////////////////////////////// if (Signal.signalKind == 1) // Call 매수 { Delta = 100; for(var i = -5; i <= 5; i++) { ForPrice = Option.GetCurrent(0,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxCallcode = Option.GetATMCallRecent(i); MaxCall = Option.GetCurrentByCode(MaxCallcode); } } OrderPrice = parseInt((MaxCall+OrderGap)*100)/100; //부동소수점 오류방지 ACC.OrderBuy(MaxCallcode, EntryVol, OrderPrice, 0); //괄호 의미는 (코드, 수량, 가격, 지정가) Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 콜 매수진입) 종목명:"+MaxCallcode+", 수량:"+EntryVol+", 현재가:"+MaxCall+", 주문가:"+OrderPrice +" CCC"); } ////////////////////////////////////////////// if (Signal.signalKind == 2) // Call 청산 { ExitPrice = Option.GetCurrentByCode(MaxCallcode); OrderPrice = parseInt((ExitPrice - OrderGap)*100)/100; //부동소수점 오류방지 ACC.OrderSell(MaxCallcode, EntryVol, OrderPrice, 0); Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 콜 청산주문) 종목명:"+MaxCallcode+", 수량:"+EntryVol+", 현재가:"+ExitPrice+", 주문가:"+OrderPrice+ " c"); } ///////////////////////////////////////////// if (Signal.signalKind == 3) // Put 매수 { Delta = 100; for(var i = -10; i <= 10; i++) { ForPrice = Option.GetCurrent(1,i); // GetCurrent 0 은 콜 , 1은 풋 if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice ) { Delta = Math.abs(ForPrice - OpPrice); MaxPutcode = Option.GetATMPutRecent(i); MaxPut = Option.GetCurrentByCode(MaxPutcode); } } OrderPrice = parseInt((MaxPut+OrderGap)*100)/100; //부동소수점 오류방지 ACC.OrderBuy(MaxPutcode, EntryVol, OrderPrice , 0); Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 풋 매수진입) 종목명:"+MaxPutcode+", 수량:"+EntryVol+", 현재가:"+MaxPut+", 주문가:"+OrderPrice +" PPP"); } ///////////////////////////////////////////// if (Signal.signalKind == 4) // Put 청산 { ExitPrice = Option.GetCurrentByCode(MaxPutcode); OrderPrice = parseInt((ExitPrice - OrderGap)*100)/100; //부동소수점 오류방지 ACC.OrderSell(MaxPutcode, EntryVol, OrderPrice, 0); Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 풋 청산주문) 종목명:"+MaxPutcode+", 수량:"+ EntryVol+", 현재가:"+ExitPrice+", 주문가:"+OrderPrice+" p" ); } } }