커뮤니티

문의

프로필 이미지
좌오비우오비
2026-06-29 11:10:56
468
글번호 232599
답변완료

아래는 콜옵션 매수 코드입니다.

첫째, 로직요약 및 설명대로 수행되는 코드인지 검토해주십시요.

둘째, 풋옵션 매수 코드로 변경한 전체 수식을 작성하여 주십시요.


풋옵션 매수코드는

콜옵션 매수 코드와 마찬가지로

트리거 가격 0.05 발생하면 1행사가 위 내가격으로 매수하는 내용입니다.


항상 고맙습니다.


*******************************************************************************************************************************



// ■ 1. 핵심 로직 요약 및 설명

//

// 1) 진입 조건 (10:00 ~ 15:15)

// - 하루 중 콜옵션 종목의 현재가가 0.05가 되는 순간, 그보다 1단계 아래 행사가 종목(x-1)인 내가격 종목을 매도 5호가로 1계약 즉시 매수 진입합니다. (당일 단 1회 수행)

//

// 2) 장중 청산 (익절)

// - 보유 중인 옵션 종목이 진입 단가 대비 +2.5 포인트 이상 상승하면 장중에 매수 5호가로 즉시 익절 청산하고 시스템을 종료합니다.

//

// 3) 장마감 청산

// - 오후 3시 15분이 되면 기존에 있던 수익률 제한(+2.5) 조건과 상관없이 현재 남아 있는 보유 잔고를 전량 매도 청산하여 위험한 야간 오버나잇을 완벽히 방지합니다.

//

// 4) Main.SetTimer / KillTimer

// - SetTimer(1, 1000)로 1초마다 시세를 감시하는 타이머를 작동시키고, 청산 완료 시 KillTimer(1)을 통해 시스템을 안전하게 중지합니다.

//

// 5) Account1.SetBalance

// - 주문 연산이나 조건 비교 전, 가상 계좌의 잔고 상태(수량, 포지션 방향, 평단가 등)를 실시간 최신 정보로 갱신·동기화해주는 필수 함수입니다.

//

// ------------------------------------------------------------------------------------------------------------------------

// ■ 2. 소스코드


var Order = false, OC; // 주문 여부를 저장하는 Order 변수(초기값 거짓)와 주문 종목 코드를 저장할 OC 변수 선언


function Main_OnStart() // 시스템이 시작될 때 최초 1회 실행되는 이벤트 함수

{ // Main_OnStart 함수 시작

Main.SetTimer(1, 1000); // 1번 타이머를 생성하여 1000밀리초(1초) 간격으로 무한 반복 실행하도록 설정

Order = false // 시작 시 주문 여부 변수를 false(주문 없음)로 초기화

} // Main_OnStart 함수 종료


function Main_OnTimer(nEventID) // 설정한 타이머가 동작할 때마다 호출되는 이벤트 함수 (매초 실행)

{ // Main_OnTimer 함수 시작

var d = new Date(); // 현재 날짜와 시간 정보를 가진 Date 객체 생성

HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); // 현재 시간을 시분초 형태의 6자리 정수(예: 15시 15분 00초 -> 151500)로 변환


//타이머 100000 이후

if (nEventID == 1 && HHMMSS >= 100000) // 작동한 타이머가 1번이고 현재 시간이 오전 10시 정각(100000) 이후일 때 실행

