답변완료
문의
아래 수식은 차트 매수신호 (Signal.signalKind == 1) 발생하면 buy로 진입하는 수식입니다.
차트 청산신호 (Signal.signalKind == 2) 발생하면 청산하는 수식을 추가해 주십시요.
참고로
차트수식의 청산내용은 강제청산(익절,손절,트레일링스탑,최소가격)과 일반청산(exitlong)이 혼재되어 있습니다.
항상 고맙습니다.
*********************************************************************************
var UNum;
var LNum;
var CallCode; var CallPrice;
var CC;
var CallOrderCode;
var CallExit;
function Main_OnStart()
{
CallExit = false;
Main.SetTimer(1, 5000);
}
//차트에서 신호가 발생하면
function Chart1_OnRiseSignal(Signal)
{
//해당 신호가 매수신호이면
if (Signal.signalKind == 1)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("매수신호 발생");
//0.2이하 중 가장 큰 가격을 가지는 종목을 찾음
//ATM위 행사가 갯수
UNum = Option1.uppersATM;
//ATM아래 행사가 갯수
LNum = Option1.lowersATM;
//각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언
CallCode = new Array(UNum+LNum+1);
//각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언
CallPrice = new Array(UNum+LNum+1);
//콜종목 찾기
//콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로
//for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함
for (var i = -LNum; i <= UNum; i++)
{
//값이 1.0이하이면
if (Option1.GetCurrent(0, i) <= 1.00)
{
//해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장
CallPrice[i+LNum] = Option1.GetCurrent(0, i);
//해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장
CallCode[i+LNum] = Option1.GetATMCallRecent(i);
//주의
//배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터
//저장하도록 작성해야 함
}
else//1.00보다 크면
{
//배열변수 CallPrice의 방번호 i+LNum에 -1 저장
CallPrice[i+LNum] = -1;
//배열변수 CallCode의 방번호 i+LNum에 -1 저장
CallCode[i+LNum] = -1;
}
}
//배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고
//CallCode의 동일 방번호의 값을 CallOrderCode에 저장
CC = -1;
CallOrderCode = -1;
for (var iii = -LNum; iii <= UNum; iii++)
{
if (CallPrice[iii+LNum] > CC)
{
CC = CallPrice[iii+LNum];
CallOrderCode = CallCode[iii+LNum]
}
}
Main.MessageList("--------------------------------------------");
Main.MessageList("콜종목코드:",CallOrderCode,"/콜현재가 :",CC);
//콜옵션종목 매수
if (CallExit == false)
{
//지정가
Account1.OrderBuy(CallOrderCode, 1, Option1.GetAskByCode(CallOrderCode, 2), 0);
//시장가
//Account1.OrderBuy(CallOrderCode, 1, 0, 1);
}
}
}
답변완료
문의드립니다
항상 노고에 감사드립니다
스팟실행시
1.프로그램 실행시 처음에 잔고를 불러와 각각의 종목들이 7%이상인 종목들만 시장가 매도하기를 구하고싶습니다
2.미체결에 같은 종목이있으면 중복으로 매수하지않게하고싶습니다.
(이미 같은 종목이라는 에러가 나온후 그대로 스탑일때가 종종있습니다)
3.당일 매수한종목과 매도한 종목은 당일 재매수 하지않게 만들고싶습니다
4.종목코드를 불러와서 종목명으로 변환해주는 함수를 알고싶습니다
(숫자코드가 아니고 한글의 종목명을 활용하고 싶습니다)
5.마지막으로 혹시 대체거래소의 종목은 필터링할수있는 방법은 있는지 만약 있다면 추가하고 싶습니다.
var timerInterval = 5; // 5초 타이머
var 매수금 = 1000000;
var MKList = []; // 종목코드 및 가격을 담는 배열 [{code, price}]
var MK = [];
var req;
function Main_OnStart()
{
var d = new Date();
HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
Main.MessageList(HHMMSS,"|Start");
Main.SetTimer(1, timerInterval*1000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
if (nEventID == 1 )
{
Main.MessageList(HHMMSS,"|종목검색요청");
Main.ReqPowerSearch("www");
}
if (nEventID == 2)
{
Main.KillTimer(2);
Main.MessageList(HHMMSS,"|종목객체재요청");
Main.ReqMarketData(MKList[req].code);
}
}
function Main_OnRcvItemList(aItemList, nCount, aValues)
{
var d = new Date();
HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
Main.KillTimer(1);
Main.MessageList(HHMMSS,"|종목검색완료|검색된종목수:", nCount);
MKList = [];
if (nCount > 0)
{
for (var i = 0; i < nCount; i++)
{
var code = aItemList[i];
var price = parseFloat(aValues[i]);
var isExist = false;
for (var j = 0; j < MK.length; j++)
{
if (code == MK[j].code) isExist = true;
}
if (!isExist)
{
MKList.push({code: code, price: price});
Main.MessageList(HHMMSS, "|대상종목:", code, "|기준가격:", price);
}
}
}
if (MKList.length == 0)
{
Main.SetTimer(1, timerInterval*1000);
}
else
{
req = 0;
Main.ReqMarketData(MKList[req].code);
}
}
function Main_OnRcvMarketData(MarketData)
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
if (MarketData.code == MKList[req].code)
{
var entryPrice = MKList[req].price;
Account1.OrderBuy(MarketData.code, 1, entryPrice, 0);
Main.MessageList(HHMMSS,"|매수주문:", MarketData.code, "|가격:", entryPrice);
MK.push(MarketData);
req = req + 1;
if (req < MKList.length)
{
var S = Main.ReqMarketData(MKList[req].code);
if (S == -1)
{
Main.MessageList(HHMMSS,"|요청제한 15초대기");
Main.SetTimer(2, 15000);
}
}
else
{
Main.MessageList(HHMMSS,"|모든종목처리완료");
Main.SetTimer(1, timerInterval*1000);
}
}
}