답변완료
문의드립니다.
청산수식에 대한 문의입니다.
갭보정된 120틱차트에 현재종가가 지수이평선 20이평선을 하향돌파하면 청산하고자 하나
휩소를 거르고자 두개의 봉으로 판단하여 청산할려고 합니다.
즉 20지수이평선을 하향돌파한 음봉한개,그다음봉이 20지수이평선아래의 양봉이든 음봉이든
종가상 아래있다면 연속두개의 봉으로 판단하여 청산하고자 합니다.
아래와 같이 확장차트를 불러왔습니다.
Main.ReqChartEx(new ReqChartItem(EntryObject[RcvData].code,120,CHART_PERIOD_TICK,1000,CHART_REQCOUNT_BAR,false,true));
청산식 부탁드리겠습니다.
2015-03-06
1314
글번호 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
1378
글번호 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
1534
글번호 223334
답변완료
orerExit관 문의
현대선물에서 FX거래를 예스스팟을 이용하여 거래를 하려고 시스템을 만들어 테스트 중입니다.
포지션이 있는 상태에서 반대 포지션이 안되어 OrderExit 함수를 활용하여
먼저 포지션을 청산하고 반대로 청산이 완료되는 것을 OnNotifyFill이벤트에서 주문번호를 확인하고 신규로 진입하는 것으로 구현했습니다.
그런데...
1. 포지션이 없음을 확인하고 진입(매수,매도)을 시도해도 "매수포지션에서 신규매도, 매도포시션에서 신규매수 불가능합니다"라는 Error가 발생합니다.
또는 포지션번호를 찾을 수 없다고 나오기도 합니다.
account1.Balance.postionNum을 로깅하면 Null입니다.
그래서
Fx매매 화면을 통해 수동으로 진입이후 포지션을 점검해서 Main_Start에서
위와 같은 작업을 해 봤습니다.
경우에 따라 위와 같은 현상이 나타나기도 하고, 정상적으로 청산이 되기도 합니다.
2. OrderExit이후 포지션이 없다는 것을 시스템이 인식하지 못하는 것 같은데
혹시 코딩을 잘못한 것이지, 아니면 다른 것이 있어서 그런 것이지 확인 부탁드립니다.
3. OnNotifyFill 이벤트는 매매 수량이 한개 임에도 2번, 3번 나타 나는데 정상적인 현상인지요?
2015-02-13
1538
글번호 223330