답변완료
설정시간 신호유지
아래의 수식에서
미완성신호가 발생 후 계속하여 미완성신호가 유지되고 있는 동안만
타이머가 작동하도록 하고자 하나,
타이머 설정시간보다 아주짧게 미완성신호가 발생 한다음 소멸하여도
타이머는 계속 작동하여 주문이 접수체결 됩니다.
이를 타이머가 설정 된 시간동안 미완성신호가 계속유지되고 있을 때에만
주문이 접수체결 되도록 아래의 수식을 변경하여 주시면 감사 하겠습니다.
즉, 타임어 설정시간이 5초인경우
1. 5초 미만 미완성신호 발생 후 소멸시 -------> 주문접수/체결 발생하지 않음.
2. 5초간 미완성신호가 계속유지되고 있을때 만 --------> 주문접수 / 체결 됨
var T;
function Main_OnStart()
{
T = 0;
Main.MessageLog("시작");
OrderCode = Main.GetOrderCode(KP.code);
}
function C1_OnRiseIncompleteSignal(IncompleteSignal)
{
Main.MessageLog("미완성신호/"+IncompleteSignal.signalKind);
A1.SetBalance(Main.GetOrderCode(IncompleteSignal.code))
if (T <= 0 && (A1.Balance.position == 1 || A1.Balance.position == 0) && IncompleteSignal.signalKind == 1)
{
T = 1;
if(A1.Balance.position == 0)
VV = 1;
else
VV = 2;
Main.SetTimer(1,5000);
}
if (T >= 0 && A1.Balance.position == 1 && IncompleteSignal.signalKind == 3)
{
T = 0;
Main.KillTimer(1);
Main.SetTimer(2,5000);
}
if (T >= 0 && (A1.Balance.position == 2 || A1.Balance.position == 0) && IncompleteSignal.signalKind == 3)
{
T = -1;
if(A1.Balance.position == 0)
VV = 1;
else
VV = 2;
Main.SetTimer(2,5000);
}
if (T <= 0 && A1.Balance.position == 2 && IncompleteSignal.signalKind == 1)
{
T = 0;
Main.KillTimer(2);
Main.SetTimer(1,5000);
}
}
function Main_OnTimer(nEventID)
{
//마지막봉 미완성 신호정보 셋팅
var Incom = C1.GetIncompleteSignal();
if (nEventID == 1 && T == 1)
{
Main.KillTimer(1);
A1.OrderBuy(KP.code, VV, KP.Ask(2),2);
Main.MessageLog("매수진입");
}
if (nEventID == 1 && T == 0)
{
Main.KillTimer(1);
Main.MessageLog("중복매수진입금지");
}
if (nEventID == 2 && T == -1)
{
Main.KillTimer(2);
A1.OrderSell(KP.code, VV, KP.Bid(2),2);
Main.MessageLog("매도진입");
}
if (nEventID == 2 && T == 0)
{
Main.KillTimer(2);
Main.MessageLog("중복매도진입금지");
}
}
2019-01-02
3140
글번호 224700
답변완료
질문드립니다.
아래는 친절히 답해주셔서 잘 사용하고 있습니다. 감사합니다.
1. 종목검색을 9시에 시작하고 원하는시간을 설정하여 종목검색을 종료할 수 있었으면 좋겠습니다.
2. 관심종목에 넣은 종목을 매매하고싶습니다.
3. 아래 스톱셋 기능을 제거하고 싶습니다.
4. 2%수익시 종목의 80%를 시장가로 청산하는 청산식이 추가되었으면 좋겠습니다.
감사합니다.아래는 로직입니다.
var reqItemList = []; //검색되서 차트요청한 종목에 대해 종목코드를 저장할 배열변수
var ItemList = []; //검색된 종목 중 reqItemList에 없는 종목에 대해 종목코드를 저장한 배열변수장
var Count; //요청할 종목갯수
var ReqCount; //종목검색 후 차트객체 요청한 종목갯수
function Main_OnStart()
{
Main.MessageList("스팟시작");
Main.MessageList("종목검색시작");
Main.ReqPowerSearch("급등주검색");
Main.SetTimer(2, 180000);//2번 타이머(180초)
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.MessageList("종목검색완료 : 검색된 종목수 : ",nCount);
//ItemList 변수 초기화
ItemList = [];
//검색종목수가 1개 이상일떄만 수행
if (nCount > 0)
{
//reqItemList에 저장된 종목코드가 한개도 없을때
if (reqItemList.length == 0)
{
//ItemList 배열변수에 aItemList를 차례대로 모두 옮김
Count = 0;
for (var i = 0; i < nCount; i++)
{
ItemList.push(aItemList[i]);
Count = Count+1;
}
}
else//reqItemList에 저장된 종목코드가 한개이상일때
{
//검색된 종목 중 reqItemList에 없는 종목만 ItemList에 담음
Count = 0;
for (var i = 0; i < nCount; i++)
{
var add = true;
for (var z = 0; z < reqItemList.length; z++)
{
if (aItemList[i] == reqItemList[z])
{
add = false;
Main.MessageList("이미 차트생성된 종목 : ",aItemList[i]);
}
}
if (add == true)
{
ItemList.push(aItemList[i]);
Count = Count+1;
}
}
}
//생성할 종목수가 1개 이상일떄
if (Count > 0)
{
Main.MessageList("차트객체 생성시작 : 생성할 종목수 : ",Count,ItemList);
Main.SetTimer(1, 1000);
ReqCount = 0;
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 2)
{
Main.MessageList("종목검색시작");
Main.ReqPowerSearch("급등주검색");
Main.SetTimer(2, 180000);//2번 타이머(180초)
}
if (nEventID == 1)
{
var StopSet = new SystemStopInfo(
new StopLoss(5, CALCMETHOD_PERCENT, 0),
new StopTrailing(5, 7, CALCMETHOD_PERCENT, 0),
new StopProfitTarget(10, CALCMETHOD_PERCENT, 0),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(230000));
var ChartSet = new ReqChartItem(ItemList[ReqCount],2,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("##단타", YL_TYPE_NORMAL, null, null, null);
Main.ReqChartEx(ChartSet,SystemSet);
//생성요청한 종목에 대해 reqItemList에 종목코드 추가
reqItemList.push(ItemList[ReqCount]);
Main.MessageLog("확장차트생성_"+ItemList[ReqCount]);
ReqCount = ReqCount+1;
if (ReqCount == Count)
{
Main.KillTimer(1);
Main.MessageList("차트객체 생성완료 : 생성된 종목수 : ",ReqCount);
}
}
}
//신호발생
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,ChartEx.GetClose(1,0),1);
Main.MessageList("매도주문");
} //잔고수량만큼만 시장가매도
}
}
2019-01-18
3124
글번호 224698
답변완료
왜 1820 답을 안 달아 주시나요?
chart1 이름이 울트라수퍼챠트
account1 이름이 9999-9999-99
콜옵션 가격은 0원에서 7만원사이 가격중 가장 큰 콜옵션 선택
울트라수퍼챠트에서 선물로 매수신호가 나올때 콜옵션 매수,
선물로 매도신호가 나올때 콜옵션 매도 나오게
예스스탁수식 작성해주세요
(물론 데이 트레이딩용이므로 첫신호가 선물의 매수신호가 먼저 나온 경우는 다음신호가 매도 일경우 매수청산후 매도진입하도록,
선물의 매도신호가 첫신호로 먼저 나온경우는 매도 청산후 매수 진입하도록, 신호 나오게 해주시고요
즉 울트라수퍼차트에서 나오는 선물의 신호가 그대로 옵션 챠트에서도 작동되도록 수식 부탁드립니다.
그리고 제가 스팟은 처음이라 자동매매를 위해 제 계좌를 연계하는 방법도 모릅니다.
그것도 수식에 넣어 주십시요
항상 감사드립니다
문의사항 010 3231 4592 유원장드림
2018-12-22
2971
글번호 224683
답변완료
질문드립니다.
var ItemList;
var Count;
var ReqCount;
function Main_OnStart()
{
Main.MessageLog("스팟시작");
Main.MessageLog("종목검색시작");
Main.ReqPowerSearch("급등주검색");
}
function Main_OnRcvItemList(aItemList, nCount)
{
ItemList = aItemList;
Count = nCount;
Main.SetTimer(1, 1000);
ReqCount = 0;
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
var StopSet = new SystemStopInfo(new StopLoss(5, CALCMETHOD_PERCENT, 0),
new StopTrailing(5, 7, CALCMETHOD_PERCENT, 0),
new StopProfitTarget(10, CALCMETHOD_PERCENT, 0),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(230000));
var ChartSet = new ReqChartItem(ItemList[ReqCount],2,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("##단타", YL_TYPE_NORMAL, null, null, null);
Main.ReqChartEx(ChartSet,SystemSet);
Main.MessageLog("확장차트생성_"+ItemList[ReqCount]);
ReqCount = ReqCount+1;
if (ReqCount == Count)
{
Main.KillTimer(1);
Main.MessageLog("종목검색완료");
}
}
}
//신호발생
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.current),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);
}
}
//잔고수량만큼만 매도
1. 위와같이 구성할 경우 종목검색도 끝마치고, 확장차트까지 불러와줍니다.
근데 그 이후 수량을 선택하지 않았다며 주문이 나가질 않네요. 저는 수량보다 주문금액으로 처리하고싶습니다만... 어디가 문제인지요?
2. 위 수식에 종목검색을 3분주기로 계속 하며 검색을 할 수 있는 로직이 추가되었으면 좋겠습니다.
2018-12-26
2828
글번호 224681