답변완료
스팟수식 부탁드립니다.
예스랭귀지 차트 신호대로 매매를 하려고 하는데
스팟을 이용하면 주문 체결 여부나 오류발생 때 대응할 수 있다고 해서 공부해보려고 했으나 너무 어렵네요..
1. 미니나스닥 신호대로 마이크로 나스닥 4계약 매매
2.
접수된 주문이 없고, 포지션이 없을 때,
-진입 미완성 신호 = 무시
-진입 완성신호 = 현재가로 주문.
접수된 주문이 없고, 포지션이 있을 때,
-청산 미완성/완성 신호 = 시장가 주문.
3. 주문 후 5초안에 오류가 발생하거나 체결이 안되면 기존 주문 취소 후 체결 될 때까지 5초마다 시장가로 재주문
1번은 차트객체 추가해서 미니나스닥 차트아이디 적용하고, 종목객체 추가해서 마이크로 나스닥 지정했고 계약수를 4로 어디서 바꾸죠?
2번은 도움말, 답변보면서 눈치껏 적었는데 의도한대로 작성됬는지 모르겠네요
3번은 어떻게 추가해야할지 잘 모르겠어요
-------------스크립트 시작-------------
var Position;
var BID;
var SID;
var Snum;
var Bnum;
function Main_OnStart()
{
Main.MessageList("Start");
Position = 0;
}
//(ExitLong)(ExitShort)
//시스템미완성 신호 발생
function Chart1_OnRiseIncompleteSignal(IncompleteSignal)
{
// Position = 1일때 ExitLong 미완성 신호 발생하면
if (IncompleteSignal.signalKind == 2 && Position == 1)
{
//포지션 설정
Position = 0 ;
//BNum 매수주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(BNum);
//미체결된 매수수량이 0 이상이면 취소주문
if(Account1.Unfill.Count > 0) Account1.OrderCancel(BNum);
//잔고 셋팅
Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code));
//잔고수량 0 이상, 매수포지션일때
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//잔고 수량 모두 시장가 청산(매도주문)
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1);
Main.MessageList("----------------");
Main.MessageList("매수청산",Position)
}
}
// Position = -1일때 ExitShort 미완성 신호 발생하면
if (IncompleteSignal.signalKind == 4 && Position == -1)
{
//포지션 설정
Position = 0 ;
// SNum 매도주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(SNum);
//미체결된 매도수량이 0 이상이면 취소주문
if (Account1.Unfill.count > 0) Account1.OrderCancel(SNum);
//잔고 셋팅
Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code));
//잔고수량 0 이상, 매도포지션일때
if (Account1.Unfill.count > 0 && Account1.Balance.position == -1)
{
//잔고 수량 모두 시장가 청산(매수주문)
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code));
Main.MessageList("----------------");
Main.MessageList("매도청산",Position)
}
}
}
//(Buy)(Sell)
//완성 신호 발생
function Chart1_OnRiseSignal(Signal)
{
//Position = 0일때 buy 완성 신호 최초발생하면
if (Signal.signalKind == 1 && Position == 0 )
{
BID = Account1.OrderBuy(Main.GetOrderCode(MarketData11.code), Math.abs(Signal.count), 0, 1 );
Position = 1 ;
Main.MessageList("----------------");
Main.MessageList("매수진입", Position);
}
//Position = 0일때 Sell 완성 신호 최초발생하면
if (Signal.signalKind == 3 && Position == 0)
{
SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Math.abs(Signal.count), 0, 1 );
Position = -1 ;
Main.MessageList("----------------");
Main.MessageList("매도진입", Position);
}
// Position = 1일때 ExitLong 완성 신호 발생하면
if (Signal.signalKind == 2 && Position == 1)
{
//포지션 설정
Position = 0 ;
//BNum 매수주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(BNum);
//미체결된 매수수량이 0 이상이면 취소주문
if(Account1.Unfill.Count > 0) Account1.OrderCancel(BNum);
//잔고 셋팅
Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code));
//잔고수량 0 이상, 매수포지션일때
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//잔고 수량 모두 시장가 청산(매도주문)
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1);
Main.MessageList("----------------");
Main.MessageList("매수청산",Position)
}
}
// Position = -1일때 ExitShort 완성 신호 발생하면
if (Signal.signalKind == 4 && Position == -1)
{
//포지션 설정
Position = 0 ;
// SNum 매도주문번호에 대해 미체결된 숫자설정
Account1.SetUnfillOrderNumber(SNum);
//미체결된 매도수량이 0 이상이면 취소주문
if (Account1.Unfill.count > 0) Account1.OrderCancel(SNum);
//잔고 셋팅
Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code));
//잔고수량 0 이상, 매도포지션일때
if (Account1.Unfill.count > 0 && Account1.Balance.position == -1)
{
//잔고 수량 모두 시장가 청산(매수주문)
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code));
Main.MessageList("----------------");
Main.MessageList("매도청산",Position)
}
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//Position이 1인 상태에서 주문응답아이디와 BID가 같으면
//BNum에 주문번호 저장
if (Position == 1 && OrderResponse.orderID == BID)
{
BNum = OrderResponse.orderNum;
}
//Position이 -1인 상태에서 주문응답아이디와 SID가 같으면
//SNum에 주문번호 저장
if (Position == -1 && OrderResponse.orderID == SID)
{
SNum = OrderResponse.orderNum;
}
}
2020-06-29
3163
글번호 225257
답변완료
일봉에서 미완성 신호로 진입하는 수식
수고많으십니다
수식 수정 부탁드립니다(모든 수식은 아래 수식을 골격으로 작성 부탁드립니다)
1.아래와 같은 수식은 5분봉에서 매매가 이뤄지는데
일봉에서 미완성 신호로 진입하려고 합니다
청산은 TRAILING STOP 으로 청산합니다
종목당 1일 1회 진입입니다
2. 현재가+- 1 호가 로 매수(매도)주문 한후 1차정정 현재가+-2 , 2차정정 시장가
로 하는 수식 부탁드립니다
**기타문의
3.가격이 상한가일 경우 무조건 매수종목을 청산하는 수식
4.엑셀에 있는 자료를 읽어서 특정셀의 글자(예: "매수", "매도")나 숫자("1", "2")를 보고 매수, 매도, 주문이 나가게 할 수 있나요?
할 수 있다면 수식을 부탁드립니다
감사합니다~
=====
var 검색주기 = 60;//60초
var ItemList = [],CT = [];
var HHMMSS,req;
function Main_OnStart()
{
CTcnt = 0;
Main.SetTimer(1, 5000);
Main.MessageList("start");
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//9시 이후에 2분간격으로 종목검색 확장차트가가 50개 이하일때 반복적으로 검색
if (nEventID == 1 && HHMMSS >= 090000 && CT.length < 50)
{
Main.KillTimer(1);
Main.MessageList("종목검색 요청");
Main.ReqPowerSearch("전략1");
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.MessageList("종목검색 완료 nCount : ",nCount);
if (nCount > 0)
{
ItemList = [];
//첫검색일때
if (CT.length == 0)
{
ItemList = aItemList;
}
else //두번쨰 이후(차트가 만들어진 종목을 제외하고 새로운 종목만 집계)
{
for (var i = 0; i < nCount; i++ )
{
var add = true;
for (var x = 0; x < CT.length; x++ )
{
if (aItemList[i] == CT[x].GetCode(1))
{
add = false;
}
}
if (add == true)
{
ItemList.push(aItemList[i]);
}
}
}
Main.MessageList("종목검색 완료 ItemList :",ItemList.length);
//집계된 종목이 1개 이상이면 순차적으로 차트객체 요청
if (ItemList.length > 0 && CT.length < 50)
{
req = 0;
var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93),
new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0),
//new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(151500));
var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, StopSet);
Main.MessageList("현재차트갯수 : ",CT.length);
Main.MessageList(req,"차트객체요청 : ",ItemList[req]);
Main.ReqChartEx(ChartSet,SystemSet);
}
else
{
if (CT.length < 50)
{
Main.SetTimer(1, 검색주기*1000);//120초
}
}
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ItemList[req] == ChartEx.GetCode(1))
{
CT[CTcnt] = ChartEx;
Main.MessageList(CTcnt,"차트객체생성 : ",CT[CTcnt].GetCode(1));
CTcnt = CTcnt +1;
req = req + 1;
if (req < ItemList.length && CT.length < 50)
{
var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93),
new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0),
//new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(151500));
var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, StopSet);
Main.MessageList("현재차트갯수 : ",CT.length);
Main.MessageList(req,"차트객체요청 : ",ItemList[req]);
Main.ReqChartEx(ChartSet,SystemSet);
}
else
{
Main.MessageList("Search1 차트객체요청종료");
//만들어진 차트가 50개 이하이면
if (CT.length < 50)
{
Main.SetTimer(1, 검색주기*1000);//120초
}
}
}
}
//신호발생
function Main_OnRiseSignal(ChartEx, Signal)
{
//신호발생 종목에 대해 잔고셋팅
Account1.SetBalance(Main.GetOrderCode(Signal.code),0);
//매수신호이고 잔고가 없을때만 매수
if (Signal.signalKind == 1 && Account1.Balance.count == 0)
{
Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1);
Main.MessageLog("매수주문");
}
if (Signal.signalKind == 2)
{
//전체미체결주문 갯수
var num = Account1.GetTheNumberOfUnfills();
//전체 미체결수 만큼 루프를 돌면서
for (var i = 0; i < num; i++)
{
//미체결을 하나씩 셋팅하고
Account1.SetUnfill(i);
//미체결종목이 신호종목과 같고 미체결수량이 있으면
if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//잔고수량만큼만 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1);
Main.MessageLog("매도주문");
}
}
}
2020-06-25
3693
글번호 225246