예스스탁
예스스탁 답변
2017-11-21 18:02:53
안녕하세요
예스스탁입니다.
스팟 수식에 대한 답변은 전반적인 수식작성의 가이드정도 입니다.
세부적인 부분은 테스트하셔서 직접 수정보완하셔야 합니다.
이용에 참고하시기 바랍니다.
1
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
if (lUp*dateID == 20001)
{
if (Account1.Balance.count == 0 && FPrice == 0)
{
BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1);
}
위 내용이면
현재 잔고가 없고 FPrice가 0이면 체결전까지
실시간으로 시세가 들어올때마다 계속 주문이 집행됩니다.
잔고가 없고 FPrice가 0이면 한번만 주문이 집행되게 하셔야 합니다.
2
추가진입도 체결확인하고 다음주문 발생하게 처리했습니다.
3
계좌리프레쉬는 1분마다 한번씩 작동하게 작성해 드립니다.
4
var BuyID,BuyNum,FPrice,Order,BBID,BBnum,RF;
//스팟시작
function Main_OnStart()
{
//MarketData1종목 잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//내부파일에 FPrice에 적어놓은 값을 가져와 다시 변수에 저장
var aa = Main.GetUserValue("FPrice");
if (aa == "" || Account1.Balance.count == 0)
FPrice = 0;
else
FPrice = aa;
Order = true;
Main.SetTimer(1, 60000);//60초, 1000이 1초
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
if (lUp*dateID == 20001)
{
//무포지션에서 첫진입
if (Order == true && RF == false && Account1.Balance.count == 0 && FPrice == 0)
{
BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1);
FPrice = MarketData1.current;
Order = false;
}
//첫진입 체결후 3틱 상승시 마다 매수주문
if (Order == true && && RF == false
Account1.Balance.count > 0 &&
FPrice > 0 &&
MarketData1.current >= FPrice + MarketData1.GetTickSize()*3)
{
Order = false;
BBID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1);
FPrice = FPrice + MarketData1.GetTickSize()*3;
Main.SetUserValue("FPrice",FPrice);
}
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//주문번호저장
if (OrderResponse.orderID == BuyID )
{
BuyNum = OrderResponse.orderNum;
}
if (OrderResponse.orderID == BBID )
{
BBNum = OrderResponse.orderNum;
}
}
//체결응답
function Main_OnNotifyFill(NotifyFill)
{
//첫진입 체결가 저장
if (NotifyFill.orderNum == BuyNum)
{
FPrice = NotifyFill.fillPrice;
Order = true;
Main.SetUserValue("FPrice",FPrice);
}
if (NotifyFill.orderNum == BBNum)
{
Order = true;
}
}
//계좌잔고에서 MarketData1이 완전청산되면 FPrice 변수 0으로 셋팅
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002)
{
FPrice = 0;
Main.SetUserValue("FPrice",FPrice);
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
}
if (lUp*dateID == 30000)
{
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
RF = false;
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Account1.Refresh();
RF = true;
}
}
즐거운 하루되세요
> 종호 님이 쓴 글입니다.
> 제목 : 수식 수정 요청드립니다.
> 아래수식은 무포지션일 때 최초 매수가 들어가고 그 이후에 최초 매수가격에 상방으로
첫진입 체결후 3틱 상승시 마다 매수주문이 들어 가고 있습니다.
그런데 최초 진입이나 중간에서 진입이나 1개가 될 때도 있지만 동시에 여러개가 될 때가 많다는 것을 확인했습니다. 특히 거래량이 많고 순간적인 작은 1틱의 변화에 수 많은 복수 동시 진입이 되는 것을 확인했습니다.
1개의 진입이 체결돨 때까지 복수 진입신호를 허용하지 않아 1개의 수량만 진입이 되도록 부탁드립니다.
그리고 청산후에 다시 무포지션이 되어 재진입이 될 때가 있고 안될 때가 있습니다.
이것도 수정해 주시면 감사하겠습니다.
Account1.Refresh() 기능도 추가 되었으면 좋겠습니다.
//종목객체 MarketData1 --> 속성에서 주문낼 종목으로 지정
//계좌객체 Account1 --> 주문낼 계좌
var BuyID,BuyNum,FPrice;
//스팟시작
function Main_OnStart()
{
//MarketData1종목 잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//내부파일에 FPrice에 적어놓은 값을 가져와 다시 변수에 저장
var aa = Main.GetUserValue("FPrice");
if (aa == "" || Account1.Balance.count == 0)
FPrice = 0;
else
FPrice = aa;
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
if (lUp*dateID == 20001)
{
//무포지션에서 첫진입
if (Account1.Balance.count == 0 && FPrice == 0)
{
BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1);
}
//첫진입 체결후 3틱 상승시 마다 매수주문
if (Account1.Balance.count > 0 &&
FPrice > 0 &&
MarketData1.current >= FPrice + MarketData1.GetTickSize()*3)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1);
FPrice = FPrice + MarketData1.GetTickSize()*3;
Main.SetUserValue("FPrice",FPrice);
}
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//주문번호저장
if (OrderResponse.orderID == BuyID )
{
BuyNum = OrderResponse.orderNum;
}
}
//체결응답
function Main_OnNotifyFill(NotifyFill)
{
//첫진입 체결가 저장
if (NotifyFill.orderNum == BuyNum)
{
FPrice = NotifyFill.fillPrice;
Main.SetUserValue("FPrice",FPrice);
}
}
//계좌잔고에서 MarketData1이 완전청산되면 FPrice 변수 0으로 셋팅
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002)
{
FPrice = 0;
Main.SetUserValue("FPrice",FPrice);
}
}