{ // 10시 이후 조건문 시작

//151500 이전

if (HHMMSS < 151500) // 현재 시간이 오후 3시 15분(151500) 이전일 때 실행 (정규장 마감 전 매매 구간)

{ // 15시 15분 이전 조건문 시작

if (Order == false) // 아직 당일 매수 주문이 들어가지 않은 상태라면 실행

{ // 매수 탐색 조건문 시작

//전체 콜종목 대상

for(var x = -Option1.lowersATM; x <= Option1.uppersATM; x++) // 행사가 하한부터 상한까지 모든 콜옵션 종목을 순회하는 반복문

{ // 반복문 시작

//현재가 0.05 발생

if (Option1.GetCurrent(0,x) == 0.05 && Order == false) // 현재 순회 중인 콜옵션의 현재가가 정확히 0.05이고 주문 전이라면 실행

{ // 매수 조건 일치문 시작


//1내가격종목 매도5호가로 매수주문

OC = Option1.GetATMCallRecent(x-1); // 조건이 만족된 행사가보다 1단계 아래 종목(내가격)의 코드를 가져와 OC에 저장

Account1.OrderBuy(OC, 1, Option1.GetAsk(OC,5),0); // 해당 종목(OC)을 매도 5호가 가격으로 1계약 매수 주문 전송

Order = true; // 주문이 완료되었으므로 주문 완료 상태(true)로 변경

break; // 매수가 완료되었으므로 콜옵션 순회 반복문을 즉시 빠져나감

} // 매수 조건 일치문 종료

} // 반복문 종료

} // 매수 탐색 조건문 종료


// 매수후 2.5이상 수익이면 청산

if (Order == true) // 이미 매수 주문이 완료된 상태(보유 중)라면 실행

{ // 장중 청산 조건문 시작

Account1.SetBalance(OC,0); // 현재 주문된 종목(OC)의 잔고 정보를 업데이트하여 Account1.Balance에 동기화


if (Account1.Balance.count > 0 && Account1.Balance.position == 2 &&

Account1.Balance.current >= Account1.Balance.avgUnitCost+2.5) // 잔고 수량이 있고, 매수 포지션(2)이며, 현재가가 매수단가보다 2.5포인트 이상 상승했을 때

{ // 익절 실행 조건문 시작

Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5),0); // 보유 종목을 매수 5호가 가격으로 전량 매도 주문(익절 청산)

Main.KillTimer(1); // 청산이 완료되었으므로 매매를 종료하기 위해 1번 타이머를 제거

} // 익절 실행 조건문 종료

} // 장중 청산 조건문 종료

} // 15시 15분 이전 조건문 종료

else //151500 이후 (오후 3시 15분 정각 또는 그 이후 시점)

{ // 오후 3시 15분 이후 조건문 시작

//청산

if (Order == true) // 아직 청산되지 않은 당일 매수 포지션이 존재한다면 실행

{ // 장마감 동시청산 시작

Account1.SetBalance(OC,0); // 현재 보유 종목(OC)의 잔고 데이터를 최신으로 업데이트


if (Account1.Balance.count > 0 && Account1.Balance.position == 2) // 수익률 조건 체크를 제거하고, 매수 잔고가 존재하기만 하면 실행

{ // 장마감 강제청산 실행

Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5),0); // 보유 종목을 매수 5호가 가격으로 전량 매도하여 당일 포지션 오버나잇 방지

} // 장마감 강제청산 종료

} // 장마감 동시청산 종료

Main.KillTimer(1); // 당일 매매 일과가 완전히 종료되었으므로 1번 타이머를 해제하여 시스템을 최종 정지

} // 오후 3시 15분 이후 조건문 종료

} // 10시 이후 조건문 종료

} // Main_OnTimer 함수 종료



답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-07-09 15:41:54

