예스스탁
예스스탁 답변
2015-04-24 16:59:27
안녕하세요
예스스탁입니다.
아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다.
이전일의 주문낸것을 기억하려면
내부파일에 값을 적어 보관해야 합니다.
아래식은 15시 4분에
차트 포지션 여부에 따라 콜과 풋종목을 선정하고 주문후에
내부파일에 지정한 변수명으로 종모코드를 적어놓게 됩니다.
15시 3분에 내부파일의 지정한 변수에 값이 저장되어 있으면
청산하고 내부파일을 지우게 됩니다.
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시 4분
if (Entry == false && HHMMSS >= 150400 )
{
Entry = true;
//차트가 무포지션
if (Chart1.GetOpenContracts() == 0)
{
Main.SetUserValue("CallOrderCode", "");
Main.SetUserValue("PutOrderCode", "");
}
//차트가 매수유지봉
if (Chart1.GetOpenContracts() > 0)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("매수신호유지");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜옵션중 1.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-1.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.SetUserValue("CallOrderCode", CallOrderCode);
Main.SetUserValue("PutOrderCode", PutOrderCode);
}
}
//차트가 매도유지봉
if (Chart1.GetOpenContracts() < 0)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("매도신호 유지");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋옵션중 1.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-1.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.SetUserValue("CallOrderCode", CallOrderCode);
Main.SetUserValue("PutOrderCode", PutOrderCode);
}
}
}
//15시 3분
if (Exit == false && HHMMSS >= 150300 )
{
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(PreDayCall,0)
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1);
Main.SetUserValue("CallOrderCode", "");
}
}
//모두 수행후 값을 빈공간으로 만듬
Main.SetUserValue("CallOrderCode", "");
Main.SetUserValue("PutOrderCode", "");
}
}
}
즐거운 하루되세요
> 팡팡 님이 쓴 글입니다.
> 제목 : 수식 부탁합니다.
> 많은 도움을 받고 있습니다.
선물매수신호유지시 콜옵션 1.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산
풋옵션 2.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산
선물매도신호유지시 콜옵션 2.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산
풋옵션 1.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산
로스컷은 아래식으로 가능한지요?
//5초단위로 잔고 체크
function Main_OnTimer(nEventID)
{
var U1 = 0;
var P1 = 0;
var V1 = 0;
var Z1 = 0;
var U2 = 0;
var P2 = 0;
var V2 = 0;
var Z2 = 0;
//최근 buy발생상태이면
if (Start == 1)
{
A1.SetBalanceItem(CallCode1,0);
if (A1.Balance.count > 0 && A1.Balance.position == 1)
{
U1 = A1.Balance.avgUnitCost;
P1 = A1.Balance.current;
V1 = A1.Balance.count;
Z1 = ((U1-P1)*V1)*500000;
}
A1.SetBalanceItem(CallCode2,0);
if (A1.Balance.count > 0 && A1.Balance.position == 2)
{
U2 = A1.Balance.avgUnitCost;
P2 = A1.Balance.current;
V2 = A1.Balance.count;
Z2 = ((P2-U2)*V2)*500000;
}
if ((Z1+Z2) <= loss)
{
A1.OrderBuy(CallCode1, V1, Option.GetAskByCode(CallCode1, 2), 0);
A1.OrderSell(CallCode2, V2, Option.GetBidByCode(CallCode2, 2), 0);
Main.SetUserValue("Start", 0);
Main.SetUserValue("Code1", " ");
Main.SetUserValue("Code2", " ");
}
}
//최근 SEll발생상태이면
if (Start == -1)
{
A1.SetBalanceItem(PutCode1,0);
if (A1.Balance.count > 0 && A1.Balance.position == 1)
{
U1 = A1.Balance.avgUnitCost;
P1 = A1.Balance.current;
V1 = A1.Balance.count;
Z1 = ((U1-P1)*V1)*500000;
}
A1.SetBalanceItem(PutCode2,0);
if (A1.Balance.count > 0 && A1.Balance.position == 2)
{
U2 = A1.Balance.avgUnitCost;
P2 = A1.Balance.current;
V2 = A1.Balance.count;
Z2 = ((P2-U2)*V2)*500000;
}
if ((Z1+Z2) <= loss)
{
Start = 0;
A1.OrderBuy(PutCode1, V1, Option.GetAskByCode(PutCode1, 2), 0);
A1.OrderSell(PutCode2, V2, Option.GetBidByCode(PutCode2, 2), 0);
Main.SetUserValue("Start", 0);
Main.SetUserValue("Code1", " ");
Main.SetUserValue("Code2", " ");
}
}
}
예스스탁
예스스탁 답변
2015-05-07 19:54:59
안녕하세요
예스스탁입니다.
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시 4분
if (Entry == false && HHMMSS >= 150400 )
{
Entry = true;
//차트가 무포지션
if (Chart1.GetOpenContracts() == 0)
{
Main.SetUserValue("CallOrderCode", "");
Main.SetUserValue("PutOrderCode", "");
}
//차트가 매수유지봉
if (Chart1.GetOpenContracts() > 0)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("매수신호유지");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜옵션중 1.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-1.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.SetUserValue("CallOrderCode", CallOrderCode);
Main.SetUserValue("PutOrderCode", PutOrderCode);
}
}
//차트가 매도유지봉
if (Chart1.GetOpenContracts() < 0)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("매도신호 유지");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋옵션중 1.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-1.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Account1.OrderSell(CallOrderCode, 1, 0, 1);
Account1.OrderSell(PutOrderCode, 1, 0, 1);
Main.SetUserValue("CallOrderCode", CallOrderCode);
Main.SetUserValue("PutOrderCode", PutOrderCode);
}
}
}
//15시 3분
if (Exit == false && HHMMSS >= 150300 )
{
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(PreDayCall,0)
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1);
Main.SetUserValue("CallOrderCode", "");
}
}
//모두 수행후 값을 빈공간으로 만듬
Main.SetUserValue("CallOrderCode", "");
Main.SetUserValue("PutOrderCode", "");
}
//콜매도, 풋매도 금액의 합으로 +500000원 익절, -500000원 손절
if (HHMMSS < 150300)
{
// 옵션매도포지션 전체 손익계산
var num = Account1.GetTheNumberOfBalances();
var PLsum = 0;
for(var i = 0; i < num; i++)
{
//잔고셋팅
Account1.SetBalanceIndex(i);
//매도포지션이고 옵션종목이고
if (Account1.Balance.position == 1 && (Account1.Balance.code.substring(0,1) == "2" || Account1.Balance.code.substring(0,1) == "3"))
{
//각 옵션매도종목의 (평균단가-현재가)*수량*50만원을 누적
PLsum = PLsum + ((Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count)*500000;
}
}
//손익이 +50만원이상이거나 -50만원 이하이면
if (PLsum >= 500000 || Plsum <= -500000)
{
for(var i = 0; i < num; i++)
{
//잔고셋팅
Account1.SetBalanceIndex(i);
//매도포지션이고 옵션종목이고
if (Account1.Balance.position == 1 && (Account1.Balance.code.substring(0,1) == "2" || Account1.Balance.code.substring(0,1) == "3"))
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0,1);
}
}
}
}
}
}
즐거운 하루되세요
> 팡팡 님이 쓴 글입니다.
> 제목 : Re : Re : 수식 부탁합니다.
> 답변 감사합니다..
콜매도, 풋매도 금액의 합으로 투입 금액의 +20% 익절, -20% 손절 식을 부탁합니다.