커뮤니티

문의

프로필 이미지
종호
2017-08-10 13:58:16
2778
글번호 224199
답변완료
안녕하세요. 예스트레이더 로직으로 해외선물 2종목을 거래하고 2종목합산 수익이 났을때 에스트레이더에서는 동시 정확하게 청산할 방법이 없습니다. 예스트레이더에서는 매수매도가 잘 일어나고 있습니다. 에스트레이더 로직에서 매수와 매도가 들어가고 예스스팟에서 합산 순수 수익이 났을 때 스팟에서 동시청산 처리하고 싶습니다.스팟에서 청산 수식과 예스트레이더와 연계방법을 알려 주시기를 부탁드립니다. 두가지 경우로 하고 싶습니다. 1번 1계죄에서 2종목 거래시 합산 순수익 날 때 동시청산수식과 합산 순손실이 날때 스팟의 동시 청산 수식 2번 2계좌에서 1종목씩 거래시 합산 순수익 날때 동시청산수식과 합산 순손실시 스팟의 동시 청산 수식 을 부탁드립니다. 추가질문1 3번질문: 잔고를 늘 감시하다가 한종목의 잔고가 0일때 현재가에서 시장가 매수가 들어가고 그현재가 근처에서 매수단가가 형성되었다면 그단가를 기준으로 상방향으로 현재가+3틱 현재가+6틱 현재가+9틱 현재가+12틱 처럼 계속 3틱단위로 상방향으로 매수가 되게 하고 싶습니다. 스팟수식으로 부탁드립니다. 스팟이 꺼지고 다시 재접속할 때 변수가 초기화 되는 문제가 해결되도록 코딩을 요청드립니다. 추가질문2 4번질문 :위의 3번질문에서 잔고를 감시하다가 잔고가 0일때 시장가 매수가 들어가서 그 체결가로 기준가로 정하지 않고요. 스팟 가동후 잔고가 최초로 0 이었을 때의 최초현재가= 최초기준가 로 정하고요. 그 이후에는 잔고들이 있다가 청산되어서 다시 0 이 되는 순간의 현재가 = 새로운 기준가 로 하고 싶습니다. 최초기준가 는 매수 안들어가고요. 상방향으로 현재가가 흘러가면 최초기준가 지켜봄 최초기준가+3틱 매수 최초기준가+6틱 매수 최초기준가+9틱 매수 ~~~~~이하생략 청산후 잔고 0 이 되는 순간의 현재가를 새로운 기준가로 생성 기준가는 지켜보고요 지준가 지켜봄 기준가+3틱 매수 기준가+6틱 매수 기준가+9틱 매수 ~~~ 이하 생략 으로 부탁드립니다. 스팟이 꺼지고 다시 재접속할 때 변수가 초기화 되어서 문제를 일으키는데 그문제가 해결되도록 코딩을 요청드립니다. 제가 실력이 없어서 열심히 공부하고 궁리해도 코딩이 나오지를 않습니다. 시간이 흐르다 보니 3번 질문과 4번 질문이 가장 중요한 질문이 되었습니다. 자꾸 부탁이 늘게 되어서 죄송합니다.
답변 5
프로필 이미지

예스스탁 예스스탁 답변

2017-09-05 16:27:01

