예스스탁
예스스탁 답변
2016-03-24 12:41:43
안녕하세요
예스스탁입니다.
1.
아래 내용 참고하시기 바랍니다.
매수신호 발생시 종목코드가
보유종목이거나 현재 3종목 미만으로 보유할경우에만 매수되게 합니다.
function C1_OnRiseSignal(Signal)
{
if (Position == 0 && Signal.signalKind == 1 )
{
Position = 1;
// 보유종목수 산정(동일종목코드 1개로 처리)
var num = A1.GetTheNumberOfBalances();
var BalanceCode = [];//잔고에서 중복코드 제외하고 종목코드를 저장할 배열변수
var OrderAble = false;//보유중인 종목인지 판단변수
for (i = 0; i < num; i++)
{
A1.SetBalance(i);
var hold = false;
if (A1.Balance.count > 0 && A1.Balance.position == 2)
{
for (y = 0; y < BalanceCode.length; y++)
{
if (A1.Balance.code == BalanceCode[i])
{
hold = true;
}
}
if (hold == false)
{
BalanceCode.push(A1.Balance.code);
}
if (A1.Balance.code == Main.GetOrderCode(Signal.code))
{
OrderAble = true;
}
}
}
if (BalanceCode.length < 3 || OrderAble == true )
{
BID = A1.OrderBuy(Signal.code, Signal.count,0, 1, 1);
Main.MessageLog("매수진입");
BuyFill = 0;
}
}
}
2.
작성상에 큰 문제는 없어 보입니다.
다만 가원장 갱신 A1.Refresh()은 일정 시간이 필요로 합니다.
A1.Refresh();가 동작하면
원장에서 값을 가져와 가원장의 값을 갱신하게 되는데
실제 원장의 응답속도가 빠르지 않습니다.
작성하신 식에서 A1.Refresh() 이후에 바로 매도를 하게 되는데
갱신중에는 값이 없습니다.
그러므로 매도신호가 발생하면 A1.Refresh();를 동작시키고
가원장 갱신이완료가 되었을때 주문을 하게 작성하셔야 합니다.
아래 내용 참고하시기 바랍니다.
수식에 게시판 금칙어가 있어 영문 업데이트가 Up*date로 중간에 *표시가
추가되어 있으므로 * 삭제하시기 바랍니다.
var Position;
var BID;
var Bnum;
var BuyFill;
var LOANDATE;
function Main_OnStart()
{
Main.MessageLog("시작");
Position = 0;
}
function C1_OnRiseSignal(Signal)
{
if (Position == 0 && Signal.signalKind == 1 )
{
Position = 1;
BID = A1.OrderBuy(Signal.code, Signal.count,0, 1, 1);
Main.MessageLog("매수진입");
BuyFill = 0;
}
//매수청산신호가 발생하고
if (Position == 1 && Signal.signalKind == 2 )
{
//체결확인값이 1이면
if (BuyFill == 1)
{
//계좌 refresh
A1.Refresh();
//Position변수는 2
Position = 2;
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (Position == 1 && OrderResponse.orderID == BID)
{
Bnum = OrderResponse.orderNum;
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (Position == 1 && NotifyFill.orderNum == Bnum)
{
BuyFill = 1;
LOANDATE = NotifyFill.loanDate;
}
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)//*제거
{
//잔고 refresh완료
if (sAccntNum == A1.number && lUp*dateID == 30000)//*제거
{
//잔고 전체 종목중
//차트종목과 같고 대출종류는 1이고, 대출일이 LOANDATE와 같은 잔고가 있으면 매도
var num = A1.GetTheNumberOfBalances();
for (i = 0; i < num; i++)
{
A1.SetBalance(i);
if (A1.Balance.code == Main.GetOrderCode(C1.GetCode(1))
&& A1.Balance.loanKind == 1
&& A1.Balance.loanDate == LOANDATE)
A1.OrderSell(A1.Balance.code,A1.Balance.count,0, 1, A1.Balance.loanKind,A1.Balance.loanDate);
Main.MessageLog("매수청산실행");
}
//Position변수는 0
Position = 0;
}
}
3
작성하신 수식에 A1.Balance.count를 사용했지만'
Balance를 셋팅한 부분이 없습니다.
Balance 객체는 A1.SetBalance이후에만 사용가능합니다.셋팅되지 않으면 값이 없습니다.
var Position;
var BID;
var Bnum;
var BuyFill;
var LOANDATE;
function Main_OnStart()
{
Main.MessageLog("시작");
Position = 0;
}
function C1_OnRiseSignal(Signal)
{
if (Position == 0 && Signal.signalKind == 1 )
{
Position = 1;
BID = A1.OrderBuy(Signal.code, Signal.count,0, 1, 1);
Main.MessageLog("매수진입");
BuyFill = 0;
}
//매수청산신호가 발생하고
if (Position == 1 && Signal.signalKind == 2 )
{
//체결확인값이 1이면
if (BuyFill == 1)
{
//계좌 refresh
A1.Refresh();
//Position변수는 2
Position = 2;
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (Position == 1 && OrderResponse.orderID == BID)
{
Bnum = OrderResponse.orderNum;
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (Position == 1 && NotifyFill.orderNum == Bnum)
{
BuyFill = 1;
LOANDATE = NotifyFill.loanDate;
}
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)//*제거
{
//잔고 refresh완료
if (sAccntNum == A1.number && lUp*dateID == 30000)//*제거
{
A1.SetBalance(Main.GetOrderCode(C1.GetCode(1),9,0);
A1.OrderSell(A1.Balance.code,A1.Balance.count,0, 1, A1.Balance.loanKind, A1.Balance.loanDate);
Main.MessageLog("매수청산실행");
}
//Position변수는 0
Position = 0;
}
즐거운 하루되세요
> 사과쥬스 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 노고에 감사드립니다.
현물 적용입니다.
1.한 종목의 융자매수와 현금매수가 다르게 나타나기 때문에 종목코드기준으로
서로 다른 종목이 3종목 이상 있을 경우,
잔고에 있지 않은 새로운 종목은 더 이상 매수하지 않고자 합니다.
- 기존 잔고에 매수되어 있는 종목의 경우는 계속해서 매수합니다.
2. 아래1. 수식을 적용하는데 매수는 되는데 매도가 되지 않습니다.
예스스팟의 주문상태부분에
"16935해당 잔고가 없습니다" 라고 나옵니다.
가원장과 원장의 차이 때문일까하여 timer 설정에도 변화가 없습니다.
잘못된 사항에 대하여 고견 부탁드립니다.
3. 아래2. 수식을 적용하는데 있어 매수는 되는데 매도가 되지 않습니다.
예스스팟의 주문상태부분에
"융자합매도 주문은 미체결,체결 조회창을 이용하시기 바랍니다."라고 나옵니다.
융자합 매도를 하면 대출일(loandate)가 필요 없을 듯 하여 적용하였지만, 작동하지 않습니다.
수정할 사항에 대하여 고견 부탁드립니다.
------아래.1 ------
var Position;
var BID;
var Bnum;
var BuyFill;
var LOANDATE;
function Main_OnStart()
{
Main.MessageLog("시작");
Position = 0;
}
function C1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1 )
{
Position = 1;
BID = A1.OrderBuy(Signal.code, Signal.count,0, 1, 1);
Main.MessageLog("매수진입");
BuyFill = 0;
}
if (Position == 1 && Signal.signalKind == 2 )
{
if (BuyFill == 1)
{
A1.Refresh();
Main.SetTimer(1, 3000);
Main.KillTimer(1);
A1.OrderSell(Signal.code, Signal.count ,0, 1, 1,LOANDATE);
Main.MessageLog("매수청산실행");
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (Position == 1 && OrderResponse.orderID == BID)
{
Bnum = OrderResponse.orderNum;
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (Position == 1 && NotifyFill.orderNum == Bnum)
{
BuyFill = 1;
LOANDATE = NotifyFill.loanDate;
}
}
--------아래.2------
var Position;
var BID;
var Bnum;
var BuyFill;
function Main_OnStart()
{
Main.MessageLog("시작");
Position = 0;
}
function C1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1 )
{
Position = 1;
BID = A1.OrderBuy(Signal.code, Signal.count,0, 1, 1);
Main.MessageLog("매수진입");
BuyFill = 0;
}
if (Position == 1 && Signal.signalKind == 2 )
{
if (BuyFill == 1)
{
A1.Refresh();
Main.SetTimer(1, 3000);
Main.KillTimer(1);
A1.OrderSell(Signal.code, A1.Balance.count,0, 1, 9,0);
Main.MessageLog("매수청산실행");
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (Position == 1 && OrderResponse.orderID == BID)
{
Bnum = OrderResponse.orderNum;
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (Position == 1 && NotifyFill.orderNum == Bnum)
{
BuyFill = 1;
}
}