예스스탁
예스스탁 답변
2013-04-05 16:42:34
안녕하세요
예스스탁입니다.
시간이 다소 걸릴것 같습니다.
다음주 중에 작성해서 올려드리도록 하겠습니다.
즐거운 하루되세요
> 털보 님이 쓴 글입니다.
> 제목 : 문의
> 아래 스팟식은 잘 사용중에 있습니다.
약간 응용하여 추가로 문의를 드립니다.
예제)
1. 선물신호에 옵션 매도 주문(2.0에 가장 근접한 종목)
2. 수익신호에는 진입한 옵션 매도 청산
3.손절 신호에만 손절 청산을 하는 게 아니라 반대옵션 매도(반드시 손절 신호에만)
4. 양 매도(포지션)구축이 되면 (손실금-백만 원) 도달시 자동 손절 청산
5. 양매도 구축시 당일 3시 청산
요약해 보면
수익일땐 네이키드 청산.
손절(손실일 땐)엔 양 매도 포지션
===============================================================
//2. 옵션매도
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
function Chart1_OnRiseSignal(Signal)
{
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 2.0 && Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 2.0 && Option.GetCurrent(1, ii) >= 1.0)
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
//buy신호 발생시
if (Signal.signalKind == 1)
{
Start = 1;
PP = -1;
PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
if (PP > 0)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//exitlong신호 발생시
if ( Start == 1 && Signal.signalKind == 2)
{
Start = 0;
if (PP > 0)
{
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//sell신호 발생시
if (Signal.signalKind == 3)
{
Start = -1;
CC = -1;
CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
if (CC > 0)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
// Exitshort신호 발생시
if (Start == -1 && Signal.signalKind == 4)
{
Start = 0;
if (CC > 0)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
}
예스스탁
예스스탁 답변
2013-04-11 13:12:28
안녕하세요
예스스탁입니다.
차트에
매수신호 발생하면 2.0 이하 중 가장 큰 풋옵션 매도하고
매도신호 발생하면 2.0 이하 중 가장 큰 콜옵션 매도합니다.
매수청산신호 발생시 신호상 수익이면 풋옵션 매도청산하고
손실이면 행사가의 반대 콜옵션을 매도합니다.
매도청산신호 발생시 신호상 수익이면 콜옵션 매도청산하고
손실이면 행사가의 반대 픗옵션을 매도합니다.
각 청산후 양매도상태이면 손실 100만원 발생하면 모두 청산합니다.
기본틀이므로 테스트 충분히 하신후에 수정보완해 사용하시기 바랍니다.
옵션객체
차트객체 : 객체명 chart1 --> 속송에서 차트아이디 차트와 동일하게 부여
계좌객체 : 객체명 Account1 --> 속성에서 계좌지정
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
var CallOrderCodeR; var PutOrderCodeR;
var BuyEntryPrice; var SellEntryPrice;
var BuyStep; var SellStep;
function Main_OnStart()
{
Start = 0;
BuyStep = 0;
SellStep = 0;
Main.SetTimer(1, 10000);
}
function Chart1_OnRiseSignal(Signal)
{
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 2.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 2.0)
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
//buy신호 발생시
if (Signal.signalKind == 1)
{
Start = 1;
PP = -1;
PutOrderCode = -1;
PutOrderCodeR = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum]; //2.0이하 중 가장 큰 풋옵션의 종목코드
PutOrderCodeR = Option.GetATMCallRecent(-iiii); //반대 콜옵션의 종목코드
}
}
if (PP > 0)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
BuyEntryPrice = Signal.price; //매수신호시 신호가격
BuyStep = 1;
Main.MessageLog("차트신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("차트신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//exitlong신호 발생시
if ( Start == 1 && Signal.signalKind == 2)
{
Start = 0;
if (PP > 0 && Signal.price > BuyEntryPrice) //차트신호 수익
{
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
BuyStep = 0;
Main.MessageLog("차트신호종류: 수익:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
if (PP > 0 && Signal.price < BuyEntryPrice)//차트신호 손실
{
Account1.OrderSell(PutOrderCodeR, 1, 0, 1);
BuyStep = 2;
Main.MessageLog("차트신호종류 : 손실:"+Signal.signalKind+" /종목코드:"+PutOrderCodeR+" /START:"+Start);
}
}
//sell신호 발생시
if (Signal.signalKind == 3)
{
Start = -1;
CC = -1;
CallOrderCode = -1;
CallOrderCodeR = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]; //2.0이하 중 가장큰 콜종목의 종목코드
CallOrderCodeR = Option.GetATMPutRecent(-iii) //반대 풋옵션의 종목코드
}
}
if (CC > 0)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
SellStep = 1;
Main.MessageLog("차트신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("차트신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
// Exitshort신호 발생시
if (Start == -1 && Signal.signalKind == 4)
{
Start = 0;
if (CC > 0 && Signal.price < SellEntryPrice)//차트신호수익
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
SellStep = 0;
Main.MessageLog("차트신호종류: 수익 : "+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
if (CC > 0 && Signal.price > SellEntryPrice)//차트신호손실
{
Account1.OrderSell(CallOrderCodeR, 1, 0, 1);
SellStep = 2;
Main.MessageLog("차트신호종류: 손"+Signal.signalKind+" /종목코드:"+CallOrderCodeR+" /START:"+Start);
}
}
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (BuyStep == 2)
{
var TotalPL = 0;
Account1.SetBalanceItem(PutOrderCode, 1);
TotalPL = TotalPL + (Account1.Balance.avgUnitCost-Account1.Balance.current)*Account1.Balance.count*500000;
Account1.SetBalanceItem(PutOrderCodeR, 1);
TotalPL = TotalPL + (Account1.Balance.avgUnitCost-Account1.Balance.current)*Account1.Balance.count*500000;
if (TotalPL <= -1000000)
{
Account1.SetBalanceItem(PutOrderCode, 1);
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
Account1.SetBalanceItem(PutOrderCodeR, 1);
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
BuyStep = 0;
}
}
if (SellStep == 2)
{
var TotalPL = 0;
Account1.SetBalanceItem(CallOrderCode, 1);
TotalPL = TotalPL + (Account1.Balance.avgUnitCost-Account1.Balance.current)*Account1.Balance.count*500000;
Account1.SetBalanceItem(CallOrderCodeR, 1);
TotalPL = TotalPL + (Account1.Balance.avgUnitCost-Account1.Balance.current)*Account1.Balance.count*500000;
if (TotalPL <= -1000000)
{
SellStep = 0;
Account1.SetBalanceItem(CallOrderCode, 1);
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
Account1.SetBalanceItem(CallOrderCodeR, 1);
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
}
}
//15시 분에 종목청산
if (nEventID == 1 && HHMMDD >= 150000)
{
Main.KillTimer(1);
if (BuyStep == 2)
{
Account1.SetBalanceItem(PutOrderCode, 1);
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
Account1.SetBalanceItem(PutOrderCodeR, 1);
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
BuyStep = 0;
}
if (SellStep == 2)
{
Account1.SetBalanceItem(CallOrderCode, 1);
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
Account1.SetBalanceItem(CallOrderCodeR, 1);
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
SellStep = 0;
}
}
}
즐거운 하루되세요
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의
> 안녕하세요
예스스탁입니다.
시간이 다소 걸릴것 같습니다.
다음주 중에 작성해서 올려드리도록 하겠습니다.
즐거운 하루되세요
> 털보 님이 쓴 글입니다.
> 제목 : 문의
> 아래 스팟식은 잘 사용중에 있습니다.
약간 응용하여 추가로 문의를 드립니다.
예제)
1. 선물신호에 옵션 매도 주문(2.0에 가장 근접한 종목)
2. 수익신호에는 진입한 옵션 매도 청산
3.손절 신호에만 손절 청산을 하는 게 아니라 반대옵션 매도(반드시 손절 신호에만)
4. 양 매도(포지션)구축이 되면 (손실금-백만 원) 도달시 자동 손절 청산
5. 양매도 구축시 당일 3시 청산
요약해 보면
수익일땐 네이키드 청산.
손절(손실일 땐)엔 양 매도 포지션
===============================================================
//2. 옵션매도
var Start;
var UNum; var LNum;
var CallCode; var CallPrice;
var PutCode; var PutPrice;
var CC; var PP;
var CallOrderCode; var PutOrderCode;
function Main_OnStart()
{
Start = 0;
}
function Chart1_OnRiseSignal(Signal)
{
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
if (Option.GetCurrent(0, i) <= 2.0 && Option.GetCurrent(0, i) >= 1.0)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1;
CallCode[i+LNum] = -1;
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
if (Option.GetCurrent(1, ii) <= 2.0 && Option.GetCurrent(1, ii) >= 1.0)
{
PutPrice[ii+UNum] = Option.GetCurrent(1, ii);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
else
{
PutPrice[ii+UNum] = -1;
PutCode[ii+UNum] = -1;
}
}
//buy신호 발생시
if (Signal.signalKind == 1)
{
Start = 1;
PP = -1;
PutOrderCode = -1;
for (var iiii = -UNum; iiii <= LNum; iiii++)
{
if (PutPrice[iiii+UNum] > PP)
{
PP = PutPrice[iiii+UNum];
PutOrderCode = PutCode[iiii+UNum];
}
}
if (PP > 0)
{
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//exitlong신호 발생시
if ( Start == 1 && Signal.signalKind == 2)
{
Start = 0;
if (PP > 0)
{
Account1.OrderBuy(PutOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+PutOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
//sell신호 발생시
if (Signal.signalKind == 3)
{
Start = -1;
CC = -1;
CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
if (CC > 0)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
// Exitshort신호 발생시
if (Start == -1 && Signal.signalKind == 4)
{
Start = 0;
if (CC > 0)
{
Account1.OrderBuy(CallOrderCode, 1, 0, 1);
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드:"+CallOrderCode+" /START:"+Start);
}
else
{
Main.MessageLog("S신호종류:"+Signal.signalKind+" /종목코드: 지정한 가격대 종목이 없음"+" /START:"+Start);
}
}
}