예스스탁
예스스탁 답변
2014-07-03 16:17:11
안녕하세요
예스스탁입니다.
아래 내용 수정보완해 사용하시기 바랍니다.
기본개념은 진입신호에서 주문발생 --> 주문응답시 에러 --> 다시 주문입니다.
청산은 진입주문에 대해 체결이 발생해야 청산신호시 주문을 내게 됩니다.
이평골든데드는 시스템으로 작성후 차트에 적용하고
차트에서 신호발생하면 주문을 내게 하셔야 합니다.
스크립트 객체화면에서
차트객체 추가 --> 속성에서 객체명 Chart1, 아이디 지정후 차트에도 아이디 지정
종목객체 추가 --> 속성에서 객체명 MarketData1, 차트종목과 같은 종목으로 지정
계좌객체 추가 --> 속성에서 객체명 Account1, 계좌번호 지정
var BuyID,BuyNum,BuyStep;
var SellID,SellNum,SellStep;
function Main_OnStart()
{
BuySetp = 0;
SellStep = 0;
Start = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Start = 1;
//차트에 해당 종목 잔고가 있으면 시장가로 청산
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0)
{
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.position == 2)
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,0,1);
}
//매수주문(매도5호가)
BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5),0);
BuyStep = 1;
}
if (Start == 1 && Signal.signalKind == 2)
{
if (BuyStep == 3)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5),0);
BuyStep = 0;
}
}
if (Signal.signalKind == 3)
{
Start = 1;
//차트에 해당 종목 잔고가 있으면 시장가로 청산
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0)
{
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.position == 2)
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,0,1);
}
//매도주문(매수5호가)
SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5),0);
SellStep = 1;
}
if (Start == 1 && Signal.signalKind == 4)
{
if (SellStep == 3)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5),0);
SellStep = 0;
}
}
}
//주문응답수신
function Main_OnOrderResponse(OrderResponse)
{
//매수주문에 대한 응답
if (BuyID == OrderResponse.orderID)
{
//에러메세지가 있으면
if (OrderResponse.error.length >= 1)
{
//에러메세지 출력
Main.MessageList(OrderResponse.error.length,OrderResponse.error)
//다시 매수주문
BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5),0);
}
//에러메세지가 없으면
if (OrderResponse.error.length == 0)
{
BuyNum = OrderResponse.orderNum;
BuyStep = 2;
}
}
//매도주문에 대한 응답
if (SellID == OrderResponse.orderID)
{
//에러메세지가 있으면
if (OrderResponse.error.length >= 1)
{
//에러메세지 출력
Main.MessageList(OrderResponse.error.length,OrderResponse.error)
//다시 매도주문
SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5),0);
}
//에러메세지가 없으면
if (OrderResponse.error.length == 0)
{
SellNum = OrderResponse.orderNum;
SellStep = 2;
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (BuyNum == NotifyFill.orderNum)
{
BuyStep = 3;
}
if (SellNum == NotifyFill.orderNum)
{
SellStep = 3;
}
}
즐거운 하루되세요
> 무결점 님이 쓴 글입니다.
> 제목 : 문의 드립니다.
> 이동평균선 골든크로스 매수.(만약 급격한 시세 변동으로 주문거부가 될 경우 계속 시도)
이동평균선 데드크로스 매도.(만약 급격한 시세 변동으로 주문거부가 될 경우 계속 시도)
* 매수하기전에 잔고를 확인해서 미결제가 있는지 없는지 확인해서
미결제가 있으면 청산한후 매수하고, 미결제가 없으면 바로 매수.
* 매도하기전에 잔고를 확인해서 미결제가 있는지 없는지 확인해서
미결제가 있으면 청산한후 매도하고, 미결제가 없으면 바로 매도.
★ CME 거래소 같은 경우에는 프로텍션 보호법에 의해서
급격한 시세 변동시에 주문거부가 되는 경우가 있습니다...
그러면 진입신호가 거부가 될 경우 청산신호를 진입을 해버리는 문제가 발생하는데요.
그래서 신호가 거부되면 재차 다시 그 신호를 쏴주는걸 원합니다.
즉 매수신호→매수청산→매도신호→매도청산
여기서 매수신호가 거부되면 매수청산을 진입해 버리는 문제가 발생합니다.
그러므로 매수신호가 거부가 되면 계속 신호를 쏴서 매수를 체결시킨후에
그 다음으로 넘어가야 문제가 안생깁니다.