예스스탁
예스스탁 답변
2013-06-10 16:58:37
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
//차트에서 신호가 발생
function Chart1_OnRiseSignal(Signal)
{
//Buy신호이면
if (Signal.signalKind == 1)
{
Start = 1;
//옵션 1.0 이상 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) >= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매수
if (CC < 9999999)
Account1.OrderBuy(CallOrderCode, 1, 0,1);
//풋매도
if (PP < 9999999)
Account1.OrderSell(PutOrderCode, 1, 0,1);
}
//exitlong신호 발생하면
if (Signal.signalKind == 2 && Start == 1)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
}
//Sell신호이면
if (Signal.signalKind == 3)
{
Start = 1;
//옵션 1.0 이상 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) >= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매도
if (CC > 0)
Account1.OrderSell(CallOrderCode, 1, 0,1);
//풋매수
if (PP > 0)
Account1.OrderBuy(CallOrderCode, 1, 0,1);
}
//exitshort신호 발생하면
if (Signal.signalKind == 4 && Start == 1)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Account1.OrderSell(PutOrderCode, 1, 0, 1);
}
}
15시 청산은 차트에 적용하는 시스템식에 추가하시면 됩니다.
즐거운 하루되세요
> sunodin 님이 쓴 글입니다.
> 제목 : 가격기준 옵션 종목선택 매매
> 선물에서 매수 신호 발생시 1보다 크면서 1에 가장 가까운 종목 콜매수, 풋매도
선물에서 매도 신호 발생시 1보다 크면서 1에 가장 가까운 종목 풋매수, 콜매도
하려면 어떻게 해야 하나요?
그리고 3시 종가 청산하려고 합니다.
가격기준 종목 선택이 힘드네요
sunodin
2013-06-13 13:48:10
자세한 답변감사드립니다
추가질문 드립니다
1. 선물주문 추가
매수 신호시 콜매수1개, 풋매도1개, 선물 매도1개
매도 신호시 콜매도1개, 풋매수1개, 선물 매수1개
로 변경(즉, 매수 신호시 선물매도, 매도 신호시 선물 매수 추가)
2. 슬리피지 최소화를 위한 지정가 주문
신호로 인한 주문시 슬리피지 최소화를 위해
매수는 매수1호가에 매도는 매도 1호가로 주문
선물과 옵션 주문 중 선물과 옵션 중에서 한쪽이 먼저 체결되면
나머지는 시장가 주문 정정
3. 청산주문시 지정가 주문
매수는 매수1호가에 매도는 매도 1호가로 주문
선물과 옵션 주문 중 선물과 옵션 중에서 한쪽이 먼저 체결되면
나머지는 시장가 주문 정정
4. 청산주문시에도 혹시 14시 58분에 잔량이 있을 경우 잔량 전부 시장가 청산
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 가격기준 옵션 종목선택 매매
>
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
//차트에서 신호가 발생
function Chart1_OnRiseSignal(Signal)
{
//Buy신호이면
if (Signal.signalKind == 1)
{
Start = 1;
//옵션 1.0 이상 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) >= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매수
if (CC < 9999999)
Account1.OrderBuy(CallOrderCode, 1, 0,1);
//풋매도
if (PP < 9999999)
Account1.OrderSell(PutOrderCode, 1, 0,1);
}
//exitlong신호 발생하면
if (Signal.signalKind == 2 && Start == 1)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
}
//Sell신호이면
if (Signal.signalKind == 3)
{
Start = 1;
//옵션 1.0 이상 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) >= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매도
if (CC > 0)
Account1.OrderSell(CallOrderCode, 1, 0,1);
//풋매수
if (PP > 0)
Account1.OrderBuy(CallOrderCode, 1, 0,1);
}
//exitshort신호 발생하면
if (Signal.signalKind == 4 && Start == 1)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Account1.OrderSell(PutOrderCode, 1, 0, 1);
}
}
15시 청산은 차트에 적용하는 시스템식에 추가하시면 됩니다.
즐거운 하루되세요
> sunodin 님이 쓴 글입니다.
> 제목 : 가격기준 옵션 종목선택 매매
> 선물에서 매수 신호 발생시 1보다 크면서 1에 가장 가까운 종목 콜매수, 풋매도
선물에서 매도 신호 발생시 1보다 크면서 1에 가장 가까운 종목 풋매수, 콜매도
하려면 어떻게 해야 하나요?
그리고 3시 종가 청산하려고 합니다.
가격기준 종목 선택이 힘드네요
예스스탁
예스스탁 답변
2013-06-17 08:36:03
안녕하세요
예스스탁입니다.
예스스팟은 기본틀만 작성해 드립니다. 첨부된 식 참고하시기 바랍니다.
정정주문은 시장가로 정정이 되지 않습니다.
매수주문일때 매도5호가, 매도주문일때 매수5호가로 주문이 발생하게
작성했습니다.
충분히 테스트 후에 사용하시기 바랍니다.
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP; var PS;
var CallOrderCode; var PutOrderCode;
var BuyID1, BuyNum1;
var BuyID2, BuyNum2;
var BuyID3, BuyNum3;
var ExLID1, ExLNum1;
var ExLID2, ExLNum2;
var ExLID3, ExLNum3;
var SellID1, SellNum1;
var SellID2, SellNum1;
var SeLLID3, SellNum1;
var ExSID1, ExSNum1;
var ExSID2, ExSNum1;
var ExSID3, ExSNum1;
function Main_OnStart()
{
Start = 0;
PS = 0;
Main.SetTimer(1, 5000);
}
//차트에서 신호가 발생
function Chart1_OnRiseSignal(Signal)
{
//Buy신호이면
if (Signal.signalKind == 1)
{
Start = 1;
//옵션 1.0 이상 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) >= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매수,풋매도, 선물매도
if (CC < 9999999 && PP < 9999999 )
{
BuyID1 = Account1.OrderBuy(CallOrderCode, 1, Option.GetBidByCode(CallOrderCode, 1),0);
BuyID2 = Account1.OrderSell(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode,1),0);
BuyID3 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Ask(1),0);
PS = 1;
}
}
//exitlong신호 발생하면
if (Signal.signalKind == 2 && Start == 1)
{
ExLID1 = Account1.OrderSell(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 1),0);
ExLID2 = Account1.OrderBuy(PutOrderCode, 1, Option.GetBidByCode(PutOrderCode,1),0);
ExLID3 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Bid(1),0);
PS = 2;
}
//Sell신호이면
if (Signal.signalKind == 3)
{
Start = 1;
//옵션 1.0 이상 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) >= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매도 풋매수 선물매수
if (CC < 9999999 && PP > 9999999)
{
SellID1 = Account1.OrderSell(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 1),0);
SellID2 = Account1.OrderBuy(PutOrderCode, 1, Option.GetBidByCode(PutOrderCode,1),0);
SellID3 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Bid(1),0);
PS = -1;
}
}
//exitshort신호 발생하면
if (Signal.signalKind == 4 && Start == 1)
{
SxSID1 = Account1.OrderBuy(CallOrderCode, 1, Option.GetBidByCode(CallOrderCode, 1),0);
SxSID2 = Account1.OrderSell(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode,1),0);
SxSID3 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Ask(1),0);
PS = -2;
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BuyID1)
BuyNum1 = OrderResponse.orderNum;
if (OrderResponse.orderID == BuyID1)
BuyNum2 = OrderResponse.orderNum;
if (OrderResponse.orderID == BuyID1)
BuyNum3 = OrderResponse.orderNum;
if (OrderResponse.orderID == ExLNum1)
ExLNum1 = OrderResponse.orderNum;
if (OrderResponse.orderID == ExLNum2)
ExLNum2 = OrderResponse.orderNum;
if (OrderResponse.orderID == ExLNum3)
ExLNum3 = OrderResponse.orderNum;
if (OrderResponse.orderID == SellNum1)
SellNum1 = OrderResponse.orderNum;
if (OrderResponse.orderID == SellNum2)
SellNum2 = OrderResponse.orderNum;
if (OrderResponse.orderID == SellNum3)
SellNum3 = OrderResponse.orderNum;
if (OrderResponse.orderID == SxSNum1)
SxSNum1 = OrderResponse.orderNum;
if (OrderResponse.orderID == SxSNum2)
SxSNum2 = OrderResponse.orderNum;
if (OrderResponse.orderID == SxSNum3)
SxSNum3 = OrderResponse.orderNum;
}
function Main_OnNotifyFill(NotifyFill)
{
//최근 Buy신호 발
if (PS == 1)
{
//콜매수가 체결되면
//풋매도 매수5호가로 정정
//선물매도 매수 5호가로 정정
if (NotifyFill.orderNum == BuyNum1)
{
Account1.SetUnfillOrderNumber(BuyNum2)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetBidByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(BuyNum3)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,MarketData1.Bid(5));
}
// 풋매도가 체결되면
//콜매수 매도5호가로 정정
//선물매도 매수 5호가로 정정
if (NotifyFill.orderNum == BuyNum2)
{
Account1.SetUnfillOrderNumber(BuyNum1)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetAskByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(BuyNum3)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,MarketData1.Bid(5));
}
//선물매도가 체결되면
//콜매수 매도5호가로 정정
//풋매도 매수5호가로 정정
if (NotifyFill.orderNum == BuyNum3)
{
Account1.SetUnfillOrderNumber(BuyNum1)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetAskByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(BuyNum2)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetBidByCode(Account1.Unfill.code,5));
}
}
//최근 exitlong신호 발생
if (PS == 2)
{
//콜매도가 체결되면
//풋매수 매도5호가로 정정
//선물매수 매도 5호가로 정정
if (NotifyFill.orderNum == ExLNum1)
{
Account1.SetUnfillOrderNumber(ExLNum2)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetAskByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(ExLNum3)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,MarketData1.Ask(5));
}
//풋매수가 체결되면
//콜매도 매수5호가로 정정
//선물매수 매도5호가로 정정
if (NotifyFill.orderNum == ExLNum2)
{
Account1.SetUnfillOrderNumber(ExLNum1)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetBidByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(ExLNum3)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,MarketData1.Ask(5));
}
//선물매수가 체결되면
//콜매도 매수5호가로 정정
//콜매수 매도5호가로 정정
if (NotifyFill.orderNum == ExLNum3)
{
Account1.SetUnfillOrderNumber(ExLNum1)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetBidByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(ExLNum2)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetAskByCode(Account1.Unfill.code,5));
}
}
//최근 Sell신호 발생
if (PS == -1 )
{
//콜매도가 체결되면
//풋매수 매도5호가로 정정
//선물매수 매도5호가로 정정
if (NotifyFill.orderNum == SellNum1)
{
Account1.SetUnfillOrderNumber(SellNum2)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetAskByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(SellNum3)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,MarketData1.Ask(5));
}
//풋매수가 체결되면
//콜매도 매수5호가로 정정
//선물매수 매도 5호가로 정정
if (NotifyFill.orderNum == SellNum1)
{
Account1.SetUnfillOrderNumber(SellNum2)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetBidByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(SellNum3)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,MarketData1.Ask(5));
}
//선물매수가 체결되면
//콜매도 매수5호가로 정정
//콜매수 매도5호가로 정정
if (NotifyFill.orderNum == SellNum3)
{
Account1.SetUnfillOrderNumber(SellNum1)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetBidByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(SellNum2)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetAskByCode(Account1.Unfill.code,5));
}
}
//최근 ExitShort신호 발생
if (PS == -2)
{
//콜매수가 체결되면
//풋매도 매수5호가로 정정
//선물매도 매수 5호가로 정정
if (NotifyFill.orderNum == BuyNum1)
{
Account1.SetUnfillOrderNumber(BuyNum2)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetBidByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(BuyNum3)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,MarketData1.Bid(5));
}
//풋매도가 체결되면
//콜매수 매도5호가로 정정
//선물매도 매수 5호가로 정정
if (NotifyFill.orderNum == BuyNum2)
{
Account1.SetUnfillOrderNumber(BuyNum1)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetAskByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(BuyNum3)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,MarketData1.Bid(5));
}
//선물매도가 체결되면
//콜매수 매도5호가로 정정
//풋매도 매수5호가로 정정
if (NotifyFill.orderNum == BuyNum3)
{
Account1.SetUnfillOrderNumber(BuyNum1)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetAskByCode(Account1.Unfill.code,5));
Account1.SetUnfillOrderNumber(BuyNum2)
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetBidByCode(Account1.Unfill.code,5));
}
}
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//14시 48분
if (nEventID == 1 && HHMMDD >= 145800)
{
Main.KillTimer(1);
//최근 exitlong 발생상태
if (PS == 2)
{
Account1.SetUnfillOrderNumber(ExLNum1);
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetBidByCode(Account1.Unfill.code, 5));
Account1.SetUnfillOrderNumber(ExLNum2);
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetAskByCode(Account1.Unfill.code, 5));
Account1.SetUnfillOrderNumber(ExLNum3);
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,MarketData1.Ask(5));
}
//최근 exitshort 발생상태
if (PS == -2)
{
Account1.SetUnfillOrderNumber(ExSNum1);
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetAskByCode(Account1.Unfill.code, 5));
Account1.SetUnfillOrderNumber(ExSNum2);
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,Option.GetBidByCode(Account1.Unfill.code, 5));
Account1.SetUnfillOrderNumber(ExSNum3);
if (Account1.Unfill.count > 0)
Account1.OrderReplacePrice(Account1.Unfill.orderNum,MarketData1.Bid(5));
}
}
}
즐거운 하루되세요
> sunodin 님이 쓴 글입니다.
> 제목 : Re : Re : 가격기준 옵션 종목선택 매매
> 자세한 답변감사드립니다
추가질문 드립니다
1. 선물주문 추가
매수 신호시 콜매수1개, 풋매도1개, 선물 매도1개
매도 신호시 콜매도1개, 풋매수1개, 선물 매수1개
로 변경(즉, 매수 신호시 선물매도, 매도 신호시 선물 매수 추가)
2. 슬리피지 최소화를 위한 지정가 주문
신호로 인한 주문시 슬리피지 최소화를 위해
매수는 매수1호가에 매도는 매도 1호가로 주문
선물과 옵션 주문 중 선물과 옵션 중에서 한쪽이 먼저 체결되면
나머지는 시장가 주문 정정
3. 청산주문시 지정가 주문
매수는 매수1호가에 매도는 매도 1호가로 주문
선물과 옵션 주문 중 선물과 옵션 중에서 한쪽이 먼저 체결되면
나머지는 시장가 주문 정정
4. 청산주문시에도 혹시 14시 58분에 잔량이 있을 경우 잔량 전부 시장가 청산
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 가격기준 옵션 종목선택 매매
>
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
//차트에서 신호가 발생
function Chart1_OnRiseSignal(Signal)
{
//Buy신호이면
if (Signal.signalKind == 1)
{
Start = 1;
//옵션 1.0 이상 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) >= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매수
if (CC < 9999999)
Account1.OrderBuy(CallOrderCode, 1, 0,1);
//풋매도
if (PP < 9999999)
Account1.OrderSell(PutOrderCode, 1, 0,1);
}
//exitlong신호 발생하면
if (Signal.signalKind == 2 && Start == 1)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
}
//Sell신호이면
if (Signal.signalKind == 3)
{
Start = 1;
//옵션 1.0 이상 종목 중 1에 가장 가까운 가격을 가지는 콜/풋 종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = 9999999;
CallCode[i+LNum] = 9999999;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) >= 1.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = 9999999;
PutCode[ii+UNum] = 9999999;
}
}
var CC = 9999999;
var CallOrderCode = 9999999;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] < CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
var PP = 9999999;
var PutOrderCode = 9999999;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] < PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
//콜매도
if (CC > 0)
Account1.OrderSell(CallOrderCode, 1, 0,1);
//풋매수
if (PP > 0)
Account1.OrderBuy(CallOrderCode, 1, 0,1);
}
//exitshort신호 발생하면
if (Signal.signalKind == 4 && Start == 1)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Account1.OrderSell(PutOrderCode, 1, 0, 1);
}
}
15시 청산은 차트에 적용하는 시스템식에 추가하시면 됩니다.
즐거운 하루되세요
> sunodin 님이 쓴 글입니다.
> 제목 : 가격기준 옵션 종목선택 매매
> 선물에서 매수 신호 발생시 1보다 크면서 1에 가장 가까운 종목 콜매수, 풋매도
선물에서 매도 신호 발생시 1보다 크면서 1에 가장 가까운 종목 풋매수, 콜매도
하려면 어떻게 해야 하나요?
그리고 3시 종가 청산하려고 합니다.
가격기준 종목 선택이 힘드네요