답변완료
부탁드리겠습니다..
안녕하세요?
제가 시스템식으로 당일매매를 하고 있습니다.
종목객체에서 수신된 매수/매도신호가 당일에 발생이 되지 않는 경우,
수동으로 매도처리를 하고 있습니다.
즉, 종목객체에서 수신되는 매수/매도 신호외 과거 보유종목이 있으면
보유종목의 평단을 수신하여 평단대비 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
2163
글번호 224032
답변완료
수식을 만들었는데 에러가 납니다.
제가 만들어봤는데 에러가 나고 주문이 안됩니다.
1. 매수(도)신호가 나오면 신호가로 매수(도) 주문이 1계약 들어가고 그 뒤로 5분간 1초에 한번씩 매수(도)주문이 반복해서 들어감(1계약 -> 1계약 -> 1계약 계속적으로 5분간 반복 주문)
2. 동시호가에 잔고가 있으면 시장가 청산
현재 신호가로 주문이 잘 반복적으로 주문되지도 않고 시장가로 청산도 안됩니다. 어디가 문제인가요? 수정 부탁드립니다. 감사합니다.
var Tcnt;
function Chart1_OnRiseSignal(Signal)
{
//매수진입신호 발생
if (Signal.signalKind == 1)
{
//매수주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
//1번 타이머 1초 셋팅
Main.SetTimer(1, 1000);
//타이머 동작 카운트 값은 초기값 0
Tcnt = 0;
}
}
//타이머 동작
function Main_OnTimer(nEventID)
{
//1번타이머
if (nEventID == 1)
{
//카운트가 1씩 증가
Tcnt = Tcnt+1;
//타이머 동작시마다 주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
// 4분 50초가 290초 이므로 카운트가 290번이 되면 1번 타이머 종료
if (Tcnt == 290)
{
Main.KillTimer(1);
}
}
}
var Tcnt;
function Chart1_OnRiseSignal(Signal)
{
//매도진입신호 발생
if (Signal.signalKind == 3)
{
//매도주문
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
//1번 타이머 1초 셋팅
Main.SetTimer(1, 1000);
//타이머 동작 카운트 값은 초기값 0
Tcnt = 0;
}
}
//타이머 동작
function Main_OnTimer(nEventID)
{
//1번타이머
if (nEventID == 1)
{
//카운트가 1씩 증가
Tcnt = Tcnt+1;
//타이머 동작시마다 주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
// 4분 50초가 290초 이므로 카운트가 290번이 되면 1번 타이머 종료
if (Tcnt == 290)
{
Main.KillTimer(1);
}
}
}
//15시 36분에 잔고에 포지션 있으면 청산
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//15시 36분 이후
if (nEventID == 1 && HHMMSS >= 153600)
{
//타이머 종료
Main.KillTimer(1);
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.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);
}
}
2016-10-26
2038
글번호 224028
답변완료
미완성신호
아래 미완성신호 스팟수식에서 오류 부분을 바르게 수정하여 주시면 감사 하겠습니다.
var T;
function Main_OnStart()
{
T = 0;
Main.MessageLog("시작");
OrderCode = Main.GetOrderCode(KP.code);
}
function C1_OnRiseIncompleteSignal(IncompleteSignal)
{
Main.MessageLog("미완성신호발생/"+IncompleteSignal.SignalKind);
A1.SetBalance(Main.GetOrderCode(IncompleteSignal.code))
if ((A1.Balance.position == 1 || A1.Balance.position == 0) && IncompleteSignal.SignalKind == 1)
{
T = 1;
if(A1.Balance.position == 0)
VV = 1;
else
VV = 2;
Main.SetTimer(1,10000);
}
if ( A1.Balance.position == 1 && IncompleteSignal.SignalKind == 3)
{
T = 0;
Main.KillTimer(1);
Main.SetTimer(2,10000);
}
if ((A1.Balance.position == 2 || A1.Balance.position == 0) && IncompleteSignal.SignalKind == 3)
{
T = -1;
if(A1.Balance.position == 0)
VV = 1;
else
VV = 2;
Main.SetTimer(2,10000);
}
if (A1.Balance.position == 2 && IncompleteSignal.SignalKind == 1)
{
T = 0;
Main.KillTimer(2);
Main.SetTimer(1,10000);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1 && T == 1)
{
Main.KillTimer(1);
A1.OrderBuy(KP.code, VV, KP.Ask(5),2);
Main.MessageLog("매수진입");
}
if (nEventID == 1 && T == 0)
{
Main.KillTimer(1);
Main.MessageLog("중복매수진입금지");
}
if (nEventID == 2 && T == -1)
{
Main.KillTimer(2);
A1.OrderSell(KP.code, VV, KP.Bid(5),2);
Main.MessageLog("매도진입");
}
if (nEventID == 2 && T == 0)
{
Main.KillTimer(2);
Main.MessageLog("중복매도진입금지");
}
}
2016-10-20
1978
글번호 224026