커뮤니티

질문입니다.

프로필 이미지
음양조파
2013-06-27 05:05:23
1852
글번호 222415
답변완료
안녕하세요? 저는 미완성 신호로 매매하고 싶어서 예스랭기지보다는 예스스팟이 더 좋습니다. 예스스팟으로 다음과 같은 기능을 구현하려면 어떻게 하면 될까요? 시가 위 a1, a2, a3 지점과 시가 밑 b1, b2, b3 지점에서 피라미딩 매수 진입을 계획합니다. 시가 밑에서 매수된 것은, 그 후 현재가가 어찌되든 내버려둡니다. 시가 위에서 매수된 것은, 매수된 후 현재가가 an+m1 지점에 이르지 못하고 an-m2지점에 이르면 손절 청산하고, 매수된 후 현재가가 일단 an+m1 지점에 이르렀다면 그 후 현재가가 어찌되든 내버려둡니다. 이미 해당 지점에서 한 번 매수되었다면 추가진입은 하지 않습니다. 그러나 위에서 본 것처럼 손절 청산이 되어 버렸다면, 현재가가 다시 원래의 매수 해당지점에 이르면(예를 들어 a3지점에서 매수한 것이 손절 청산되었다면, 그 후 다시 a3 지점에 이르면) 다시 매수합니다. 다시 매수한 것도 손절문제와 재진입문제를 동일하게 처리합니다. 매뉴얼을 공부하다 보니까 예스스팟이 예스랭기지보다는 명령어 분량이 훨씬 많은 것 같습니다. 그렇지만 저는 예스스팟이 더 좋아서 앞으로 최대한 예스스팟으로 식을 짜고 싶어 이렇게 여쭈어 봅니다. 번거로우시겠으나 가르쳐 주시면, 매뉴얼에 나오는 내용하고 하나하나 비교해 가면서 원리를 잘 공부해 보겠습니다. 감사합니다. * a1,a2,a3,b1,b2,b3,m1,m2는 구동 시작시 지정해주려고 합니다.
답변 3
프로필 이미지

예스스탁 예스스탁 답변

2013-07-02 15:50:05