안녕하세요 예스스탁입니다. 수식에 이상이 없습니다. 다만 수식 최종 검증은 사용자분이 직접하셔야 합니다. 모의투자 이용하셔서 테스트하시기 바랍니다. 아래는 풋으로 변경한 식입니다. 주석은 변경하지 않습니다. var Order = false, OC; // 주문 여부를 저장하는 Order 변수(초기값 거짓)와 주문 종목 코드를 저장할 OC 변수 선언 function Main_OnStart() // 시스템이 시작될 때 최초 1회 실행되는 이벤트 함수 { // Main_OnStart 함수 시작 Main.SetTimer(1, 1000); // 1번 타이머를 생성하여 1000밀리초(1초) 간격으로 무한 반복 실행하도록 설정 Order = false // 시작 시 주문 여부 변수를 false(주문 없음)로 초기화 } // Main_OnStart 함수 종료 function Main_OnTimer(nEventID) // 설정한 타이머가 동작할 때마다 호출되는 이벤트 함수 (매초 실행) { // Main_OnTimer 함수 시작 var d = new Date(); // 현재 날짜와 시간 정보를 가진 Date 객체 생성 HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); // 현재 시간을 시분초 형태의 6자리 정수(예: 15시 15분 00초 -> 151500)로 변환 //타이머 100000 이후 if (nEventID == 1 && HHMMSS >= 100000) // 작동한 타이머가 1번이고 현재 시간이 오전 10시 정각(100000) 이후일 때 실행 { // 10시 이후 조건문 시작 //151500 이전 if (HHMMSS < 151500) // 현재 시간이 오후 3시 15분(151500) 이전일 때 실행 (정규장 마감 전 매매 구간) { // 15시 15분 이전 조건문 시작 if (Order == false) // 아직 당일 매수 주문이 들어가지 않은 상태라면 실행 { // 매수 탐색 조건문 시작 //전체 콜종목 대상 for(var x = -Option1.lowersATM; x <= Option1.uppersATM; x++) // 행사가 하한부터 상한까지 모든 콜옵션 종목을 순회하는 반복문 { // 반복문 시작 //현재가 0.05 발생 if (Option1.GetCurrent(1,-x) == 0.05 && Order == false) // 현재 순회 중인 콜옵션의 현재가가 정확히 0.05이고 주문 전이라면 실행 { // 매수 조건 일치문 시작 //1내가격종목 매도5호가로 매수주문 OC = Option1.GetATMPutRecent(x+1); // 조건이 만족된 행사가보다 1단계 아래 종목(내가격)의 코드를 가져와 OC에 저장 Account1.OrderBuy(OC, 1, Option1.GetAsk(OC,5),0); // 해당 종목(OC)을 매도 5호가 가격으로 1계약 매수 주문 전송 Order = true; // 주문이 완료되었으므로 주문 완료 상태(true)로 변경 break; // 매수가 완료되었으므로 콜옵션 순회 반복문을 즉시 빠져나감 } // 매수 조건 일치문 종료 } // 반복문 종료 } // 매수 탐색 조건문 종료 // 매수후 2.5이상 수익이면 청산 if (Order == true) // 이미 매수 주문이 완료된 상태(보유 중)라면 실행 { // 장중 청산 조건문 시작 Account1.SetBalance(OC,0); // 현재 주문된 종목(OC)의 잔고 정보를 업데이트하여 Account1.Balance에 동기화 if (Account1.Balance.count > 0 && Account1.Balance.position == 2 && Account1.Balance.current >= Account1.Balance.avgUnitCost+2.5) // 잔고 수량이 있고, 매수 포지션(2)이며, 현재가가 매수단가보다 2.5포인트 이상 상승했을 때 { // 익절 실행 조건문 시작 Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5),0); // 보유 종목을 매수 5호가 가격으로 전량 매도 주문(익절 청산) Main.KillTimer(1); // 청산이 완료되었으므로 매매를 종료하기 위해 1번 타이머를 제거 } // 익절 실행 조건문 종료 } // 장중 청산 조건문 종료 } // 15시 15분 이전 조건문 종료 else //151500 이후 (오후 3시 15분 정각 또는 그 이후 시점) { // 오후 3시 15분 이후 조건문 시작 //청산 if (Order == true) // 아직 청산되지 않은 당일 매수 포지션이 존재한다면 실행 { // 장마감 동시청산 시작 Account1.SetBalance(OC,0); // 현재 보유 종목(OC)의 잔고 데이터를 최신으로 업데이트 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) // 수익률 조건 체크를 제거하고, 매수 잔고가 존재하기만 하면 실행 { // 장마감 강제청산 실행 Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5),0); // 보유 종목을 매수 5호가 가격으로 전량 매도하여 당일 포지션 오버나잇 방지 } // 장마감 강제청산 종료 } // 장마감 동시청산 종료 Main.KillTimer(1); // 당일 매매 일과가 완전히 종료되었으므로 1번 타이머를 해제하여 시스템을 최종 정지 } // 오후 3시 15분 이후 조건문 종료 } // 10시 이후 조건문 종료 } // Main_OnTimer 함수 종료 즐거운 하루되세요