예스스탁
예스스탁 답변
2014-08-12 18:55:07
안녕하세요
예스스탁입니다.
아래 내용 참고하시기 바랍니다.
스팟답변은 가이드라인이므로 수식의 주석으로 흐름 참고하셔서 수정보완해 사용하시기 바랍니다.
차트객체 Chart1
종목객체 MarketData1
계좌객체 Account1
var Start, OrderCode,SK;
var BEID, BXID, SEID, SXID;
var BxVol,SxVol;
function Main_OnStart()
{
Start = 0;
OrderCode = Main.GetOrderCode(Chart1.GetCode(1));
}
function Chart1_OnRiseSignal(Signal)
{
SK = Signal.signalKind;
//Buy 신호
if (SK == 1)
{
Start = 1;
//Buy신호발생하면 매수진입주문의 실행여부를 판단하는 BuyOrderAble는 false
BuyOrderAble = false;
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매수주문하고 BuyOrderAble은 true
if (BuyOrderAble == false && Account1.Balance.count == 0)
{
BEID = Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
BuyOrderAble = true;
}
}
//Exitlong 신호
if (Start == 1 && SK == 1)
{
//청산신호 수량
BxVol = Signal.count;
//주문 후 체결량 카운트할 변수
BXfill = 0;
BXID = Account1.OrderSell(OrderCode,BxVol,MarketData1.current - MarketData1.GetTickSize()*5, 0);
}
//Sell 신호
if (SK == 3)
{
Start = 1;
//Sell신호발생하면 매도진입주문의 실행여부를 판단하는 SellOrderAble는 false
SellOrderAble = false;
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매도진입 주문하고 SellOrderAble은 true
if (SellOrderAble == false && Account1.Balance.count == 0)
{
SEID = Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
SellOrderAble = true;
}
}
//ExitShort 신호
if (Start == 1 && SK == 4)
{
//청산신호 수량
SxVol = Signal.count;
//주문 후 체결량 카운트할 변수
SXfill = 0;
SXID = Account1.OrderBuy(OrderCode,SxVol,MarketData1.current + MarketData1.GetTickSize()*5, 0);
}
}
//각 주문의 주문 번호 저장
function Main_OnOrderResponse(OrderResponse)
{
if (BEID == OrderResponse.orderID)
BENum = OrderResponse.orderNum;
if (BXID == OrderResponse.orderID)
BXNum = OrderResponse.orderNum;
if (SEID == OrderResponse.orderID)
SENum = OrderResponse.orderNum;
if (SXID == OrderResponse.orderID)
SXNum = OrderResponse.orderNum;
}
function Main_OnNotifyFill(NotifyFill)
{
//매수청산 주문 체결
if (NotifyFill.orderNum == BXNum)
{
//체결수량 합계
//수량이 복수일 경우 분할로 체결될수 있으므로 동일 주문번호로 체결된것을 합해야함)
BxFill = BxFill + NotifyFill.fillCount;
//매수청산주문이 모두 체결(BxFill == BxVol)되고
//최근 발생신호가 매도진입(SK==3)이고
//신호발생시 잔고가 있어 주문되지 못했다면(SellOrderAble == false)
//매도주문 실행
if (BxFill == BxVol && SK == 3 && SellOrderAble == false)
{
SEID = Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
}
}
if (NotifyFill.orderNum == SXNum)
{
//체결수량 합계
//수량이 복수일 경우 분할로 체결될수 있으므로 동일 주문번호로 체결된것을 합해야함)
SxFill = SxFill + NotifyFill.fillCount;
//매도청산주문이 모두 체결(SxFill == SxVol)되고
//최근 발생신호가 매수진입(SK==1)이고
//신호발생시 잔고가 있어 주문되지 못했다면(BuyOrderAble == false)
//매도주문 실행
if (SxFill == SxVol && SK == 1 && BuyOrderAble == false)
{
BEID = Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
}
}
}
위식에서 주문응답과 체결과 신호수신의 이벤트가 시간이 엇갈릴 여지도 있습니다.
리버스일경우 청산과 진입이 동시에 발생되고 청산에 대한 주문응답과 체결도
거의 시차 없이 진행될수 있습니다. 그러므로 진입신호에서 잔고를 판단해서 잔고있다고 판단하고
체결이벤트로 가기 전에 체결이벤트를 감시를 시작하기 이전에 청산에 대한 체결이 발생하게 될수있습니다.
아래식은 위에 식보다는 간단한 구조입니다.
진입신호가 발생하면 잔고에 수량이 없으면 바로 주문하고
수량이 있으면 타이머를 셋팅해서 1초단위로 잔고를 감시해서 잔고가 0이 되면
주문을 하게 하는 내용입니다. 물론 타이머는 500으로 지정하시면 0.5초 단위로도 감시가 가능합니다.
식의 구조도 간단하고 청산의 체결이벤트에서 동작하는 것보다는 더 좋은 방법 같아서 같이 올려드립니다.
var Start, OrderCode, SK;
function Main_OnStart()
{
Start = 0;
OrderCode = Main.GetOrderCode(Chart1.GetCode(1));
}
function Chart1_OnRiseSignal(Signal)
{
SK = Signal.signalKind;
//Buy 신호
if (SK == 1)
{
Start = 1;
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매수주문
if (Account1.Balance.count == 0)
{
Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
}
//잔고가 있으면 1번 타이머 셋팅
if (Account1.Balance.count > 0)
{
Main.SetTimer(1, 1000);
}
}
//Exitlong 신호
if (Start == 1 && SK == 1)
{
Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
}
//Sell 신호
if (SK == 3)
{
Start = 1;
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매도진입 주문
if (Account1.Balance.count == 0)
{
Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
SellOrderAble = true;
}
//잔고가 있으면 2번 타이머 셋팅
if (Account1.Balance.count > 0)
{
Main.SetTimer(2, 1000);
}
}
//ExitShort 신호
if (Start == 1 && SK == 4)
{
SXID = Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
}
}
function Main_OnTimer(nEventID)
{
//1번타이머 동작(1초간격으로 잔고 감시)
if (nEventID == 1);
{
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매수주문
if (Account1.Balance.count == 0)
{
Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
//주문후 타이머 종료
Main.KillTimer(1);
}
}
//2번타이머 동작(1초간격으로 잔고 감시)
if (nEventID == 2);
{
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매도진입 주문
if (Account1.Balance.count == 0)
{
Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
//주문후 타이머 종료
Main.KillTimer(2);
}
}
}
즐거운 하루되세요
> 뚱띵 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 항상 감사하다는 말씀 먼저 드리고 시작합니다.
예스에서 신호를 받아 예스스팟에서 처리하는 것으로 (연결선물)
기존의 잔고가 없을시는 예스의 진입신호 발생시 현재가 +-5틱으로 즉시 주문이 나가고
기존의 잔고가 있고 예스에서 청산신호만 발생시 현재가 +-5틱으로 즉시 주문이 나가고
기존의 잔고가 있고 리버스 신호가 발생해서 청산 및 반대 방향으로 신규진입이
이루어져야 하는 상황에서는 증거금 확보를 위하여
1. 기존의 잔고의 청산신호는 예스신호 발생즉시 현재가 +-5틱으로 나가고
2. 반대방향 신규진입은 기존의 잔고청산 주문의 체결통보가 온 즉시 현재가 +-5틱으로 나가는 겁니다.
기존의 예스의 진입주문 지연은 그냥 시간을 몇초 늘리는 거고 기존의 잔고가 없을 시에도
신규주문시 지연되어 슬리피지가 양산되는 상황이라.
스팟을 이용해 잔고가 없을 때는 그냥 예쓰의 일반주문처럼 즉시 나가고
잔고가 있을 때는 기존의 청산주문은 즉시 나가고 신규주문은 청산주문의 체결통보가
온 후에 나가게 하고 싶습니다.
혹시 잔고 없을시 신규주문과 잔고 있을시 청산 후의 신규주문이 구별하기 불가하여
어려울 경우 체결통보에서 증거금 부족과 같은 문구가 뜨면 그때 신규주문이 다시 나가는
방법도 생각해 봐 주십시요.
꼭 부탁드리겠습니다.
예스스탁
예스스탁 답변
2014-10-21 13:48:16
var Start, OrderCode, SK, BB, SS;
function Main_OnStart()
{
Start = 0;
OrderCode = Main.GetOrderCode(Chart1.GetCode(1));
}
function Chart1_OnRiseSignal(Signal)
{
SK = Signal.signalKind;
//Buy 신호
if (SK == 1)
{
Start = 1;
//잔고셋팅
BB = Math.abs(Signal.count);
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매수주문
if (Account1.Balance.count == 0)
{
Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
}
//잔고가 있으면 1번 타이머 셋팅
if (Account1.Balance.count > 0)
{
Main.SetTimer(1, 1000);
}
}
//Exitlong 신호
if (Start == 1 && SK == 2)
{
Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
}
//Sell 신호
if (SK == 3)
{
Start = 1;
//잔고셋팅
SS = Math.abs(Signal.count);
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매도진입 주문
if (Account1.Balance.count == 0)
{
Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
SellOrderAble = true;
}
//잔고가 있으면 2번 타이머 셋팅
if (Account1.Balance.count > 0)
{
Main.SetTimer(2, 1000);
}
}
//ExitShort 신호
if (Start == 1 && SK == 4)
{
SXID = Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
}
}
function Main_OnTimer(nEventID)
{
//1번타이머 동작(1초간격으로 잔고 감시)
if (nEventID == 1);
{
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매수주문
if (Account1.Balance.count == 0)
{
Account1.OrderBuy(OrderCode,BB,MarketData1.current + MarketData1.GetTickSize()*5, 0);
//주문후 타이머 종료
Main.KillTimer(1);
}
}
//2번타이머 동작(1초간격으로 잔고 감시)
if (nEventID == 2);
{
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매도진입 주문
if (Account1.Balance.count == 0)
{
Account1.OrderSell(OrderCode,SS,MarketData1.current - MarketData1.GetTickSize()*5, 0);
//주문후 타이머 종료
Main.KillTimer(2);
}
}
}
즐거운 하루되세요
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의드립니다.
> 안녕하세요
예스스탁입니다.
아래 내용 참고하시기 바랍니다.
스팟답변은 가이드라인이므로 수식의 주석으로 흐름 참고하셔서 수정보완해 사용하시기 바랍니다.
차트객체 Chart1
종목객체 MarketData1
계좌객체 Account1
var Start, OrderCode,SK;
var BEID, BXID, SEID, SXID;
var BxVol,SxVol;
function Main_OnStart()
{
Start = 0;
OrderCode = Main.GetOrderCode(Chart1.GetCode(1));
}
function Chart1_OnRiseSignal(Signal)
{
SK = Signal.signalKind;
//Buy 신호
if (SK == 1)
{
Start = 1;
//Buy신호발생하면 매수진입주문의 실행여부를 판단하는 BuyOrderAble는 false
BuyOrderAble = false;
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매수주문하고 BuyOrderAble은 true
if (BuyOrderAble == false && Account1.Balance.count == 0)
{
BEID = Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
BuyOrderAble = true;
}
}
//Exitlong 신호
if (Start == 1 && SK == 1)
{
//청산신호 수량
BxVol = Signal.count;
//주문 후 체결량 카운트할 변수
BXfill = 0;
BXID = Account1.OrderSell(OrderCode,BxVol,MarketData1.current - MarketData1.GetTickSize()*5, 0);
}
//Sell 신호
if (SK == 3)
{
Start = 1;
//Sell신호발생하면 매도진입주문의 실행여부를 판단하는 SellOrderAble는 false
SellOrderAble = false;
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매도진입 주문하고 SellOrderAble은 true
if (SellOrderAble == false && Account1.Balance.count == 0)
{
SEID = Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
SellOrderAble = true;
}
}
//ExitShort 신호
if (Start == 1 && SK == 4)
{
//청산신호 수량
SxVol = Signal.count;
//주문 후 체결량 카운트할 변수
SXfill = 0;
SXID = Account1.OrderBuy(OrderCode,SxVol,MarketData1.current + MarketData1.GetTickSize()*5, 0);
}
}
//각 주문의 주문 번호 저장
function Main_OnOrderResponse(OrderResponse)
{
if (BEID == OrderResponse.orderID)
BENum = OrderResponse.orderNum;
if (BXID == OrderResponse.orderID)
BXNum = OrderResponse.orderNum;
if (SEID == OrderResponse.orderID)
SENum = OrderResponse.orderNum;
if (SXID == OrderResponse.orderID)
SXNum = OrderResponse.orderNum;
}
function Main_OnNotifyFill(NotifyFill)
{
//매수청산 주문 체결
if (NotifyFill.orderNum == BXNum)
{
//체결수량 합계
//수량이 복수일 경우 분할로 체결될수 있으므로 동일 주문번호로 체결된것을 합해야함)
BxFill = BxFill + NotifyFill.fillCount;
//매수청산주문이 모두 체결(BxFill == BxVol)되고
//최근 발생신호가 매도진입(SK==3)이고
//신호발생시 잔고가 있어 주문되지 못했다면(SellOrderAble == false)
//매도주문 실행
if (BxFill == BxVol && SK == 3 && SellOrderAble == false)
{
SEID = Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
}
}
if (NotifyFill.orderNum == SXNum)
{
//체결수량 합계
//수량이 복수일 경우 분할로 체결될수 있으므로 동일 주문번호로 체결된것을 합해야함)
SxFill = SxFill + NotifyFill.fillCount;
//매도청산주문이 모두 체결(SxFill == SxVol)되고
//최근 발생신호가 매수진입(SK==1)이고
//신호발생시 잔고가 있어 주문되지 못했다면(BuyOrderAble == false)
//매도주문 실행
if (SxFill == SxVol && SK == 1 && BuyOrderAble == false)
{
BEID = Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
}
}
}
위식에서 주문응답과 체결과 신호수신의 이벤트가 시간이 엇갈릴 여지도 있습니다.
리버스일경우 청산과 진입이 동시에 발생되고 청산에 대한 주문응답과 체결도
거의 시차 없이 진행될수 있습니다. 그러므로 진입신호에서 잔고를 판단해서 잔고있다고 판단하고
체결이벤트로 가기 전에 체결이벤트를 감시를 시작하기 이전에 청산에 대한 체결이 발생하게 될수있습니다.
아래식은 위에 식보다는 간단한 구조입니다.
진입신호가 발생하면 잔고에 수량이 없으면 바로 주문하고
수량이 있으면 타이머를 셋팅해서 1초단위로 잔고를 감시해서 잔고가 0이 되면
주문을 하게 하는 내용입니다. 물론 타이머는 500으로 지정하시면 0.5초 단위로도 감시가 가능합니다.
식의 구조도 간단하고 청산의 체결이벤트에서 동작하는 것보다는 더 좋은 방법 같아서 같이 올려드립니다.
var Start, OrderCode, SK;
function Main_OnStart()
{
Start = 0;
OrderCode = Main.GetOrderCode(Chart1.GetCode(1));
}
function Chart1_OnRiseSignal(Signal)
{
SK = Signal.signalKind;
//Buy 신호
if (SK == 1)
{
Start = 1;
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매수주문
if (Account1.Balance.count == 0)
{
Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
}
//잔고가 있으면 1번 타이머 셋팅
if (Account1.Balance.count > 0)
{
Main.SetTimer(1, 1000);
}
}
//Exitlong 신호
if (Start == 1 && SK == 1)
{
Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
}
//Sell 신호
if (SK == 3)
{
Start = 1;
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매도진입 주문
if (Account1.Balance.count == 0)
{
Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
SellOrderAble = true;
}
//잔고가 있으면 2번 타이머 셋팅
if (Account1.Balance.count > 0)
{
Main.SetTimer(2, 1000);
}
}
//ExitShort 신호
if (Start == 1 && SK == 4)
{
SXID = Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
}
}
function Main_OnTimer(nEventID)
{
//1번타이머 동작(1초간격으로 잔고 감시)
if (nEventID == 1);
{
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매수주문
if (Account1.Balance.count == 0)
{
Account1.OrderBuy(OrderCode,Signal.count,MarketData1.current + MarketData1.GetTickSize()*5, 0);
//주문후 타이머 종료
Main.KillTimer(1);
}
}
//2번타이머 동작(1초간격으로 잔고 감시)
if (nEventID == 2);
{
//잔고셋팅
Account1.SetBalanceItem(OrderCode, 0);
//잔고가 0이면 매도진입 주문
if (Account1.Balance.count == 0)
{
Account1.OrderSell(OrderCode,Signal.count,MarketData1.current - MarketData1.GetTickSize()*5, 0);
//주문후 타이머 종료
Main.KillTimer(2);
}
}
}
즐거운 하루되세요
> 뚱띵 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 항상 감사하다는 말씀 먼저 드리고 시작합니다.
예스에서 신호를 받아 예스스팟에서 처리하는 것으로 (연결선물)
기존의 잔고가 없을시는 예스의 진입신호 발생시 현재가 +-5틱으로 즉시 주문이 나가고
기존의 잔고가 있고 예스에서 청산신호만 발생시 현재가 +-5틱으로 즉시 주문이 나가고
기존의 잔고가 있고 리버스 신호가 발생해서 청산 및 반대 방향으로 신규진입이
이루어져야 하는 상황에서는 증거금 확보를 위하여
1. 기존의 잔고의 청산신호는 예스신호 발생즉시 현재가 +-5틱으로 나가고
2. 반대방향 신규진입은 기존의 잔고청산 주문의 체결통보가 온 즉시 현재가 +-5틱으로 나가는 겁니다.
기존의 예스의 진입주문 지연은 그냥 시간을 몇초 늘리는 거고 기존의 잔고가 없을 시에도
신규주문시 지연되어 슬리피지가 양산되는 상황이라.
스팟을 이용해 잔고가 없을 때는 그냥 예쓰의 일반주문처럼 즉시 나가고
잔고가 있을 때는 기존의 청산주문은 즉시 나가고 신규주문은 청산주문의 체결통보가
온 후에 나가게 하고 싶습니다.
혹시 잔고 없을시 신규주문과 잔고 있을시 청산 후의 신규주문이 구별하기 불가하여
어려울 경우 체결통보에서 증거금 부족과 같은 문구가 뜨면 그때 신규주문이 다시 나가는
방법도 생각해 봐 주십시요.
꼭 부탁드리겠습니다.