안녕하세요 예스스탁입니다. 예스스팟의 수식답변은 단순히 가이드만 해드립니다. 내용 참고하셔서 수정보완해 원하시는 식으로 완성해 가시기 바랍니다. 게시판에서는 영문 업데이트가 금칙어 입니다. 수식내 이벤트나 객체명에 업데이트는 Up*date와 같이 중간에 *이 포함되어 있습니다.' 삭제하고 사용하셔야 합니다. 1 //계좌객체 Account1 function Main_OnStart() { Main.SetTimer(1,5000);//5초 단위 체크 } function Main_OnTimer(nEventID) { if (nEventID == 1) { //총수익 누적할 변수 var sumPL = 0; //계좌의 종목수 var num = Account1.GetTheNumberOfBalances(); //종목이 2개 이상일때만 if (num >= 2) { //잔고 종목 총손익 계산 for (i = 0; i < num;i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { sumPL = sumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count; } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { sumPL = sumPL + (Account1.Balance.current - Account1.Balance.avgUnitCost)*Account1.Balance.count; } } //총손익이 특정값(0)보다 크면 전체 종목 청산 if (sumPL > 0) { for (i = 0; i < num;i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } } //총손익이 특정값(0)보다 작으면면 전체종목 청산 if (sumPL < 0) { for (i = 0; i < num;i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } } } } } 2 //계좌객체1 Account1 //계좌객체2 Account2 function Main_OnStart() { Main.SetTimer(1,5000);//5초 단위 체크 } function Main_OnTimer(nEventID) { if (nEventID == 1) { //총수익 누적할 변수 var sumPL = 0; //계좌1의 종목수 var num1 = Account1.GetTheNumberOfBalances(); //계좌2의 종목수 var num2 = Account2.GetTheNumberOfBalances(); //계좌1과 계좌2에 종목이 각 1개 이상일때만 if (num1 >= 1 && num2 >= 1) { //잔고 종목 총손익 계산 for (i = 0; i < num1; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { sumPL = sumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count; } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { sumPL = sumPL + (Account1.Balance.current - Account1.Balance.avgUnitCost)*Account1.Balance.count; } } //잔고 종목 총손익 계산 for (i = 0; i < num2; i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { sumPL = sumPL + (Account2.Balance.avgUnitCost - Account2.Balance.current)*Account2.Balance.count; } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { sumPL = sumPL + (Account2.Balance.current - Account2.Balance.avgUnitCost)*Account2.Balance.count; } } //총손익이 특정값(0)보다 크면 전체종목 청산 if (sumPL > 0) { for (i = 0; i < num1;i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } for (i = 0; i < num2; i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count,0,1); } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { Account2.OrderSell(Account2.Balance.code, Account2.Balance.count,0,1); } } } //총손익이 특정값(0)보다 작으면 전체종목 청산 if (sumPL < 0) { for (i = 0; i < num;i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } for (i = 0; i < num;i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count,0,1); } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { Account2.OrderSell(Account2.Balance.code, Account2.Balance.count,0,1); } } } } } } 3 //종목객체 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); } } 4 //종목객체 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) { //무포지션이고 FPrice가 0이면 기준값 지정 if (Account1.Balance.count == 0 && FPrice == 0) { FPrice = MarketData1.current; Main.SetUserValue("FPrice",FPrice); } //FPrice가 0보다 크면 현재가가 FPrice+3틱 이상이면 매수 if (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); } } } //계좌잔고에서 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); } } 즐거운 하루되세요 > 종호 님이 쓴 글입니다. > 제목 : 문의 > 안녕하세요. 예스트레이더 로직으로 해외선물 2종목을 거래하고 2종목합산 수익이 났을때 에스트레이더에서는 동시 정확하게 청산할 방법이 없습니다. 예스트레이더에서는 매수매도가 잘 일어나고 있습니다. 에스트레이더 로직에서 매수와 매도가 들어가고 예스스팟에서 합산 순수 수익이 났을 때 스팟에서 동시청산 처리하고 싶습니다.스팟에서 청산 수식과 예스트레이더와 연계방법을 알려 주시기를 부탁드립니다. 두가지 경우로 하고 싶습니다. 1번 1계죄에서 2종목 거래시 합산 순수익 날 때 동시청산수식과 합산 순손실이 날때 스팟의 동시 청산 수식 2번 2계좌에서 1종목씩 거래시 합산 순수익 날때 동시청산수식과 합산 순손실시 스팟의 동시 청산 수식 을 부탁드립니다. 추가질문1 3번질문: 잔고를 늘 감시하다가 한종목의 잔고가 0일때 현재가에서 시장가 매수가 들어가고 그현재가 근처에서 매수단가가 형성되었다면 그단가를 기준으로 상방향으로 현재가+3틱 현재가+6틱 현재가+9틱 현재가+12틱 처럼 계속 3틱단위로 상방향으로 매수가 되게 하고 싶습니다. 스팟수식으로 부탁드립니다. 스팟이 꺼지고 다시 재접속할 때 변수가 초기화 되는 문제가 해결되도록 코딩을 요청드립니다. 추가질문2 4번질문 :위의 3번질문에서 잔고를 감시하다가 잔고가 0일때 시장가 매수가 들어가서 그 체결가로 기준가로 정하지 않고요. 스팟 가동후 잔고가 최초로 0 이었을 때의 최초현재가= 최초기준가 로 정하고요. 그 이후에는 잔고들이 있다가 청산되어서 다시 0 이 되는 순간의 현재가 = 새로운 기준가 로 하고 싶습니다. 최초기준가 는 매수 안들어가고요. 상방향으로 현재가가 흘러가면 최초기준가 지켜봄 최초기준가+3틱 매수 최초기준가+6틱 매수 최초기준가+9틱 매수 ~~~~~이하생략 청산후 잔고 0 이 되는 순간의 현재가를 새로운 기준가로 생성 기준가는 지켜보고요 지준가 지켜봄 기준가+3틱 매수 기준가+6틱 매수 기준가+9틱 매수 ~~~ 이하 생략 으로 부탁드립니다. 스팟이 꺼지고 다시 재접속할 때 변수가 초기화 되어서 문제를 일으키는데 그문제가 해결되도록 코딩을 요청드립니다. 제가 실력이 없어서 열심히 공부하고 궁리해도 코딩이 나오지를 않습니다. 시간이 흐르다 보니 3번 질문과 4번 질문이 가장 중요한 질문이 되었습니다. 자꾸 부탁이 늘게 되어서 죄송합니다.
프로필 이미지

