커뮤니티
거래량 최대 행사가에서 콜옵션 매수
데이트레이딩입니다.
콜옵션 매수 수식을 AI와 작성해보았습니다.
수식이 틀렸으면 얼른 폐기하시고 원래대로 답변 수식 작성바랍니다.
1. 콜옵션 매수 내용
1) 조건
- 시작시간 : 140000
- 행사가 선택 :
140000 기준으로
당일 거래량이 가장 많은 행사가와 옵션시세표상의 가장 싼 행사가가 같다면 그 행사가에서 매수주문을 실행합니다.
불일치할 경우 옵션시세표상의 가장 싼 행사가에서 매수주문 실행합니다.
2) 진입
- 해당 행사가에서 0.02 체결이 발생하면 매도1호가에 매수주문합니다. 수량은 4개입니다.
3) 익절
- 거래량이 가장 많은 행사가와 옵션시세표상의 가장 싼 행사가가 같아서 매수주문 실행한 경우
해당 행사가 옵션 가격이 4.90 되면 1개 청산
해당 행사가 옵션 가격이 5.90 되면 1개 청산
해당 행사가 옵션 가격이 6.90 되면 1개 청산
해당 행사가 옵션 가격이 7.90 되면 1개 청산
- 불일치하여 옵션시세표상의 가장 싼 행사가에서 매수주문 실행한 경우
해당 행사가 옵션 가격이 0.90 되면 1개 청산
해당 행사가 옵션 가격이 1.90 되면 1개 청산
해당 행사가 옵션 가격이 2.90 되면 1개 청산
해당 행사가 옵션 가격이 3.90 되면 1개 청산
4) end of day : 151800 (익절이 없을 경우 미결제 모두 청산)
항상 고맙습니다.
********************************************************************************************
// ==========================================
// [전역 변수 설정]
// ==========================================
var BuyCallCode = ""; // 최종 선택된 콜옵션 종목코드
var IsSameStrike = false; // 일치(true) / 불일치(false) 여부
var TargetPrices = []; // 익절 목표 가격들을 저장할 배열
var Position = 0; // 포지션 상태 (0: 무포지션, 1: 매수완료)
var EntryPrice = 0.02; // 진입 기준가 (체결가)
var OrderVol = 4; // 진입 수량
var CleanedCount = 0; // 익절 청산 완료 횟수 (최대 4회)
var OrderID = ""; // 주문번호 저장용
// ==========================================
// 1. 시스템 시작 (초기화)
// ==========================================
function Main_OnStart()
{
Main.MessageLog("스팟 전략 시작");
}
// ==========================================
// 2. 실시간 시세 및 조건 체크 감시
// ==========================================
function Main_OnNotifyUpdateMarketData(sMarketCode)
{
// [단계 2-1] 행사가 찾기 및 일치/불일치 판단 (14:00:00 최초 1회 실행)
if (sTimeChoose() >= "140000" && BuyCallCode == "")
{
FindTargetStrike(); // 행사가 판정 함수 호출
if (BuyCallCode != "")
{
// 장마감 시간 체크를 위한 타이머 가동 (1초 주기)
Main.SetTimer(1, 1000);
// 판정된 콜옵션 종목에 대한 실시간 시세 제공 요청
Main.ReqMarketData(BuyCallCode);
}
}
// [단계 2-2] 진입 (해당 행사가에서 0.02 체결 발생 시 매도1호가 매수)
if (Position == 0 && BuyCallCode != "" && sMarketCode == BuyCallCode)
{
var MarketData = Main.GetMarketData(BuyCallCode);
if (MarketData != null && MarketData.current == EntryPrice)
{
// 매도1호가[Ask(1)]로 4계약 매수 주문 실행
OrderID = Account1.OrderBuy(BuyCallCode, OrderVol, MarketData.Ask(1), 0); // 0: 지정가
Main.MessageLog("★ 진입완료 ★ 매도1호가 매수주문 발송 -> 가격: " + MarketData.Ask(1));
Position = 1; // 포지션 상태 보유로 변경
}
}
// [단계 2-3] 익절 (진입 완료 후 단계별 순차 청산)
if (Position == 1 && BuyCallCode != "" && sMarketCode == BuyCallCode)
{
var MarketData = Main.GetMarketData(BuyCallCode);
if (MarketData != null)
{
// 4개 계약에 대해 각 목표값 도달 여부를 순차적으로 감시
for (var i = CleanedCount; i < 4; i++)
{
if (MarketData.current >= TargetPrices[i])
{
// 매수1호가[Bid(1)]로 1계약 청산(매도) 주문 실행
Account1.OrderSell(BuyCallCode, 1, MarketData.Bid(1), 0);
Main.MessageLog("■ 익절달성 ■ (" + (i+1) + "차 목표: " + TargetPrices[i] + ") 1개 청산");
CleanedCount++; // 청산 카운트 누적
}
}
}
}
}
// ==========================================
// 3. 장마감 청산 감시 (타이머 이벤트)
// ==========================================
function Main_OnTimer(nEventID)
{
// [단계 3-1] 15:18:00 도달 시 미결제 전량 매수1호가 지정가 청산 (EOD)
var sTime = sTimeChoose();
if (sTime >= "151800" && Position == 1)
{
Main.KillTimer(1); // 가동 중인 타이머 해제
// 잔고 객체를 통해 실제 보유 수량이 있는지 재확인 후 매수1호가로 매도 지정가 청산
Account1.SetBalanceItem(BuyCallCode, 0);
if (Account1.Balance.count > 0)
{
var MarketData = Main.GetMarketData(BuyCallCode);
if (MarketData != null)
{
// 상대방 호가인 매수1호가[Bid(1)]를 지정가로 입력하여 매도 주문을 전송 (0: 지정가)
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, MarketData.Bid(1), 0);
Main.MessageLog("▲ 장마감 청산(EOD) ▲ 매수1호가 지정가 청산 집행: 수량 " + Account1.Balance.count + " / 가격: " + MarketData.Bid(1));
Position = 0;
}
}
}
}
// ==========================================
// [보조 함수 및 로직 정의]
// ==========================================
// 행사가 탐색 및 일치/불일치 판단 프로세스
function FindTargetStrike()
{
var MaxVol = -1;
var MaxVolCode = "";
var MinPrice = 999999;
var MinPriceCode = "";
// 콜옵션 전체 행사가를 순회하며 거래량 최대 종목과 가격이 가장 싼 종목을 추출
for (var i = 0; i < OptionAn.Length; i++)
{
// 당일 거래량 최대 행사가 탐색
if (OptionAn.CallVolume(i) > MaxVol)
{
MaxVol = OptionAn.CallVolume(i);
MaxVolCode = OptionAn.CallCode(i);
}
// 시세표 상 가장 싼(최소 가격) 행사가 탐색 (거래가 있는 종목 대상)
if (OptionAn.CallCurrent(i) > 0 && OptionAn.CallCurrent(i) < MinPrice)
{
MinPrice = OptionAn.CallCurrent(i);
MinPriceCode = OptionAn.CallCode(i);
}
}
// 거래량 최대 행사가와 가장 싼 행사가의 일치 여부 판정
if (MaxVolCode == MinPriceCode && MaxVolCode != "")
{
// 1) 일치할 경우
BuyCallCode = MaxVolCode;
IsSameStrike = true;
TargetPrices = [4.90, 5.90, 6.90, 7.90]; // 일치 시 청산 가격 설정
Main.MessageLog("▶ 판정결과 [일치]: 거래량 최대 == 가장 싼 행사가 (" + BuyCallCode + ")");
}
else
{
// 2) 불일치할 경우
BuyCallCode = MinPriceCode;
IsSameStrike = false;
TargetPrices = [0.90, 1.90, 2.90, 3.90]; // 불일치 시 청산 가격 설정
Main.MessageLog("▶ 판정결과 [불일치]: 가장 싼 행사가 선택 (" + BuyCallCode + ")");
}
}
// PC 시스템 시간 획득 함수 (HHMMSS 형식)
function sTimeChoose()
{
var D = new Date();
var HH = D.getHours().toString();
var MM = D.getMinutes().toString();
var SS = D.getSeconds().toString();
if (HH.length == 1) HH = "0" + HH;
if (MM.length == 1) MM = "0" + MM;
if (SS.length == 1) SS = "0" + SS;
return HH + MM + SS;
}