예스스탁
예스스탁 답변
2015-03-30 19:02:16
안녕하세요
예스스탁입니다.
예스스팟 답변은 가이드라인정도입니다.
아래내용 참고하셔서 수정보완해 사용하시기 바랍니다.
스크립트객체화면 설정
계좌객체 추가 --> 속성에서 객체명은 Account1, 계좌번호지정
차트객체 추가 --> 속성에서 객체명은 Chart1, 차트 아이디 지정후 차트에 동일아이디 부여
옵션객체 추가 --> 속성에서 따로 지정하실 부분은 없습니다.
각객체 설정은 예스스팟 도움말 참고하시기 바랍니다.
var CallOrderCode,PutOrderCode,T;
function Main_OnStart()
{
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (T <= 0 && Signal.signalKind == 1)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//종목을 찾았으면
if (CC < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
T = 1;
Main.SetTimer(1, 10000);//1번타이머 10초
}
}
}
if (T == 1 && Signal.signalKind == 2)
{
Account1.SetBalanceItem(CallOrderCode, 0);
//CallOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0);
T = 0;
}
}
if (T >= 0 && Signal.signalKind == 3)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (PP < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
T = -1;
Main.SetTimer(2, 10000);//2번타이머 10초
}
}
}
if (T == -1 && Signal.signalKind == 4)
{
Account1.SetBalanceItem(PutOrderCode, 0);
//PutOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0);
T = 0;
}
}
}
function Main_OnTimer(nEventID)
{
//1번 타이머 동작 T가 1일이면(Buy신호 이후)
if (nEventID == 1 && T == 1)
{
//CallOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(CallOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
//1번 타이머종료
Main.KillTimer(1);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
}
}
}
//2번 타이머 동작하고 T가 -1이면(Sell신호 이후)
if (nEventID == 2 && T == -1)
{
//PutOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(PutOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
//2번 타이머종료
Main.KillTimer(2);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
}
}
}
}
즐거운 하루되세요
> 왼손잡이 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 수고하십니다.
연결선물에 시스템을 적용하고 있는데요.
1. 선물에서 시스템 매수 시그날시.
-> 콜옵션 2.0 근처가격 매수
-> 전체 자금의 10%
-> 진입이후 수익률 20%도달시 전체자금의 10% 추가매수
2. 선물에서 매도 시그날시
-> 풋옵션 2.0 근처가격 매수
-> 전체 자금의 10%
-> 진입이후 수익률 20%도달시 전체자금의 10% 추가매수
3. 청산시그날시 모두 청산
을 하고 싶습니다.
초보라 잘 부탁드립니다.
자세한 답변 감사드립니다 .^^
몇가지 궁금한 사항이 있는데요.
1. var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1
라고 표현해 주셨는데 30이란 코드가 코스닥 증거금 현금이라고 되어 있는데 옵션주문시 위 사항이 맞는지요?
그럼 확인 부탁드리겠습니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의드립니다.
>
안녕하세요
예스스탁입니다.
예스스팟 답변은 가이드라인정도입니다.
아래내용 참고하셔서 수정보완해 사용하시기 바랍니다.
스크립트객체화면 설정
계좌객체 추가 --> 속성에서 객체명은 Account1, 계좌번호지정
차트객체 추가 --> 속성에서 객체명은 Chart1, 차트 아이디 지정후 차트에 동일아이디 부여
옵션객체 추가 --> 속성에서 따로 지정하실 부분은 없습니다.
각객체 설정은 예스스팟 도움말 참고하시기 바랍니다.
var CallOrderCode,PutOrderCode,T;
function Main_OnStart()
{
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (T <= 0 && Signal.signalKind == 1)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//종목을 찾았으면
if (CC < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
T = 1;
Main.SetTimer(1, 10000);//1번타이머 10초
}
}
}
if (T == 1 && Signal.signalKind == 2)
{
Account1.SetBalanceItem(CallOrderCode, 0);
//CallOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0);
T = 0;
}
}
if (T >= 0 && Signal.signalKind == 3)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (PP < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
T = -1;
Main.SetTimer(2, 10000);//2번타이머 10초
}
}
}
if (T == -1 && Signal.signalKind == 4)
{
Account1.SetBalanceItem(PutOrderCode, 0);
//PutOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0);
T = 0;
}
}
}
function Main_OnTimer(nEventID)
{
//1번 타이머 동작 T가 1일이면(Buy신호 이후)
if (nEventID == 1 && T == 1)
{
//CallOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(CallOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
//1번 타이머종료
Main.KillTimer(1);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
}
}
}
//2번 타이머 동작하고 T가 -1이면(Sell신호 이후)
if (nEventID == 2 && T == -1)
{
//PutOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(PutOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
//2번 타이머종료
Main.KillTimer(2);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
}
}
}
}
즐거운 하루되세요
> 왼손잡이 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 수고하십니다.
연결선물에 시스템을 적용하고 있는데요.
1. 선물에서 시스템 매수 시그날시.
-> 콜옵션 2.0 근처가격 매수
-> 전체 자금의 10%
-> 진입이후 수익률 20%도달시 전체자금의 10% 추가매수
2. 선물에서 매도 시그날시
-> 풋옵션 2.0 근처가격 매수
-> 전체 자금의 10%
-> 진입이후 수익률 20%도달시 전체자금의 10% 추가매수
3. 청산시그날시 모두 청산
을 하고 싶습니다.
초보라 잘 부탁드립니다.
예스스탁
예스스탁 답변
2015-04-02 10:43:02
안녕하세요
예스스스탁입니다.
계좌종류별로 인덱스가 모두 다릅니다.
위탁계좌는 30번이 코스닥증거금현금
저축계좌는 30분이 금일재매매대상금액
선물옵션계좌는 30번이 주문가능현금
입니다.
계좌별로 인덱스에 따른 리턴값이 모두 다릅니다.
Account1 계좌객체에 계좌번호를 지정할때 선물옵션계좌로 지정하시면 됩니다.
예스스팟 도움말에서 해당 함수 설명 참고하시기 바랍니다.
즐거운 하루되세요
> 왼손잡이 님이 쓴 글입니다.
> 제목 : Re : Re : 문의드립니다.
> 자세한 답변 감사드립니다 .^^
몇가지 궁금한 사항이 있는데요.
1. var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1
라고 표현해 주셨는데 30이란 코드가 코스닥 증거금 현금이라고 되어 있는데 옵션주문시 위 사항이 맞는지요?
그럼 확인 부탁드리겠습니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의드립니다.
>
안녕하세요
예스스탁입니다.
예스스팟 답변은 가이드라인정도입니다.
아래내용 참고하셔서 수정보완해 사용하시기 바랍니다.
스크립트객체화면 설정
계좌객체 추가 --> 속성에서 객체명은 Account1, 계좌번호지정
차트객체 추가 --> 속성에서 객체명은 Chart1, 차트 아이디 지정후 차트에 동일아이디 부여
옵션객체 추가 --> 속성에서 따로 지정하실 부분은 없습니다.
각객체 설정은 예스스팟 도움말 참고하시기 바랍니다.
var CallOrderCode,PutOrderCode,T;
function Main_OnStart()
{
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (T <= 0 && Signal.signalKind == 1)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//종목을 찾았으면
if (CC < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
T = 1;
Main.SetTimer(1, 10000);//1번타이머 10초
}
}
}
if (T == 1 && Signal.signalKind == 2)
{
Account1.SetBalanceItem(CallOrderCode, 0);
//CallOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0);
T = 0;
}
}
if (T >= 0 && Signal.signalKind == 3)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (PP < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
T = -1;
Main.SetTimer(2, 10000);//2번타이머 10초
}
}
}
if (T == -1 && Signal.signalKind == 4)
{
Account1.SetBalanceItem(PutOrderCode, 0);
//PutOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0);
T = 0;
}
}
}
function Main_OnTimer(nEventID)
{
//1번 타이머 동작 T가 1일이면(Buy신호 이후)
if (nEventID == 1 && T == 1)
{
//CallOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(CallOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
//1번 타이머종료
Main.KillTimer(1);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
}
}
}
//2번 타이머 동작하고 T가 -1이면(Sell신호 이후)
if (nEventID == 2 && T == -1)
{
//PutOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(PutOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
//2번 타이머종료
Main.KillTimer(2);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
}
}
}
}
즐거운 하루되세요
> 왼손잡이 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 수고하십니다.
연결선물에 시스템을 적용하고 있는데요.
1. 선물에서 시스템 매수 시그날시.
-> 콜옵션 2.0 근처가격 매수
-> 전체 자금의 10%
-> 진입이후 수익률 20%도달시 전체자금의 10% 추가매수
2. 선물에서 매도 시그날시
-> 풋옵션 2.0 근처가격 매수
-> 전체 자금의 10%
-> 진입이후 수익률 20%도달시 전체자금의 10% 추가매수
3. 청산시그날시 모두 청산
을 하고 싶습니다.
초보라 잘 부탁드립니다.
답변 감사드립니다.
해당 프로그램을 실행하니
refeneceError : Opiton is not defined
라는 에러가 나오는데요...
옵션 객체를 추가해줘야 하는건지요?
그럼 답변 부탁드리겠습니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : Re : Re : 문의드립니다.
>
안녕하세요
예스스스탁입니다.
계좌종류별로 인덱스가 모두 다릅니다.
위탁계좌는 30번이 코스닥증거금현금
저축계좌는 30분이 금일재매매대상금액
선물옵션계좌는 30번이 주문가능현금
입니다.
계좌별로 인덱스에 따른 리턴값이 모두 다릅니다.
Account1 계좌객체에 계좌번호를 지정할때 선물옵션계좌로 지정하시면 됩니다.
예스스팟 도움말에서 해당 함수 설명 참고하시기 바랍니다.
즐거운 하루되세요
> 왼손잡이 님이 쓴 글입니다.
> 제목 : Re : Re : 문의드립니다.
> 자세한 답변 감사드립니다 .^^
몇가지 궁금한 사항이 있는데요.
1. var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1
라고 표현해 주셨는데 30이란 코드가 코스닥 증거금 현금이라고 되어 있는데 옵션주문시 위 사항이 맞는지요?
그럼 확인 부탁드리겠습니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의드립니다.
>
안녕하세요
예스스탁입니다.
예스스팟 답변은 가이드라인정도입니다.
아래내용 참고하셔서 수정보완해 사용하시기 바랍니다.
스크립트객체화면 설정
계좌객체 추가 --> 속성에서 객체명은 Account1, 계좌번호지정
차트객체 추가 --> 속성에서 객체명은 Chart1, 차트 아이디 지정후 차트에 동일아이디 부여
옵션객체 추가 --> 속성에서 따로 지정하실 부분은 없습니다.
각객체 설정은 예스스팟 도움말 참고하시기 바랍니다.
var CallOrderCode,PutOrderCode,T;
function Main_OnStart()
{
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (T <= 0 && Signal.signalKind == 1)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//종목을 찾았으면
if (CC < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
T = 1;
Main.SetTimer(1, 10000);//1번타이머 10초
}
}
}
if (T == 1 && Signal.signalKind == 2)
{
Account1.SetBalanceItem(CallOrderCode, 0);
//CallOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0);
T = 0;
}
}
if (T >= 0 && Signal.signalKind == 3)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (PP < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
T = -1;
Main.SetTimer(2, 10000);//2번타이머 10초
}
}
}
if (T == -1 && Signal.signalKind == 4)
{
Account1.SetBalanceItem(PutOrderCode, 0);
//PutOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0);
T = 0;
}
}
}
function Main_OnTimer(nEventID)
{
//1번 타이머 동작 T가 1일이면(Buy신호 이후)
if (nEventID == 1 && T == 1)
{
//CallOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(CallOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
//1번 타이머종료
Main.KillTimer(1);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
}
}
}
//2번 타이머 동작하고 T가 -1이면(Sell신호 이후)
if (nEventID == 2 && T == -1)
{
//PutOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(PutOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
//2번 타이머종료
Main.KillTimer(2);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
}
}
}
}
즐거운 하루되세요
> 왼손잡이 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 수고하십니다.
연결선물에 시스템을 적용하고 있는데요.
1. 선물에서 시스템 매수 시그날시.
-> 콜옵션 2.0 근처가격 매수
-> 전체 자금의 10%
-> 진입이후 수익률 20%도달시 전체자금의 10% 추가매수
2. 선물에서 매도 시그날시
-> 풋옵션 2.0 근처가격 매수
-> 전체 자금의 10%
-> 진입이후 수익률 20%도달시 전체자금의 10% 추가매수
3. 청산시그날시 모두 청산
을 하고 싶습니다.
초보라 잘 부탁드립니다.