질문 있습니다.
for 문을 돌아가면서 분할매수한 종목들을 데이터베이스에 저장하는 코드를 작성했는데, 각 분할 차수의 마지막 종목만 들어가네요?
for (var i = 1 ; i < buycount+1 ; i++)
{
ID = A1.OrderBuy(Main.GetOrderCode(ItemCode[i]), Math.floor(EachBal/ItemPrice[i]/InputVar1)- Math.floor((EachBal/ItemPrice[i])/InputVar1)%ItemUnits[i],Item[i].Bid(1),0);
Main.MessageLog("ID: "+ ID +" 분할 매수 종목 : "+ Item[i].code + " 매수가: " + Item[i].Bid(1));
}
위와 같이 for문 돌면서 주문을 내고요, ID 정상적으로 찍히는 것은 로그로 확인했습니다.
한 종목 주문이 들어갈 때마다 주문응답객체가 생성되고, 체결되면 체결통보객체가 생성되므로,
아래 코드처럼 처리하면 데이터베이스에 순차적으로 저장될 것이라고 생각했습니다.
function Main_OnOrderResponse(OrderResponse)
{
if(OrderResponse.orderID == ID && OrderResponse.orderKind == 1)
{
OrderNum_s.push(OrderResponse.orderNum); //매도주문 목록에 주문번호 저장
}
else if(OrderResponse.orderID == ID && OrderResponse.orderKind == 2)
{
OrderNum_b.push(OrderResponse.orderNum); //매수주문 목록에 주문번호 저장
}
}
function Main_OnNotifyFill(NotifyFill)
{
var checkOrderBuy = OrderNum_b.indexOf(NotifyFill.orderNum);
var checkOrderSell = OrderNum_s.indexOf(NotifyFill.orderNum);
if( checkOrderSell != -1 && NotifyFill.orderKind == 1) //주문번호가 매도주문목록에 있으면 진행
{
var stockcode = NotifyFill.code;
var sellcount = NotifyFill.fillCount;
var sellprice = NotifyFill.fillPrice;
var orderkind = 1;
var ordernumber = NotifyFill.orderNum;
D1.Inse rt("db_fill VALUES (" + y_date + ", '"+ stockcode +"', 'A" + stockcode +"', "+ sellcount +", "+ sellprice +", " + orderkind + ", "+ ordernumber +")");
}
else if(checkOrderBuy != -1 && NotifyFill.orderKind == 2) //주문번호가 매수주문목록에 있으면 진행
{
var stockcode = NotifyFill.code;
var buycount = NotifyFill.fillCount;
var buyprice = NotifyFill.fillPrice;
var orderkind = 2;
var ordernumber = NotifyFill.orderNum;
D1.Inse rt("db_fill VALUES (" + logdate + ", '"+ stockcode +"', 'A" + stockcode +"', "+ buycount +", "+ buyprice +", " + orderkind + ", "+ ordernumber +")");
}
}
실제로 돌려보니까 각 회차 마지막 종목만 기록이 됩니다.
질문 1) 마지막 회차만 기록되는 원인이 혹시 for 문을 다 돌고 나서야 Main_OnOrderResponse가 작동하기 때문인가요?
질문 2) 주문응답객체와 체결통보객체는 새로운 주문/체결이 나올 때마다 기존의 것이 삭제되고 갱신되나요? 아니면 스팟 종료 시까지 축적되나요?
질문 3) 위의 경우처럼 for 문을 돌면서 주문이 들어가는 경우, 구동되는 다른 스팟 전략과 구별해서 이 스팟에서 체결된 주문만 데이터베이스에 기록되게 하려면, 어떤 방법을 추천하시나요?
질문 4) 혹시 OrderReplace로 정정 주문이 들어간 경우에도 주문응답객체가 생성되나요?
답변 1
예스스탁
예스스탁 답변
2019-10-02 15:59:18
안녕하세요
예스스탁입니다.
1
특정 이벤트 안에서 계산을 수행 중에 다른 이벤트가 발생해도
해당 이벤트의 로직으로 바로 넘어가지 않습니다.
이벤트에서 처리되는 내용이 모두 완료가 되어야 다음이벤트로 넘어가므로
for문 수행중에 바로 다음 이벤트로 넘어가지 못합니다.
이벤트를 수행중에 다른이벤트가 발생하면 해당 내용을 기억하고 있다가
현재 처리가 모두 완료되면 기억하고 있는 다음으로 넘어가게 됩니다.
주문순서대로 처리하시려면
한번에 for문으로 처리하시면 방법이 없습니다.
주문부터 기록을 하나의 사이클로 수행하고 코딩하셔야 합니다.
주문 -> 응답 -> 체결(DB기록) -> 다음주문 -> 응답 -> 체결(DB기록) -> 다음주문.....
2
최근 발생된 정보만 가지고 있습니다.
축적되거나 하지 않습니다.
3
해당 스팟수식에서 주문을 추적하는 방법은 하나입니다.
스팟주문시 주문아이디를 특정변수에 저장
--> 주문응답시 주문응답객체의 아이디와 변수가 같은지 확인해서 주문번호 저장
--> 체결응답시 저장한 주문번호와 같은 번호인지 확인입니다.
이미 올려주신 수식에 해당 내용이 반영되어 있는것 같습니다.
4
정정주문도 주문응답이 발생합니다.
즐거운 하루되세요
> 다인아빠 님이 쓴 글입니다.
> 제목 : 체결내역 데이터베이스 저장 관련 문의
> 질문 있습니다.
for 문을 돌아가면서 분할매수한 종목들을 데이터베이스에 저장하는 코드를 작성했는데, 각 분할 차수의 마지막 종목만 들어가네요?
for (var i = 1 ; i < buycount+1 ; i++)
{
ID = A1.OrderBuy(Main.GetOrderCode(ItemCode[i]), Math.floor(EachBal/ItemPrice[i]/InputVar1)- Math.floor((EachBal/ItemPrice[i])/InputVar1)%ItemUnits[i],Item[i].Bid(1),0);
Main.MessageLog("ID: "+ ID +" 분할 매수 종목 : "+ Item[i].code + " 매수가: " + Item[i].Bid(1));
}
위와 같이 for문 돌면서 주문을 내고요, ID 정상적으로 찍히는 것은 로그로 확인했습니다.
한 종목 주문이 들어갈 때마다 주문응답객체가 생성되고, 체결되면 체결통보객체가 생성되므로,
아래 코드처럼 처리하면 데이터베이스에 순차적으로 저장될 것이라고 생각했습니다.
function Main_OnOrderResponse(OrderResponse)
{
if(OrderResponse.orderID == ID && OrderResponse.orderKind == 1)
{
OrderNum_s.push(OrderResponse.orderNum); //매도주문 목록에 주문번호 저장
}
else if(OrderResponse.orderID == ID && OrderResponse.orderKind == 2)
{
OrderNum_b.push(OrderResponse.orderNum); //매수주문 목록에 주문번호 저장
}
}
function Main_OnNotifyFill(NotifyFill)
{
var checkOrderBuy = OrderNum_b.indexOf(NotifyFill.orderNum);
var checkOrderSell = OrderNum_s.indexOf(NotifyFill.orderNum);
if( checkOrderSell != -1 && NotifyFill.orderKind == 1) //주문번호가 매도주문목록에 있으면 진행
{
var stockcode = NotifyFill.code;
var sellcount = NotifyFill.fillCount;
var sellprice = NotifyFill.fillPrice;
var orderkind = 1;
var ordernumber = NotifyFill.orderNum;
D1.Inse rt("db_fill VALUES (" + y_date + ", '"+ stockcode +"', 'A" + stockcode +"', "+ sellcount +", "+ sellprice +", " + orderkind + ", "+ ordernumber +")");
}
else if(checkOrderBuy != -1 && NotifyFill.orderKind == 2) //주문번호가 매수주문목록에 있으면 진행
{
var stockcode = NotifyFill.code;
var buycount = NotifyFill.fillCount;
var buyprice = NotifyFill.fillPrice;
var orderkind = 2;
var ordernumber = NotifyFill.orderNum;
D1.Inse rt("db_fill VALUES (" + logdate + ", '"+ stockcode +"', 'A" + stockcode +"', "+ buycount +", "+ buyprice +", " + orderkind + ", "+ ordernumber +")");
}
}
실제로 돌려보니까 각 회차 마지막 종목만 기록이 됩니다.
질문 1) 마지막 회차만 기록되는 원인이 혹시 for 문을 다 돌고 나서야 Main_OnOrderResponse가 작동하기 때문인가요?
질문 2) 주문응답객체와 체결통보객체는 새로운 주문/체결이 나올 때마다 기존의 것이 삭제되고 갱신되나요? 아니면 스팟 종료 시까지 축적되나요?
질문 3) 위의 경우처럼 for 문을 돌면서 주문이 들어가는 경우, 구동되는 다른 스팟 전략과 구별해서 이 스팟에서 체결된 주문만 데이터베이스에 기록되게 하려면, 어떤 방법을 추천하시나요?
질문 4) 혹시 OrderReplace로 정정 주문이 들어간 경우에도 주문응답객체가 생성되나요?