답변완료
양매도 문의
안녕하세요~ 항상 답변 감사히 받고 있습니다.
아래식은 선물매도시 콜풋양매도, 선물매도청산시 양매도 청산 스팟식입니다.
다음과 같이 변경하고 싶습니다.
당일 양매도 전략인데요
ㅁㅁ진입
- 선물매도신호 --> 스팟 콜,풋 양매도 ---> 12시 이전이고 포지션 평균수익이 0.1P
이상이면 ---> 스팟 콜, 풋 양매도 1SET 추가 ---> 이후 12시 이전이고 포지션
평균수익(총수익/4계약) 0.13P 이상이면 ---> 스팟 콜, 풋 양매도 1SET 추가(최대3SET)
*첫진입, 추가진입하는 옵션의 종목은 항상 설정값(0.7~2.9) 사이에 있음
ㅁㅁ청산
- 1SET 양매도 진입후 포지션 평균수익이 -0.15P이상이면 양매도 청산(2계약 청산)
- 2SET 양매도 진입후 포지션 평균수익이 -0.10P이상이면 양매도 청산(4계약 청산)
- 3SET 양매도 진입후 포지션 평균수익이 -0.05P이상이면 양매도 청산(6계약 청산)
- 선물매도청산 신호시 옵션 모든 포지션 청산
- 한번 청산하면 당일 재진입 없음
ㅁ 코딩 실력이 많이 부족하오니 주석도 부탁드립니다. 진심으로 미리 감사합니다.
============================================================================
var Start = 0;
var BC;
var BP;
var Bcount;
var SC;
var SP;
var Scount;
var upv = 2.9;
var dnv = 0.7;
function Main_OnStart()
{
Start = 0;
Main.MessageList("시작",Start);
}
function Chart1_OnRiseSignal(Signal)
{
//차트에서 매도신호 발생
if (Signal.signalKind == 3)
{
//ATM위 행사가 갯수
var UNum = Option.uppersATM;
//ATM아래 행사가 갯수
var LNum = Option.lowersATM;
//각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언
var CallCode = new Array(UNum+LNum+1);
//각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언
var CallPrice = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언
var PutCode = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언
var PutPrice = new Array(UNum+LNum+1);
//콜종목 찾기
//콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로
//for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함
for (var i = -LNum; i <= UNum; i++)
{
//값이 0.7~2.9사이이면
if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv)
{
//해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장
CallPrice[i+LNum] = Option.GetCurrent(0, i);
//해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장
CallCode[i+LNum] = Option.GetATMCallRecent(i);
//주의
//배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터
//저장하도록 작성해야 함
}
else//0.7~2.9 사이가 아니면
{
//배열변수 CallPrice의 방번호 i+LNum에 -1 저장
CallPrice[i+LNum] = -1;
//배열변수 CallCode의 방번호 i+LNum에 -1 저장
CallCode[i+LNum] = -1;
}
}
//풋종목 찾기
//풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로
//for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함
for (var i = -UNum; i <= LNum; i++)
{
//값이 0.7~2.9사이이면
if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv )
{
//해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장
PutPrice[i+UNum] = Option.GetCurrent(1, i);
//해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
else //2.0보다 크면
{
//배열변수 PutPrice의 방번호 ii+LNum에 -1 저장
PutPrice[i+UNum] = -1;
//배열변수 PutCode의 방번호 ii+LNum에 -1 저장
PutCode[i+UNum] = -1;
}
}
//배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고
//CallCode의 동일 방번호의 값을 CallOrderCode에 저장
var CC = -1;
var CallOrderCode = -1;
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] > CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고
//PutCode의 동일 방번호의 값을 PutOrderCode에 저장
var PP = -1;
var PutOrderCode = -1;
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] > PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
if (CC > 0 && PP > 0)
{
Start = -1;
SC = CallOrderCode;
SP = PutOrderCode;
Scount = Signal.count;
Account1.OrderSell(SC,Scount,Option.GetBidByCode(SC,3),0);
Account1.OrderSell(SP,Scount,Option.GetBidByCode(SP,3),0);
}
}
//차트에서 매도청산신호 발생
if (Start == -1 && Signal.signalKind == 4)
{
Start = 0;
Account1.OrderBuy(SC,Scount,Option.GetAskByCode(SC,3),0);
Account1.OrderBuy(SP,Scount,Option.GetAskByCode(SP,3),0);
}
}
=================================================================================
2016-02-18
2205
글번호 223818
답변완료
오류메세지??
NO. 1337 호의 연속입니다.
예스글러벌 모의시장에서 테스트결과
주문함수의 가격구분을 아래의 시스템식과 같이 지정가 2로 변경 하였으나 동일한 오류메세지가 발생 합니다.
원인이 다른 데에 있는 것 같습니다.
그리고 위 그림과 같이 오류메세지를 확인 크릭 후에는 스크립트메세지에서는 다음단계로 진행은 되나 체결 통보가 발생하지 아니 합니다.
또한 예스글러벌 모의시장 차트의 오류사항을 NH선물에 수차례 시정을 요구 하였으나 분봉차트의 경우에는 업데이트가 되지 아니하여 시험작동을 할 수가 없습니다.
그리고 예스글러벌 리얼시장의 차트는 분봉차트는 5000 바 틱차트는 1000 바로 시스템을 구현하기에는 너무 짧아 보입니다.
* 오류 메세지 내용
1. 종목코드값을 확인하시기바랍니다.
2. 미체결 내역에서 주문번호를 찾을 수 없어서 주문이 자체 거부 되었습니다.
참조사항 차트객체명 : C1
차트아이디 : D101 (자동매매 활성화 됨)
종목객체명 : SP
종목명 : E-mini S&P 500(2016.3)
종목코드 : ESH 16
var Position;
var OrderCode;
var BID;
var SID;
var SNum;
var BNum;
var BuyFill;
var SellFill;
function Main_OnStart()
{
Main.MessageLog("시작");
Position = 0;
OrderCode = Main.GetOrderCode(SP.Code);
}
function C1_OnRiseSignal(Signal)
{
Main.MessageLog("신호완성/"+Signal.signalKind);
if (Signal.signalKind == 1)
{
Position = 1;
BID = A1.OrderBuy(SP.Code, 1, SP.Ask(2),2);
Main.MessageLog("매수진입");
BuyFill = 0;
}
if (Position == 1 && Signal.signalKind == 2)
{
if (BuyFill == 1)
{
A1.OrderSell(SP.Code, 1, SP.Bid(2),2);
Main.MessageLog("매수청산실행");
}
if (BuyFill == 0)
{
A1.OrderCancel(BNum);
Main.MessageLog("매수청산취소");
}
}
if (Signal.signalKind == 3)
{
Position = -1;
SellFill = 0;
SID = A1.OrderSell(SP.Code, 1, SP.Bid(2), 2);
Main.MessageLog("매도진입");
}
if (Position == -1 && Signal.signalKind == 4)
{
if (SellFill == 1)
{
A1.OrderBuy(SP.Code, 1, Ask(2), 2);
Main.MessageLog("매도청산");
}
if (SellFill == 0)
{
A1.OrderCancel(SNum);
Main.MessageLog("매도청산취소");
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (Position == 1 && OrderResponse.orderID == BID)
{
BNum = OrderResponse.orderNum;
}
if (Position == -1 && OrderResponse.orderID == SID)
{
SNum = OrderResponse.orderNum;
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (Position == 1 && NotifyFill.orderNum == BNum)
{
BuyFill = 1;
}
if (Position == -1 && NotifyFill.orderNum == SNum)
{
SellFill = 1;
}
}
2016-02-10
2214
글번호 223808