예스스탁
예스스탁 답변
2020-07-21 15:10:54
안녕하세요
예스스탁입니다.
1
올리신 글에 진입이 현재가인데 시장가로 되어 있어 현재가로 수정했습니다.
2
매도청산에 종목코드만 지정되어 있어 잔고수량과 시장가 옵션을 추가했습니다.
3
주문함수의 2번쨰 매개변수가 수량을 지정하는 부분입니다
진입에 잔고수량으로 수량이 설정되어 있어 변수 계약수로 처리했습니다.
4
Account1.SetBalanceIndex는 계좌의 리스트의 순서로 종목잔고를 지정하는 함수입니다
종목코드로 지정할 때는 Account1.SetBalanceItem함수를 이용하셔야 합니다.
5
Account1.Balance.position
잔고의 포지션은 매도면 1, 매수면 2입니다. -1은 존재하지 않습니다.
6
시장가 주문을 접수가 되었는데 취소 후에 재주문하는 것은 의미가 없습니다.
주문 접수에 에러가 난 경우에만 재주문하게 작성해 드립니다.
7
스팟의 수식답변은 식작성의 가이드 입니다.
테스트해보시고 수정보완해 완성하시기 바랍니다.
8
var 계약수 = 4;
var Position;
var BEID,BECID,BXID,BV,SV;
var SEID,SECID,SXID;
var Snum;
var Bnum;
function Main_OnStart()
{
Main.MessageList("Start");
Position = 0;
}
//(ExitLong)(ExitShort)
//시스템미완성 신호 발생
function Chart1_OnRiseIncompleteSignal(IncompleteSignal)
{
// Position = 1일때 ExitLong 미완성 신호 발생하면
if (IncompleteSignal.signalKind == 2 && Position == 1)
{
//포지션 설정
Position = 0 ;
//Bnum 매수주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(Bnum);
//미체결된 매수수량이 0 이상이면 취소주문
if(Account1.Unfill.Count > 0)
{
Account1.OrderCancel(Bnum);
}
//잔고 셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0);
//잔고수량 0 이상, 매수포지션일때
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//잔고 수량 모두 시장가 청산(매도주문)
BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1);
Main.MessageList("----------------");
Main.MessageList("매수청산",Position)
}
}
// Position = -1일때 ExitShort 미완성 신호 발생하면
if (IncompleteSignal.signalKind == 4 && Position == -1)
{
//포지션 설정
Position = 0 ;
// Snum 매도주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(Snum);
//미체결된 매도수량이 0 이상이면 취소주문
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(Snum);
}
//잔고 셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0);
//잔고수량 0 이상, 매도포지션일때
if (Account1.Unfill.count > 0 && Account1.Balance.position == 1)
{
//잔고 수량 모두 시장가 청산(매수주문)
SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1);
Main.MessageList("----------------");
Main.MessageList("매도청산",Position)
}
}
}
//(Buy)(Sell)
//완성 신호 발생
function Chart1_OnRiseSignal(Signal)
{
//Position = 0일때 buy 완성 신호 최초발생하면
if (Signal.signalKind == 1 && Position == 0 )
{
BV = 계약수;
BEID = Account1.OrderBuy(Main.GetOrderCode(MarketData11.code), BV, MarketData1.current, 2 );
//매수진입주문번호 초기값 -1
Bnum = -1;
Position = 1 ;
Main.MessageList("----------------");
Main.MessageList("매수진입", Position);
}
//Position = 0일때 Sell 완성 신호 최초발생하면
if (Signal.signalKind == 3 && Position == 0)
{
SV = 계약수;
SEID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), SV, MarketData1.current, 2 );
//매도진입주문번호 초기값 -1
Snum = -1;
Position = -1 ;
Main.MessageList("----------------");
Main.MessageList("매도진입", Position);
}
// Position = 1일때 ExitLong 완성 신호 발생하면
if (Signal.signalKind == 2 && Position == 1)
{
//포지션 설정
Position = 0 ;
//Bnum 매수주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(Bnum);
//미체결된 매수수량이 0 이상이면 취소주문
if(Account1.Unfill.Count > 0)
{
Account1.OrderCancel(Bnum);
}
//잔고 셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0);
//잔고수량 0 이상, 매수포지션일때
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//잔고 수량 모두 시장가 청산(매도주문)
BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1);
Main.MessageList("----------------");
Main.MessageList("매수청산",Position)
}
}
// Position = -1일때 ExitShort 완성 신호 발생하면
if (Signal.signalKind == 4 && Position == -1)
{
//포지션 설정
Position = 0 ;
// Snum 매도주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(Snum);
//미체결된 매도수량이 0 이상이면 취소주문
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(Snum);
}
//잔고 셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0);
//잔고수량 0 이상, 매도포지션일때
if (Account1.Unfill.count > 0 && Account1.Balance.position == 1)
{
//잔고 수량 모두 시장가 청산(매수주문)
SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1);
Main.MessageList("----------------");
Main.MessageList("매도청산",Position)
}
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//Position이 1인 상태에서 주문응답아이디와 BEID가 같으면
if (Position == 1 && OrderResponse.orderID == BEID)
{
//주문이 정상접수이면 Bnum에 주문번호 저장
if (OrderResponse.isNormal == true)
{
Bnum = OrderResponse.orderNum;
//지정가 주문일 경우 1번타이머 5초(시장가정상접수이면 타이머 동작안함)
if (OrderResponse.priceKind == 2)
{
Main.SetTimer(1, 5000);
}
}
else
{
//주문거부일 경우 1번타이머 5초
Main.SetTimer(1, 5000);
}
}
//매수진입주문 취소주문이 발생하면 나머지 수량을 시장가로 주문
if (Position == 1 && OrderResponse.orderID == BECID)
{
//매수주문번호는 -1로 초기화
Bnum = -1;
BEID = Account1.OrderBuy(Main.GetOrderCode(MarketData11.code), BV,0, 1);
}
//매수청산 주문이 접수거부
if (OrderResponse.orderID == BXID)
{
if (OrderResponse.isNormal == false)
{
Main.SetTimer(2, 5000);
}
}
//Position이 -1인 상태에서 주문응답아이디와 SEID가 같으면
if (Position == -1 && OrderResponse.orderID == SEID)
{
//주문이 정상접수이면 Bnum에 주문번호 저장
if (OrderResponse.isNormal == true)
{
Bnum = OrderResponse.orderNum;
//지정가 주문일 경우 3타이머 5초(시장가정상접수이면 타이머 동작안함)
if (OrderResponse.priceKind == 2)
{
Main.SetTimer(3, 5000);
}
}
else
{
//주문거부일 경우 3번타이머 5초
Main.SetTimer(3, 5000);
}
}
//매도진입주문 취소주문이 발생하면 나머지 수량을 시장가로 주문
if (Position == 1 && OrderResponse.orderID == SECID)
{
//매수주문번호는 -1로 초기화
Snum = -1;
SEID = Account1.OrderSell(Main.GetOrderCode(MarketData11.code), SV,0, 1);
}
//매도청산 주문이 접수거부
if (OrderResponse.orderID == SXID)
{
if (OrderResponse.isNormal == false)
{
Main.SetTimer(4, 5000);
}
}
}
function Main_OnTimer(nEventID)
{
//1번 타이머 동작
if (nEventID == 1)
{
//타이머 종료
Main.KillTimer(1);
//지정가 주문이 정상접수되어 번호가 저장된 상태이면
if (Bnum >= 0)
{
//미체결셋팅
Account1.SetUnfillOrderNumber(Bnum);
//미체결이 있으면
if (Account1.Unfill.count > 0)
{
//미체결 수량 저장하고
BV = Account1.Unfill.count;
//주문취소 하고 취소주문 응답시에 시장가로 주문
BECID = Account1.OrderCancel(Bnum);
}
}
else //주문접수가 거부이면
{
//시장가로 주문
BID = Account1.OrderBuy(Main.GetOrderCode(MarketData11.code),BV,0,1);
}
}
if (nEventID == 2)
{
Main.KillTimer(2);
//잔고 셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0);
//잔고수량 0 이상, 매수포지션일때
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//잔고 수량 모두 시장가 청산(매도주문)
BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1);
}
}
//3번 타이머 동작
if (nEventID == 1)
{
//타이머 종료
Main.KillTimer(3);
//지정가 주문이 정상접수되어 번호가 저장된 상태이면
if (Snum >= 0)
{
//미체결셋팅
Account1.SetUnfillOrderNumber(Snum);
//미체결이 있으면
if (Account1.Unfill.count > 0)
{
//미체결 수량 저장하고
SV = Account1.Unfill.count;
//주문취소 하고 취소주문 응답시에 시장가로 주문
SECID = Account1.OrderCancel(Snum);
}
}
else //주문접수가 거부이면
{
//시장가로 주문
SEID = Account1.OrderSell(Main.GetOrderCode(MarketData11.code),SV,0,1);
}
}
if (nEventID == 4)
{
Main.KillTimer(4);
//잔고 셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0);
//잔고수량 0 이상, 매수포지션일때
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
//잔고 수량 모두 시장가 청산(매수주문)
SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1);
}
}
}
즐거운 하루되세요
> swhinc 님이 쓴 글입니다.
> 제목 : 스팟수식 부탁드립니다.
> 예스랭귀지 차트 신호대로 매매를 하려고 하는데
스팟을 이용하면 주문 체결 여부나 오류발생 때 대응할 수 있다고 해서 공부해보려고 했으나 너무 어렵네요..
1. 미니나스닥 신호대로 마이크로 나스닥 4계약 매매
2.
접수된 주문이 없고, 포지션이 없을 때,
-진입 미완성 신호 = 무시
-진입 완성신호 = 현재가로 주문.
접수된 주문이 없고, 포지션이 있을 때,
-청산 미완성/완성 신호 = 시장가 주문.
3. 주문 후 5초안에 오류가 발생하거나 체결이 안되면 기존 주문 취소 후 체결 될 때까지 5초마다 시장가로 재주문
1번은 차트객체 추가해서 미니나스닥 차트아이디 적용하고, 종목객체 추가해서 마이크로 나스닥 지정했고 계약수를 4로 어디서 바꾸죠?
2번은 도움말, 답변보면서 눈치껏 적었는데 의도한대로 작성됬는지 모르겠네요
3번은 어떻게 추가해야할지 잘 모르겠어요
-------------스크립트 시작-------------
var Position;
var BID;
var SID;
var Snum;
var Bnum;
function Main_OnStart()
{
Main.MessageList("Start");
Position = 0;
}
//(ExitLong)(ExitShort)
//시스템미완성 신호 발생
function Chart1_OnRiseIncompleteSignal(IncompleteSignal)
{
// Position = 1일때 ExitLong 미완성 신호 발생하면
if (IncompleteSignal.signalKind == 2 && Position == 1)
{
//포지션 설정
Position = 0 ;
//BNum 매수주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(BNum);
//미체결된 매수수량이 0 이상이면 취소주문
if(Account1.Unfill.Count > 0) Account1.OrderCancel(BNum);
//잔고 셋팅
Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code));
//잔고수량 0 이상, 매수포지션일때
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//잔고 수량 모두 시장가 청산(매도주문)
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1);
Main.MessageList("----------------");
Main.MessageList("매수청산",Position)
}
}
// Position = -1일때 ExitShort 미완성 신호 발생하면
if (IncompleteSignal.signalKind == 4 && Position == -1)
{
//포지션 설정
Position = 0 ;
// SNum 매도주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(SNum);
//미체결된 매도수량이 0 이상이면 취소주문
if (Account1.Unfill.count > 0) Account1.OrderCancel(SNum);
//잔고 셋팅
Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code));
//잔고수량 0 이상, 매도포지션일때
if (Account1.Unfill.count > 0 && Account1.Balance.position == -1)
{
//잔고 수량 모두 시장가 청산(매수주문)
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code));
Main.MessageList("----------------");
Main.MessageList("매도청산",Position)
}
}
}
//(Buy)(Sell)
//완성 신호 발생
function Chart1_OnRiseSignal(Signal)
{
//Position = 0일때 buy 완성 신호 최초발생하면
if (Signal.signalKind == 1 && Position == 0 )
{
BID = Account1.OrderBuy(Main.GetOrderCode(MarketData11.code), Math.abs(Signal.count), 0, 1 );
Position = 1 ;
Main.MessageList("----------------");
Main.MessageList("매수진입", Position);
}
//Position = 0일때 Sell 완성 신호 최초발생하면
if (Signal.signalKind == 3 && Position == 0)
{
SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Math.abs(Signal.count), 0, 1 );
Position = -1 ;
Main.MessageList("----------------");
Main.MessageList("매도진입", Position);
}
// Position = 1일때 ExitLong 완성 신호 발생하면
if (Signal.signalKind == 2 && Position == 1)
{
//포지션 설정
Position = 0 ;
//BNum 매수주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(BNum);
//미체결된 매수수량이 0 이상이면 취소주문
if(Account1.Unfill.Count > 0) Account1.OrderCancel(BNum);
//잔고 셋팅
Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code));
//잔고수량 0 이상, 매수포지션일때
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//잔고 수량 모두 시장가 청산(매도주문)
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1);
Main.MessageList("----------------");
Main.MessageList("매수청산",Position)
}
}
// Position = -1일때 ExitShort 완성 신호 발생하면
if (Signal.signalKind == 4 && Position == -1)
{
//포지션 설정
Position = 0 ;
// SNum 매도주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(SNum);
//미체결된 매도수량이 0 이상이면 취소주문
if (Account1.Unfill.count > 0) Account1.OrderCancel(SNum);
//잔고 셋팅
Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code));
//잔고수량 0 이상, 매도포지션일때
if (Account1.Unfill.count > 0 && Account1.Balance.position == -1)
{
//잔고 수량 모두 시장가 청산(매수주문)
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code));
Main.MessageList("----------------");
Main.MessageList("매도청산",Position)
}
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//Position이 1인 상태에서 주문응답아이디와 BID가 같으면
//BNum에 주문번호 저장
if (Position == 1 && OrderResponse.orderID == BID)
{
BNum = OrderResponse.orderNum;
}
//Position이 -1인 상태에서 주문응답아이디와 SID가 같으면
//SNum에 주문번호 저장
if (Position == -1 && OrderResponse.orderID == SID)
{
SNum = OrderResponse.orderNum;
}
}