답변완료
수식 설명좀 부탁합니다.
이수식이 무엇을 말하는지 아시는분있으면 쉽게
한글로 풀이좀 해주세요..
indip = input(1,type=bool,title="Use current timeframe?")
tf = (indip==0?(input('60',type=resolution,title="Timeframe (only if previous opt is unflagged)")):period)
Timeframem = (tf=='D'?'M':(tf=='240'?'W':(tf=='120'?'W':(tf=='60'?'W':(tf=='15'?'640':(tf=='5'?'360':'na'))))))
Timeframed = (tf=='D'?'2W':(tf=='240'?'2D':(tf=='120'?'2D':(tf=='60'?'D':(tf=='15'?'360':(tf=='5'?'180':'na'))))))
Timeframeh = (tf=='D'?'W':(tf=='240'?'D':(tf=='120'?'D':(tf=='60'?'720':(tf=='15'?'180':(tf=='5'?'90':'na'))))))
chm = security(tickerid, Timeframem, open)
chm1 = security(tickerid, Timeframem, close)
defm = (chm1/chm) -1
chd = security(tickerid, Timeframed, open)
chd1 = security(tickerid, Timeframed, close)
defd = (chd1/chd) -1
chh = security(tickerid, Timeframeh, open)
chh1 = security(tickerid, Timeframeh, close)
defh = (chh1/chh) -1
output = defm>0?(defd>defh?defd:defh):(defd>defh?defh:defd)
plot(output,linewidth=2,color=output>0?lime:red,transp=50,style=area)
plot(defh,color=defh>0?lime:red,transp=0,linewidth=1)
plot(defh,color=defh>0?lime:red,transp=75,style=area)
hline(0)
답변완료
수식 수정 및 질문
아래수식을 게시판에서
받아서 모의로 실행하면 안돼는게 있어서 질문드립니다.
1. 관심종목등록이 안되네요.
2. 종목검색중 검색되다가 -1로 시간초과후 멈춤니다.
3. 매수주문은 들어가는데 체결이 안됩니다.
원인이 무엇인지 설명부탁드리며, 수식보완 부탁합니다.
var 검색주기 = 60;//60초
var 종목수 = 50;
var 매수금액 = 1000000;
var ItemList = [],MK = [],HH = [];
var HHMMSS,req;
function Main_OnStart()
{
Main.SetTimer(1, 60000);
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 >= 090100 && MK.length < 종목수)
{
Main.KillTimer(1);
Main.MessageList("종목검색 요청");
Main.ReqPowerSearch("단타A");
}
}
// 검색종목 관심등록
function Main_OnRcvItemList(aItemList, nCount)
{
if (nCount > 0)
{
Main.SendInterests("관심단타A", aItemList, false);
Main.MessageList("관심종목 등록");
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.MessageList("종목검색 완료 nCount : ",nCount,MK.length);
Main.MessageList("종목검색 완료 aItemList : ",aItemList);
if (nCount > 0)
{
ItemList = [];
//첫검색일때
if (MK.length == 0)
{
ItemList = aItemList;
}
else //두번쨰 이후(차트가 만들어진 종목을 제외하고 새로운 종목만 집계)
{
for (var i = 0; i < nCount; i++ )
{
var add = true;
for (var x = 0; x < MK.length; x++ )
{
if (aItemList[i] == MK[x].code)
{
add = false;
}
}
if (add == true)
{
ItemList.push(aItemList[i]);
}
}
}
if (ItemList.length > 0 && MK.length < 종목수)
{
req = 0;
Main.MessageList("종목객체요청 : ",ItemList[req]);
Main.ReqMarketData(ItemList[req]);
}
else
{
if (MK.length < 종목수)
{
Main.SetTimer(1, 검색주기*1000);
}
}
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == ItemList[req])
{
Main.MessageList("종목객체생성:",req,MarketData.code);
MK.push(MarketData);
HH.push(MK[req].current);//최고가 초기값은 현재가
Main.MessageList("매수주문:",MarketData.code);
//매도5호가로 매수금액만큼 매수주문
Account1.OrderBuy(MarketData.code,Math.floor(매수금액/MarketData.Ask(5)),MarketData.Ask(5),0);
req = req+1;
if (req < ItemList.length && MK.length < 종목수)
{
Main.MessageList("종목객체요청 : ",ItemList[req]);
Main.ReqMarketData(ItemList[req]);
}
else
{
Main.MessageList("종목객체생성완료");
if (MK.length < 50)
{
Main.SetTimer(1, 검색주기*1000);
}
}
}
}
function Main_OnUp*ateMarket(sItemCode, lUp*ateID)
{
if (lUp*ateID == 20001)
{
for (var i = 0; i < MK.length; i++)
{
//업데이트된 종목을 찾아
if (MK[i].code == sItemCode && HH[i] > 0)
{
//현재가가 저장된 최고가 보다 크면 최고가를 현재가로 변경
if (MK[i].current > HH[i])
{
HH[i] = MK[i].current;
}
//잔고셋팅
Account1.SetBalance(MK[i].code, 0);
//최고가는 평단가 대비 20이상 크고 현재가가 평단가 대비 15% 이하로 내려오면 매수5호가로 전량 매도
if (HH[i] >= Account1.Balance.avgUnitCost*1.20 &&
MK[i].current <= Account1.Balance.avgUnitCost*1.10)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Bid(5),0);
//HH[i]는 -1로 저장하여 이후 감시하지 않게 함
HH[i] = -1;
Main.MessageList("종목객체삭제 : ",S);
var S = Main.RemoveObject(MK[i]);
MK.splice(i,1);
}
}
}
}
}
답변완료
수식부탁합니다.
안녕하세요
많은 도움 받고있습니다.
당일 콜,풋 양매도한 전량을 종목에 상관없이 당일 15시 5분에 콜풋 모두 청산하는 식 원합니다.
아래 식은 전일 양매도한 걸 당일 15시 5분에 청산하는식이나 정상작동되지 않습니다.
var CallOrderCode,PutOrderCode;
var Entry, Exit;
function Main_OnStart()
{
Entry = false;
Exit = false;
Main.SetTimer(1, 5000);
}
function Main_OnTimer(nEventID)
{
if (nEventID <= 1)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//15시 10분
if (Entry == false && HHMMSS >= 151000 )
{
Entry = true;
//차트가 매수유지봉
if (Chart1.GetOpenContracts() > 0)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("매수신호유지");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
================================ 중략 ========================================
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.SetUserValue("CallOrderCode", CallOrderCode);
Main.SetUserValue("PutOrderCode", PutOrderCode);
}
}
}
//15시 5분
if (Exit == false && HHMMSS >= 150500 )
{
Exit = true;
//내부파일의 값을 가져와 변수에 저장
var PreDayCall = Main.GetUserValue("CallOrderCode");
var PreDayPut = Main.GetUserValue("PutOrderCode");
//PreDayCall에 값이 있으면
if (PreDayCall != "")
{
//잔고셋팅후 매도포지션이면 청산하고
//내부파일의 값을 빈공간으로 만듬
Account1.SetBalanceItem(PreDayCall,0)
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1);
Main.SetUserValue("CallOrderCode", "");
}
}
//PreDayPutl에 값이 있으면
if (PreDayPut != "")
{
//잔고셋팅후 매도포지션이면 청산하고
//내부파일의 값을 빈공간으로 만듬
Account1.SetBalanceItem(PreDayPut,0)
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1);
Main.SetUserValue("PutOrderCode", "");
}
}
//모두 수행후 값을 빈공간으로 만듬
Main.SetUserValue("CallOrderCode", "");
Main.SetUserValue("PutOrderCode", "");
}
답변완료
금액 기준 수량
외부입력변수 EntryVol에 기입한 금액에 따른 주식 수량(Vol)을 매수하는 식을 작성하였는데, 수량을 입력시키라는 에러 메시지와 함께 매수 주문이 안나가네요.
아래의 스팟 검토 부탁드립니다.
var BL = [],req;
var CT = [],MK = [];
function Main_OnStart()
{
//처음 시작시 step은 0
step = 0;
//시작시점의 보유종목수
var num = Account1.GetTheNumberOfBalances();
//보유종목이 1개 이상이면 보유종목의 종목코드를 BL변수에 순차적으로 저장
if (num > 0)
{
BL = [];
for(var i = 0 ; i < num ; i++)
{
Account1.SetBalance(i);
BL.push(Account1.Balance.code);
}
Main.MessageList("BL : ",BL);
if (BL.length >= 1)
{
req = 0;
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,
1, // 거래수량
123456789, // 자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
100000, // 최대진입수량
10); // 최대진입횟수
var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false);
var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet);
Main.ReqChartEx(ChartSet, SymSet);
Main.MessageList("차트객체요청 :",BL[req]);
}
}
else //보유종목이 없으면 바로 1분 타이머 시작
{
Main.MessageList("보유종목없음");
Main.SetTimer(1, 10000);//1번 타이머, 60초
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ChartEx.GetCode(1) == BL[req])
{
Main.MessageList("차트객체생성 :",ChartEx.GetCode(1));
CT.push(ChartEx);
Main.ReqMarketData(BL[req]);
Main.MessageList("종목객체요청 :",BL[req]);
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == BL[req])
{
Main.MessageList("종목객체생성 :",MarketData.code);
MK.push(MarketData);
req = req+1;
if (req < BL.length)
{
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,
1, // 거래수량
123456789, // 자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
100000, // 최대진입수량
10);
var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false);
var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet);
Main.ReqChartEx(ChartSet, SymSet);
Main.MessageList("차트객체요청 :",BL[req]);
}
else
{
Main.SetTimer(1, 10000);//1번 타이머, 60초
Main.MessageList("보유종목차트생성완료",CT.length,MK.length);
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//타이머 종료
Main.KillTimer(1);
Main.ReqPowerSearch("PSearch");
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
//검색된 종목이 없으면
if (nCount == 0)
{
//타이머 다시 셋팅
Main.SetTimer(1, 100000);//1번 타이머, 60초
}
//검색된 종목이 있으면
if (nCount >= 1)
{
//검색된 종목과 기존 만든 차트들의 종목코드를 비교해
//차트가 만들어 지지 않은 종목이면 BL변수에 종목코드 추가
BL = [];
for(var i = 0 ; i < aItemList.length ; i++)
{
var add = true;
for(var z = 0 ; z < CT.length ; z++)
{
if (aItemList[i] == CT[z].GetCode(1))
{
add = false;
break;
}
}
if (add == true)
{
BL.push(aItemList[i]);
}
}
Main.MessageList("BL : ",BL);
//차트 생성해야할 종목이 있으면 차트요청
if (BL.length >= 1)
{
req = 0;
//차트 요청
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,
1, // 거래수량
123456789, // 자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
100000, // 최대진입수량
10);
var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false);
var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet);
Main.ReqChartEx(ChartSet, SymSet);
}
else //없으면 타이머 다시 셋팅
{
Main.SetTimer(1, 100000);//1번 타이머, 60초
}
}
}
//생성된 차트들에서 신호가 발생하면
function Main_OnRiseSignal(ChartEx, Signal)
{
//매수신호 발생
if (Signal.signalKind == 1)
{
//EntryVol 금액 시장가 매수
var Vol = Math.floor(EntryVol/Signal.price);
Account1.OrderBuy(Signal.code, Vol,Signal.price,1);
}
//매수청산신호 발생
if (Signal.signalKind == 2)
{
//잔고셋팅
Account1.SetBalance(Signal.code,0);
//보유수량이 있으면
if (Account1.Balance.count > 0)
{
//전량 시장가 매도
Account1.OrderSell(Signal.code, Account1.Balance.count,Signal.price,1);
}
}
}