답변완료
문의드립니다.(12.01)
수식 문의드립니다.
도움부탁드립니다.
주식현물(예:삼성전자)에서,
1. 스팟시작 1초 후 0.2초간격으로 10주씩 10회, 시장가로 매수주문 (매수/매수/매수...10회)
2. 스팟시작 1초 후 0.2초간격으로 10주씩 10회, 시장가로 매도주문 (매도/매도/매도...10회)
3. 스팟시작 1초 후, [0.2초뒤 10주(1회)를 시장가로 매수주문 후 0.2초뒤 10주(1회)를 시장가로 매도주문]을 10회 반복 (매수/매도 1쌍(0.4초간격)으로 "매수/매도","매수/매도".....10회반복)
1,2,3. 각각 수식부탁드립니다.
(혹시 시장가가 안되면 "상한가 하한가" 혹은 "현재가 +-10호가" 주문등을 사용)
감사합니다.
2016-12-10
2287
글번호 224048
답변완료
수식 문의 드립니다.
안녕하세요
당일청산 선물신호 시스템 을 이용한, 아래 스팟수식으로 당일손실제한(1.0 PT)
전량 청산할경우, 당일 추가 선물신호가 발생해도 추가 진입이 안되도록 수정
요청 드립니다.
(스팟수식으로 당일손실제한정산 될 경우, PT 청산 메시지 출력 요청 드림니다)
감사합니다.
스팟수식요류
if (Signal.signalKind == 3 sumPL > 당일손실제한) => ReferenceError 오류
=> if (Signal.signalKind == 3, sumPL > -1.0) 수정 확인 점검 요청드림니다.
스크립트 객체설정
차트객체 추가 --> 속성에서 객체명은 Chart1, 아이디 연결
계좌객체 추가 --> 속성에서 객체명은 Account1, 계좌번호 지정
종목객체 추가 --> 속성에서 객체명은 MarketData1, 주문낼 종목으로 지정
입력변수 추가 --> 속성에서 변수명은 당일손실제한, 초기값 음수로 지정, 데이터형 숫자
var sumPL; -1.0 //당일손실제한 1.0 PT 설정
var BuyID, BxID, SellID,SxID;
var BuyNum, BxNum, SellNum,SxNum;
var BuyAvg,SellAvg;
var EntryStart,Dayloss,sumPL,T;
function Main_OnStart()
{
sumPL = 0;
T = 0;
EntryStart = false;
Dayloss = false;
Main.SetTimer(1, 5000);
}
//차트에서 신호나오면 MarketData1 종목에 대해 주문
function Chart1_OnRiseSignal(Signal)
{
//매수진입신호 발생
if (Signal.signalKind == 1 && Dayloss == false)
{
BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(3), 0);
EntryStart = true;
}
//매수청산신호 발생
if (EntryStart == true && Signal.signalKind == 2)
{
//매수진입 미체결 있으면 취소
Account1.SetUnfill(BuyNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(BuyNum);
}
//잔고셋팅해 매수포지션 있으면 잔고수량만큼만 청산
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//매수포지션 잔고 평단가 저장
BuyAvg = Account1.Balance.avgUnitCost;
BxID = Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(3), 0);
T = 1;
}
}
//매도진입신호 발생
if (Signal.signalKind == 3 sumPL > 당일손실제한) <============= 수식요류메세지
{
SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Bid(3), 0);
EntryStart = true;
}
//매도청산신호 발생
if (EntryStart == true && Signal.signalKind == 4)
{
//매수진입 미체결 있으면 취소
Account1.SetUnfill(SellNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(SellNum);
}
//잔고셋팅해 매도포지션 있으면 잔고수량만큼만 청산
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
//매도포지션 잔고 평단가 저장
SellAvg = Account1.Balance.avgUnitCost;
SxID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(3), 0);
T = -1;
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BuyID)
BuyNum = OrderResponse.orderNum;
if (OrderResponse.orderID == BxID)
BxNum = OrderResponse.orderNum;
if (OrderResponse.orderID == SellID)
SellNum = OrderResponse.orderNum;
if (OrderResponse.orderID == SxID)
SxNum = OrderResponse.orderNum;
}
function Main_OnNotifyFill(NotifyFill)
{
//매수청산신호의 체결이 수신되면
if (NotifyFill.orderNum == BxNum)
{
sumPL = sumPL +(NotifyFill.fillPrice-BuyAvg)*NotifyFill.fillCount;
}
//매도청산신호의 체결이 수신되면
if (NotifyFill.orderNum == SxNum)
{
sumPL = sumPL +(SellAvg-NotifyFill.fillPrice)*NotifyFill.fillCount;
}
}
function Main_OnTimer(nEventID)
{
if (EntryStart == true && T == 1)
{
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
tempPL = sumPL+(Account1.Balance.current-Account1.Balance.avgUnitCost)*Account1.Balance.count;
if (tempPL <= 당일손실제한)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(3), 0);
Dayloss = true;
}
}
}
if (EntryStart == true && T == -1)
{
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
tempPL = sumPL+(Account1.Balance.avgUnitCost-Account1.Balance.current)*Account1.Balance.count;
if (tempPL <= 당일손실제한)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(3), 0);
Dayloss = true;
}
}
}
}
2016-11-25
2279
글번호 224044
답변완료
부탁드리겠습니다..
안녕하세요?
제가 시스템식으로 당일매매를 하고 있습니다.
종목객체에서 수신된 매수/매도신호가 당일에 발생이 되지 않는 경우,
수동으로 매도처리를 하고 있습니다.
즉, 종목객체에서 수신되는 매수/매도 신호외 과거 보유종목이 있으면
보유종목의 평단을 수신하여 평단대비 4%대면 매도를 할 수 있는 식을
추가로 부탁드리겠습니다.
아래식으로 시스템을 입혀서 종목객체를 수신하였습니다.
//요청한 종목객체가 생성되면
function Main_OnRcvMarketData(MarketData)
{
RcvData = RcvData+1;
DataReq = false;
EntryItem[RcvData] = MarketData.code;
EntryObject[RcvData] = MarketData;
Account1.SetBalanceItem(MarketData.code,0);
Main.MessageList("종목수신",EntryObject[RcvData]);
Main.MessageList(RcvData,"번째 종목생성",MarketData.name);
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 기타정보들..)
var C1 = new ReqChartItem(EntryObject[RcvData].code, 기타정보들..)
var S1 = new SystemInfo("당일매매식",YL_TYPE_NORMAL,null,TradeSet,null);
Main.ReqChartEx(C1,S1);
}
function Main_OnRiseSignal(ChartEx, Signal)
{
for (var i = 1; i <= RcvData; i++)
{
if (EntryObject[i].code == ChartEx.GetCode(1))
{
if (Signal.signalKind == 1)
{
BuyVol[i] = 0;
if (EntryObject[i].tradeUnit == 1)
BuyVol[i] = Math.floor(EntryMoney/EntryObject[i].Ask(5) );
else
BuyVol[i] = Math.floor((EntryMoney/EntryObject[i].Ask(5) )/EntryObject[i].tradeUnit);
Account1.OrderBuy(Signal.code,BuyVol[i],EntryObject[i].Ask(5),0); Main.MessageList("매수주문종목 : ",Signal.code);
}
if (Signal.signalKind == 2)
Account1.OrderSell(Signal.code,BuyVol[i],EntryObject[i].Bid(5),0); Main.MessageList("매도주문종목 : ",Signal.code);
}
}
}
2016-11-05
2153
글번호 224032