예스스탁
예스스탁 답변
2013-05-13 18:10:46
안녕하세요
예스스탁입니다.
예스스팟은 기본틀만 작성해 드립니다. 첨부된 식 참고하시기 바랍니다.
충분히 테스트 후에 사용하시기 바랍니다.
1.
차트에서 매수신호 발생하면 콜(3.0이하의 종목중 가장큰 종목) 매수
차트에서 매수청산신호 발생하면 위 종목 매도
차트에서 매도신호 발생하면 풋(3.0이하의 종목중 가장큰 종목) 매수
차트에서 매도청산신호 발생하면 위 종목 매도
스크립트 객체화면에
옵션객체 추가
계좌객체 추가 --> 객체명 Account1 --> 속성에서 주문낼 계좌 지정
차트객체 추가 --> 객체명 Chart1 --> 속성에서 차트와 동일한 차트아이디 지정
var BStart; SStart;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
var SK1;
function Main_OnStart()
{
BStart = 0;
SStart = 0;
}
//차트에서 신호가 발생하면
function Chart1_OnRiseSignal(Signal)
{
SK1 = Signal.signalKind;
//Buy신호 발생
if (SK1 == 1)
{
Main.MessageLog("선물신호발생--------------------------------------------");
//3.0이하 중 가장 큰 가격을 가지는 콜종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 3.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
var CC = -1;
var CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
Main.MessageLog("--------------------------------------------");
Main.MessageLog("콜주문종목코드:"+CallOrderCode+"/가격:"+CC);
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
BStart = 1;
}
//Exitlong 신호발생하면 CallOrderCode종목 청산
if (SK1 == 2 && BStart == 1)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
}
//Sell신호 발생
if (SK1 == 3)
{
//3.0이하 중 가장 큰 가격을 가지는 풋종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 3.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
var PP = -1;
var PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
Main.MessageLog("--------------------------------------------");
Main.MessageLog("풋주문종목코드:"+PutOrderCode+"/가격:"+PP);
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
SStart = 1;
}
//exitshort청산 신호발생하면 PutOrderCode종목 청산
if (SK1 == 4 && SStart == 1)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
}
}
2.
아래식은 최근 발생신호를 기준으로 2개의 동일신호가 나오면 주문을 집행합니다.
문의하신 부분은 상당히 많은 경우가 발생할수 있으므로
최근 발생신호만으로 조건을 판단하여 주문을 하는 식을 올려드립니다.
하나의 차트에서는 이미 청산하고 다른 진입신호로 넘어간 상황에서
뒤늦게 다른 차트에서 청산등이 발생하면 최근 발생신호가 다르므로 주문발생하지 않습니다.
아래 참고하셔서 수정해 사용하시기 바랍니다.
스크립트 객체화면에
옵션객체 추가
계좌객체 추가 --> 객체명 Account1 --> 속성에서 주문낼 계좌 지정
차트객체 추가 --> 객체명 Chart1 --> 속성에서 차트와 동일한 차트아이디 지정
차트객체 추가 --> 객체명 Chart2 --> 속성에서 차트와 동일한 차트아이디 지정
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
var SK1;
function Main_OnStart()
{
Start = 0;
}
//차트1에서 신호가 발생하면
function Chart1_OnRiseSignal(Signal)
{
SK1 = Signal.signalKind;
//Buy신호 발생
if (SK1 == 1 && SK2 == 1 && Start == 0)
{
Main.MessageLog("선물신호발생--------------------------------------------");
//3.0이하 중 가장 큰 가격을 가지는 콜종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 3.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
var CC = -1;
var CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
Main.MessageLog("--------------------------------------------");
Main.MessageLog("콜주문종목코드:"+CallOrderCode+"/가격:"+CC);
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Start = 1;
}
//Exitlong 신호발생하면 CallOrderCode종목 청산
if (SK1 == 2 && SK2 == 2 && Start == 1)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Start = 0;
}
//Sell신호 발생
if (SK1 == 3 && SK2 == 3 && Start == 0 )
{
//3.0이하 중 가장 큰 가격을 가지는 풋종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 3.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
var PP = -1;
var PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
Main.MessageLog("--------------------------------------------");
Main.MessageLog("풋주문종목코드:"+PutOrderCode+"/가격:"+CC);
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
Start = -1;
}
//exitshort청산 신호발생하면 PutOrderCode종목 청산
if (SK1 == 4 && SK2 == 4 && Start == -1)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Start = 0;
}
}
//차트2에서 신호가 발생하면
function Chart2_OnRiseSignal(Signal)
{
SK2 = Signal.signalKind;
//Buy신호 발생
if (SK1 == 1 && SK2 == 1 && Start == 0)
{
Main.MessageLog("선물신호발생--------------------------------------------");
//3.0이하 중 가장 큰 가격을 가지는 콜종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 3.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
var CC = -1;
var CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
Main.MessageLog("--------------------------------------------");
Main.MessageLog("콜주문종목코드:"+CallOrderCode+"/가격:"+CC);
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Start = 1;
}
//Exitlong 신호발생하면 CallOrderCode종목 청산
if (SK1 == 2 && SK2 == 2 && Start == 1)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Start = 0;
}
//Sell신호 발생
if (SK1 == 3 && SK2 == 3 && Start == 0 )
{
//3.0이하 중 가장 큰 가격을 가지는 풋종목을 찾음
UNum = Option.uppersATM;
LNum = Option.lowersATM;
PutCode = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 3.0 )
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
var PP = -1;
var PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
Main.MessageLog("--------------------------------------------");
Main.MessageLog("풋주문종목코드:"+PutOrderCode+"/가격:"+PP);
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
Start = -1;
}
//exitshort청산 신호발생하면 PutOrderCode종목 청산
if (SK1 == 4 && SK2 == 4 && Start == -1)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Start = 0;
}
}
3.
메인객체에 PrintOnFile함수를 이용하시면 됩니다.
파일명 지정하시고 계산값등을 지정하시면됩니다.
계산값등을 복수로 나열해 지정하실수 있습니다.
Main.PrintOnFile(sFilePath, sMsg)
즐거운 하루되세요
> 블레이즈 님이 쓴 글입니다.
> 제목 : 선물 신호로 옵션 주문하기...
> 1. 복수의 선물 신호로 옵션을 주문하려고 합니다.
선물 매수시 콜옵션 , 선물 매도시 풋옵션, 청산 신호시 옵션 청산.
이때 당일 시가 가격 기준으로 옵션을 주문내고 싶습니다.
3.0 에 가장 가까운 가격요.
2. 선물 매수 신호가 2개가 모일 때마다 옵션 1개를 낼 수 있나요?
선물 매수인 시스템 신호가 2개이면 콜매수 1 ,
매도 2개이면 풋매수 1 이렇게 말이죠. 청산도 마찬가지로요.
3. 당일 옵션의 매매 손익 기록을 파일 등으로 기록해두고 싶습니다.
백테스트가 안되다보니 기록으로 관리할 수 밖에 없을 거 같습니다.
어떤 식으로 할 수 있나요? 옵션 행사가라던가 그런 정보도 함께 기록이 가능한지요.
감사합니다.