커뮤니티
문의_pointless
2024-08-22 10:03:39
592
글번호 226084
<p><p>1. 검토사항 (아래 수식) 진입조건(등가격의 합과 차)을 만족했을 때 등가콜과 등가풋 중 절대값이 작은 쪽의 등가격 옵션을 매수하는 수식을 작성해보았습니다.&nbsp; 코딩내용이 맞는지 봐주셨으면 합니다. 2. 요청수식 검토요청한 수식과 진입조건은 똑같습니다. 다만 매수는 등가격이 아니고 1행사가 아래인 외가격1 입니다. 등가콜과 등가풋 중 절대값이 작은 쪽의 외가격1 옵션을 매수합니다. (판단은 등가격의 합과 차로, 액션은 외가격으로) 익절과 손절과 시간청산은 외가격1옵션으로 처리될 수 있도록 부탁드립니다. 포지션 청산은 다른 전략 미결제가 있으니 case by case 청산입니다. **************************************************************************** var ID, num; var Entry, Code; var Xvol; var HasExited;&nbsp;&nbsp;// 청산 후 재진입을 방지하는 변수 function Main_OnStart() { &nbsp;&nbsp;&nbsp;&nbsp;Main.MessageList("Start"); &nbsp;&nbsp;&nbsp;&nbsp;Main.SetTimer(1, 5000);&nbsp;&nbsp;// 기존 타이머 설정 (5초 간격) &nbsp;&nbsp;&nbsp;&nbsp;Main.SetTimer(2, 1000);&nbsp;&nbsp;// 15시 청산을 위한 타이머 설정 (1초 간격) &nbsp;&nbsp;&nbsp;&nbsp;Entry = 0;&nbsp;&nbsp;// 초기 Entry 값 설정 &nbsp;&nbsp;&nbsp;&nbsp;HasExited = false;&nbsp;&nbsp;// 초기 재진입 가능 상태 } function Main_OnTimer(nEventID) { &nbsp;&nbsp;&nbsp;&nbsp;var d = new Date(); &nbsp;&nbsp;&nbsp;&nbsp;var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds(); &nbsp;&nbsp;&nbsp;&nbsp;if (nEventID == 1) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!HasExited) {&nbsp;&nbsp;// 재진입 방지 조건 추가 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (HHMMSS &gt;= 84500) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var CallPrice = Option1.GetCurrent(0, 0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var PutPrice = Option1.GetCurrent(1, 0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var CallAsk = Option1.GetAsk(Option1.GetATMCallRecent(0), 5); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var PutAsk = Option1.GetAsk(Option1.GetATMPutRecent(0), 5); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var absCall = Math.abs(CallPrice); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var absPut = Math.abs(PutPrice); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var sum = absCall + absPut; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var diff = Math.abs(absCall - absPut); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 진입 조건 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (Entry == 0 &amp;&amp; sum &lt;= 5.00 &amp;&amp; diff &lt;= 2.50) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (absCall &lt;= absPut) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entry = CallPrice; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Code = Option1.GetATMCallRecent(0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID = Account1.OrderBuy(Code, 1, CallAsk, 0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Xvol = 1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entry = PutPrice; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Code = Option1.GetATMPutRecent(0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID = Account1.OrderBuy(Code, 1, PutAsk, 0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Xvol = 1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 익절/손절 조건 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (Entry &gt; 0 &amp;&amp; Xvol &gt; 0) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var currentPrice = Option1.GetCurrent(Code); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (currentPrice &gt;= Entry + 0.50 || currentPrice &lt;= Entry - 0.50) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closePosition(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 청산 후 매수 재진입 방지 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HasExited = true;&nbsp;&nbsp;// 청산 후 재진입 방지 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.KillTimer(1);&nbsp;&nbsp;// 타이머 1 종료 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if (nEventID == 2) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 15시 청산 조건 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (HHMMSS &gt;= 151000 &amp;&amp; HHMMSS &lt; 151500) { // 15시 15분에 청산 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closePosition(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.KillTimer(2);&nbsp;&nbsp;// 타이머 2 종료 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} } function closePosition() { &nbsp;&nbsp;&nbsp;&nbsp;// 포지션 청산 &nbsp;&nbsp;&nbsp;&nbsp;if (Xvol &gt; 0) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (Code) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Account1.OrderSell(Code, Xvol, Option1.GetBid(Code, 5), 0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;Entry = 0;&nbsp;&nbsp;// Entry 값 초기화 &nbsp;&nbsp;&nbsp;&nbsp;Code = null;&nbsp;&nbsp;// Code 초기화 &nbsp;&nbsp;&nbsp;&nbsp;Xvol = 0;&nbsp;&nbsp;// 수량 초기화 &nbsp;&nbsp;&nbsp;&nbsp;// HasExited = true;&nbsp;&nbsp;// 청산 후 재진입 방지&nbsp; } function Main_OnOrderResponse(OrderResponse) { &nbsp;&nbsp;&nbsp;&nbsp;// 주문 응답 처리 &nbsp;&nbsp;&nbsp;&nbsp;if (OrderResponse.orderID == ID) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num = OrderResponse.orderNum; &nbsp;&nbsp;&nbsp;&nbsp;} }</p></p>
답변 3
예스스탁 예스스탁 답변
2024-08-26 16:44:58
안녕하세요
예스스탁입니다.
1
예 맞습니다.
낮은 가격의 종목을 매수하게 작성되었습니다.
2
code변수에 저장되는 값만
Option1.GetATMCallRecent(1),Option1.GetATMPutRecent(1)로 변경하시면 됩니다.
// 진입 조건
if (Entry == 0 && sum <= 5.00 && diff <= 2.50)
{
if (absCall <= absPut)
{
Entry = CallPrice;
Code = Option1.GetATMCallRecent(1);
ID = Account1.OrderBuy(Code, 1, CallAsk, 0);
Xvol = 1;
}
else
{
Entry = PutPrice;
Code = Option1.GetATMPutRecent(1);
ID = Account1.OrderBuy(Code, 1, PutAsk, 0);
Xvol = 1;
}
}
즐거운 하루되세요
> 좌오비우오비 님이 쓴 글입니다.
> 제목 : 외가격 옵션 매수
> 1. 검토사항 (아래 수식)
진입조건(등가격의 합과 차)을 만족했을 때
등가콜과 등가풋 중 절대값이 작은 쪽의 등가격 옵션을 매수하는 수식을 작성해보았습니다.
코딩내용이 맞는지 봐주셨으면 합니다.
2. 요청수식
검토요청한 수식과 진입조건은 똑같습니다. 다만 매수는 등가격이 아니고 1행사가 아래인 외가격1 입니다.
등가콜과 등가풋 중 절대값이 작은 쪽의 외가격1 옵션을 매수합니다.
(판단은 등가격의 합과 차로, 액션은 외가격으로)
익절과 손절과 시간청산은 외가격1옵션으로 처리될 수 있도록 부탁드립니다.
포지션 청산은 다른 전략 미결제가 있으니 case by case 청산입니다.
****************************************************************************
var ID, num;
var Entry, Code;
var Xvol;
var HasExited; // 청산 후 재진입을 방지하는 변수
function Main_OnStart() {
Main.MessageList("Start");
Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격)
Main.SetTimer(2, 1000); // 15시 청산을 위한 타이머 설정 (1초 간격)
Entry = 0; // 초기 Entry 값 설정
HasExited = false; // 초기 재진입 가능 상태
}
function Main_OnTimer(nEventID) {
var d = new Date();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (nEventID == 1) {
if (!HasExited) { // 재진입 방지 조건 추가
if (HHMMSS >= 84500) {
var CallPrice = Option1.GetCurrent(0, 0);
var PutPrice = Option1.GetCurrent(1, 0);
var CallAsk = Option1.GetAsk(Option1.GetATMCallRecent(0), 5);
var PutAsk = Option1.GetAsk(Option1.GetATMPutRecent(0), 5);
var absCall = Math.abs(CallPrice);
var absPut = Math.abs(PutPrice);
var sum = absCall + absPut;
var diff = Math.abs(absCall - absPut);
// 진입 조건
if (Entry == 0 && sum <= 5.00 && diff <= 2.50) {
if (absCall <= absPut) {
Entry = CallPrice;
Code = Option1.GetATMCallRecent(0);
ID = Account1.OrderBuy(Code, 1, CallAsk, 0);
Xvol = 1;
} else {
Entry = PutPrice;
Code = Option1.GetATMPutRecent(0);
ID = Account1.OrderBuy(Code, 1, PutAsk, 0);
Xvol = 1;
}
}
// 익절/손절 조건
if (Entry > 0 && Xvol > 0) {
var currentPrice = Option1.GetCurrent(Code);
if (currentPrice >= Entry + 0.50 || currentPrice <= Entry - 0.50) {
closePosition();
// 청산 후 매수 재진입 방지
HasExited = true; // 청산 후 재진입 방지
Main.KillTimer(1); // 타이머 1 종료
}
}
}
}
}
if (nEventID == 2) {
// 15시 청산 조건
if (HHMMSS >= 151000 && HHMMSS < 151500) { // 15시 15분에 청산
closePosition();
Main.KillTimer(2); // 타이머 2 종료
}
}
}
function closePosition() {
// 포지션 청산
if (Xvol > 0) {
if (Code) {
Account1.OrderSell(Code, Xvol, Option1.GetBid(Code, 5), 0);
}
}
Entry = 0; // Entry 값 초기화
Code = null; // Code 초기화
Xvol = 0; // 수량 초기화
// HasExited = true; // 청산 후 재진입 방지
}
function Main_OnOrderResponse(OrderResponse) {
// 주문 응답 처리
if (OrderResponse.orderID == ID) {
num = OrderResponse.orderNum;
}
}
좌오비우오비
2024-08-29 14:16:21
답변 고맙습니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 외가격 옵션 매수
>
안녕하세요
예스스탁입니다.
1
예 맞습니다.
낮은 가격의 종목을 매수하게 작성되었습니다.
2
code변수에 저장되는 값만
Option1.GetATMCallRecent(1),Option1.GetATMPutRecent(1)로 변경하시면 됩니다.
// 진입 조건
if (Entry == 0 && sum <= 5.00 && diff <= 2.50)
{
if (absCall <= absPut)
{
Entry = CallPrice;
Code = Option1.GetATMCallRecent(1);
ID = Account1.OrderBuy(Code, 1, CallAsk, 0);
Xvol = 1;
}
else
{
Entry = PutPrice;
Code = Option1.GetATMPutRecent(1);
ID = Account1.OrderBuy(Code, 1, PutAsk, 0);
Xvol = 1;
}
}
즐거운 하루되세요
> 좌오비우오비 님이 쓴 글입니다.
> 제목 : 외가격 옵션 매수
> 1. 검토사항 (아래 수식)
진입조건(등가격의 합과 차)을 만족했을 때
등가콜과 등가풋 중 절대값이 작은 쪽의 등가격 옵션을 매수하는 수식을 작성해보았습니다.
코딩내용이 맞는지 봐주셨으면 합니다.
2. 요청수식
검토요청한 수식과 진입조건은 똑같습니다. 다만 매수는 등가격이 아니고 1행사가 아래인 외가격1 입니다.
등가콜과 등가풋 중 절대값이 작은 쪽의 외가격1 옵션을 매수합니다.
(판단은 등가격의 합과 차로, 액션은 외가격으로)
익절과 손절과 시간청산은 외가격1옵션으로 처리될 수 있도록 부탁드립니다.
포지션 청산은 다른 전략 미결제가 있으니 case by case 청산입니다.
****************************************************************************
var ID, num;
var Entry, Code;
var Xvol;
var HasExited; // 청산 후 재진입을 방지하는 변수
function Main_OnStart() {
Main.MessageList("Start");
Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격)
Main.SetTimer(2, 1000); // 15시 청산을 위한 타이머 설정 (1초 간격)
Entry = 0; // 초기 Entry 값 설정
HasExited = false; // 초기 재진입 가능 상태
}
function Main_OnTimer(nEventID) {
var d = new Date();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (nEventID == 1) {
if (!HasExited) { // 재진입 방지 조건 추가
if (HHMMSS >= 84500) {
var CallPrice = Option1.GetCurrent(0, 0);
var PutPrice = Option1.GetCurrent(1, 0);
var CallAsk = Option1.GetAsk(Option1.GetATMCallRecent(0), 5);
var PutAsk = Option1.GetAsk(Option1.GetATMPutRecent(0), 5);
var absCall = Math.abs(CallPrice);
var absPut = Math.abs(PutPrice);
var sum = absCall + absPut;
var diff = Math.abs(absCall - absPut);
// 진입 조건
if (Entry == 0 && sum <= 5.00 && diff <= 2.50) {
if (absCall <= absPut) {
Entry = CallPrice;
Code = Option1.GetATMCallRecent(0);
ID = Account1.OrderBuy(Code, 1, CallAsk, 0);
Xvol = 1;
} else {
Entry = PutPrice;
Code = Option1.GetATMPutRecent(0);
ID = Account1.OrderBuy(Code, 1, PutAsk, 0);
Xvol = 1;
}
}
// 익절/손절 조건
if (Entry > 0 && Xvol > 0) {
var currentPrice = Option1.GetCurrent(Code);
if (currentPrice >= Entry + 0.50 || currentPrice <= Entry - 0.50) {
closePosition();
// 청산 후 매수 재진입 방지
HasExited = true; // 청산 후 재진입 방지
Main.KillTimer(1); // 타이머 1 종료
}
}
}
}
}
if (nEventID == 2) {
// 15시 청산 조건
if (HHMMSS >= 151000 && HHMMSS < 151500) { // 15시 15분에 청산
closePosition();
Main.KillTimer(2); // 타이머 2 종료
}
}
}
function closePosition() {
// 포지션 청산
if (Xvol > 0) {
if (Code) {
Account1.OrderSell(Code, Xvol, Option1.GetBid(Code, 5), 0);
}
}
Entry = 0; // Entry 값 초기화
Code = null; // Code 초기화
Xvol = 0; // 수량 초기화
// HasExited = true; // 청산 후 재진입 방지
}
function Main_OnOrderResponse(OrderResponse) {
// 주문 응답 처리
if (OrderResponse.orderID == ID) {
num = OrderResponse.orderNum;
}
}
예스스탁 예스스탁 답변
2024-08-29 14:31:51
> 좌오비우오비 님이 쓴 글입니다.
> 제목 : Re : Re : 외가격 옵션 매수
> 답변 고맙습니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 외가격 옵션 매수
>
안녕하세요
예스스탁입니다.
1
예 맞습니다.
낮은 가격의 종목을 매수하게 작성되었습니다.
2
code변수에 저장되는 값만
Option1.GetATMCallRecent(1),Option1.GetATMPutRecent(1)로 변경하시면 됩니다.
// 진입 조건
if (Entry == 0 && sum <= 5.00 && diff <= 2.50)
{
if (absCall <= absPut)
{
Entry = CallPrice;
Code = Option1.GetATMCallRecent(1);
ID = Account1.OrderBuy(Code, 1, CallAsk, 0);
Xvol = 1;
}
else
{
Entry = PutPrice;
Code = Option1.GetATMPutRecent(1);
ID = Account1.OrderBuy(Code, 1, PutAsk, 0);
Xvol = 1;
}
}
즐거운 하루되세요
> 좌오비우오비 님이 쓴 글입니다.
> 제목 : 외가격 옵션 매수
> 1. 검토사항 (아래 수식)
진입조건(등가격의 합과 차)을 만족했을 때
등가콜과 등가풋 중 절대값이 작은 쪽의 등가격 옵션을 매수하는 수식을 작성해보았습니다.
코딩내용이 맞는지 봐주셨으면 합니다.
2. 요청수식
검토요청한 수식과 진입조건은 똑같습니다. 다만 매수는 등가격이 아니고 1행사가 아래인 외가격1 입니다.
등가콜과 등가풋 중 절대값이 작은 쪽의 외가격1 옵션을 매수합니다.
(판단은 등가격의 합과 차로, 액션은 외가격으로)
익절과 손절과 시간청산은 외가격1옵션으로 처리될 수 있도록 부탁드립니다.
포지션 청산은 다른 전략 미결제가 있으니 case by case 청산입니다.
****************************************************************************
var ID, num;
var Entry, Code;
var Xvol;
var HasExited; // 청산 후 재진입을 방지하는 변수
function Main_OnStart() {
Main.MessageList("Start");
Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격)
Main.SetTimer(2, 1000); // 15시 청산을 위한 타이머 설정 (1초 간격)
Entry = 0; // 초기 Entry 값 설정
HasExited = false; // 초기 재진입 가능 상태
}
function Main_OnTimer(nEventID) {
var d = new Date();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (nEventID == 1) {
if (!HasExited) { // 재진입 방지 조건 추가
if (HHMMSS >= 84500) {
var CallPrice = Option1.GetCurrent(0, 0);
var PutPrice = Option1.GetCurrent(1, 0);
var CallAsk = Option1.GetAsk(Option1.GetATMCallRecent(0), 5);
var PutAsk = Option1.GetAsk(Option1.GetATMPutRecent(0), 5);
var absCall = Math.abs(CallPrice);
var absPut = Math.abs(PutPrice);
var sum = absCall + absPut;
var diff = Math.abs(absCall - absPut);
// 진입 조건
if (Entry == 0 && sum <= 5.00 && diff <= 2.50) {
if (absCall <= absPut) {
Entry = CallPrice;
Code = Option1.GetATMCallRecent(0);
ID = Account1.OrderBuy(Code, 1, CallAsk, 0);
Xvol = 1;
} else {
Entry = PutPrice;
Code = Option1.GetATMPutRecent(0);
ID = Account1.OrderBuy(Code, 1, PutAsk, 0);
Xvol = 1;
}
}
// 익절/손절 조건
if (Entry > 0 && Xvol > 0) {
var currentPrice = Option1.GetCurrent(Code);
if (currentPrice >= Entry + 0.50 || currentPrice <= Entry - 0.50) {
closePosition();
// 청산 후 매수 재진입 방지
HasExited = true; // 청산 후 재진입 방지
Main.KillTimer(1); // 타이머 1 종료
}
}
}
}
}
if (nEventID == 2) {
// 15시 청산 조건
if (HHMMSS >= 151000 && HHMMSS < 151500) { // 15시 15분에 청산
closePosition();
Main.KillTimer(2); // 타이머 2 종료
}
}
}
function closePosition() {
// 포지션 청산
if (Xvol > 0) {
if (Code) {
Account1.OrderSell(Code, Xvol, Option1.GetBid(Code, 5), 0);
}
}
Entry = 0; // Entry 값 초기화
Code = null; // Code 초기화
Xvol = 0; // 수량 초기화
// HasExited = true; // 청산 후 재진입 방지
}
function Main_OnOrderResponse(OrderResponse) {
// 주문 응답 처리
if (OrderResponse.orderID == ID) {
num = OrderResponse.orderNum;
}
}