커뮤니티
야간옵션
아래수식은
국내 옵션 주간 거래수식입니다.
- 수식 내용
084500에 15분간 변동성 체크하고 090000 거래시작
익절,손절,151500에 endofday 작동
야간거래에 사용할 수 있도록 수정바랍니다.
1. 첫번째 요청수식
오후6시에 15분간 변동성 체크하고 오후6시15분 거래시작
익절,손절, 새벽2시 endofday 작동
2. 두번째 요청수식
오후10시에 15분간 변동성 체크하고 오후10시15분 거래시작
익절,손절, 새벽5시 endofday 작동
항상 고맙습니다.
*********************************************************************************************************************************
var ID1, ID2, num1, num2;
var Entry, CallCode, PutCode;
var Xv1, Xv2;
var HasExited; // 청산 후 재진입을 방지하는 변수
var VolatilityCheckPassed; // 변동성 필터 확인 변수
var InitialSum, FinalSum; // 양합 체크용 변수
var a, b; // 양합
var FilterTimePassed; // 필터 시간이 지났는지 여부
var HasSoldCall = false; // 콜 옵션 매도 여부
var HasSoldPut = false; // 풋 옵션 매도 여부
function Main_OnStart() {
Main.MessageList("Start");
Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격)
Main.SetTimer(2, 1000); // 청산을 위한 타이머 설정 (1초 간격)
Main.SetTimer(3, 1000); // 변동성 필터용 타이머 설정 (1초 간격)
Entry = 0; // 초기 Entry 값 설정
HasExited = false; // 초기 재진입 가능 상태
VolatilityCheckPassed = false; // 변동성 필터 초기화
InitialSum = null; // 초기 양합값 초기화
FinalSum = null; // 최종 양합값 초기화
a = null; // a양합 초기화
b = null; // b양합 초기화
FilterTimePassed = false; // 필터 시간이 지났는지 여부
}
function Main_OnTimer(nEventID) {
var d = new Date();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (nEventID == 3) {
// 변동성 필터 확인 타이머 설정
if (HHMMSS == 084500) {
// 084500 양합값 기록
a = Option1.GetCurrent(0, 0) + Option1.GetCurrent(1, 0);
} else if (HHMMSS == 085959) {
// 085959 양합값 기록
b = Option1.GetCurrent(0, 0) + Option1.GetCurrent(1, 0);
if (a !== null && b !== null) {
// 양합 차이 계산
var sumDifference = a - b;
// 변동성 high 시장으로 판단
if (sumDifference >= 999) {
Main.MessageList("Market volatility is low. Skipping trading.");
VolatilityCheckPassed = true; // 변동성 필터 통과
}
}
}
// 필터 시간이 지났는지 체크
if (HHMMSS >= 090000) { // 09시 00분부터 거래 가능
FilterTimePassed = true;
}
}
if (nEventID == 1 && !HasExited) { // 재진입 방지 조건 추가
if (HHMMSS >= 084500 && HHMMSS < 150000) { // 0845부터 1500까지
if (FilterTimePassed) {
var callPrice = Option1.GetCurrent(0, 0);
var putPrice = Option1.GetCurrent(1, 0);
var sum = callPrice + putPrice;
var diff = Math.abs(callPrice - putPrice);
// 진입 조건
if (Entry == 0 && sum <= 999 && diff <= 2.00 && !VolatilityCheckPassed) {
Entry = sum;
CallCode = Option1.GetATMCallRecent(0);
PutCode = Option1.GetATMPutRecent(0);
ID1 = Account1.OrderBuy(CallCode, 1, Option1.GetAsk(CallCode, 5), 0);
ID2 = Account1.OrderBuy(PutCode, 1, Option1.GetAsk(PutCode, 5), 0);
Xv1 = 1;
Xv2 = 1;
// 진입 성공 시 메시지
Main.MessageList("Trade entry successful. Market volatility is high. Trading ON.");
}
}
if (Entry > 0 && HHMMSS < 151500 &&
(Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) >= Entry+999) ||
(Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) <= Entry-1.00)) {
// 청산 로직
if (Xv1 > 0 && !HasSoldCall) {
Account1.SetUnfill(num1);
if (Account1.Unfill.count > 0) {
Xv1 = Xv1 - Account1.Unfill.count;
Account1.OrderCancel(num1);
}
Account1.OrderSell(CallCode, Xv1, Option1.GetBid(CallCode, 5), 0);
HasSoldCall = true; // 콜 옵션 매도 완료
Main.MessageList("Call option sold.");
}
if (Xv2 > 0 && !HasSoldPut) {
Account1.SetUnfill(num2);
if (Account1.Unfill.count > 0) {
Xv2 = Xv2 - Account1.Unfill.count;
Account1.OrderCancel(num2);
}
Account1.OrderSell(PutCode, Xv2, Option1.GetBid(PutCode, 5), 0);
HasSoldPut = true; // 풋 옵션 매도 완료
Main.MessageList("Put option sold.");
}
// Entry = 0; // 필요한 경우에만 주석 해제
Main.KillTimer(1);
}
}
}
// 1515에 청산 로직 추가
if (Entry > 0 && HHMMSS >= 151500) {
Main.MessageList("Clearing orders");
if (Xv1 > 0 && !HasSoldCall) {
Account1.SetUnfill(num1);
if (Account1.Unfill.count > 0) {
Xv1 = Xv1 - Account1.Unfill.count;
Account1.OrderCancel(num1);
}
Account1.OrderSell(CallCode, Xv1, Option1.GetBid(CallCode, 5), 0);
HasSoldCall = true; // 콜 옵션 매도 완료
Main.MessageList("Call option sold.");
}
if (Xv2 > 0 && !HasSoldPut) {
Account1.SetUnfill(num2);
if (Account1.Unfill.count > 0) {
Xv2 = Xv2 - Account1.Unfill.count;
Account1.OrderCancel(num2);
}
Account1.OrderSell(PutCode, Xv2, Option1.GetBid(PutCode, 5), 0);
HasSoldPut = true; // 풋 옵션 매도 완료
Main.MessageList("Put option sold.");
}
Main.KillTimer(1);
}
}
function Main_OnOrderResponse(OrderResponse) {
if (OrderResponse.orderID == ID1) {
num1 = OrderResponse.orderNum;
}
if (OrderResponse.orderID == ID2) {
num2 = OrderResponse.orderNum;
}
}
답변 1
예스스탁 예스스탁 답변
2026-01-13 12:59:00