답변완료
문의
더운데 수고하십니다.
스팟 수식 문의 드립니다.
우선 하나의 계좌에서 지수 선물과 콜옵션, 풋옵션을 거래하려 합니다.
다 컨셉은 똑 같지만 총 6개의 전략입니다.
당일 청산 전략이며,
선물은 전략당 계좌 잔고의 20% 금액으로 거래하고 (선물 매수/매도 2개의 전략)
옵션은 전략당 10% 금액으로 거래하려 합니다. (옵션 콜풋 각가 2개의 전략 총 4개의 전략)
계좌 잔고를 실시간으로 체크하면서 만약 10억원이라면,
1. 계좌 잔고 10억 중 2억원은 선물 매수 후 청산 전략에만 사용.
(캐시 2억원으로 max로 살 수 있는 계약수)
2. 계좌 잔고 10억 중 2억원은 선물 매도 후 청산 전략에만 사용.
3. 계좌 잔고 10억 중 1억원은 콜옵션 1.5 이상 최근접가 매수 후 청산 전략에만 사용.
(캐시 1억원으로 max로 살 수 있는 계약수)
4. 계좌 잔고 10억 중 1억원은 콜옵션 1.5 이하 최근접가 매수 후 청산 전략에만 사용.
5. 계좌 잔고 10억 중 1억원은 풋옵션 1.5 이상 최근접가 매수 후 청산 전략에만 사용.
6. 계좌 잔고 10억 중 1억원은 풋옵션 1.5 이하 최근접가 매수 후 청산 전략에만 사용.
이렇게 6개의 전략을 만들려고 하는데 실질적으로는 1, 3 전략만 짜주시면 나머지는 주석 달아주시면 조금 변경해서 사용할 수 있겠습니다.
전략 1) 선물 매수 후 청산
#아웃라인
거래시간은 오전 9시부터 오후 3시까지 (옵션만기일은 2시 45분까지)
호가가 변하는 이벤트를 이용해서 포지션을 실시간 체크하면서 거래합니다.
#진입
해당 계약수 (예탁금의 20%로 살수 있는 최대 선물 계약수, 최소 1계약)
를 Bid(1) 즉, 최우선 매수호가에 주문을 내 놓고,
1계약이라도 체결이 되고 가격이 오르면 즉, Bid(1)이 오르면 청산 준비를 하고,
체결이 안되고 가격이 오르면 기존 주문을 취소 후 이미 오른 Bid(1)에 새로운 주문을 냅니다.
이 경우는 체결이 하나도 안된 경우이기 때문에 가격정정 주문을 이용해도 될 듯 합니다.
즉, 1계약이라도 체결 될 때까지 매수호가에 걸어놓으면서 시장을 따라 갑니다.
만약 1계약이라도 부분 체결되고 Bid(1) 가격이 체결 가격 대비 한 호가라도 올라버린 경우에는 기존 미체결 부분은 취소합니다.
#청산
부분 체결이나 전체 체결 모두
체결가 대비 5호가 아래로 Bid(1)가 떨어지거나
체결가 대비 5호가 위로 Bid(1)이 오르면 청산모드 시작.
청산 모드 시작 후.
Bid(1) 호가 잔량이 Ask(1)의 호가 잔량의 50%보다 적으면 Bid(1)에 주문
Bid(1) 호가 잔량이 Ask(1)의 호가 잔량의 50%보다 많으면 Ask(1)에 주문
일부나 전체 미체결된 (즉, 청산이 다 되지 않은) 상태로 가격이 하락하면
위의 Bid(1) / Ask(1) 호가 잔량 비율 원칙에 입각해서 모두 청산될 때까지 추적 청산.
전부 청산 되면 다시 진입 준비.
#거래시간 종료시
만약 거래시간 종료시 해당 종목 포지션이 있을 경우 전체 청산 및 미체결 주문 취소.
전략 3) 콜옵션 매수 후 청산
#아웃라인
선물 거래와 동일하나 실시간으로
가격이 1.5 이상인 최근접가 옵션(1.5 이상의 가격대중 가장 저렴한 행사가)를 선택해서 거래하고,
청산 조건이 발동 될 때 5호가가 아닌 5%를 이용해서 수식 작성.
즉, 5%가 오르거나 5%가 내렸을 때 청산 조건 발동.
사정상 다양한 종목을 한 계좌에서 거래 하려고 합니다. (위에 언급한 선물 2개 옵션 4개)
옵션은 콜옵션 2개 행사가 풋옵션 2개 행사가입니다.
그리고 선물은 매수 후 청산 시스템과 매도 후 청산 시스템을 동시에 한 계좌에서 돌립니다.
선물과 옵션에 대해서 작성해주시는 수식이
하나의 계좌에서 각각의 종목 포지션을 참고하면서 잘 돌아갈 수 있게 수식 작성해주시면 감사하겠습니다.
2014-05-27
948
글번호 223000
답변완료
시초가 주문에 대해 질문드립니다.
질문 좀 할께요.
1. 시초가로 시스템 신호를 스팟에서 받아서 옵션을 주문 내는 것이 가능한가요?
예)
if stime == 150000 then
{
sell("sel-001",atstop,nextbaropen);
}
setstopendofday(150000);
이 시초가 매도진입신호를 스팟에서 받아서 옵션중에 2.0이하 call과 put옵션을
양매도 주문을 내고,15시에 양매도 신호를 정리할 수 잇는 건가요?
위에것이 안되면, 구현할 수 있는 시초가 양매도 방법이 있으면 알려주시면
감사하겠습니다.
var CC,CallOrderCode;
var PP,PutOrderCode;
function Main_OnStart()
{
EntryStart = 0;
}
//차트에서 신호 발생
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 3) //Sell신호 발생
{
Main.MessageList("매도신호발생:",Signal.signalKind);
var UNum = Option.uppersATM;//ATM기준 위아래 행사 갯수
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);//풋 종목 찾기//////////////////////////////////////////
var PutPrice = new Array(UNum+LNum+1);//전 행사가 갯수만큼 배열변수 만듬
for (var j = -UNum; j <= LNum; j++) //전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
{
if (Option.GetCurrent(1, j) <= 1.5)//2.5이하이면 해당종목의 현재가와 종목코드를 저장하고
{
PutPrice[j+UNum] = Option.GetCurrent(1, j);
PutCode[j+UNum] = Option.GetATMPutRecent(j);
}
else
{
PutPrice[j+UNum] = -1;//2.0보다 크면 모두 -1를 저장
PutCode[j+UNum] = -1;
}
}
PP = -1;
PutOrderCode = -1; // PutPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
for (var jj = -UNum; jj <= LNum; jj++)// 동일 방번호의 PutCode를 PutOrderCode에 저장
{
if (PutPrice[jj+UNum] > PP)
{
PP = PutPrice[jj+UNum];
PutOrderCode = PutCode[jj+UNum];
}
}
if (PP > 0)
{
EntryStart = 1;
Account1.OrderSell(PutOrderCode, 1, Option.GetBidByCode(PutOrderCode, 5), 0);//풋매도(1계약,매수5호가)
Main.MessageList("풋매도",PutOrderCode);
}
var UNum = Option.uppersATM; //ATM기준 위아래 행사 갯수
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1); //콜 종목 찾기//////////////////////////////////////////
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++) //전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
{
if (Option.GetCurrent(0, i) <= 1.5)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1; //2.0보다 크면 모두 -1를 저장
CallCode[i+LNum] = -1;
}
}
CC = -1;
CallOrderCode = -1;
for (var ii = -LNum; ii <= UNum; ii++)
{
if (CallPrice[ii+LNum] > CC) // CallPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
{
CC = CallPrice[ii+LNum];
CallOrderCode = CallCode[ii+LNum]; // 동일 방번호의 CallCode를 CallOrderCode에 저장
}
}
if (CC > 0)
{
EntryStart = 1;
Account1.OrderSell(CallOrderCode, 1, Option.GetBidByCode(CallOrderCode, 5), 0); //콜매도(1계약, 매수5호가)
Main.MessageList("콜매도",CallOrderCode);
}
}
if (EntryStart == 1 && Signal.signalKind == 4) //ExitShort신호 발생
{
Main.MessageList("매도청산 신호발생:",Signal.signalKind);
Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 5), 0); //콜 매도청산(매수주문, 1계약, 매도5호가)
Account1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 5), 0); //풋 매도청산(매수주문, 1계약, 매도5호가)
Main.MessageList("전체청산",CallOrderCode);
}
}
function Main_OnStart()
{
Main.SetTimer(3, 1000);
Main.MessageList("스팟시작 - 타이머셋팅(1초)")
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (HHMMSS >= 90000)
{
//잔고갯수
var num = Account1.GetTheNumberOfBalances();
for (var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.code.charAt(0) == "2" &&
Account1.Balance.position == 1 &&
Account1.Balance.current >= Account1.Balance.avgUnitCost*2.5)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
if (Account1.Balance.code.charAt(0) == "3" &&
Account1.Balance.position == 1 &&
Account1.Balance.current >= Account1.Balance.avgUnitCost*2.0)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
2014-05-26
903
글번호 222994
답변완료
문의 드립니다.
항상 친절하신 답변 감사드립니다.
아래 912번 문의와 관련하여 보충 문의 드립니다.
원유의 경우를 예로 들어서 질문 드리고자 합니다.
A. 초기 스탑 ((손절)): 2틱 손절
A-1.
원유의 경우, 1틱이 0.01포인트.
가령 최초에 배럴당 가격 100.00달러에 매수진입했다고 가정하면, 1틱은 가격 100포인트의 0.01%. 따라서 2틱 스탑이면 0.02% 스탑임. ((= *0.0002 하락하는 경우임))
따라서, 아래 식으로 하면 될런지요?
if (MarketData1.current <= Account1.Balance.avgUnitCost *0.9998)
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.current, 1); ///// ((현재가로 시장가 청산주문하고자 합니다)).
}
A-2.
일단 이 주문이 나간 후, 어떤 이유에서든간에 위 주문이 체결되지 않고 남아 있다가 나중에 엉뚱하게 주문이 체결되어 버리는 일이 생기지 않도록,
이 주문이 나간 후, 이 주문이 필요없어 지면 이 미체결 주문을 취소하는 식도 같이 알려 주시면 대단히 감사하겠습니다.
[[밑의 질문 항목들에서도, 그 주문이 미체결 상태에서 필요 없어 지면 그 미체결 주문을 없애 치우는 (취소하는) 식들을 포함해 주시길 부탁 드립니다.]]
B. 추적 스탑: 아래와 같이 추적스탑을 하려고 하면, 식을 어떻게 작성해야 할지요?
1.
4틱 오를 때까지는((가격이 100.01 ~ 100.04)) 2틱 스탑
((예를 들자면 아래와 같은 상황이 되겠습니다.
1틱 오르면, 즉 가격이 100.01이 되면 스탑은 99.99에 설정됨. // 2틱 오르면 가격은 100.02. 이 때 스탑은 100.00. // 3틱 오르면 가격은100.03. 이 때 스탑은 100.01. // 4틱 오르면 100.04. 스탑은 100.02))
2.
5틱 오른 후 15틱 오를 때까지((예: 100.05 ~ 100.15))는 3틱 스탑
((예: 100.00에 매수 진입 후 5틱 오르면 100.05. 이 때 스탑은 100.02에 설정. ~ 15틱 오르면 100.15. 스탑은 100.12))
3.
16틱 오른 후 30틱 오를 때까지: 10틱 스탑
((예: 16틱 오르면 가격은 100.16. => 이 때 스탑은 100.06. ~ 30틱 오르면 가격은 100.30 => 이 때 스탑은 100.20))
4.
31틱 이상 ~ 50틱까지 오르면: 5틱 스탑
((예: 31틱 오르면 가격은 100.31 => 이 때 스탑은 100.26))
5.
51틱 이상 오르면 2틱 스탑
((예: 만일 51틱 오르면 가격은 100.51 => 이 때 스탑은 100.49))
감사합니다!
아래: 912번 식에서, 한 품목만 거래하는 경우 ((부분 복사해 옴)):
var Entry1,H1,L1;
function Main_OnStart()
{
Entry1 = false;
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
//Account1계좌에 MarketData1종목이 신규로 들어오면
if (sAccntNum == Account1.number && lUp*dateID == 30001 && MarketData1.code == sItemCode)
{
Entry1 = true;
H1 = MarketData1.current;
L1 = MarketData1.current;
Account1.SetBalanceItem(MarketData1.code, 0);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
//MarketData1종목 진입이후 최고가/최저가 계산
if (Entry1 == true && sItemCode == MarketData1.code && lUp*dateID == 20001)
{
if (MarketData1.current > H1);
H1 = MarketData1.current;
if (MarketData1.current < L1);
L1 = MarketData1.current;
//매수포지션
if (Account1.Balance.position == 2)
{
//1% 익절
if (MarketData1.current >= Account1.Balance.avgUnitCost *1.04)
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//1% 손절
if (MarketData1.current <= Account1.Balance.avgUnitCost *0.99)
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//3%이상 상승후 최고가격에서 1% 하락하면 청산
if (H1 >= Account1.Balance.avgUnitCost *1.03 && MarketData1.current <= H1*0.99 )
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
}
//매도포지션
if (Account1.Balance.position == 2)
{
//4% 익절
if (MarketData1.current <= Account1.Balance.avgUnitCost *0.96)
{
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//1% 손절
if (MarketData1.current >= Account1.Balance.avgUnitCost *1.01)
{
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//3%이상 하락후 최저가격에서 1% 상승하면 청산
if (L1 <= Account1.Balance.avgUnitCost *0.97 && MarketData1.current >= L1*1.01 )
{
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
}
}
2014-05-30
941
글번호 222992