커뮤니티
문의
아래는 콜옵션 매수 코드입니다.
첫째, 로직요약 및 설명대로 수행되는 코드인지 검토해주십시요.
둘째, 풋옵션 매수 코드로 변경한 전체 수식을 작성하여 주십시요.
풋옵션 매수코드는
콜옵션 매수 코드와 마찬가지로
트리거 가격 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