답변완료
수식 설명좀 부탁합니다.
이수식이 무엇을 말하는지 아시는분있으면 쉽게
한글로 풀이좀 해주세요..
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)
2021-04-25
2846
글번호 225476
답변완료
수식 수정 및 질문
아래수식을 게시판에서
받아서 모의로 실행하면 안돼는게 있어서 질문드립니다.
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);
}
}
}
}
}
2021-04-22
2672
글번호 225473
답변완료
수식부탁합니다.
안녕하세요
많은 도움 받고있습니다.
당일 콜,풋 양매도한 전량을 종목에 상관없이 당일 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", "");
}
2021-04-14
2878
글번호 225464
답변완료
금액 기준 수량
외부입력변수 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);
}
}
}
2021-04-06
3008
글번호 225460