예스스탁
예스스탁 답변
2013-08-28 10:46:16
안녕하세요
예스스탁입니다.
식을 3개 올려드립니다.
식작성에 참고하시기 바랍니다.
모두 스크립트 객체화면에서
계좌객체 추가 --> 속성에서 객체명 Account1로 지정, 계좌번호 선택
차트객체 추가 --> 속성에서 객체명 Chart1로 지정, 임의로 차트아이디 부여하고 신호를 받는 차트도 동일 아이디 부여
옵션객체 추가 --> 따로 속성에서 설정할 내용 없습니다.
1) 같은 방향의 옵션을 매수하는것
var CC,CallOrderCode;
var PP,PutOrderCode;
function Main_OnStart()
{
EntryStart = 0;
}
//차트에서 신호 발생
function Chart1_OnRiseSignal(Signal)
{
// buy신호 발생
if (Signal.signalKind == 1)
{
Main.MessageList("매수신호발생:",Signal.signalKind);
//ATM기준 위아래 행사 갯수
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜 종목 찾기//////////////////////////////////////////
//전 행사가 갯수만큼 배열변수 만듬
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
//전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
for (var i = -LNum; i <= UNum; i++)
{
//2.5이하이면 해당종목의 현재가와 종목코드를 저장하고
if (Option.GetCurrent(0, i) <= 2.5)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
//2.5보다 크면 모두 -1를 저장
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
// CallPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
// 동일 방번호의 CallCode를 CallOrderCode에 저장
CC = -1;
CallOrderCode = -1;
for (var ii = -LNum; ii <= UNum; ii++)
{
if (CallPrice[ii+LNum] > CC)
{
CC = CallPrice[ii+LNum];
CallOrderCode = CallCode[ii+LNum];
}
}
if (CC > 0)
{
EntryStart = 1;
Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 5), 0);
Main.MessageList("콜매수",CallOrderCode);
}
}
//exitlong신호 발생
if (EntryStart == 1 && Signal.signalKind == 2)
{
Main.MessageList("매수청산 신호발생:",Signal.signalKind);
Account1.OrderSell(CallOrderCode, 1, Option.GetBidByCode(CallOrderCode, 5), 0);
Main.MessageList("콜청산",CallOrderCode);
}
//Sell신호 발생
if (Signal.signalKind == 3)
{
Main.MessageList("매도신호발생:",Signal.signalKind);
//ATM기준 위아래 행사 갯수
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//풋 종목 찾기//////////////////////////////////////////
//전 행사가 갯수만큼 배열변수 만듬
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
//전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
for (var j = -UNum; j <= LNum; j++)
{
//2.5이하이면 해당종목의 현재가와 종목코드를 저장하고
if (Option.GetCurrent(1, j) <= 2.5)
{
PutPrice[j+UNum] = Option.GetCurrent(1, j);
PutCode[j+UNum] = Option.GetATMPutRecent(j);
}
else
{
//2.5보다 크면 모두 -1를 저장
PutPrice[j+UNum] = -1;
PutCode[j+UNum] = -1;
}
}
// PutPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
// 동일 방번호의 PutCode를 PutOrderCode에 저장
PP = -1;
PutOrderCode = -1;
for (var jj = -UNum; jj <= LNum; jj++)
{
if (PutPrice[jj+UNum] > PP)
{
PP = PutPrice[jj+UNum];
PutOrderCode = PutCode[jj+UNum];
}
}
if (PP > 0)
{
EntryStart = 1;
Account1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 5), 0);
Main.MessageList("풋매수",PutOrderCode);
}
}
//ExitShort신호 발생
if (EntryStart == 1 && Signal.signalKind == 4)
{
Main.MessageList("매도청산 신호발생:",Signal.signalKind);
Account1.OrderSell(PutOrderCode, 1, Option.GetBidByCode(PutOrderCode, 5), 0);
Main.MessageList("풋청산",PutOrderCode);
}
}
2) 반대 방향의 옵션을 매도하는것
var CC,CallOrderCode;
var PP,PutOrderCode;
function Main_OnStart()
{
EntryStart = 0;
}
//차트에서 신호 발생
function Chart1_OnRiseSignal(Signal)
{
// buy신호 발생
if (Signal.signalKind == 1)
{
Main.MessageList("매수신호발생:",Signal.signalKind);
//ATM기준 위아래 행사 갯수
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//풋 종목 찾기//////////////////////////////////////////
//전 행사가 갯수만큼 배열변수 만듬
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
//전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
for (var j = -UNum; j <= LNum; j++)
{
//2.5이하이면 해당종목의 현재가와 종목코드를 저장하고
if (Option.GetCurrent(1, j) <= 2.5)
{
PutPrice[j+UNum] = Option.GetCurrent(1, j);
PutCode[j+UNum] = Option.GetATMPutRecent(j);
}
else
{
//2.5보다 크면 모두 -1를 저장
PutPrice[j+UNum] = -1;
PutCode[j+UNum] = -1;
}
}
// PutPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
// 동일 방번호의 PutCode를 PutOrderCode에 저장
PP = -1;
PutOrderCode = -1;
for (var jj = -UNum; jj <= LNum; jj++)
{
if (PutPrice[jj+UNum] > PP)
{
PP = PutPrice[jj+UNum];
PutOrderCode = PutCode[jj+UNum];
}
}
if (PP > 0)
{
EntryStart = 1;
//풋매도(1계약,매수5호가)
Account1.OrderSell(PutOrderCode, 1, Option.GetBidByCode(PutOrderCode, 5), 0);
Main.MessageList("풋매도",PutOrderCode);
}
}
//exitlong신호 발생
if (EntryStart == 1 && Signal.signalKind == 2)
{
Main.MessageList("매수청산 신호발생:",Signal.signalKind);
//풋청산(매수주문,1계약,매수5호가)
Account1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 5), 0);
Main.MessageList("풋청산",PutOrderCode);
}
//Sell신호 발생
if (Signal.signalKind == 3)
{
Main.MessageList("매도신호발생:",Signal.signalKind);
//ATM기준 위아래 행사 갯수
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜 종목 찾기//////////////////////////////////////////
//전 행사가 갯수만큼 배열변수 만듬
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
//전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
for (var i = -LNum; i <= UNum; i++)
{
//2.5이하이면 해당종목의 현재가와 종목코드를 저장하고
if (Option.GetCurrent(0, i) <= 2.5)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
//2.5보다 크면 모두 -1를 저장
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
// CallPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
// 동일 방번호의 CallCode를 CallOrderCode에 저장
CC = -1;
CallOrderCode = -1;
for (var ii = -LNum; ii <= UNum; ii++)
{
if (CallPrice[ii+LNum] > CC)
{
CC = CallPrice[ii+LNum];
CallOrderCode = CallCode[ii+LNum];
}
}
if (CC > 0)
{
EntryStart = 1;
//콜매도(1계약, 매수5호가)
Account1.OrderSell(CallOrderCode, 1, Option.GetBidByCode(CallOrderCode, 5), 0);
Main.MessageList("콜매도",CallOrderCode);
}
}
//ExitShort신호 발생
if (EntryStart == 1 && Signal.signalKind == 4)
{
Main.MessageList("매도청산 신호발생:",Signal.signalKind);
//콜 매도청산(매수주문, 1계약, 매도5호가)
Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 5), 0);
Main.MessageList("콜청산",CallOrderCode);
}
}
3) 같은 방향은 매수하고 반대방향은 매도하는 것
var CC,CallOrderCode;
var PP,PutOrderCode;
function Main_OnStart()
{
EntryStart = 0;
}
//차트에서 신호 발생
function Chart1_OnRiseSignal(Signal)
{
// buy신호 발생
if (Signal.signalKind == 1)
{
Main.MessageList("매수신호발생:",Signal.signalKind);
//ATM기준 위아래 행사 갯수
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜 종목 찾기//////////////////////////////////////////
//전 행사가 갯수만큼 배열변수 만듬
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
//전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
for (var i = -LNum; i <= UNum; i++)
{
//2.5이하이면 해당종목의 현재가와 종목코드를 저장하고
if (Option.GetCurrent(0, i) <= 2.5)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
//2.5보다 크면 모두 -1를 저장
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
// CallPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
// 동일 방번호의 CallCode를 CallOrderCode에 저장
CC = -1;
CallOrderCode = -1;
for (var ii = -LNum; ii <= UNum; ii++)
{
if (CallPrice[ii+LNum] > CC)
{
CC = CallPrice[ii+LNum];
CallOrderCode = CallCode[ii+LNum];
}
}
//풋 종목 찾기//////////////////////////////////////////
//전 행사가 갯수만큼 배열변수 만듬
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
//전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
for (var j = -UNum; j <= LNum; j++)
{
//2.5이하이면 해당종목의 현재가와 종목코드를 저장하고
if (Option.GetCurrent(1, j) <= 2.5)
{
PutPrice[j+UNum] = Option.GetCurrent(1, j);
PutCode[j+UNum] = Option.GetATMPutRecent(j);
}
else
{
//2.5보다 크면 모두 -1를 저장
PutPrice[j+UNum] = -1;
PutCode[j+UNum] = -1;
}
}
// PutPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
// 동일 방번호의 PutCode를 PutOrderCode에 저장
PP = -1;
PutOrderCode = -1;
for (var jj = -UNum; jj <= LNum; jj++)
{
if (PutPrice[jj+UNum] > PP)
{
PP = PutPrice[jj+UNum];
PutOrderCode = PutCode[jj+UNum];
}
}
if (CC > 0 && PP > 0)
{
EntryStart = 1;
Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 5), 0);
Account1.OrderSell(PutOrderCode, 1, Option.GetBidByCode(PutOrderCode, 5), 0);
Main.MessageList("콜매수:",CallOrderCode, "/풋매도:",PutOrderCode);
}
}
//exitlong신호 발생
if (EntryStart == 1 && Signal.signalKind == 2)
{
Main.MessageList("매수청산 신호발생:",Signal.signalKind);
Account1.OrderSell(CallOrderCode, 1, Option.GetBidByCode(CallOrderCode, 5), 0);
Account1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 5), 0);
Main.MessageList("콜청산:",CallOrderCode, "/풋청산:",PutOrderCode);
}
//Sell신호 발생
if (Signal.signalKind == 3)
{
Main.MessageList("매도신호발생:",Signal.signalKind);
//ATM기준 위아래 행사 갯수
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜 종목 찾기//////////////////////////////////////////
//전 행사가 갯수만큼 배열변수 만듬
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
//전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
for (var i = -LNum; i <= UNum; i++)
{
//2.5이하이면 해당종목의 현재가와 종목코드를 저장하고
if (Option.GetCurrent(0, i) <= 2.5)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
//2.5보다 크면 모두 -1를 저장
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
// CallPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
// 동일 방번호의 CallCode를 CallOrderCode에 저장
CC = -1;
CallOrderCode = -1;
for (var ii = -LNum; ii <= UNum; ii++)
{
if (CallPrice[ii+LNum] > CC)
{
CC = CallPrice[ii+LNum];
CallOrderCode = CallCode[ii+LNum];
}
}
//풋 종목 찾기//////////////////////////////////////////
//전 행사가 갯수만큼 배열변수 만듬
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
//전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
for (var j = -UNum; j <= LNum; j++)
{
//2.5이하이면 해당종목의 현재가와 종목코드를 저장하고
if (Option.GetCurrent(1, j) <= 2.5)
{
PutPrice[j+UNum] = Option.GetCurrent(1, j);
PutCode[j+UNum] = Option.GetATMPutRecent(j);
}
else
{
//2.5보다 크면 모두 -1를 저장
PutPrice[j+UNum] = -1;
PutCode[j+UNum] = -1;
}
}
// PutPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
// 동일 방번호의 PutCode를 PutOrderCode에 저장
PP = -1;
PutOrderCode = -1;
for (var jj = -UNum; jj <= LNum; jj++)
{
if (PutPrice[jj+UNum] > PP)
{
PP = PutPrice[jj+UNum];
PutOrderCode = PutCode[jj+UNum];
}
}
if (CC > 0 && PP > 0)
{
EntryStart = 1;
Account1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 5), 0);
Account1.OrderSell(CallOrderCode, 1, Option.GetBidByCode(CallOrderCode, 5), 0);
Main.MessageList("풋매수:",PutOrderCode, "/콜매도:",CallOrderCode);
}
}
//ExitShort신호 발생
if (EntryStart == 1 && Signal.signalKind == 4)
{
Main.MessageList("매도청산 신호발생:",Signal.signalKind);
Account1.OrderSell(PutOrderCode, 1, Option.GetBidByCode(PutOrderCode, 5), 0);
Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 5), 0);
Main.MessageList("풋청산:",PutOrderCode, "/콜청산:",CallOrderCode);
}
}
즐거운 하루되세요
> 먼지의추억 님이 쓴 글입니다.
> 제목 : 부탁드립니다.
> 수고 많습니다.
681번 수정건은 없는걸로 해주시구요.
<프로그램명:스팟-돌파>
var1= dayhigh(1)-daylow(1);
if stime >= 90000 and stime <=144000 then
{
buy("buy-001",atstop,daylow+var1*0.33);
sell("sell-001",atstop,dayhigh-var1*0.33);
}
setstopendofday(150000);
## 당일저가(고가)에서 전일폭의 33%를 돌파하면 매수(매도)
##
<객체계좌-2403-xxxx-31>
<객체옵션>
(스팟랭귀지)
1. buy신호시: call 2.5p 이하중 최고가의 콜매수(5호가매수).
매수청산신호시: 진입한 콜청산(같은 종목 같은수량5호가)
sell신호시: put 2.5p 이하중 최고가의 풋매수(5호가매수).
매도청산신호시: 진입한 콜청산(같은 종목 같은수량5호가)
2. buy신호시: put 2.5p 이하중 최고가의 풋매도(5호가매도).
매수청산신호시: 진입한 풋청산(같은 종목 같은수량5호가)
sell신호시: call 2.5p 이하중 최고가의 콜매도(5호가매도).
매도청산신호시: 진입한 콜청산(같은 종목 같은수량5호가)
3. buy신호시: call 2.5p 이하중 최고가의 콜매수(5호가매수)와
put 2.5p 이하중 최고가의 풋매도(5호가매도).
매수청산신호시: 콜매수청산,풋매도청산(같은 종목 같은수량5호가)
sell신호시 put 2.5p 이하중 최고가의 풋매수(5호가매수)와
call 2.5p 이하중 최고가의 콜매도(5호가매도).
매수청산은 콜매수청산,풋매도청산(같은 종목 같은수량5호가)
일단 선물신호로 1) 같은 방향의 옵션을 매수하는것,
2) 반대 방향의 옵션을 매도하는것,
3) 같은 방향은 매수하고 반대방향은 매도하는 것을
처리할 수 있게 해주시기 바랍니다.
감사합니다.