답변완료
도움 부탁드립니다.
안녕하세요.153600시간에 시장가로 청산주문 넣는 예스스팟수식입니다.
코스닥선물150에서 어제 사이드카가 발동되어서인지,
마감동시호가에 아래의 시장가 주문이 접수가 안되는 경우가 발생되었습니다.
(시장가 주문불가라는 메세지가 뜸)
근 1년간 아무런 문제없이 시장가 청산 잘 되었음.
그래서 시장가 대신에 현재가+50틱 지정가로 청산주문을 넣는 수식으로
변경하려 합니다. 염치없지만, 수정 부탁드립니다.
function Main_OnStart()
{
Main.SetTimer(1, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 1 && HHMMSS >= 153600 )
{
Main.KillTimer(1);
var num = Account1.GetTheNumberOfBalances();
if (num > 0)
{
for (var i = 0; i < num; i++)
{
Account1.SetBalance(i);
if (Option1.GetCurrent(Account1.Balance.code) > 0)
{
if (Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
}
if (Account1.Balance.position == 2)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1)
}
}
else
{
if (Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1);
}
if (Account1.Balance.position == 2)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1)
}
}
}
}
}
}
2019-08-06
3145
글번호 224951
function Main_OnNotifyFill(NotifyFill) 질문
안녕하세요? 매번 도우심 감사드립니다.
function Main_OnNotifyFill(NotifyFill)의 동작에 대해 질문있습니다.
만약 A라는 종목을 10,000주 주문을 했는데,
최초 체결 수량이 2,000주,
이어서 두번에 걸쳐 4,000주, 4,000주 가 체결이 된다면,
function Main_OnNotifyFill(NotifyFill) 함수는 매번 체결 될때마다 호출이 되나요??
아니면, 최초 2,000주 체결때에만 호출되고 나머지 두번의 4,000주 체결시에는 호출이 안되는지?
만약, 매번 체결시마다 호출이 된다면 (해당 예시에서는 3번)
각 호출때마다 NotifyFill.fillCount 는 2,000 / 4,000 / 4,000 으로 셋팅 되는지??
바쁘시더라도 확인 부탁드립니다.
2019-08-02
3212
글번호 224948
답변완료
보유종목 수량 추가시 자동청산로직 추가부탁합니다.
안녕하세요?
하기의 로직은 신규 추가 종목에 대해서는 잘동작하지만,
기존 보유종목의 분할매수로 인해서 수량이 추가되는 변동이 있을때는
인식을 못하는 것 같습니다.
따라서, 보유종목의 수량 추가에 대해서도 자동으로 수량인식되어
올바르게 청산될수 있도록 수정부탁드립니다.
특히, 수량이 추가되었을때 평균매수가격에 오류가 납니다.
-------------------------------------------------------------------
4
var Nth = 0;
var ItemCode = [];
var ItemObject = [];
var ItemHigh = [];
var Bnum;
function Main_OnStart()
{
Nth = 0;
Bnum = Account1.GetTheNumberOfBalances()
Main.MessageList("잔고종목수",Bnum);
if (Bnum > 0)
{
//계좌의 잔고리스트에서 첫번째 잔고 셋팅
Account1.SetBalanceIndex(Nth);//잔고는 순번이 0부터 시작
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
Main.MessageList("보유종목 종목객체요청시작-------");
//1번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 0,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목객체요청",Account1.Balance.code);
}
}
}
//요청한 종목객체 수신되면
function Main_OnRcvMarketData(MarketData)
{
Main.MessageList("종목객체수신",MarketData.code);
//수신받은 종목객체의 종목코드와 직전에 요청한 종목과 같은지 확인 후에
if (MarketData.code == ItemCode[Nth])
{
ItemObject[Nth] = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장
ItemHigh[Nth] = 0; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최고값 계산해 저장할 변수)
Main.MessageList(Nth,"번째","종목객체생성완료 : ",ItemObject[Nth].code);
//순번은 1 증가
Nth = Nth+1;
//종목객체 수신완료되면 다음 종목 종목객체 요청
if (Nth < Bnum)
{
//계좌의 잔고리스트에서 다음 순번 잔고 셋팅
Account1.SetBalanceIndex(Nth);
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
//Nth번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 0,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목객체요청",Account1.Balance.code);
}
}
else
{
Main.MessageList("보유종목 종목객체요청완료------");
}
}
}
//잔고에 종목이 추가된다면
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) //*삭제
{
if (sAccntNum == Account1.number && lUp*dateID == 30001) //*삭제
{
Main.MessageList("신규편입종목 객체요청",sItemCode,Nth);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = sItemCode;
//1번째 종목객체 생성요청
Main.ReqMarketData(ItemCode[Nth], 0,0);
}
}
//종목객체 시세 업데이트
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)// *제거
{
//편입된 종목수 만킄만 수행
for (var i = 0; i < ItemObject.length; i++)
{
if (ItemObject[i].code == sItemCode && lUp*dateID == 20001)// *제거
{
Main.MessageList("-----------------------------------------------");
Main.MessageList(ItemObject[i].code,"업데이트");
//잔고셋팅
Account1.SetBalanceItem(ItemObject[i].code,0);
//종목편입 이후의 최고가 계산
if (ItemObject[i].current > ItemHigh[i])
{
ItemHigh[i] = ItemObject[i].current;
}
//매수잔고
if (Account1.Balance.position == 2)
{
//현재가가 평균단가 대비 10%이상 상승하면 목표이익 매도
if (ItemObject[i].current >= Account1.Balance.avgUnitCost*1.10)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제");
}
// 현재가가 평균단가 대비 3%이상 하락하면 손절매도
if (ItemObject[i].current <= Account1.Balance.avgUnitCost*0.97)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제");
}
//현재가가 평균단가 대비 7% 이상 상승후 평균단가+5%까지 하락하면 매도주문
if (ItemHigh[i] >= Account1.Balance.avgUnitCost*1.07 &&
ItemObject[i].current <= Account1.Balance.avgUnitCost*1.05)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("TR청산 : ",ItemObject[i].code,"종목객체삭제");
}
}
Main.MessageList("-----------------------------------------------");
Main.MessageList("종 목 : ",ItemObject[i].code);
Main.MessageList("평균단가 : ",Account1.Balance.avgUnitCost);
Main.MessageList("현 재 가 : ",ItemObject[i].current);
Main.MessageList("진입최고 : ",ItemHigh[i]);
}
}
}
2019-08-08
3210
글번호 224947