답변완료
수식 문의 드립니다
검토 후 수정바랍니다.
◎ 연결선물지수차트에서 완성신호가 발생하면
선물 잔고객체를 세팅하고 포지션상태를 확인합니다.
◎ 완성신호가 무포지션 상태에서 발생한 Buy이면,
1. 혹시 있을지 모를 미체결주문을 확인하여 모두 취소하고
주문수량 : 선물계좌 주문가능금액의 50%, 최대 20계약내 산출수량을
(주문수량계산 로직이 틀린 것 같은데... ㅠ)
주문가격 : 매도2호가로 매수주문합니다.
2. 선물 매도포지션 보유시 발생한 Buy이면 - 매도포지션 전량 청산하고, 매수포지션 주문합니다
① 매도포지션 청산
청산 : 미체결주문을 확인하여 모두 취소하고 청산주문을 집행합니다.
주문수량 : 보유 매도포지션 전량 청산주문
주 문 가 : "매도2호가",
1분 동안 미체결 잔량이 발생하면 "시장가"로 정정 청산주문합니다.
② 청산완료 되어 잔고상 포지션계약수가 0 이 응답확인 후 매수 주문합니다
주문수량 : 변경된 선물계좌 주문가능금액을 재확인하여 금액의 50%, 최대 20계약내 산출수량을
주문가격 : 매도2호가로 매수주문합니다.
◎ 차트에서 ExitLong 완성신호가 발생하면
청산 : 미체결주문을 확인하여 모두 취소하고 청산주문을 집행합니다.
주문수량 : 보유 매수포지션 전량
주 문 가 : "매도2호가", 1분 동안 미체결 잔량이 발생하면 "시장가"로 정정 청산주문합니다.
종목객체 F1 계좌객체 A1 차트객체 C1
var Position;
var OrdeCode;
var BID;
var SID;
var Number ;
var EntryVol
function Main_OnStart()
{
Main.MessageLog("시작");
OrdeCode = Main.GetOrderCode(F1.code);
}
function C1_OnRiseSignal(Signal)
{
Main.MessageLog("신호완성/"+Signal.signalKind);
A1.SetBalanceItem(OrdeCode, 0) ; // 차트 주종목의 잔고 객체 생성
if (A1.Balance.count == 0)
{
Position = 0;
}
A1.SetBalanceItem(OrdeCode, 1) ; // (0: 구분없음, 1:매도, 2: 매수)
if (A1.Balance.count > 0)
{
Position = -1;
}
A1.SetBalanceItem(OrdeCode, 2) ;
if (A1.Balance.count > 0)
{
Position = 1;
}
if (Position == 0 && Signal.signalKind == 1 )
{
Main.MessageLog("매수진입");
// 종목 미체결주문 모두 취소
var UFnum = A1.GetTheNumberOfUnfills();
for (var i = 0; i < UFnum; i++)
{
A1.SetUnfillIndex(i);
if (A1.Unfill.code == OrdeCode && A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageLog("미체결주문 모두 취소");
}
}
//주문수량 : 선물계좌 잔고금액의 50%, 최대 20계약내 산출수량
EntryVol = Math.floor(A1.GetBalanceETCinfo(30) * 0.5 / OrdeCode.current);
if (EntryVol >= 20)
{
EntryVol = 20 ;
}
if (EntryVol < 1)
{
Main.MessageLog("잔고불충분");
}
A1.OrderBuy(OrdeCode, EntryVol , OrdeCode.Ask(2), 0);
}
if (Position == -1 && Signal.signalKind == 1 ) // buy
{
Main.MessageLog("매도청산후 매수진입");
// 종목 미체결주문 모두 취소
var UFnum = A1.GetTheNumberOfUnfills(); // 미체결리스트 개수
for (var i = 0; i < UFnum; i++)
{
A1.SetUnfillIndex(i);
if (A1.Unfill.code == OrdeCode && A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageLog("미체결주문 모두 취소");
}
}
// 매도2호 청산주문하고 1분후 시장가로 정정하여 매도청산
BID = A1.OrderBuy (OrdeCode, A1.Balance.count, OrdeCode.Ask(2),0);
// 청산완료확인 후 변경된 잔고금액으로 주문수량결정 진입
A1.SetBalanceItem(OrdeCode, 0) ; // (0: 구분없음, 1:매도, 2: 매수)
if (A1.Balance.count == 0)
{
//주문수량 : 선물계좌 잔고금액의 50%, 최대 20계약내 산출수량
EntryVol = Math.floor(A1.GetBalanceETCinfo(30) * 0.5 / OrdeCode.current);
if (EntryVol >= 20)
{
EntryVol = 20 ;
}
if (EntryVol < 1)
{
Main.MessageLog("잔고불충분");
}
A1.OrderBuy(OrdeCode, EntryVol , OrdeCode.Ask(2), 0);
}
}
if (Position == 1 && Signal.signalKind == 2 ) // ExitLong
{
// 종목 미체결주문 모두 취소
var UFnum = A1.GetTheNumberOfUnfills();
for (var i = 0; i < UFnum; i++)
{
A1.SetUnfillIndex(i);
if (A1.Unfill.code == OrdeCode && A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageLog("미체결주문 모두 취소");
}
}
//매수2호 매도하고 1분후 시장가로 정정 매도청산
SID == A1.OrderSell(OrdeCode,A1.Balance.count,OrdeCode.Bid(2),0);
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BID)
{
Number = OrderResponse.orderNum;
Main.SetTimer(1, 60000);
}
if (OrderResponse.orderID == SID)
{
Number = OrderResponse.orderNum;
Main.SetTimer(2, 60000);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
A1.OrderReplacePrice(Number,0); //시장가청산으로 변경
Main.KillTimer(1);
}
if (nEventID == 2)
{
A1.OrderReplacePrice(Number,0); //시장가청산으로 변경
Main.KillTimer(2);
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (NotifyFill.orderNum == Number)
{
Main.KillTimer(1);
Main.KillTimer(2);
}
}
2013-11-28
1121
글번호 222727
답변완료
수식 문의 드립니다
1. 아래는 저번에 선물차트 신호로 옵션진입하는 로직을 작성하여 주신 내용입니다. 이번에는 는 옵션차트의 신호를 보고 옵션에 주문을 넣는 주문을 부탁드립니다. 옵션차트신호가 매수신호일 때, 옵션차트종목보다 +2단계 위의 옵션종목을 매도합니다. 옵션차트신호가 매도신호일 때 옵션차트종목보다 -2단계 아래 옵션종목을 매수합니다.
2. 당일매매가 아니고 포지션전략이므로 예스스팟이 꺼졌다 다시 켜져도 위에서 진입했던 동일종목이 청산과 반전이 되도로 로직 부탁드립니다.
3. 데이타 매니저에 코스피 연결선물이나 월물별 코스피 선물 종목추가하는 방법 좀 안내 부탁드립니다.
안녕하세요
예스스탁입니다.
차트의 신호로 보고 옵션에 주문을 넣으시므로
시크립트 객체화면에 총 3개의 객체가 필요합니다.
옵션객체 추가 --> 속성에서 지정하실 부분이 없습니다
차트객체 추가 --> 속성에서 객체명은 Chart1, 차트아이디는 차트와 동일한 이름으로 지정
계좌객체 추가 --> 속성에서 객체명은 Account1, 계좌변호는 거래하고자 하는 선옵계좌를 지정
아래는 수식내용입니다.
var Start = 0;
var SelCallCode;
var SelCallPrice;
var SelCallVol;
var SellPutCode;
var SellPutPrice;
var SellPutVol;
function Main_OnStart()
{
Start = 0;
}
function Chart1_OnRiseSignal(Signal)
{
//차트에서 매수신호 발생하면 콜 매수
if (Signal.signalKind ==1)
{
Start = 1;
SellCallCode = Option.GetATMCallRecent(0);//주문종목 : ATM콜 종목코드
SellCallPrice = Option.GetBidByCode(SellCallCode, 2);//주문가격 매수2호가
SelCallVol = Signal.count;//주문수량 : 차트신호의 수량
Account1.OrderSell(SellCallCode,SelCallVol, SellCallPrice, 0);
Main.MessageList("등가콜매도 : "+SellCallCode);
}
//차트에서 매수청산신호 발생하면 콜매도 청산
if (Start == 1 && Signal.signalKind == 2)
{
//매도2호가로 청산
Account1.OrderBuy(SellCallCode, SelCallVol, Option.GetAskByCode(SellCallCode, 2), 0);
Main.MessageList("콜청산 : ",SellCallCode);
}
//선물차트에서 매도신호 발생하면 풋 매수
if (Signal.signalKind ==3)
{
Start =1;
SellPutCode = Option.GetATMPutRecent(0);//주문종목 : ATM풋 종목코드
SellPutPrice = Option.GetBidByCode(SellPutCode, 2);//주문가격 : 매수 2호가
SellPutVol = Signal.count; //수량 : 차트신호의 수량
Account1.OrderSell(SellPutCode, Signal.count, SellPutPrice, 0);
Main.MessageList("등가풋매도 : "+SellPutCode);
}
//차트에서 매도청산신호 발생하면 풋매도 청산
if (Start == 1 && Signal.signalKind == 4)
{
Account1.OrderBuy(SellPutCode, SellPutVol, Option.GetAskByCode(SellPutCode, 2), 0);
Main.MessageList("풋청산 : ",SellPutCode);
}
}
2013-11-28
1107
글번호 222725