예스스탁
예스스탁 답변
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는 구동 시작시 지정해주려고 합니다.
정말 감사합니다.
주신 예문 갖고 열심히 매뉴얼이랑 비교하며 살펴보다가 잘 이해가 안되는 부분이 있어서요.
//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는 구동 시작시 지정해주려고 합니다.