예스스탁
예스스탁 답변
2017-11-22 15:42:03
안녕하세요
예스스탁입니다.
재접속하면 청산이 나가지 않는 이유는 T라는 변수때문입니다.
T가 항상 0으로 시작됩니다. 1이나 -1일때 발생하게되는 청산이 발생할수 없습니다.
함수중에 Main.SetUserValue, Main.GetUserValue와 같이
임의의 값을 내부파일에 적어 보관하는 기능을 하는 함수가 있습니다.
해당 함수를 이용해 T값을 저장하고 OnStart시에 불러와 초기에 T값을 조정해 주는 내용이 필요합니다.
//계좌객체 추가 : Account1
//챠트객체 추가 : Chart1 //예트챠트명과 일치
//옵션데이타 추가 : Option
//입력변수 추가 : Near //숫자형, 진입하고자 하는 가까운 옵션값
//입력변수 추가 : Vol // 진입수량
var T;
var CC, CallOrderCode;
var PP, PutOrderCode;
var BC, BP;
function Main_OnStart()
{
var TT = Main.GetUserValue("TT");
if (TT == "" || TT == 0)
T = 0;
else
T = TT;
Main.MessageList("옵션매수 전용시작");
}
function Chart1_OnRiseSignal(Signal)
{
// 매수신호
if (Signal.signalKind == 1)
{
T = 1;
Main.SetUserValue("TT",T);
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
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++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-Near);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//종목을 찾았으면
if (CC < 99999999)
{
BC = CallOrderCode;
Account1.OrderBuy(BC, Vol, Option.GetAskByCode(BC, 5)+2, 0);
}
}
//매수청산 신호
if (T == 1 && Signal.signalKind == 2)
{
T = 0;
Main.SetUserValue("TT",T);
num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
Main.MessageList("ExitLong신호 발생");
}
//매도 신호
if (Signal.signalKind == 3)
{
T = -1;
Main.SetUserValue("TT",T);
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-Near);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (PP < 99999999)
{
BP = PutOrderCode;
Account1.OrderBuy(BP, Vol, Option.GetAskByCode(BP, 5)+2, 0);
}
}
//매도청산 신호
if (T == -1 && Signal.signalKind == 4)
{
T = 0;
Main.SetUserValue("TT",T);
num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 2)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
Main.MessageList("ExitShort신호 발생");
}
}
즐거운 하루되세요
> 궁금궁금123 님이 쓴 글입니다.
> 제목 : 잔고 확인 청산 방법 문의
> 매수청산, 매도청산의 상황에서
예를들면 이전에 인터넷이 비정상적으로 끊겨 재접속 되었을시에 잔고가 있어도 청산 주문이 나가지 않습니다.
그래서 저는 청산신호에는 무조건 잔고를 시장가로 청산하는 스팟 로직을 구현하려 하는데 쉽지가 않습니다.
1. 매수(매도)청산 신호가 나왔을때 잔고를 확인하여 모든 잔고를 시장가로 청산하는 로직
제 기존 수식에 청산부분에만 삽입,수정하려고 합니다. 부탁드립니다.
참고
기존 제 수식(선물신호->옵션매수식)
//계좌객체 추가 : Account1
//챠트객체 추가 : Chart1 //예트챠트명과 일치
//옵션데이타 추가 : Option
//입력변수 추가 : Near //숫자형, 진입하고자 하는 가까운 옵션값
//입력변수 추가 : Vol // 진입수량
var T;
var CC, CallOrderCode;
var PP, PutOrderCode;
var BC, BP;
function Main_OnStart()
{
T = 0;
Main.MessageList("옵션매수 전용시작");
}
function Chart1_OnRiseSignal(Signal)
{
// 매수신호
if (Signal.signalKind == 1)
{
T = 1;
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
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++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-Near);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//종목을 찾았으면
if (CC < 99999999)
{
BC = CallOrderCode;
Account1.OrderBuy(BC, Vol, Option.GetAskByCode(BC, 5)+2, 0);
}
}
//매수청산 신호
if (T==1 && Signal.signalKind == 2)
{
T = 0;
num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 2);
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
Main.MessageList("ExitLong신호 발생");
}
//매도 신호
if (Signal.signalKind == 3)
{
T = -1;
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-Near);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (PP < 99999999)
{
BP = PutOrderCode;
Account1.OrderBuy(BP, Vol, Option.GetAskByCode(BP, 5)+2, 0);
}
}
//매도청산 신호
if (T==-1 && Signal.signalKind == 4)
{
T = 0;
num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 2);
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
Main.MessageList("ExitShort신호 발생");
}
}