안녕하세요.
고생이 많으십니다.
매수 시 계좌 잔고를 활용하여 매수 수량을 정하고, 매도 시 매수 금액을 매도하는 수식을 작성하고자 아래와 같이 수식 작성하였습니다.
매수는 정상적으로 작동하지만, 매도가 작동하지 않습니다.
계좌 잔고를 사용하지 않고 수량을 직접 입력했을 시에는 시뮬레이션 및 실전에서 매도가 정상적으로 이루어졌습니다.
혹시 잔고함수를 써서 매수 시에는 매도가 불가능한걸까요? (계좌함수 사용시 차트상으로도 매수표시가 나오지 않는데, 혹시 이것때문에 매수가 없다고 판단하여 매도를 하지 않는걸까요?)
그렇다면 잔고함수를 썼을때 매도 방법이 있다면 알려주시면 감사하겠습니다.
(..변수식 생략..)
#매수 조건
# 1. 상한선 돌파 매수
if stime > 093000
and marketposition== 0
and crossup(ma(C,period),value1)
buy("상한매수",Atmarket,DEF,floor(GetUnclearedDeposits("1234-5678-90")*0.3*Score/C));
#매도 조건: 시초가 매도
if NextBarSdate > sdate Then
{
ExitLong("매도",AtMarket,DEF,"");
}
#손절 조건
if stime > 093000
and marketposition== 1
and crossdown(ma(C,period),value3) then
exitlong("기준매도",Atmarket,DEF,"기준매수");
도와주셔서 감사드립니다.
답변 1
예스스탁
예스스탁 답변
2020-04-17 13:44:54
안녕하세요
예스스탁입니다.
1
계좌의 잔고는 과거 히스토리 데이타가 없습니다.
항상 현재시점의 값만 제공하므로 차트의 과거봉에서는 그 떄의 값을 알수가 없고
0으로만 리턴되므로 해당 함수를 이용해 수량을 계산해 진입식을 작성하시면
다음날이나 당일에도 프로그램을 재접속하시면
이전에 발생했던 신호자리에 신호를 발생하게 할수가 없게되고
청산함수는 진입신호가 없으면 발생하지 못하므로 매도를 할수 없습니다.
예스랭귀지에서는 잔고함수는
당일에 진입하고 당일에 청산할 때 제한적으로 이용하실 수 있습니다.
2
잔고와 연동하는 전략을 구현하시려면 예스스팟으로 주문을 내게 구현하셔야 합니다.
다만 예스스팟은 자바스크립트로 전략을 구현하는 API급 프로그램입니다.
사용자분이 자바스크립트로 코딩이 가능하셔야 합니다.
간단한 예제외에 저희가 식을 작성해 드리지 않습니다.
아래 예제 참고하셔서 수정보완해 사용하시기 바랍니다.
차트에서 신호가 발생하면 예스스팟으로 주문을 하는 내용입니다.
기존 수식의 수량계산하는 로직은 내용을 알수 없어 score는 변수처리만 했습니다.
스팟안에서 계산식 구현하셔야 합니다.
스팟 계좌객체에서 예수금 관련항목을 가져오는 함수는 증권사별로 인덱스가 다릅니다.
예를 들어 하이투자증권은 예수금이 GetBalanceETCinfo(0),
NH투자증권은 GetBalanceETCinfo(6)입니다, 스팟도움말에서 해당 함수에 대한 내용을 참고하시기 바랍니다.
차트는 신호만 발생하고 주문은 예스스팟으로 내므로
시스템은 차트에 잔고함수 사용하지 않는 내용으로 시험적용으로 적용하시면 됩니다.
스크립트 객체설정
차트객체추가 --> 속성에서 객체명 Chart1, 차트와 아이디 연결
종목객체추가 --> 속성에서 객체명 MarketData1, 차트와 동일종목으로 설정
계좌객체추가 --> 속성에서 객체명 Account1, 계좌번호 지정
var Score;
function Main_OnStart()
{
Main.MessageList("start")
}
//차트에서 신호발생
function Chart1_OnRiseSignal(Signal)
{
//매수진입신호이면
if (Signal.signalKind == 1)
{
//수량계산
var vol = Account1.GetBalanceETCinfo(0)*0.6*Score/ MarketData1.Ask(3);
//계산된 수량으로 매도3호가로 매수주문
Account1.OrderBuy(MarketData1.code, vol, MarketData1.Ask(3), 0);
}
//매수청산신호이면
if (Signal.signalKind == 2)
{
//미체결 중 해당종목의 미체결은 모두 취소
var num = Account1.GetTheNumberOfUnfills();
if (num > 0)
{
for (var i = 0;i < num;i++)
{
Account1.SetUnfill(i)
if (Account1.Unfill.count > 0 && Account1.Unfill.code == MarketData1.code)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
}
//잔고셋팅
Account1.SetBalance(MarketData1.code, 0);
//잔고보유수량 전량 매수3호가로 매도주문
if (Account1.Balance.count > 0)
{
Account1.OrderSell(MarketData1.code,Account1.Balance.count, MarketData1.Bid(3), 0);
}
}
}
즐거운 하루되세요
> 기사단장 님이 쓴 글입니다.
> 제목 : 잔고함수를 활용한 매수 시 매도방법
> 안녕하세요.
고생이 많으십니다.
매수 시 계좌 잔고를 활용하여 매수 수량을 정하고, 매도 시 매수 금액을 매도하는 수식을 작성하고자 아래와 같이 수식 작성하였습니다.
매수는 정상적으로 작동하지만, 매도가 작동하지 않습니다.
계좌 잔고를 사용하지 않고 수량을 직접 입력했을 시에는 시뮬레이션 및 실전에서 매도가 정상적으로 이루어졌습니다.
혹시 잔고함수를 써서 매수 시에는 매도가 불가능한걸까요? (계좌함수 사용시 차트상으로도 매수표시가 나오지 않는데, 혹시 이것때문에 매수가 없다고 판단하여 매도를 하지 않는걸까요?)
그렇다면 잔고함수를 썼을때 매도 방법이 있다면 알려주시면 감사하겠습니다.
(..변수식 생략..)
#매수 조건
# 1. 상한선 돌파 매수
if stime > 093000
and marketposition== 0
and crossup(ma(C,period),value1)
buy("상한매수",Atmarket,DEF,floor(GetUnclearedDeposits("1234-5678-90")*0.3*Score/C));
#매도 조건: 시초가 매도
if NextBarSdate > sdate Then
{
ExitLong("매도",AtMarket,DEF,"");
}
#손절 조건
if stime > 093000
and marketposition== 1
and crossdown(ma(C,period),value3) then
exitlong("기준매도",Atmarket,DEF,"기준매수");
도와주셔서 감사드립니다.