답변완료
체결내역 데이터베이스 저장 관련 문의
질문 있습니다.
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로 정정 주문이 들어간 경우에도 주문응답객체가 생성되나요?
2019-09-23
3518
글번호 225005
답변완료
ChartEx 정보 property 요청
function Main_OnStart()
{
var chartItem = new ReqChartItem("00000000", 30, CHART_PERIOD_SECOND, 5000,
CHART_REQCOUNT_BAR, false, false);
Main.ReqChartEx(chartItem, sysInfo);
}
function Main_OnRcvChartEx(ChartEx)
{
// 여기서 ChartEx 의 정보를 얻고 싶다.
}
이런 수식에서... ChartEx의 주기 등을 얻을 수 있었으면 좋겠습니다.
지금은 ChartEx.GetCode(1) 외에는 정보를 얻을 수 있는 게 없습니다.
2019-09-17
3483
글번호 224999
답변완료
ReqChartItem 초 설정 제약 완화 요청
var sysInfo = new SystemInfo(systemName,YL_TYPE_NORMAL);
var chartItem30 = new ReqChartItem("00000000", 30, CHART_PERIOD_SECOND, 5000, CHART_REQCOUNT_BAR, false, false);
var chartItem90 = new ReqChartItem("00000000", 90, CHART_PERIOD_SECOND, 5000, CHART_REQCOUNT_BAR, false, false);
Main.ReqChartEx(chartItem30, sysInfo);
Main.ReqChartEx(chartItem90, sysInfo);
위에 30초 차트는 정상 생성되고, 아시겠지만 아래 90초 차트는 60초가 넘는다고 에러 메시지가 뜹니다.
그냥 예스트레이더에서의 차트 설정과 마찬가지로, 60초가 넘어도 허용해주시면 안되나요?
2019-09-17
3578
글번호 224998
답변완료
매도, 매도식 부탁드립니다.2
==================================================================================
****매수대상 선정 방법 선택
매수시 아래 방법으로 종목선정
1. 매수 대상 선정 방법1: a. 관심종목2에 저장된 종목 호출
b. 파워종목검색
2. 매수 대상 선정 방법2: c. (a or b) 방법으로 선정된 종목 중 관심종목3에 저장된 종목을 제외
d. (a or b) 방법으로 선정된 종목 중 파워종목검색의 조건을 만족하는 종목만 선정
(((d의 검색식은 과거의 조건으로 검색하므로, 검색당일에는 검색 내용이 달라지지 않을 예정입니다.)))
*****매수방식을 조합할 수 있게 부탁드립니다*****
if (inputvar1 == 1 ) ==> a+c
if (inputvar1 == 2 ) ==> a+d
if (inputvar1 == 3 ) ==> b+c
if (inputvar1 == 4 ) ==> b+d
==================================================================================
****매수방법선택
아래의 (1-1+1-2)와 (2-1+2-2)중 선택한 방법으로 tt3 ~ tt4 시간 사이에 매수한다.
종목당 매수금액 = 총매수금액/선정된 종목개수
매수후 매수량의 xx%만큼 익절 tp%, 손절 sl%를 설정한다.
선택한 종목을 tt3 ~ tt4 시간 사이에
1-1. 전일 종가대비 >= -dd% 이면 전일 종가대비 -nn1%에 매수주문
(종가대비 -nn1%에 해당하는 가격의 지정가)
1-2. 전일 종가대비 < -dd% 이면 전일 종가대비 -nn2%에 매수주문
(현재가 대비 -nn2%에 해당하는 가격의 매수3호가)
선택한 종목을 tt3 ~ tt4 시간 사이에
2-1. nn2 회 분할 매수한다.
2-2. 마지막 매수직후 미체결 취소후 취소량 만큼 현재가 매수.
****매수방법도 1, 2중에 선택하도록 부탁드립니다.
예1) if(inputvar2 == 1) ==> 매수방법 (1-1+1-2)로 매수
예2) if(inputvar2 == 2) ==> 매수방법 (2-1+2-2)로 매수
==================================================================================
****당일 매도
3. 보유종목중 관심종목4에 있는 종목은 매도에서 제외한다.
4. tt5 직전 미체결 매수 취소
5. tt5~tt6까지 cnt2 회 분할매도한다.
6. 매번 매도전 미체결 매도를 취소한다.
7. 매번 매도량는 잔고/(남은 매도 회차) 로 한다.
예) 총 cnt2 회 매도 일때.
1회차 매도: 잔고수량/cnt2
2회차 매도: 갱신된 잔고수량/(cnt2-1)
mm2회차 매도: 갱신된 잔고수량/(cnt2-mm2+1)
cnt2회차 매도 : 갱신된 잔고수량/1
8. 마지막 회차매도시에는 전량매도 한다.
(마지막회차만 시장가, 나머지 매도는 매도1호가+1틱)
==================================================================================
****매수 다음날 오전 매도
9. 보유종목중 관심종목1에 있는 종목은 매도에서 제외한다.
10. tt1~tt2까지 cnt1 회 분할매도한다.
11. 매번 매도전 미체결 매도를 취소한다.
12. 매번 매도량는 잔고/(남은 매도 회차) 로 한다.
예) 총 cnt1 회 매도 일때.
1회차 매도: 잔고수량/cnt1
2회차 매도: 갱신된 잔고수량/(cnt1-1)
mm1회차 매도: 갱신된 잔고수량/(cnt1-mm1+1)
cnt1회차 매도 : 갱신된 잔고수량/1
13. 마지막 회차매도시에는 전량매도 한다.
(마지막회차만 시장가, 나머지 매도는 매도1호가+1틱)
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
매매 당일 시간순서는 (tt1-tt2), (tt3-tt4), (tt5-tt6) 순입니다.
모든 매수, 매도는 관심종목에서 호출한 종목만을 대상으로 한다(<-- 가능한 방법이라면 실현되도록 부탁드립니다.*****
2019-10-01
3629
글번호 224996
답변완료
홈페이지에 있는 예스스팟 안내서 관련해서 질문드립니다.
예제 3번이
스팟전략이 [예스스팟 모니터]에 적용하면
삼성전자를 매수1호가에 1주 매수주문하고
해당 주문에 대한 주문응답이 수신된 후 60초 후에도 미체결 상태이면
매도2호가로 정정주문을 발생합니다.
라는 문제인데 해당 파일에선 코딩을
var ID;
var Number;
function Main_OnStart()
{
ID = A1.OrderBuy(SSE.code, 1, F1.Bid(1), 0);
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == ID)
{
Number = OrderResponse.orderNum;
Main.SetTimer(1, 60000);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
A1.OrderReplacePrice(Number,F1.Ask(2));
Main.KillTimer(1);
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (NotifyFill.orderNum == Number)
Main.KillTimer(1);
}
이렇게 해 놓았더라구요 A1은 계좌고.
그런데 똑같이 만들어서 돌려보니 ID = A1.OrderBuy(SSE.code, 1, F1.Bid(1), 0); <-- 이 부분에서 에러가 뜹니다 기타 에러요.
주문에서부터 오류가 생성되니 당연히 밑의 코드들은 돌아가지 않구요. 이거 어떻게 해결하나요?
2019-09-09
3458
글번호 224988