안녕하세요 예스스탁입니다. 1 스크립트 객체화면에서 종목객체 추가 --> 속성에서 객체명은 MarketData1으로 하시고 종목선택하시면 됩니다. 계좌객체 추가 --> 속성에서 객체명은 Account1로 하시고 속성에서 계좌번호 선택하시면 됩니다. 외부변수 추가 후 변수명 a1, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 a2, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 a3, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 b1, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 b2, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 b3, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 m1, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 m2, 초기값을 지정하시고 데이터형은 숫자로 설정 각 수식안에서 시초가+a1, 시초가-b1,(시초가+a1)+m1,(시초가+a1)-m2등으로 사용되므로 모든 변수의 기초값은 양수로 지정하시면 됩니다. 2. 수식상 게시판 금칙어가 있어 영문업데이트가 U*pdate로 *가 추가되어 있습니다. 식상 19번째 줄, 22번째 줄에서 제거하시고 사용하셔야 합니다. 3 예스스팟은 주문등을 완전히 테스트해 드리지 않습니다. 수식에 주석을 붙여 드렸으므로 식수정이나 작성에 참고하시기 바랍니다. 4. 예스스팟 수식 var upcond1 = false, upid1 = 0, upnum1 = 0, upfill1 = false, mcond1 = false; var upcond2 = false, upid2 = 0, upnum2 = 0, upfill2 = false, mcond2 = false; var upcond3 = false, upid3 = 0, upnum3 = 0, upfill3 = false, mcond3 = false; var dncond1 = false, dnid1 = 0, dnnum1 = 0, dnfill1 = false; var dncond2 = false, dnid2 = 0, dnnum2 = 0, dnfill1 = false; var dncond3 = false, dnid3 = 0, dnnum3 = 0, dnfill1 = false; function Main_OnStart() { upcond1 = false; upcond2 = false; upcond3 = false; dncond1 = false; dncond2 = false; dncond3 = false; } function Main_OnU*pdateMarket(sItemCode, lU*pdateID) { //MarketData1종목이 시세업데이트가 됨 if(MarketData1.code == sItemCode && lU*pdateID == 20001 && MarketData1.open > 0) { //시초가+a1 주문 //upcond1이 false인 상태에서 현재가가 시초가+a1에 도달하면 if (upcond1 == false && MarketData1.current >= MarketData1.open +a1) { Main.MessageList("시초가+a1만족","현재가",MarketData1.current,"시초가+a1",MarketData1.open +a1) //upcond1은 true로 변경 upcond1 = true; //매도5호가로 1계약 매수주문 (주문아이디는 upid1에 저장) upid1 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); upfill1 = false;//체결확인하는 변수는 false mcond1 = false;//an+m1 도달확인용 변수 } //시초가+a2 주문 //upcond2가 false인 상태에서 현재가가 시초가+a2에 도달하면 if (upcond2 == false && MarketData1.current >= MarketData1.open +a2) { Main.MessageList("시초가+a2만족","현재가",MarketData1.current,"시초가+a2",MarketData1.open +a2) //upcond2는 true로 변경 upcond2 = true; //매도5호가로 1계약 매수주문 (주문아이디는 upid2에 저장) upid2 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); upfill2 = false;//체결확인하는 변수는 false mcond2 = false;//an+m1 도달확인용 변수 } //시초가+a3 주문 //upcond3가 false인 상태에서 현재가가 시초가+a3에 도달하면 if (upcond3 == false && MarketData1.current >= MarketData1.open +a3) { Main.MessageList("시초가+a3만족","현재가",MarketData1.current,"시초가+a3",MarketData1.open +a3) //upcond3은 true로 변경 upcond3 = true; //매도5호가로 1계약 매수주문 (주문아이디는 upid2에 저장) upid3 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); upfill3 = false;//체결확인하는 변수는 false mcond3 = false;//an+m1 도달확인용 변수 } //시초가-b1 주문 //dncond1이 false인 상태에서 현재가가 시초가-b1에 도달하면 if (dncond1 == false && MarketData1.current <= MarketData1.open-b1) { Main.MessageList("시초가-b1만족","현재가",MarketData1.current,"시초가-b1",MarketData1.open-b1) //dncond1은 true로 변경 dncond1 = true; //매도5호가로 1계약 매수주문 (주문아이디는 dnid1에 저장) dnid1 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); dnfill1 = false;//체결확인하는 변수는 false } //시초가-b2 주문 //dncond2이 false인 상태에서 현재가가 시초가-b2에 도달하면 if (dncond2 == false && MarketData1.current <= MarketData1.open-b2) { Main.MessageList("시초가-b1만족","현재가",MarketData1.current,"시초가-b1",MarketData1.open-b2) //dncond2는 true로 변경 dncond2 = true; //매도5호가로 1계약 매수주문 (주문아이디는 dnid2에 저장) dnid2 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); dnfill2 = false;//체결확인하는 변수는 false } //시초가-b3 주문 //dncond3이 false인 상태에서 현재가가 시초가-b3에 도달하면 if (dncond3 == false && MarketData1.current <= MarketData1.open-b3) { Main.MessageList("시초가-b3만족","현재가",MarketData1.current,"시초가-b3",MarketData1.open-b1) //dncond3은 true로 변경 dncond3 = true; //매도5호가로 1계약 매수주문 (주문아이디는 dnid1에 저장) dnid3 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); dnfill2 = false;//체결확인하는 변수는 false } //시초가+a1이 체결된 이후 if (upfill1 == true) { //현재가가 (시초가+a1)+m1에 도달하면 mcond1은 true if (MarketData1.current >= (MarketData1.open+a1)+m1) mcond1 = true; // mcond1이 false인 상태에서 현재가가 (시초가+a1)-m2에 도달하면 매수5호가로 1계약 매도주문 if (mcond1 == false && MarketData1.current <= (MarketData1.open+a1)-m2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } //시초가+a2이 체결된 이후 if (upfill2 == true) { //현재가가 (시초가+a2)+m1에 도달하면 mcond2은 true if (MarketData1.current >= (MarketData1.open+a2)+m1) mcond2 = true; // mcond2이 false인 상태에서 현재가가 (시초가+a2)-m2에 도달하면 매수5호가로 1계약 매도주문 if (mcond2 == false && MarketData1.current <= (MarketData1.open+a2)-m2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } //시초가+a3이 체결된 이후 if (upfill3 == true) { //현재가가 (시초가+a3)+m1에 도달하면 mcond3은 true if (MarketData1.current >= (MarketData1.open+a3)+m1) mcond3 = true; // mcond3이 false인 상태에서 현재가가 (시초가+a3)-m2에 도달하면 매수5호가로 1계약 매도주문 if (mcond3 == false && MarketData1.current <= (MarketData1.open+a3)-m2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } } } //수식에서 발생한 주문에 대해 주문응답이 수신되면 function Main_OnOrderResponse(OrderResponse) { //upid1주문이 접수되면 주문번호를 upnum1에 주문번호 저장 if (OrderResponse.orderID == upid1) upnum1 = OrderResponse.orderNum; //upid2주문이 접수되면 주문번호를 upnum2에 주문번호 저장 if (OrderResponse.orderID == upid2) upnum2 = OrderResponse.orderNum; //upid3주문이 접수되면 주문번호를 upnum3에 주문번호 저장 if (OrderResponse.orderID == upid3) upnum3 = OrderResponse.orderNum; //dnid1주문이 접수되면 주문번호를 dnnum1에 주문번호 저장 if (OrderResponse.orderID == dnid1) dnnum1 = OrderResponse.orderNum; //dnid2주문이 접수되면 주문번호를 dnnum2에 주문번호 저장 if (OrderResponse.orderID == dnid2) dnnum2 = OrderResponse.orderNum; //dnid3주문이 접수되면 주문번호를 dnnum3에 주문번호 저장 if (OrderResponse.orderID == dnid3) dnnum3 = OrderResponse.orderNum; } //수식에서 발생한 주문에 대해 체결응답이 수신되면 function Main_OnNotifyFill(NotifyFill) { //upnum1주문번호가 체결되면 upfill1을 true로 변경 if (NotifyFill.orderNum == upnum1) upfill1 = true; //upnum2주문번호가 체결되면 upfill2를 true로 변경 if (NotifyFill.orderNum == upnum2) upfill2 = true; //upnum3주문번호가 체결되면 upfill3을 true로 변경 if (NotifyFill.orderNum == upnum3) upfill3 = true; //dnnum1주문번호가 체결되면 dnfill1을 true로 변경 if (NotifyFill.orderNum == dnnum1) dnfill1 = true; //dnnum2주문번호가 체결되면 dnfill2를 true로 변경 if (NotifyFill.orderNum == dnnum2) dnfill2 = true; //dnnum3주문번호가 체결되면 dnfill3을 true로 변경 if (NotifyFill.orderNum == dnnum3) dnfill3 = true; } 즐거운 하루되세요 > 음양조파 님이 쓴 글입니다. > 제목 : 질문입니다. > 안녕하세요? 저는 미완성 신호로 매매하고 싶어서 예스랭기지보다는 예스스팟이 더 좋습니다. 예스스팟으로 다음과 같은 기능을 구현하려면 어떻게 하면 될까요? 시가 위 a1, a2, a3 지점과 시가 밑 b1, b2, b3 지점에서 피라미딩 매수 진입을 계획합니다. 시가 밑에서 매수된 것은, 그 후 현재가가 어찌되든 내버려둡니다. 시가 위에서 매수된 것은, 매수된 후 현재가가 an+m1 지점에 이르지 못하고 an-m2지점에 이르면 손절 청산하고, 매수된 후 현재가가 일단 an+m1 지점에 이르렀다면 그 후 현재가가 어찌되든 내버려둡니다. 이미 해당 지점에서 한 번 매수되었다면 추가진입은 하지 않습니다. 그러나 위에서 본 것처럼 손절 청산이 되어 버렸다면, 현재가가 다시 원래의 매수 해당지점에 이르면(예를 들어 a3지점에서 매수한 것이 손절 청산되었다면, 그 후 다시 a3 지점에 이르면) 다시 매수합니다. 다시 매수한 것도 손절문제와 재진입문제를 동일하게 처리합니다. 매뉴얼을 공부하다 보니까 예스스팟이 예스랭기지보다는 명령어 분량이 훨씬 많은 것 같습니다. 그렇지만 저는 예스스팟이 더 좋아서 앞으로 최대한 예스스팟으로 식을 짜고 싶어 이렇게 여쭈어 봅니다. 번거로우시겠으나 가르쳐 주시면, 매뉴얼에 나오는 내용하고 하나하나 비교해 가면서 원리를 잘 공부해 보겠습니다. 감사합니다. * a1,a2,a3,b1,b2,b3,m1,m2는 구동 시작시 지정해주려고 합니다.
프로필 이미지

음양조파

2013-06-29 11:06:25

정말 감사합니다. 주신 예문 갖고 열심히 매뉴얼이랑 비교하며 살펴보다가 잘 이해가 안되는 부분이 있어서요. //MarketData1종목이 시세업데이트가 됨 if(MarketData1.code == sItemCode && lU*pdateID == 20001 && MarketData1.open > 0) 에서,다른 부분은 이해가 되는데, MarketData1.open > 0 이 무슨 뜻인지 모르겠습니다. 그 날의 장이 시작되어 시가가 생겨났다는 의미인가요? > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 질문입니다. > 안녕하세요 예스스탁입니다. 1 스크립트 객체화면에서 종목객체 추가 --> 속성에서 객체명은 MarketData1으로 하시고 종목선택하시면 됩니다. 계좌객체 추가 --> 속성에서 객체명은 Account1로 하시고 속성에서 계좌번호 선택하시면 됩니다. 외부변수 추가 후 변수명 a1, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 a2, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 a3, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 b1, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 b2, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 b3, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 m1, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 m2, 초기값을 지정하시고 데이터형은 숫자로 설정 각 수식안에서 시초가+a1, 시초가-b1,(시초가+a1)+m1,(시초가+a1)-m2등으로 사용되므로 모든 변수의 기초값은 양수로 지정하시면 됩니다. 2. 수식상 게시판 금칙어가 있어 영문업데이트가 U*pdate로 *가 추가되어 있습니다. 식상 19번째 줄, 22번째 줄에서 제거하시고 사용하셔야 합니다. 3 예스스팟은 주문등을 완전히 테스트해 드리지 않습니다. 수식에 주석을 붙여 드렸으므로 식수정이나 작성에 참고하시기 바랍니다. 4. 예스스팟 수식 var upcond1 = false, upid1 = 0, upnum1 = 0, upfill1 = false, mcond1 = false; var upcond2 = false, upid2 = 0, upnum2 = 0, upfill2 = false, mcond2 = false; var upcond3 = false, upid3 = 0, upnum3 = 0, upfill3 = false, mcond3 = false; var dncond1 = false, dnid1 = 0, dnnum1 = 0, dnfill1 = false; var dncond2 = false, dnid2 = 0, dnnum2 = 0, dnfill1 = false; var dncond3 = false, dnid3 = 0, dnnum3 = 0, dnfill1 = false; function Main_OnStart() { upcond1 = false; upcond2 = false; upcond3 = false; dncond1 = false; dncond2 = false; dncond3 = false; } function Main_OnU*pdateMarket(sItemCode, lU*pdateID) { //MarketData1종목이 시세업데이트가 됨 if(MarketData1.code == sItemCode && lU*pdateID == 20001 && MarketData1.open > 0) { //시초가+a1 주문 //upcond1이 false인 상태에서 현재가가 시초가+a1에 도달하면 if (upcond1 == false && MarketData1.current >= MarketData1.open +a1) { Main.MessageList("시초가+a1만족","현재가",MarketData1.current,"시초가+a1",MarketData1.open +a1) //upcond1은 true로 변경 upcond1 = true; //매도5호가로 1계약 매수주문 (주문아이디는 upid1에 저장) upid1 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); upfill1 = false;//체결확인하는 변수는 false mcond1 = false;//an+m1 도달확인용 변수 } //시초가+a2 주문 //upcond2가 false인 상태에서 현재가가 시초가+a2에 도달하면 if (upcond2 == false && MarketData1.current >= MarketData1.open +a2) { Main.MessageList("시초가+a2만족","현재가",MarketData1.current,"시초가+a2",MarketData1.open +a2) //upcond2는 true로 변경 upcond2 = true; //매도5호가로 1계약 매수주문 (주문아이디는 upid2에 저장) upid2 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); upfill2 = false;//체결확인하는 변수는 false mcond2 = false;//an+m1 도달확인용 변수 } //시초가+a3 주문 //upcond3가 false인 상태에서 현재가가 시초가+a3에 도달하면 if (upcond3 == false && MarketData1.current >= MarketData1.open +a3) { Main.MessageList("시초가+a3만족","현재가",MarketData1.current,"시초가+a3",MarketData1.open +a3) //upcond3은 true로 변경 upcond3 = true; //매도5호가로 1계약 매수주문 (주문아이디는 upid2에 저장) upid3 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); upfill3 = false;//체결확인하는 변수는 false mcond3 = false;//an+m1 도달확인용 변수 } //시초가-b1 주문 //dncond1이 false인 상태에서 현재가가 시초가-b1에 도달하면 if (dncond1 == false && MarketData1.current <= MarketData1.open-b1) { Main.MessageList("시초가-b1만족","현재가",MarketData1.current,"시초가-b1",MarketData1.open-b1) //dncond1은 true로 변경 dncond1 = true; //매도5호가로 1계약 매수주문 (주문아이디는 dnid1에 저장) dnid1 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); dnfill1 = false;//체결확인하는 변수는 false } //시초가-b2 주문 //dncond2이 false인 상태에서 현재가가 시초가-b2에 도달하면 if (dncond2 == false && MarketData1.current <= MarketData1.open-b2) { Main.MessageList("시초가-b1만족","현재가",MarketData1.current,"시초가-b1",MarketData1.open-b2) //dncond2는 true로 변경 dncond2 = true; //매도5호가로 1계약 매수주문 (주문아이디는 dnid2에 저장) dnid2 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); dnfill2 = false;//체결확인하는 변수는 false } //시초가-b3 주문 //dncond3이 false인 상태에서 현재가가 시초가-b3에 도달하면 if (dncond3 == false && MarketData1.current <= MarketData1.open-b3) { Main.MessageList("시초가-b3만족","현재가",MarketData1.current,"시초가-b3",MarketData1.open-b1) //dncond3은 true로 변경 dncond3 = true; //매도5호가로 1계약 매수주문 (주문아이디는 dnid1에 저장) dnid3 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); dnfill2 = false;//체결확인하는 변수는 false } //시초가+a1이 체결된 이후 if (upfill1 == true) { //현재가가 (시초가+a1)+m1에 도달하면 mcond1은 true if (MarketData1.current >= (MarketData1.open+a1)+m1) mcond1 = true; // mcond1이 false인 상태에서 현재가가 (시초가+a1)-m2에 도달하면 매수5호가로 1계약 매도주문 if (mcond1 == false && MarketData1.current <= (MarketData1.open+a1)-m2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } //시초가+a2이 체결된 이후 if (upfill2 == true) { //현재가가 (시초가+a2)+m1에 도달하면 mcond2은 true if (MarketData1.current >= (MarketData1.open+a2)+m1) mcond2 = true; // mcond2이 false인 상태에서 현재가가 (시초가+a2)-m2에 도달하면 매수5호가로 1계약 매도주문 if (mcond2 == false && MarketData1.current <= (MarketData1.open+a2)-m2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } //시초가+a3이 체결된 이후 if (upfill1 == true) { //현재가가 (시초가+a3)+m1에 도달하면 mcond3은 true if (MarketData1.current >= (MarketData1.open+a3)+m1) mcond3 = true; // mcond3이 false인 상태에서 현재가가 (시초가+a3)-m2에 도달하면 매수5호가로 1계약 매도주문 if (mcond3 == false && MarketData1.current <= (MarketData1.open+a3)-m2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } } } //수식에서 발생한 주문에 대해 주문응답이 수신되면 function Main_OnOrderResponse(OrderResponse) { //upid1주문이 접수되면 주문번호를 upnum1에 주문번호 저장 if (OrderResponse.orderID == upid1) upnum1 = OrderResponse.orderNum; //upid2주문이 접수되면 주문번호를 upnum2에 주문번호 저장 if (OrderResponse.orderID == upid2) upnum2 = OrderResponse.orderNum; //upid3주문이 접수되면 주문번호를 upnum3에 주문번호 저장 if (OrderResponse.orderID == upid3) upnum3 = OrderResponse.orderNum; //dnid1주문이 접수되면 주문번호를 dnnum1에 주문번호 저장 if (OrderResponse.orderID == dnid1) dnnum1 = OrderResponse.orderNum; //dnid2주문이 접수되면 주문번호를 dnnum2에 주문번호 저장 if (OrderResponse.orderID == dnid2) dnnum2 = OrderResponse.orderNum; //dnid3주문이 접수되면 주문번호를 dnnum3에 주문번호 저장 if (OrderResponse.orderID == dnid3) dnnum3 = OrderResponse.orderNum; } //수식에서 발생한 주문에 대해 체결응답이 수신되면 function Main_OnNotifyFill(NotifyFill) { //upnum1주문번호가 체결되면 upfill1을 true로 변경 if (NotifyFill.orderNum == upnum1) upfill1 = true; //upnum2주문번호가 체결되면 upfill2를 true로 변경 if (NotifyFill.orderNum == upnum2) upfill2 = true; //upnum3주문번호가 체결되면 upfill3을 true로 변경 if (NotifyFill.orderNum == upnum3) upfill3 = true; //dnnum1주문번호가 체결되면 dnfill1을 true로 변경 if (NotifyFill.orderNum == dnnum1) dnfill1 = true; //dnnum2주문번호가 체결되면 dnfill2를 true로 변경 if (NotifyFill.orderNum == dnnum2) dnfill2 = true; //dnnum3주문번호가 체결되면 dnfill3을 true로 변경 if (NotifyFill.orderNum == dnnum3) dnfill3 = true; } 즐거운 하루되세요 > 음양조파 님이 쓴 글입니다. > 제목 : 질문입니다. > 안녕하세요? 저는 미완성 신호로 매매하고 싶어서 예스랭기지보다는 예스스팟이 더 좋습니다. 예스스팟으로 다음과 같은 기능을 구현하려면 어떻게 하면 될까요? 시가 위 a1, a2, a3 지점과 시가 밑 b1, b2, b3 지점에서 피라미딩 매수 진입을 계획합니다. 시가 밑에서 매수된 것은, 그 후 현재가가 어찌되든 내버려둡니다. 시가 위에서 매수된 것은, 매수된 후 현재가가 an+m1 지점에 이르지 못하고 an-m2지점에 이르면 손절 청산하고, 매수된 후 현재가가 일단 an+m1 지점에 이르렀다면 그 후 현재가가 어찌되든 내버려둡니다. 이미 해당 지점에서 한 번 매수되었다면 추가진입은 하지 않습니다. 그러나 위에서 본 것처럼 손절 청산이 되어 버렸다면, 현재가가 다시 원래의 매수 해당지점에 이르면(예를 들어 a3지점에서 매수한 것이 손절 청산되었다면, 그 후 다시 a3 지점에 이르면) 다시 매수합니다. 다시 매수한 것도 손절문제와 재진입문제를 동일하게 처리합니다. 매뉴얼을 공부하다 보니까 예스스팟이 예스랭기지보다는 명령어 분량이 훨씬 많은 것 같습니다. 그렇지만 저는 예스스팟이 더 좋아서 앞으로 최대한 예스스팟으로 식을 짜고 싶어 이렇게 여쭈어 봅니다. 번거로우시겠으나 가르쳐 주시면, 매뉴얼에 나오는 내용하고 하나하나 비교해 가면서 원리를 잘 공부해 보겠습니다. 감사합니다. * a1,a2,a3,b1,b2,b3,m1,m2는 구동 시작시 지정해주려고 합니다.
프로필 이미지

예스스탁 예스스탁 답변

2013-07-01 17:17:12

안녕하세요 예스스탁입니다. MarketData1.open은 시초가입니다. 당일 정규장전에는 0값입니다. MarketData1.open > 0은 정규장 시작하고라는 의미입니다. 즐거운 하루되세요 > 음양조파 님이 쓴 글입니다. > 제목 : Re : Re : 질문입니다.(추가질문) > 정말 감사합니다. 주신 예문 갖고 열심히 매뉴얼이랑 비교하며 살펴보다가 잘 이해가 안되는 부분이 있어서요. //MarketData1종목이 시세업데이트가 됨 if(MarketData1.code == sItemCode && lU*pdateID == 20001 && MarketData1.open > 0) 에서,다른 부분은 이해가 되는데, MarketData1.open > 0 이 무슨 뜻인지 모르겠습니다. 그 날의 장이 시작되어 시가가 생겨났다는 의미인가요? > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 질문입니다. > 안녕하세요 예스스탁입니다. 1 스크립트 객체화면에서 종목객체 추가 --> 속성에서 객체명은 MarketData1으로 하시고 종목선택하시면 됩니다. 계좌객체 추가 --> 속성에서 객체명은 Account1로 하시고 속성에서 계좌번호 선택하시면 됩니다. 외부변수 추가 후 변수명 a1, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 a2, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 a3, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 b1, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 b2, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 b3, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 m1, 초기값을 지정하시고 데이터형은 숫자로 설정 외부변수 추가 후 변수명 m2, 초기값을 지정하시고 데이터형은 숫자로 설정 각 수식안에서 시초가+a1, 시초가-b1,(시초가+a1)+m1,(시초가+a1)-m2등으로 사용되므로 모든 변수의 기초값은 양수로 지정하시면 됩니다. 2. 수식상 게시판 금칙어가 있어 영문업데이트가 U*pdate로 *가 추가되어 있습니다. 식상 19번째 줄, 22번째 줄에서 제거하시고 사용하셔야 합니다. 3 예스스팟은 주문등을 완전히 테스트해 드리지 않습니다. 수식에 주석을 붙여 드렸으므로 식수정이나 작성에 참고하시기 바랍니다. 4. 예스스팟 수식 var upcond1 = false, upid1 = 0, upnum1 = 0, upfill1 = false, mcond1 = false; var upcond2 = false, upid2 = 0, upnum2 = 0, upfill2 = false, mcond2 = false; var upcond3 = false, upid3 = 0, upnum3 = 0, upfill3 = false, mcond3 = false; var dncond1 = false, dnid1 = 0, dnnum1 = 0, dnfill1 = false; var dncond2 = false, dnid2 = 0, dnnum2 = 0, dnfill1 = false; var dncond3 = false, dnid3 = 0, dnnum3 = 0, dnfill1 = false; function Main_OnStart() { upcond1 = false; upcond2 = false; upcond3 = false; dncond1 = false; dncond2 = false; dncond3 = false; } function Main_OnU*pdateMarket(sItemCode, lU*pdateID) { //MarketData1종목이 시세업데이트가 됨 if(MarketData1.code == sItemCode && lU*pdateID == 20001 && MarketData1.open > 0) { //시초가+a1 주문 //upcond1이 false인 상태에서 현재가가 시초가+a1에 도달하면 if (upcond1 == false && MarketData1.current >= MarketData1.open +a1) { Main.MessageList("시초가+a1만족","현재가",MarketData1.current,"시초가+a1",MarketData1.open +a1) //upcond1은 true로 변경 upcond1 = true; //매도5호가로 1계약 매수주문 (주문아이디는 upid1에 저장) upid1 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); upfill1 = false;//체결확인하는 변수는 false mcond1 = false;//an+m1 도달확인용 변수 } //시초가+a2 주문 //upcond2가 false인 상태에서 현재가가 시초가+a2에 도달하면 if (upcond2 == false && MarketData1.current >= MarketData1.open +a2) { Main.MessageList("시초가+a2만족","현재가",MarketData1.current,"시초가+a2",MarketData1.open +a2) //upcond2는 true로 변경 upcond2 = true; //매도5호가로 1계약 매수주문 (주문아이디는 upid2에 저장) upid2 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); upfill2 = false;//체결확인하는 변수는 false mcond2 = false;//an+m1 도달확인용 변수 } //시초가+a3 주문 //upcond3가 false인 상태에서 현재가가 시초가+a3에 도달하면 if (upcond3 == false && MarketData1.current >= MarketData1.open +a3) { Main.MessageList("시초가+a3만족","현재가",MarketData1.current,"시초가+a3",MarketData1.open +a3) //upcond3은 true로 변경 upcond3 = true; //매도5호가로 1계약 매수주문 (주문아이디는 upid2에 저장) upid3 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); upfill3 = false;//체결확인하는 변수는 false mcond3 = false;//an+m1 도달확인용 변수 } //시초가-b1 주문 //dncond1이 false인 상태에서 현재가가 시초가-b1에 도달하면 if (dncond1 == false && MarketData1.current <= MarketData1.open-b1) { Main.MessageList("시초가-b1만족","현재가",MarketData1.current,"시초가-b1",MarketData1.open-b1) //dncond1은 true로 변경 dncond1 = true; //매도5호가로 1계약 매수주문 (주문아이디는 dnid1에 저장) dnid1 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); dnfill1 = false;//체결확인하는 변수는 false } //시초가-b2 주문 //dncond2이 false인 상태에서 현재가가 시초가-b2에 도달하면 if (dncond2 == false && MarketData1.current <= MarketData1.open-b2) { Main.MessageList("시초가-b1만족","현재가",MarketData1.current,"시초가-b1",MarketData1.open-b2) //dncond2는 true로 변경 dncond2 = true; //매도5호가로 1계약 매수주문 (주문아이디는 dnid2에 저장) dnid2 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); dnfill2 = false;//체결확인하는 변수는 false } //시초가-b3 주문 //dncond3이 false인 상태에서 현재가가 시초가-b3에 도달하면 if (dncond3 == false && MarketData1.current <= MarketData1.open-b3) { Main.MessageList("시초가-b3만족","현재가",MarketData1.current,"시초가-b3",MarketData1.open-b1) //dncond3은 true로 변경 dncond3 = true; //매도5호가로 1계약 매수주문 (주문아이디는 dnid1에 저장) dnid3 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); dnfill2 = false;//체결확인하는 변수는 false } //시초가+a1이 체결된 이후 if (upfill1 == true) { //현재가가 (시초가+a1)+m1에 도달하면 mcond1은 true if (MarketData1.current >= (MarketData1.open+a1)+m1) mcond1 = true; // mcond1이 false인 상태에서 현재가가 (시초가+a1)-m2에 도달하면 매수5호가로 1계약 매도주문 if (mcond1 == false && MarketData1.current <= (MarketData1.open+a1)-m2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } //시초가+a2이 체결된 이후 if (upfill2 == true) { //현재가가 (시초가+a2)+m1에 도달하면 mcond2은 true if (MarketData1.current >= (MarketData1.open+a2)+m1) mcond2 = true; // mcond2이 false인 상태에서 현재가가 (시초가+a2)-m2에 도달하면 매수5호가로 1계약 매도주문 if (mcond2 == false && MarketData1.current <= (MarketData1.open+a2)-m2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } //시초가+a3이 체결된 이후 if (upfill1 == true) { //현재가가 (시초가+a3)+m1에 도달하면 mcond3은 true if (MarketData1.current >= (MarketData1.open+a3)+m1) mcond3 = true; // mcond3이 false인 상태에서 현재가가 (시초가+a3)-m2에 도달하면 매수5호가로 1계약 매도주문 if (mcond3 == false && MarketData1.current <= (MarketData1.open+a3)-m2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } } } //수식에서 발생한 주문에 대해 주문응답이 수신되면 function Main_OnOrderResponse(OrderResponse) { //upid1주문이 접수되면 주문번호를 upnum1에 주문번호 저장 if (OrderResponse.orderID == upid1) upnum1 = OrderResponse.orderNum; //upid2주문이 접수되면 주문번호를 upnum2에 주문번호 저장 if (OrderResponse.orderID == upid2) upnum2 = OrderResponse.orderNum; //upid3주문이 접수되면 주문번호를 upnum3에 주문번호 저장 if (OrderResponse.orderID == upid3) upnum3 = OrderResponse.orderNum; //dnid1주문이 접수되면 주문번호를 dnnum1에 주문번호 저장 if (OrderResponse.orderID == dnid1) dnnum1 = OrderResponse.orderNum; //dnid2주문이 접수되면 주문번호를 dnnum2에 주문번호 저장 if (OrderResponse.orderID == dnid2) dnnum2 = OrderResponse.orderNum; //dnid3주문이 접수되면 주문번호를 dnnum3에 주문번호 저장 if (OrderResponse.orderID == dnid3) dnnum3 = OrderResponse.orderNum; } //수식에서 발생한 주문에 대해 체결응답이 수신되면 function Main_OnNotifyFill(NotifyFill) { //upnum1주문번호가 체결되면 upfill1을 true로 변경 if (NotifyFill.orderNum == upnum1) upfill1 = true; //upnum2주문번호가 체결되면 upfill2를 true로 변경 if (NotifyFill.orderNum == upnum2) upfill2 = true; //upnum3주문번호가 체결되면 upfill3을 true로 변경 if (NotifyFill.orderNum == upnum3) upfill3 = true; //dnnum1주문번호가 체결되면 dnfill1을 true로 변경 if (NotifyFill.orderNum == dnnum1) dnfill1 = true; //dnnum2주문번호가 체결되면 dnfill2를 true로 변경 if (NotifyFill.orderNum == dnnum2) dnfill2 = true; //dnnum3주문번호가 체결되면 dnfill3을 true로 변경 if (NotifyFill.orderNum == dnnum3) dnfill3 = true; } 즐거운 하루되세요 > 음양조파 님이 쓴 글입니다. > 제목 : 질문입니다. > 안녕하세요? 저는 미완성 신호로 매매하고 싶어서 예스랭기지보다는 예스스팟이 더 좋습니다. 예스스팟으로 다음과 같은 기능을 구현하려면 어떻게 하면 될까요? 시가 위 a1, a2, a3 지점과 시가 밑 b1, b2, b3 지점에서 피라미딩 매수 진입을 계획합니다. 시가 밑에서 매수된 것은, 그 후 현재가가 어찌되든 내버려둡니다. 시가 위에서 매수된 것은, 매수된 후 현재가가 an+m1 지점에 이르지 못하고 an-m2지점에 이르면 손절 청산하고, 매수된 후 현재가가 일단 an+m1 지점에 이르렀다면 그 후 현재가가 어찌되든 내버려둡니다. 이미 해당 지점에서 한 번 매수되었다면 추가진입은 하지 않습니다. 그러나 위에서 본 것처럼 손절 청산이 되어 버렸다면, 현재가가 다시 원래의 매수 해당지점에 이르면(예를 들어 a3지점에서 매수한 것이 손절 청산되었다면, 그 후 다시 a3 지점에 이르면) 다시 매수합니다. 다시 매수한 것도 손절문제와 재진입문제를 동일하게 처리합니다. 매뉴얼을 공부하다 보니까 예스스팟이 예스랭기지보다는 명령어 분량이 훨씬 많은 것 같습니다. 그렇지만 저는 예스스팟이 더 좋아서 앞으로 최대한 예스스팟으로 식을 짜고 싶어 이렇게 여쭈어 봅니다. 번거로우시겠으나 가르쳐 주시면, 매뉴얼에 나오는 내용하고 하나하나 비교해 가면서 원리를 잘 공부해 보겠습니다. 감사합니다. * a1,a2,a3,b1,b2,b3,m1,m2는 구동 시작시 지정해주려고 합니다.