예스스탁
예스스탁 답변
2015-04-09 12:36:45
안녕하세요
예스스탁입니다.
아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다.
스크립트 객체화면에서
차트객체 추가 --> 객체명 C1, 차트와 같은 아이디 지정
계좌객체 추가 --> 객체명 A1, 계좌번호 지정
외부변수 추가 --> 변수명 Vol, 데이터형 숫자, 초기값에 진입수량지정
외부변수 추가 --> 변수명 loss, 데이터형 숫자, 초기값에 손실금액지정, 백만원이면 -1000000
var Start;
var CallCode1,CallCode2;
var PutCode1,PutCode2;
function Main_OnStart()
{
Main.MessageList("시작");
//내부파일에 Start로 저장된 값 호출해 V에 저장
var V = Main.GetUserValue("Start");
//0이면 Start는 0
if (V == 0)
Start = 0;
//1이면
if (V == 1)
{
//Start는 1
Start = 1;
//CallCode1에 내부파일 Code1에 저장된 값 호출해 저장
CallCode1 = Main.GetUserValue("Code1");
//CallCode2에 내부파일 Code2에 저장된 값 호출해 저장
CallCode2 = Main.GetUserValue("Code2");
}
if (V == -1)
{ Start = 0;
//Start는 -1
Start = 1;
//PutCode1에 내부파일 Code1에 저장된 값 호출해 저장
PutCode1 = Main.GetUserValue("Code1");
//PutCode2에 내부파일 Code2에 저장된 값 호출해 저장
PutCode2 = Main.GetUserValue("Code2");
}
Main.SetTimer(1, 5000);//5초간격 타이머 셋팅
}
function C1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1 )
{
Main.MessageList("매수신호발생");
Start = 1;
CallCode1 = Option.GetATMCallRecent(0);
CallCode2 = Option.GetATMCallRecent(-1);
var CallPrice1 = Option.GetBidByCode(CallCode1,2);
var CallPrice2 = Option.GetAskByCode(CallCode2,2);
A1.OrderSell(CallCode1, Vol, CallPrice1, 0);
A1.OrderBuy(CallCode2, Vol, CallPrice2, 0);
//Start와 종목코드 저장
Main.SetUserValue("Start", Start);
Main.SetUserValue("CallCode1", CallCode1);
Main.SetUserValue("CallCode2", CallCode1);
}
if (Start == 1 && Signal.signalKind == 2 )
{
Start = 0;
Main.MessageList("매수청산발생");
var BxPrice1 = Option.GetAskByCode(CallCode1, 2);
var BxPrice2 = Option.GetBidByCode(CallCode2, 2);
A1.OrderBuy(CallCode1, Vol, BxPrice1, 0);
A1.OrderSell(CallCode2, Vol, BxPrice2, 0);
//저장값 초기화
Main.SetUserValue("Start", 0);
Main.SetUserValue("Code1", " ");
Main.SetUserValue("Code2", " ");
}
if (Signal.signalKind == 3 )
{
Main.MessageList("매도신호발생");
Start = -1;
PutCode1 = Option.GetATMPutRecent(0);
PutCode2 = Option.GetATMPutRecent(1);
var PutPrice1 = Option.GetBidByCode(PutCode1,2);
var PutPrice2 = Option.GetAskByCode(PutCode2,2);
A1.OrderSell(PutCode1, Vol, PutPrice1 , 0);
A1.OrderBuy(PutCode2, Vol, PutPrice2, 0);
//Start와 종목코드 저장
Main.SetUserValue("Start", Start);
Main.SetUserValue("Code1", PutCode1);
Main.SetUserValue("Code2", PutCode2);
}
if (Start == 1 && Signal.signalKind == 4 )
{
Start = 0;
Main.MessageList("매도청산발생");
var SxPrice1 = Option.GetAskByCode(PutCode1, 2);
var SxPrice2 = Option.GetBidByCode(PutCode2, 2);
A1.OrderBuy(PutCode1, Vol, SxPrice1, 0);
A1.OrderSell(PutCode2, Vol, SxPrice2, 0);
//저장값 초기화
Main.SetUserValue("Start", 0);
Main.SetUserValue("Code1", " ");
Main.SetUserValue("Code2", " ");
}
}
//5초단위로 잔고 체크
function Main_OnTimer(nEventID)
{
var U1 = 0;
var P1 = 0;
var V1 = 0;
var Z1 = 0;
var U2 = 0;
var P2 = 0;
var V2 = 0;
var Z2 = 0;
//최근 buy발생상태이면
if (Start == 1)
{
A1.SetBalanceItem(CallCode1,0);
if (A1.Balance.count > 0 && A1.Balance.position == 1)
{
U1 = A1.Balance.avgUnitCost;
P1 = A1.Balance.current;
V1 = A1.Balance.count;
Z1 = ((U1-P1)*V1)*500000;
}
A1.SetBalanceItem(CallCode2,0);
if (A1.Balance.count > 0 && A1.Balance.position == 2)
{
U2 = A1.Balance.avgUnitCost;
P2 = A1.Balance.current;
V2 = A1.Balance.count;
Z2 = ((P2-U2)*V2)*500000;
}
if ((Z1+Z2) <= loss)
{
A1.OrderBuy(CallCode1, V1, Option.GetAskByCode(CallCode1, 2), 0);
A1.OrderSell(CallCode2, V2, Option.GetBidByCode(CallCode2, 2), 0);
Main.SetUserValue("Start", 0);
Main.SetUserValue("Code1", " ");
Main.SetUserValue("Code2", " ");
}
}
//최근 SEll발생상태이면
if (Start == -1)
{
A1.SetBalanceItem(PutCode1,0);
if (A1.Balance.count > 0 && A1.Balance.position == 1)
{
U1 = A1.Balance.avgUnitCost;
P1 = A1.Balance.current;
V1 = A1.Balance.count;
Z1 = ((U1-P1)*V1)*500000;
}
A1.SetBalanceItem(PutCode2,0);
if (A1.Balance.count > 0 && A1.Balance.position == 2)
{
U2 = A1.Balance.avgUnitCost;
P2 = A1.Balance.current;
V2 = A1.Balance.count;
Z2 = ((P2-U2)*V2)*500000;
}
if ((Z1+Z2) <= loss)
{
Start = 0;
A1.OrderBuy(PutCode1, V1, Option.GetAskByCode(PutCode1, 2), 0);
A1.OrderSell(PutCode2, V2, Option.GetBidByCode(PutCode2, 2), 0);
Main.SetUserValue("Start", 0);
Main.SetUserValue("Code1", " ");
Main.SetUserValue("Code2", " ");
}
}
}
즐거운 하루되세요
> 팡팡 님이 쓴 글입니다.
> 제목 : 수식부탁합니다
> 안녕하세요
아래 수식을 다음과 같이 변경하려고 합니다.
선물 매수 신호시; 콜옵션 ATM 매도, ATM-1 매수 / 풋옵션 ATM 매도, ATM+1 매수 청산
선물 매도 신호시; 풋옵션 ATM 매도, ATM+1 매수 / 콜옵션 ATM 매도, ATM-1 매수 청산
선진입한 콜, 풋의 잔고 청산하고 콜,풋 양쪽 포지션 없이 어느쪽이든 1개만 유지
진입 후 잔액대비 5% 손실 청산(로스컷)
var Start;
var BuyCallCode;
var BuyPutCode;
var SellCallCode;
var SellPutCode;
function Main_OnStart()
{
Main.MessageLog("시작");
Start = 0;
}
function C1_OnRiseSignal(Signal)
{
Main.MessageLog("신호완성/"+Signal.signalKind);
if (Signal.signalKind == 1 )
{
Start = 1;
BuyCallCode = Option.GetATMCallRecent(0);
BuyPutCode = Option.GetATMPutRecent(0);
var BuyCallPrice = Option.GetAskByCode(BuyCallCode,2);
var BuyPutPrice = Option.GetBidByCode(BuyPutCode,2);
A1.OrderBuy(BuyCallCode, Vol, BuyCallPrice, 0);
A1.OrderSell(BuyPutCode, Vol, BuyPutPrice, 0);
Main.MessageLog("합성선물매수");
}
if (Start == 1 && Signal.signalKind == 2 )
{
var BxCallPrice = Option.GetBidByCode(BuyCallCode, 2);
var BxPutPrice = Option.GetAskByCode(BuyPutCode, 2);
A1.OrderSell(BuyCallCode, Vol, BxCallPrice, 0);
A1.OrderBuy(BuyPutCode, Vol, BxPutPrice, 0);
Main.MessageLog("합성선물매수청산");
}
if (Signal.signalKind == 3 )
{
Start = 1;
SellCallCode = Option.GetATMCallRecent(0);
SellPutCode = Option.GetATMPutRecent(0);
var SellCallPrice = Option.GetBidByCode(SellCallCode,2);
var SellPutPrice = Option.GetAskByCode(SellPutCode,2);
A1.OrderSell(SellCallCode, Vol, SellCallPrice , 0);
A1.OrderBuy(SellPutCode, Vol, SellPutPrice, 0);
Main.MessageLog("합성선물매도");
}
if (Start == 1 && Signal.signalKind == 4 )
{
var SxCallPrice = Option.GetAskByCode(SellCallCode, 2);
var SxPutPrice = Option.GetBidByCode(SellPutCode, 2);
A1.OrderBuy(SellCallCode, Vol, SxCallPrice, 0);
A1.OrderSell(SellPutCode, Vol, SxPutPrice, 0);
Main.MessageLog("합성선물매도청산");
}
}