커뮤니티

예스스팟 Q&A

데이터베이스 객체 문의드립니다.

데이터베이스 객체를 사용해서 스팟 작성을 하는 도중 오류가 떠서 어떤게 문제인지 알 수 있을까요? 오류 내용은 "지정된 DSN은 드라이버와 응용 프로그램 간 아키텍처 불일치를 포함합니다." 라고 뜨네요...
프로필 이미지
도비
2018-01-25
3032
글번호 224317
답변완료

스팟 문의드립니다.

아래식을 이용해서 수정하고 싶습니다. 한 계좌에서 해외선물 여러종목을 동시에 매매할껀데요 계좌의 감시를 하다가 여려 종목들의 합산 수익이 20만원이 되면 모든종목청산 합산손실이 -20만원이면 모든종목청산을 하고 싶습니다. 아래식을 이용해서 위 전략을 작성할수 있나요 아래식을 이용하면 종목당 틱가치나 틱단위가 서로 달라서 문제가 있을것 같은데요... 도움 부탁드리겠습니다. function Main_OnStart() { Main.MessageList("계좌감시 시작"); //타이머 셋팅 Main.SetTimer(1, 5000); //스팟시작시 잔고가 있으면 true if (Account1.GetTheNumberOfBalances() >= 1) Exit = true; else// 아니면 false Exit = false; } function Main_OnTimer(nEventID) { var num = Account1.GetTheNumberOfBalances(); //Exit은 true이고 계좌에 1종목이상 있음 if (Exit == true && num >= 1) { var sum1 = 0; var sum2 = 0; var PL = 0; for (var i = 0; i < num; i++) { Account1.SetBalance(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { sum1 = sum1 + Account1.Balance.avgUnitCost * Account1.Balance.count; //평단가 곱하기 수량 sum2 = sum2 + Account1.Balance.current * Account1.Balance.count; //현재가 곱하기 수량 PL = PL + (sum2-sum1); //손익 } if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { sum1 = sum1 + Account1.Balance.avgUnitCost * Account1.Balance.count; sum2 = sum2 + Account1.Balance.current * Account1.Balance.count; PL = PL + (sum1-sum2); } } //전체종목의 손익이 -이고 평단가기준 총평가금액의 10% 이상이면 전체종목 청산 //Exit은 false로 if (PL < 0 && Math.abs(PL) >= sum1*0.10) { Exit = false; for (var i = 0; i < num; i++) { Account1.SetBalance(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); } } } } } function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)//*제거 { //잔고에 새로운 종목이 추가되면 true로 변경하고 타이머 셋팅 if (Exit == false && sAccntNum == Account1.number && lUp*dateID == 30001)//*제거 { Exit = true; } }
프로필 이미지
수다리
2018-01-21
2973
글번호 224316

베스트시스템 님에 의해서 삭제되었습니다.

프로필 이미지
베스트시스템
2018-01-21
3
글번호 224315

베스트시스템 님에 의해서 삭제되었습니다.

프로필 이미지
베스트시스템
2018-01-18
2
글번호 224314

데이터베이스에서 리턴 받은 데이터의 데이터형식 문제...

고생이 많으십니다~~ <CODE> var ItemCode var ItemVol var ItemAvg var ItemCrt var ItemBPL var ItemSPL var c var d var cond = false; var cond2 = false; var arr = new Array; var arr2 = new Array; var i // 변수들을 지정하고 function Main_OnStart() { Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); ItemCode = Account1.Balance.code; ItemVol = Account1.Balance.count; ItemAvg = Account1.Balance.avgUnitCost; ItemCrt = MarketData1.current; ItemSPL = (ItemAvg - ItemCrt - 0.0003)*100000/1375; d = ItemSPL var cond = DataBase1.Selec*t("* FROM [NKD] ", "idx" ); if (cond == true) { DataBase1.MoveFirst(); while (DataBase1.IsEOF() == false) { arr.push(DataBase1.GetFieldValue(0)); DataBase1.MoveNext(); } } c = arr.length Main.MessageList(c+1,d) DataBase1.Inser*t("[NKD] VALUES("+(c+1)+","+d+")") // 이번거래에서 얻어진 수익률을 데이터베이스에 반영(Inser*t)한 후 var cond2 = false; var cond2 = DataBase1.Selec*t(" Test_column FROM [NKD] WHERE idx ="+i+"", "Test_column" ); //이전 수익률값까지 모두 받아서 if (cond2 == true) { DataBase1.MoveFirst(); while (DataBase1.IsEOF() == false) { arr2.push(DataBase1.GetFieldValue(0)); DataBase1.MoveNext(); } } for(i=0; i <= (c-1); i++) {arr2[i] = parseFloat(arr2[i])} Main.MessageList(arr2) sum = function(x,y) { return x+y; }; mean = arr2.reduce(sum)/(c+1); Main.MessageList(mean) } // 구해진 수익률을 업데이트 한 새로운 평균을 내는 코드를 작성하는데 성공하였습니다만... 문제가 있습니다. arr2 의 배열의 요소들을 숫자로 인식하지 않습니다. 데이터형이 object 로 나오는데요... parseFloat, Number 로도 안되고 1.어떤방법으로 arr2 배열의 요소를 숫자(실수형)으로 변환 가능할까요? 2.처음부터 SQL에서 컬럼을 만들당시에 실수형(Float)으로 지정하였음에도 불구하고 데이터를 받아오는 과정에서 테이터 변환이 일어났는데 데이터 변환이 일어나지 않도록 데이터를 받아올 수는 없을까요? 구력이 얼마 안되고 코딩 센스도 부족하여 기초적이고 허접한 질문을 드려 죄송합니당^^ 지도편달 부탁드려요~
프로필 이미지
검시관덱스터
2018-01-28
2853
글번호 224311

YesSpot 에서 MS SQL 직접연결문제...

수고가 많으십니다.^^ <YesSpot JavaScript Code> var ItemCode var ItemVol var ItemAvg var ItemCrt var ItemBPL var ItemSPL var d function Main_OnStart() { Account1.Refresh(); Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); ItemCode = Account1.Balance.code; ItemVol = Account1.Balance.count; ItemAvg = Account1.Balance.avgUnitCost; ItemCrt = MarketData1.current; ItemSPL = (ItemAvg - ItemCrt - 0.0003)*100000/1375; var d = ItemSPL Main.MessageList(typeof d) Main.MessageList(d) DataBase1.Inser*t("[NKD] VALUES(d)") --------------------------------------------------------------------------------------- 예스스팟에서 수익 또는 손실이 생기면(ItemSPL) 그것을 데이터베이스(MS SQL)에 삽입(Inser*t)하여 데이터를 갱신하는 코드를 작성하였습니다만... 예스스팟상에서 DataBase1.Inser*t("[NKD] VALUES(1)")와 같이 코드를 작성하면 1을 MS SQL에 삽입하나... DataBase1.Inser*t("[NKD] VALUES(d)")를 실행하는경우 변수 d의 값을 MS SQL에 삽입하지 못합니다. 이것이 단순한 변수 d의 JavaScript(데이터 형식: number) 와 MS SQL (데이터 형식:decimal) 사이의 데이터 형식의 차이에 의한 것이라고도 생각해 보았으나 그것이 문제가 아닐수도 있겠다는 생각이 들었습니다. 1.결국은 예스스팟상에서 미들웨어( 다른 환경이지만 예를들어 PHP같은)를 통해 서버 사이드 데이터베이스에 접근을 하여야합니까? 2.아니면 위의 코드에서 자바스크립트상의 var d(변수)를 데이터베이스(MS SQL)에 바로 인식시켜 Inser*t 하고 Selec*t 하는 방법이 따로 있는것입니까? 3.위의 코드에서 var d를 MS SQL에 삽입하는 방법이 있으면 지도 부탁드립니다...
프로필 이미지
검시관덱스터
2018-01-16
2911
글번호 224308
답변완료

문의드립니다

예스렝귀지를 이용하여 구동중입니다 이용중 신호발생 진입,청산이 이루어 지지 않았을때 백업으로 예스스팟을 이용하여 계좌를 모니터링하여 설정해 놓은 손실시 발생시 청산하는 것을 구현하고 싶습니다 스팟은 처음이라시상기와 같은 식이 있는지와 구현방법에 대해 알려주시면 감사하겠습니다
프로필 이미지
라떼처럼
2018-01-13
2810
글번호 224306

베스트시스템 님에 의해서 삭제되었습니다.

프로필 이미지
베스트시스템
2018-01-12
4
글번호 224305

mirror05 님에 의해서 삭제되었습니다.

프로필 이미지
mirror05
2018-01-09
9
글번호 224303
답변완료

수정 부탁드립니다.

수식 문의 드립니다. 하이투자 이용하고 있고 예스트레이더에서 신호를 받아와서 예스스팟을 이용해 주문 하고 있습니다. 설정은 예스트레이더 차트 4개에서 가각의 신호를 받아서 코스피 선물 거래하고 있습니다. 하지만, 오류가 계속 발생해서 제대로 적용하지 못하고 있습니다. 현재는 예스스팟은 모의 투자로만 돌리면서 테스트 하고 있고요. 아래의 조건에 맞게 수식을 보완해 주시면 감사 하겠습니다. 1. 4개중의 하나의 차트에서 신호가 발생하면 신규 진입한다. 2. 진입시 계약 수 설정할 수 있었으면 합니다.(예 5계약 주문) 3, 하나의 차트에서 신호가 나와서 체결이 되었으면 즉, 포지션이 있으면 다른차트에서의 신규 진입은 무시한다. 4, 1번 차트에서 신호가 나와서 미체결 상태로 남아 있고 2번 차트에서 신호가 나왔다면 미체결 취소하고 2번차트 신호로 신규진입한다. 5, 청산신호가 나와서 포지션이 청산되고 3분뒤에 포지션을 확인해서 포지션이 남아 있으면 모두 시장가로 청산한다. 이 때, 모든 미체결도 모두 취소한다. 6, 아래식에서 정정취소가 제대로 안되는 것 같습니다. 또 청산이 제대로 안되어 포지션이 남아 있는 경우가 많습니다. 수정부탁드립니다. (모의투자에서 적용시) 아래 식에서 위 의 조건대로 고쳐 주시면 감사하겠습니다. 나름대로 열심히 만들고는 있는데 너무 모자라네요. 또, 마지막 잔고청산은 15시 06분으로 청산하라고 작성했는데 확인결과 15시 26분에 일괄청산이 되네요. 왜 그런건지도 알려주면 고맙겠습니다. 원래는 4개의 차트를 이용하는데 너무 길어서 두 개만 올립니다. var BID,BXID,SID,SXID; var BID1,BXID1,SID1,SXID1; var BNum,BXNum,SNum,SXNum; var BNum1,BXNum1,SNum1,SXNum1; function Chart1_OnRiseSignal(Signal) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //buy신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 1) { BID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitlong신호 발생 if (Signal.signalKind == 2) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.current, 0); } } //Sell신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 3) { SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitshort신호 발생 if (Signal.signalKind == 4) { //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.current, 0); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입 최초주문 if (OrderResponse.orderID == BID) { BNum = OrderResponse.orderNum; Main.SetTimer(1,30000); //1번 타이머셋팅 30초 } //매수진입 30초후 정정주문 if (OrderResponse.orderID == BID1) { BNum1 = OrderResponse.orderNum; Main.SetTimer(11,180000); //11번 타이머셋팅 180초 } //매수청산 최초주문 if (OrderResponse.orderID == BXID) { BXNum = OrderResponse.orderNum; Main.SetTimer(2,20000); //2번 타이머셋팅 20초 } //매수청산 취소주문 후 시장가 청산 if (OrderResponse.orderID == BXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입 최초주문 if (OrderResponse.orderID == SID) { SNum = OrderResponse.orderNum; Main.SetTimer(3,30000); //3번 타이머셋팅 30초 } //매도진입 30초 후 정정주문 if (OrderResponse.orderID == SID1) { SNum1 = OrderResponse.orderNum; Main.SetTimer(33,180000); //33번 타이머셋팅 180초 } //매도청산 최초주문 if (OrderResponse.orderID == SXID) { SXNum = OrderResponse.orderNum; Main.SetTimer(4,20000); //4번 타이머셋팅 20초 } //매도청산 취소주문 후 시장가로 청산 if (OrderResponse.orderID == SXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Ask(2), 0); } } } function Main_OnTimer(nEventID) { //매수진입주문 타이머 동작 if (nEventID == 1) { Main.KillTimer(1); Account1.SetUnfill(BNum); if (Account1.Unfill.count > 0) { BID1 = Account1.OrderCancel(BNum); } } //매수청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 2) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BID2 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입주문 타이머 동작 if (nEventID == 3) { Main.KillTimer(3); Account1.SetUnfill(SNum); if (Account1.Unfill.count > 0) { SID1 = Account1.OrderCancel(SNum); } } //매도청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 4) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,Ask(2), 0); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMDD >= 150600) { //전체 보유 종목 수 Main.KillTimer(1); num = Account1.GetTheNumberOfBalances(); //전체 보유 종목을 하나씩 불러와 for(var i = 0; i < num; i++) { //잔고객체를 셋팅하고 Account1.SetBalanceIndex(i); // 해당 잔고가 매도이면 보유수량만큼 매수주문 if (Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Ask(2), 0); } //해당 잔고가 매수이면 보유수량만큼 매도주문 if (Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Bid(2), 0); } } } } //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ function Chart2_OnRiseSignal(Signal) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //buy신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 1) { BID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitlong신호 발생 if (Signal.signalKind == 2) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.current, 0); } } //Sell신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 3) { SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitshort신호 발생 if (Signal.signalKind == 4) { //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.current, 0); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입 최초주문 if (OrderResponse.orderID == BID) { BNum = OrderResponse.orderNum; Main.SetTimer(1,30000); //1번 타이머셋팅 30초 } //매수진입 30초후 정정주문 if (OrderResponse.orderID == BID1) { BNum1 = OrderResponse.orderNum; Main.SetTimer(11,180000); //11번 타이머셋팅 180초 } //매수청산 최초주문 if (OrderResponse.orderID == BXID) { BXNum = OrderResponse.orderNum; Main.SetTimer(2,20000); //2번 타이머셋팅 20초 } //매수청산 취소주문 후 시장가 청산 if (OrderResponse.orderID == BXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입 최초주문 if (OrderResponse.orderID == SID) { SNum = OrderResponse.orderNum; Main.SetTimer(3,30000); //3번 타이머셋팅 30초 } //매도진입 30초 후 정정주문 if (OrderResponse.orderID == SID1) { SNum1 = OrderResponse.orderNum; Main.SetTimer(33,180000); //33번 타이머셋팅 180초 } //매도청산 최초주문 if (OrderResponse.orderID == SXID) { SXNum = OrderResponse.orderNum; Main.SetTimer(4,20000); //4번 타이머셋팅 20초 } //매도청산 취소주문 후 시장가로 청산 if (OrderResponse.orderID == SXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Ask(2), 0); } } } function Main_OnTimer(nEventID) { //매수진입주문 타이머 동작 if (nEventID == 1) { Main.KillTimer(1); Account1.SetUnfill(BNum); if (Account1.Unfill.count > 0) { BID1 = Account1.OrderCancel(BNum); } } //매수청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 2) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BID2 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입주문 타이머 동작 if (nEventID == 3) { Main.KillTimer(3); Account1.SetUnfill(SNum); if (Account1.Unfill.count > 0) { SID1 = Account1.OrderCancel(SNum); } } //매도청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 4) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,Ask(2), 0); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMDD >= 150600) { //전체 보유 종목 수 Main.KillTimer(1); num = Account1.GetTheNumberOfBalances(); //전체 보유 종목을 하나씩 불러와 for(var i = 0; i < num; i++) { //잔고객체를 셋팅하고 Account1.SetBalanceIndex(i); // 해당 잔고가 매도이면 보유수량만큼 매수주문 if (Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Ask(2), 0); } //해당 잔고가 매수이면 보유수량만큼 매도주문 if (Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Bid(2), 0); } } } }
프로필 이미지
지킴이
2018-01-09
2738
글번호 224302