답변완료
수식 수정 요청드립니다.
아래수식은 무포지션일 때 최초 매수가 들어가고 그 이후에 최초 매수가격에 상방으로
첫진입 체결후 3틱 상승시 마다 매수주문이 들어 가고 있습니다.
그런데 최초 진입이나 중간에서 진입이나 1개가 될 때도 있지만 동시에 여러개가 될 때가 많다는 것을 확인했습니다. 특히 거래량이 많고 순간적인 작은 1틱의 변화에 수 많은 복수 동시 진입이 되는 것을 확인했습니다.
1개의 진입이 체결돨 때까지 복수 진입신호를 허용하지 않아 1개의 수량만 진입이 되도록 부탁드립니다.
그리고 청산후에 다시 무포지션이 되어 재진입이 될 때가 있고 안될 때가 있습니다.
이것도 수정해 주시면 감사하겠습니다.
Account1.Refresh() 기능도 추가 되었으면 좋겠습니다.
//종목객체 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);
}
}
2017-11-04
2896
글번호 224236
답변완료
문의드립니다.
안녕하세요.
1번 질문:
해외선물의 경우 장개시 시간이 08시0분에 시작해서 그다음날 07시0분에 장마감됩니다.
제가 데이트레이딩으로 거래하고 싶습니다.
매수 또는 매도가 08:00 부터 거래를 시작해서
익일 04:00 넘어서 거래가 모두 청산이 되면 새로운 매수,또는 매도가 일어나지 않도록 하고 싶습니다.
2번질문 아래 수식에서 어떤 방식으로 수식을 짜야 할까요?
또 모든 거래가 익일 06:00 까지 잔존하고 있다면 익일 06:00에 잔존하는 모든거래를 청산하고 싶습니다.
2번 질문:
아래 매도 수식을 ( 무포지션시 기준가 형성후 그 기준가를 하방으로 돌파시 1계약씩 매도하는 수식)
실행을 시키면
var SSPrice;
//스팟시작
function Main_OnStart()
{
//MarketData1종목 잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//내부파일에 SSPrice에 적어놓은 값을 가져와 다시 변수에 저장
var bb = Main.GetUserValue("SSPrice");
if (bb == "" || Account1.Balance.count == 0)
SSPrice = 0;
else
SSPrice = bb;
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
if (lUp*dateID == 20001)
{
//무포지션이고 SSPrice가 0이면 기준값 지정
if (Account1.Balance.count == 0 && SSPrice == 0)
{
SSPrice = MarketData1.current;
Main.SetUserValue("SSPrice",SSPrice);
}
//SSPrice가 0보다 크고 현재가가 SSPrice-3틱 이하이면 1계약 시장가 매도
if (SSPrice > 0 && MarketData1.current <= SSPrice - MarketData1.GetTickSize()*3)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1,0,1);
SSPrice = SSPrice - MarketData1.GetTickSize()*3;
Main.SetUserValue("SSPrice",SSPrice);
}
}
}
//계좌잔고에서 MarketData1이 완전청산되면 SSPrice 변수 0으로 셋팅
function Main_OnU*pdateAccount(sAccntNum, sItemCode, lUp*dateID)
{
if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002)
{
SSPrice = 0;
Main.SetUserValue("SSPrice",SSPrice);
}
}
가장 중요한 질문A : 거래가 이루어질 때 거의 동시에 2계약이나 심지어 수십계약이 동시 체결이 될 때가 있습니다..1 계약씩만 매도가 되도록 수식을 보완해 주시면 감사드리겠습니다.
그런데 최초 진입시 SSPrice-3틱 이하이면 1계약 시장가 매도
에서 -1틱 ,-2틱 간격으로 놓으면 진입이 일어나는데 3틱부터는 (큰 수의 4틱 5틱으로)
큰간격을 벌려 놓으면 진입이 아예 안되고 있습니다.
1틱으로 놓으면 동시진입이 6개 ,7개씩 동시진입이 나옵니다.
그리고 잔고 청산후에 다시 재진입시 진입이 되다가 안되다가등 진입이 중구 난방입니다.있던 잔고가 청산후에 재진입이 항상 일어나도록 수식을 수정 요청드립니다.
질문 B : 위에서 진입시 1개씩도 진입되지만 경우에 따라서는 거의 동시에 몇개씩 여러개가 동시진입이 되고 있습니다. 어떤 데이타 기준에 의해서 거래가 이루어지는 것인지도 알고 싶습니다.틱의 최소단위 데이타로 거래가 이루어지는 것인지요?
또 2분봉이나 30초봉, 20틱봉의 특정 분,초, 틱봉 데이타로 이 수식을 적용하는 방법을 가르쳐 주시면 감사드리겠습니다.
질문C :
또 if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002)
에서
lUp*dateID == 30002 의 의미는 어떤 의미인지도 알고 싶습니다.
3번질문
이전 청산 손익에 따른 기준값 변경을 하고 싶습니다.
위의 2번식에서 2번식이 실행되어 잔고가 있게되고 그 잔고가 청산이 되어 다시 무포지션이 될 때
이전 청산이 손실이면
2번식의
//무포지션이고 SSPrice가 0이면 기준값 지정
if (Account1.Balance.count == 0 && SSPrice == 0)
{
SSPrice = MarketData1.current;
에서 기준값 SSPrice 을 SSPrice = MarketData1.current; 그대로 하고요.
이전 청산이 수익이면
기준값 SSPrice 을 SSPrice = MarketData1.current + MarketData1.GetTickSize()*5; 처럼 변경하고 싶습니다.
수식을 요청드립니다.
2017-11-07
2706
글번호 224234
답변완료
수식에러가 나는데 도움요청드립니다.
해외선물을 매매하는데요
청산만 수식에 적용하려고 해서 글을 찾아보다가 아래 식을 사용하려고 하는데요
검증누르면 검증이 완료됬다고 나오긴합니다.
한국투자증권 이프렌드 글로벌 사용중인데 모의투자로 접속해서 스팟을 적용시켜 놓고
매매창에서 한계약 들어가면
메세지를 달아 디버그창으로 확인해보면
청산 항목부터 진행이 안됩니다.
한계약 수동으로 진입하면
//요청받은 종목객체 생성완료
여기까진 메세지가 나오는데
그 아래 청산부분
//종목객체 시세 업데이트
여기부터 수식에서 계속 루프가 돌고 청산이 실행이 안됩니다.
확인 좀 부탁드립니다 ㅠ
var Nth = 0;
var ItemCode = new Array(100);
var ItemObject = new Array(100);
function Main_OnStart()
{
Nth = 0;
}
//계좌의 종목편입
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)//*제거
{
//Account1 계좌에 종목이 편입
if (Account1.number == sAccntNum && lUp*dateID == 30001)//*제거
{
//해당종목 잔고 셋팅
Nth = Nth+1;//스팟 실행 후 편입된 종목수
ItemCode[Nth] = sItemCode; //종목코드 저장
Main.ReqMarketData(ItemCode[Nth], 0,0);//종목객체 생성요청
}
//Account1 계좌에 종목이 청산되 없어짐
if (Account1.number == sAccntNum && lUp*dateID == 30002)//*제거
{
//이전에 생성한 종목객체가 필요없으므로 종목객체를 삭제
for (var i = 1; i <= Nth; i++)
{
if (sItemCode == ItemObject[i].code)
{
Main.RemoveMarketData(ItemObject[i]);
}
}
}
}
//요청받은 종목객체 생성완료
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == ItemCode[Nth])
{
ItemObject[Nth] = MarketData;
}
}
//종목객체 시세 업데이트
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
if (Nth >= 1)
{ //편입된 종목수 만킄만 수행
for (var i = 1; i <= Nth; i++)
{
if (ItemObject[i].code == sItemCode && lUp*dateID == 20001)//*제거
{
//잔고셋팅
Account1.SetBalanceItem(ItemObject[i].code,0);
//매수잔고
if (Account1.Balance.position == 2 && Account1.Balance.count > 0)
{
// 현재가가 평균단가 대비 20틱이상 하락하면 시장가로 매도주문
if (ItemObject[i].current <= Account1.Balance.avgUnitCost-ItemObject[i].GetTickSize()*20)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
}
}
//매도잔고
if (Account1.Balance.position == 1 && Account1.Balance.count > 0)
{
// 현재가가 평균단가 대비 20틱이상 상승하면 시장가로 매수주문
if (ItemObject[i].current >= Account1.Balance.avgUnitCost+ItemObject[i].GetTickSize()*20)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
}
}
}
}
}
}
2017-10-19
2640
글번호 224228