답변완료
문의드립니다.
청산수식에 대한 문의입니다.
갭보정된 120틱차트에 현재종가가 지수이평선 20이평선을 하향돌파하면 청산하고자 하나
휩소를 거르고자 두개의 봉으로 판단하여 청산할려고 합니다.
즉 20지수이평선을 하향돌파한 음봉한개,그다음봉이 20지수이평선아래의 양봉이든 음봉이든
종가상 아래있다면 연속두개의 봉으로 판단하여 청산하고자 합니다.
아래와 같이 확장차트를 불러왔습니다.
Main.ReqChartEx(new ReqChartItem(EntryObject[RcvData].code,120,CHART_PERIOD_TICK,1000,CHART_REQCOUNT_BAR,false,true));
청산식 부탁드리겠습니다.
2015-03-06
1276
글번호 223338
답변완료
문의드립니다.
안녕하세요?
질문답변으로 얻은 수식을 나름대로 변형해서 아래 식을 짠 후 모의투자로 돌려보았습
니다.
가격이 오르면 따라 사고 내리면 따라 파는 식입니다.
그런데, 스팟을 시작하고나서 기준가보다 크거나 작을 때 한 번은 진입을 하는데
그 후에는 가격이 오르거나 내려도 추가진입이 이루어지지 않네요.
종목객체, 계좌객체, 다 제대로 설정했는지도 확인했고 일간데이터도 사용으로 설정했는
지 확인했는데 거기에는 문제가 없었습니다.
아무래도 제가 만든 코딩 자체에 문법적 잘못이 있거나 구조적으로 무언가를 잘못한 것 아
닐까 하는 생각이 드는데, 아래 코딩이 제가 원하는 것을 구현하고자 할 때에 코딩
자체의 문제는 없는 것인지 좀 봐 주시면 감사하겠습니다.
저 혼자 추측하기에는, ckey의 사용법에 문제가 있나 하는 생각을 합니다. 가격이 변화하
는 순간 수도 없는 진입을 방지하려고, 일단 스팟 시작하면 ckey를 1로 놓았다가 가격변화
를 포착하면 일단 ckey를 0으로 놓고 매수도를 수행한 후에 체결통보를 받으면 ckey를 다
시 1로 다시 놓는 것으로 식을 짠다고 아래 식을 짰는데, 이게 뭔가 코딩 방법 상 잘못된
것은 아닌지 궁금합니다.
가르쳐 주시면 감사하겠습니다.
//진입컨트롤키
var ckey;
//기준가
var sprice;
//저장값
var lfprice;
//스팟이 시작하면
function Main_OnStart()
{
//컨트롤키를 진입가능하도록
ckey=1;
//저장된 값이 있는지 확인하여 저장값 변수에 대입
lfprice = parseFloat(Main.GetUserValue('lfprice'));
//만일 저장값 변수가 양이면 그 값을 기준가로 하고 메시지출력
if (lfprice > 0)
{
sprice = lfprice;
Main.MessageLog("저장된 최종체결가를 기준가로 : " + lfprice);
}
//그렇지 않다면 어제의 종가를 기준가 변수에 대입하고 메시지출력
else
{
sprice = MarketData1.GetPrevClose(1);
Main.MessageLog("어제의 종가를 기준가로 : " + MarketData1.GetPrevClose(1));
}
}
//시장정보가 갱신되고
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//금칙어땜에 별표,실제 실행시에는 별표 지움
//갱신된 시장정보가 해당종목의 시세정보이며 시가가 접수 즉 장이 시작된 경우
{ if (sItemCode == MarketData1.code && lUp*dateID == 20001 && MarketData1.open > 0)//실제 실행시에는 별표 지워야
{ //계좌를 체크하여 잔고를 세팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//키가 진입허용상태이고 현재가가 기준가보다 일정가격 이상 커지면
if (ckey==1 && MarketData1.current >= sprice+0.05 )
{
//일단 무한진입 방지
ckey=0;
//매도잔고가 있으면 2개매수
if (Account1.Balance.count >= 1 && Account1.Balance.position == 1 )
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 2, MarketData1.current, 0);
}
//매도잔고가 없으면 1개매수
if (Account1.Balance.count == 0)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0);
}
}
//진입허용 상태이고 현재가가 기준가보다 일정가격 이상 작아지면
if (ckey==1 && MarketData1.current <= sprice-0.05)
{
//일단 무한진입 방지
ckey=0;
//매수잔고가 있으면 2개 매도
if (Account1.Balance.count >= 1 && Account1.Balance.position == 2 )
{Account1.OrderSell(Main.GetOrderCode(MarketData1.code),2, MarketData1.current, 0);
}
//매수잔고가 없으면 1개매도
if (Account1.Balance.count == 0)
{Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0);
}
}
}
}
//체결통보를 받으면 기준가에 체결가를 저장하고 컨트롤키를 진입가능케하면서 계좌를 새롭게 갱신
function Main_OnNotifyFill(NotifyFill)
{ if (NotifyFill.code == MarketData1.code)
{
sprice = NotifyFill.fillPrice;
ckey=1;
Account1.Refresh();
}
}
//스팟 종료시에는 기준가를 저장값으로 저장하고 미체결주문 취소
function Main_OnClose()
{
Main.SetUserValue('lfprice', sprice);
var numOfUnfills = Account1.GetTheNumberOfUnfills();
for(var i = 0 ; i < numOfUnfills ; i++) {
var unfill = Account1.SetUnfillIndex(i);
Account1.OrderCancel(unfill.orderNum);
}
}
2015-03-06
1347
글번호 223337
답변완료
SetBalanceItem의 매도 포지션을 가져오지 못합니다.
아래와 같이 코딩했는데 매도포지션을 찾아오지 못합니다.
신속히 수정 바랍니다.
function check_postion()
{
gPosition = 0;
fxAct.SetBalanceItem(Main.GetOrderCode(fxMktData.code),1);
if (fxAct.Balance.count > 0)
{
fxVol = fxAct.Balance.count;
fxPst = fxAct.Balance.position;
gPosition = fxPst;
};
Main.MessageList(fxMktData.time, "3.매도포지션 체크 fxAct.Balance.count =", fxAct.Balance.count , "fxAct.Balance.position=", fxAct.Balance.position);
fxAct.Refresh();
fxAct.SetBalanceItem(Main.GetOrderCode(fxMktData.code),2);
if (fxAct.Balance.count > 0)
{
fxVol = fxAct.Balance.count;
fxPst = fxAct.Balance.position;
gPosition = fxPst;
};
Main.MessageList(fxMktData.time, "4.매수 포지션 체크 fxAct.Balance.count =", fxAct.Balance.count , "fxAct.Balance.position=", fxAct.Balance.position);
}
2015-02-25
1503
글번호 223334