예스스탁
예스스탁 답변
2014-06-02 17:28:29
안녕하세요
예스스탁입니다.
1.
%로 설정하시면 작성하시 작성하신 내용이 맞습니다.
종목객체에는 해당종목의 1틱의 값도 같이 제공이 되고 있습니다.
MarketData1.GetTickSize()
아래와 같이 2틱으로 지정하셔도 됩니다.
if (MarketData1.current <= Account1.Balance.avgUnitCost-MarketData1.GetTickSize()*2)
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.current, 1); ///// ((현재가로 시장가 청산주문하고자 합니다)).
}
틱으로 지정하시면 위식 사용하시면 됩니다.
손절과 추적스탑의 내용을 모두 틱으로 지정해 올려드립니다.
2.
내용상 미체결이 필요없어지는 조건을 알수가 없습니다.
특정 이벤트가 발생하고 특정조건이면
취소를 하셔야 하는데 해당 부분에 대한 언급이 없으셔서
각 청산주문 나갈때 해당종목에 대한 미체결이 있으면 모두 취소하고
주문이 발생하게 했습니다.
var Entry1,H1,L1;
function Main_OnStart()
{
Entry1 = false;
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
//Account1계좌에 MarketData1종목이 신규로 들어오면
if (sAccntNum == Account1.number && lUp*dateID == 30001 && MarketData1.code == sItemCode)
{
Entry1 = true;
H1 = MarketData1.current;
L1 = MarketData1.current;
Account1.SetBalanceItem(MarketData1.code, 0);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
//MarketData1종목 진입이후 최고가/최저가 계산
if (Entry1 == true && sItemCode == MarketData1.code && lUp*dateID == 20001)
{
if (MarketData1.current > H1);
H1 = MarketData1.current;
if (MarketData1.current < L1);
L1 = MarketData1.current;
//매수포지션
if (Account1.Balance.position == 2)
{
//1% 익절
if (MarketData1.current >= Account1.Balance.avgUnitCost *1.04)
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//2틱 손절
if (MarketData1.current <= Account1.Balance.avgUnitCost-MarketData1.GetTickSize()*2)
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//4틱이하 상승하면 최고가격에서 2틱 하락하면 청산
if (H1 <= Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*4 &&
MarketData1.current <= H1- MarketData1.GetTickSize()*2 )
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//5~15틱 상승하면 최고가격에서 3틱 하락하면 청산
if (H1 >= Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*5 &&
H1 <= Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*15 &&
MarketData1.current <= H1- MarketData1.GetTickSize()*3 )
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//16~30틱 상승하면 최고가격에서 10틱 하락하면 청산
if (H1 >= Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*16 &&
H1 <= Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*30 &&
MarketData1.current <= H1- MarketData1.GetTickSize()*10 )
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//31~50틱 상승하면 최고가격에서 5틱 하락하면 청산
if (H1 >= Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*16 &&
H1 <= Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*30 &&
MarketData1.current <= H1- MarketData1.GetTickSize()*5 )
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//51틱 상승하면 최고가격에서 2틱 하락하면 청산
if (H1 >= Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*51 &&
MarketData1.current <= H1- MarketData1.GetTickSize()*2 )
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
}
//매도포지션
if (Account1.Balance.position == 2)
{
//4% 익절
if (MarketData1.current <= Account1.Balance.avgUnitCost *0.96)
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//1% 손절
if (MarketData1.current >= Account1.Balance.avgUnitCost *1.0002)
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//4틱 미만 하락하면 최저가격에서 2틱 상승하면 청산
if (L1 >= Account1.Balance.avgUnitCost-MarketData1.GetTickSize()*4 &&
MarketData1.current >= L1+MarketData1.GetTickSize()*2 )
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//5~15틱 하락하면 최저가격에서 3틱 상승하면 청산
if (L1 <= Account1.Balance.avgUnitCost-MarketData1.GetTickSize()*5 &&
L1 >= Account1.Balance.avgUnitCost-MarketData1.GetTickSize()*15 &&
MarketData1.current >= L1+MarketData1.GetTickSize()*3 )
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//16~30틱 하락하면 최저가격에서 10틱 상승하면 청산
if (L1 <= Account1.Balance.avgUnitCost-MarketData1.GetTickSize()*16 &&
L1 >= Account1.Balance.avgUnitCost-MarketData1.GetTickSize()*30 &&
MarketData1.current >= L1+MarketData1.GetTickSize()*10 )
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//31~50틱 하락하면 최저가격에서 5틱 상승하면 청산
if (L1 <= Account1.Balance.avgUnitCost-MarketData1.GetTickSize()*31 &&
L1 >= Account1.Balance.avgUnitCost-MarketData1.GetTickSize()*50 &&
MarketData1.current >= L1+MarketData1.GetTickSize()*5 )
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//51틱 이상 하락하면 최저가격에서 2틱 상승하면 청산
if (L1 <= Account1.Balance.avgUnitCost-MarketData1.GetTickSize()*51 &&
MarketData1.current >= L1+MarketData1.GetTickSize()*2 )
{
//기존 MarketData1종목에 대한 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i);
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum)
}
}
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
}
}
}
즐거운 하루되세요
> 즐겁게 님이 쓴 글입니다.
> 제목 : 문의 드립니다.
> 항상 친절하신 답변 감사드립니다.
아래 912번 문의와 관련하여 보충 문의 드립니다.
원유의 경우를 예로 들어서 질문 드리고자 합니다.
A. 초기 스탑 ((손절)): 2틱 손절
A-1.
원유의 경우, 1틱이 0.01포인트.
가령 최초에 배럴당 가격 100.00달러에 매수진입했다고 가정하면, 1틱은 가격 100포인트의 0.01%. 따라서 2틱 스탑이면 0.02% 스탑임. ((= *0.0002 하락하는 경우임))
따라서, 아래 식으로 하면 될런지요?
if (MarketData1.current <= Account1.Balance.avgUnitCost *0.9998)
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.current, 1); ///// ((현재가로 시장가 청산주문하고자 합니다)).
}
A-2.
일단 이 주문이 나간 후, 어떤 이유에서든간에 위 주문이 체결되지 않고 남아 있다가 나중에 엉뚱하게 주문이 체결되어 버리는 일이 생기지 않도록,
이 주문이 나간 후, 이 주문이 필요없어 지면 이 미체결 주문을 취소하는 식도 같이 알려 주시면 대단히 감사하겠습니다.
[[밑의 질문 항목들에서도, 그 주문이 미체결 상태에서 필요 없어 지면 그 미체결 주문을 없애 치우는 (취소하는) 식들을 포함해 주시길 부탁 드립니다.]]
B. 추적 스탑: 아래와 같이 추적스탑을 하려고 하면, 식을 어떻게 작성해야 할지요?
1.
4틱 오를 때까지는((가격이 100.01 ~ 100.04)) 2틱 스탑
((예를 들자면 아래와 같은 상황이 되겠습니다.
1틱 오르면, 즉 가격이 100.01이 되면 스탑은 99.99에 설정됨. // 2틱 오르면 가격은 100.02. 이 때 스탑은 100.00. // 3틱 오르면 가격은100.03. 이 때 스탑은 100.01. // 4틱 오르면 100.04. 스탑은 100.02))
2.
5틱 오른 후 15틱 오를 때까지((예: 100.05 ~ 100.15))는 3틱 스탑
((예: 100.00에 매수 진입 후 5틱 오르면 100.05. 이 때 스탑은 100.02에 설정. ~ 15틱 오르면 100.15. 스탑은 100.12))
3.
16틱 오른 후 30틱 오를 때까지: 10틱 스탑
((예: 16틱 오르면 가격은 100.16. => 이 때 스탑은 100.06. ~ 30틱 오르면 가격은 100.30 => 이 때 스탑은 100.20))
4.
31틱 이상 ~ 50틱까지 오르면: 5틱 스탑
((예: 31틱 오르면 가격은 100.31 => 이 때 스탑은 100.26))
5.
51틱 이상 오르면 2틱 스탑
((예: 만일 51틱 오르면 가격은 100.51 => 이 때 스탑은 100.49))
감사합니다!
아래: 912번 식에서, 한 품목만 거래하는 경우 ((부분 복사해 옴)):
var Entry1,H1,L1;
function Main_OnStart()
{
Entry1 = false;
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
//Account1계좌에 MarketData1종목이 신규로 들어오면
if (sAccntNum == Account1.number && lUp*dateID == 30001 && MarketData1.code == sItemCode)
{
Entry1 = true;
H1 = MarketData1.current;
L1 = MarketData1.current;
Account1.SetBalanceItem(MarketData1.code, 0);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
//MarketData1종목 진입이후 최고가/최저가 계산
if (Entry1 == true && sItemCode == MarketData1.code && lUp*dateID == 20001)
{
if (MarketData1.current > H1);
H1 = MarketData1.current;
if (MarketData1.current < L1);
L1 = MarketData1.current;
//매수포지션
if (Account1.Balance.position == 2)
{
//1% 익절
if (MarketData1.current >= Account1.Balance.avgUnitCost *1.04)
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//1% 손절
if (MarketData1.current <= Account1.Balance.avgUnitCost *0.99)
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//3%이상 상승후 최고가격에서 1% 하락하면 청산
if (H1 >= Account1.Balance.avgUnitCost *1.03 && MarketData1.current <= H1*0.99 )
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
}
//매도포지션
if (Account1.Balance.position == 2)
{
//4% 익절
if (MarketData1.current <= Account1.Balance.avgUnitCost *0.96)
{
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//1% 손절
if (MarketData1.current >= Account1.Balance.avgUnitCost *1.01)
{
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//3%이상 하락후 최저가격에서 1% 상승하면 청산
if (L1 <= Account1.Balance.avgUnitCost *0.97 && MarketData1.current >= L1*1.01 )
{
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
}
}