종호

2017-09-11 12:16:11

수고하셨습니다, 감사드립니다. 추가질문은 위의 스팟식을 합하지 않고 따로 따로 적용해도 서로 충돌하지 않고 각각 기능들을 하는지 여쭙니다.
프로필 이미지

예스스탁 예스스탁 답변

2017-09-13 11:09:27

안녕하세요 예스스탁입니다. 스팟은 실행하면 각각 별도로 동작을 합니다. 다만 수식에서 내부파일에 값을 저장하고 가져오는 기능은 (Main.SetUserValue, Main.GetUserValue) 하나의 파일을 공용으로 사용해서 값을 적고 가져오기를 하게 됩니다 그러므로 A수식에서 B라는 이름으로 값을 저장했고 다른 수식에서 변경을 원치 않으시면 다른 수식에서는 B라는 값을 변형하지 않게 B라는 이름을 피해서 저장하게 하셔야 합니다. 즐거운 하루되세요 > 종호 님이 쓴 글입니다. > 제목 : 감사드림과 추가질문 > 수고하셨습니다, 감사드립니다. 추가질문은 위의 스팟식을 합하지 않고 따로 따로 적용해도 서로 충돌하지 않고 각각 기능들을 하는지 여쭙니다.
프로필 이미지

종호

2017-10-20 18:36:34

종호 님에 의해 삭제된 답변입니다.
프로필 이미지

종호

2017-10-20 18:38:49

위의 3번수식을 맨처음 전략을 실행하면 매수가 잘되는데요 수동으로하던지 스팟전략으로 청산되던지 관계없이 한번 청산이 된후엔 작동이 안되고 있습니다. 청산후에 무포지션에서 다시 재매수가 들어가야 하는데 매수가 안되고 그냥 멈추어져 있습니다. 청산후에 다시 진입이 되도록 부탁드립니다.