답변완료
검토부탁드립니다.
수고 많으십니다.
당일 15시 25분에 잔고에 있는 종목전체를 불러와, 매수10호가로 청산하고자 할때
Main.ReqMarketData(RemainObject[i], 0, 0)로 불러와
매도호가에 RemainObject[i].Bid(10)로 작성해봤는데...
ReferenceError메세지가 뜨며 실행이 안되네요....
도움 부탁드립니다.
//15시 25분에 잔고에 있는 종목 전량 청산(당일청산)
if (DayX == false && HHMMSS >= 152500 && RcvData >= 1)
{
DayX = true;
Main.KillTimer(1);
Main.MessageList("동시호가 잔고청산 주문실행",EntryItem);
var num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
var RemainObject = []; //종목객체 설정
Main.ReqMarketData(RemainObject[i], 0, 0);
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, RemainObject[i].Bid(10),0); //잔고 매수10호가 전량청산
// Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); //시장가
Main.MessageList("동시호가 청산매도: ", Account1.Balance.code);
}
}
2017-11-21
2801
글번호 224251
답변완료
질문입니다.
주가지수 선물에 적용되는 시스템을 예스랭귀지로 작성을 하였습니다.
예스랭귀지는 신호를 발생시키는 역할까지만 하고 채결에는 관여하지 않는다고 들었습니다.
그래서 예스스팍을 이용하려고 합니다.
질문1.
예스랭귀지로 작성한 시스템을 창에 걸어놓고,
그 상태에서 전입과 청산만을 예스스팟으로 컨트롤할수 있나요?
즉, 예스랭귀지로 작서한 시스템을 예스스팟으로 옮기는 작업이 꼭 필요한 것인지 궁금합니다.
질문2.
예스스팟으로 진입과 청산을 컨트롤할때,
예를들어 매수진입 후 매수청산과 매도진입이 동시에 일어날 경우,
순간적으로 증거금이 부족해서 신호가 채결되지 않는 경우가 있습니다.
이럴때를 대비해서 매수청산과 매도진입 시그널이 동시에 나왔다고 하더라도,
매수청산 후 증거금이 계좌로 들어온 후 매도진입 시그널을 채결시키는
기능이 예스스팟으로 가능한지 알고 싶습니다.
꼭 알고 싶은 사항입니다. 자세한 답변 부탁드립니다.
감사합니다.
추가로 질문하나 더 드립니다.
예를들어 선물차트에서 50이평을 crossup하면 매수, crossdown하면 매도하는
시스템이 있다고 가정할때,
이를 예스랭귀지로 작성했습니다.
저는 예스스팟으로 나오는 신호는 어떻게 해서든 채결시키고 싶습니다.
예를들어 현재상태가 매수인데 매도 시그널이 발생했을 때,
만약 미채결이 발생했다고하면,
매x초(예를들어5초0마다 주문을 정정하여 그때의 현재가, 혹은 1호가에 진입시키도록하고
예스스팟을 작성하고 싶습니다.
예시로 부탁드립니다.
감사합니다.
2017-11-22
2645
글번호 224249
답변완료
스팟식 문의드립니다.
한국투자증권에서 해외선물 3종목을 예스트레이더 차트신호에 따라서 매매하는 식인데요
3개차트 신호대로 매매하다가 현재 총 손실이 포지션이 있던 없던간에 현재 예탁자산평가액이
스팟적용했을 시기보다 -200000만원이상 떨어졌을때 모든포지션을 청산하고 차트에 신호가 나
와도 더 이상 매매하지 않게 하려고 합니다.
진입식을 잘 작동하는데 매매정지식이 뭔가 잘못된거 같은데 확인 좀 부탁드립니다.
근데 조회를 원화 기준으로 해야하는 달러기준으로 해야하는지요?
-200000만원을 원화 기준으로 해야하나요 달러기준으로 -200으로 해야하나요?
원화기준으로 매매정지 손실금액을 맞추고 싶습니다.
달러기준 조회를 햇을때는 달러로 변하고 원화조회를 햇을때는 원화 기준에 맞춰지는 건가요?
var i1;
var X;
//스팟 시작시
function Main_OnStart()
{
Main.MessageList("스팟 시작");
//i1에 예수금/예탁총액 저장
i1 = Account1.GetBalanceETCinfo(4);
X = 0;
Main.SetTimer(1, 1000);//5초 타이머 셋팅
Main.MessageList("예수금", Account1.GetBalanceETCinfo(4));
}
//-------------------------------------------------------------------------------------
//차트에서 신호나오면 MarketData1 종목에 대해 주문
function Chart1_OnRiseSignal(Signal) //차트1에서 완성신호이벤트가(온라이즈시그널)) 발생하면 시그널에 그정보를 넘겨준다
{
//매수진입신호 발생
if (Signal.signalKind == 1 && X == 0)
{
Main.MessageList("J1매수");
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,0,1);
}
//매수청산신호 발생
if (Signal.signalKind == 2)
{
//잔고셋팅해 매수포지션 있으면 잔고수량만큼만 청산
Main.MessageList("J1매수청산");
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
//매도진입신호 발생
if (Signal.signalKind == 3 && X == 0)
{
Main.MessageList("J1매도");
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,0,1);
}
//매도청산신호 발생
if (Signal.signalKind == 4)
{
//잔고셋팅해 매도포지션 있으면 잔고수량만큼만 청산
Main.MessageList("J1매도청산");
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
//-------------------------------------------------------------------------------------
//차트에서 신호나오면 MarketData1 종목에 대해 주문
function Chart2_OnRiseSignal(Signal) //차트1에서 완성신호이벤트가(온라이즈시그널)) 발생하면 시그널에 그정보를 넘겨준다
{
//매수진입신호 발생
if (Signal.signalKind == 1 && X == 0)
{
Main.MessageList("J2매수");
Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), Signal.count,0,1);
}
//매수청산신호 발생
if (Signal.signalKind == 2)
{
//잔고셋팅해 매수포지션 있으면 잔고수량만큼만 청산
Main.MessageList("J2매수청산");
Account1.SetBalance(Main.GetOrderCode(MarketData2.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
//매도진입신호 발생
if (Signal.signalKind == 3 && X == 0)
{
Main.MessageList("J2매도");
Account1.OrderSell(Main.GetOrderCode(MarketData2.code), Signal.count,0,1);
}
//매도청산신호 발생
if (Signal.signalKind == 4)
{
//잔고셋팅해 매도포지션 있으면 잔고수량만큼만 청산
Main.MessageList("J2매도청산");
Account1.SetBalance(Main.GetOrderCode(MarketData2.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
//-------------------------------------------------------------------------------------
//차트에서 신호나오면 MarketData1 종목에 대해 주문
function Chart3_OnRiseSignal(Signal) //차트1에서 완성신호이벤트가(온라이즈시그널)) 발생하면 시그널에 그정보를 넘겨준다
{
//매수진입신호 발생
if (Signal.signalKind == 1 && X == 0)
{
Main.MessageList("J3매수");
Account1.OrderBuy(Main.GetOrderCode(MarketData3.code), Signal.count,0,1);
}
//매수청산신호 발생
if (Signal.signalKind == 2)
{
//잔고셋팅해 매수포지션 있으면 잔고수량만큼만 청산
Main.MessageList("J3매수청산");
Account1.SetBalance(Main.GetOrderCode(MarketData3.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
//매도진입신호 발생
if (Signal.signalKind == 3 && X == 0)
{
Main.MessageList("J3매도");
Account1.OrderSell(Main.GetOrderCode(MarketData3.code), Signal.count,0,1);
}
//매도청산신호 발생
if (Signal.signalKind == 4)
{
//잔고셋팅해 매도포지션 있으면 잔고수량만큼만 청산
Main.MessageList("J3매도청산");
Account1.SetBalance(Main.GetOrderCode(MarketData3.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
//---------------------------------------------------------------------
function Main_OnTimer(nEventID)
{
//현재 예수금/예탁총액이 스팟시작시값보다 20만원 이상 감소했으면
if (nEventID == 1 && Account1.GetBalanceETCinfo(4) <= i1-200000)
{
//미체결주문 전체 취소
var num1 = Account1.GetTheNumberOfUnfills();
for(i = 0; i < num1; i++)
{
Account1.SetUnfillIndex(i)
Account1.OrderCancel(Account1.Unfill.orderNum);
}
//잔고 전체 종목 청산
var num2 = Account1.GetTheNumberOfBalances();
for(i = 0; i < num2; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
X = 1;
Main.MessageList("진입금지요건만족");
}
}
2017-11-07
2651
글번호 224243
답변완료
청산 수식 수정 요청드림
아래 수식은 2계좌에서 1종목씩 거래시 합산 순수익 날때 동시 청산수식과 합산 순손실시 동시 청산 수식 입니다
그런데 합산 순수익이 날때 동시 청산이 이루어지지 않고 한 계좌만 청산이 되고 다른 계좌는 그대로 남아 있습니다.
2계좌 합산 순수익이나 순손실이 날 때 두계좌가 동시 청산 되도록 수식을 수정 요청드립니다.
//계좌객체1 Account1
//계좌객체2 Account2
function Main_OnStart()
{
Main.SetTimer(1,5000);//5초 단위 체크
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//총수익 누적할 변수
var sumPL = 0;
//계좌1의 종목수
var num1 = Account1.GetTheNumberOfBalances();
//계좌2의 종목수
var num2 = Account2.GetTheNumberOfBalances();
//계좌1과 계좌2에 종목이 각 1개 이상일때만
if (num1 >= 1 && num2 >= 1)
{
//잔고 종목 총손익 계산
for (i = 0; i < num1; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
sumPL = sumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count;
}
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
sumPL = sumPL + (Account1.Balance.current - Account1.Balance.avgUnitCost)*Account1.Balance.count;
}
}
//잔고 종목 총손익 계산
for (i = 0; i < num2; i++)
{
Account2.SetBalanceIndex(i);
if (Account2.Balance.count > 0 && Account2.Balance.position == 1)
{
sumPL = sumPL + (Account2.Balance.avgUnitCost - Account2.Balance.current)*Account2.Balance.count;
}
if (Account2.Balance.count > 0 && Account2.Balance.position == 2)
{
sumPL = sumPL + (Account2.Balance.current - Account2.Balance.avgUnitCost)*Account2.Balance.count;
}
}
//총손익이 특정값(0)보다 크면 전체종목 청산
if (sumPL > 0)
{
for (i = 0; i < num1;i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
}
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1);
}
}
for (i = 0; i < num2; i++)
{
Account2.SetBalanceIndex(i);
if (Account2.Balance.count > 0 && Account2.Balance.position == 1)
{
Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count,0,1);
}
if (Account2.Balance.count > 0 && Account2.Balance.position == 2)
{
Account2.OrderSell(Account2.Balance.code, Account2.Balance.count,0,1);
}
}
}
//총손익이 특정값(0)보다 작으면 전체종목 청산
if (sumPL < 0)
{
for (i = 0; i < num;i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
}
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1);
}
}
for (i = 0; i < num;i++)
{
Account2.SetBalanceIndex(i);
if (Account2.Balance.count > 0 && Account2.Balance.position == 1)
{
Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count,0,1);
}
if (Account2.Balance.count > 0 && Account2.Balance.position == 2)
{
Account2.OrderSell(Account2.Balance.code, Account2.Balance.count,0,1);
}
}
}
}
}
}
2017-11-03
2686
글번호 224241
답변완료
잔고 확인 청산 방법 문의
매수청산, 매도청산의 상황에서
예를들면 이전에 인터넷이 비정상적으로 끊겨 재접속 되었을시에 잔고가 있어도 청산 주문이 나가지 않습니다.
그래서 저는 청산신호에는 무조건 잔고를 시장가로 청산하는 스팟 로직을 구현하려 하는데 쉽지가 않습니다.
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신호 발생");
}
}
2017-11-01
2888
글번호 224237