예스스탁
예스스탁 답변
2021-06-17 14:57:42
안녕하세요
예스스탁입니다.
1
스팟은 실행중에만 변수의 값을 기억하므로
재접속시에 시작시점에 시간을 체크해서 지정한 시간이후이면 해당로직이 수행되지 않게 하셔야 합니다.
2
중간에 재접속하게 되면
종목코드를 알수가 없습니다.
양매도시 종목코드를 내부파일에 저장 후 청산시 내부파일에 적혀진 종목코드를 가지고와 잔고셋팅해 청산하게 하셔야 합니다.
3
아래 내용 참고하시기 바랍니다.
var EntryTime = 103000;
var ExitTime = 144500;
var MaxEnryVol = 10;
var Entry,Exit,CurrentVol;
var CSV,PSV,CSX,PSX;
function Main_OnStart()
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
Main.MessageList(HHMMSS,"Start");
Entry = true;
if (HHMMSS >= EntryTime)
{
Entry = false;
}
Exit = true;
if (HHMMSS >= ExitTime)
{
Exit = false;
}
if (Entry == true || Exit == true)
{
Main.MessageList(HHMMSS,"1번 타이머동작");
Main.SetTimer(1, 5000);
}
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 1)
{
if (Entry == true && HHMMSS >= EntryTime)
{
//양매도종목
var CallOrderCode = Option.GetATMCallRecent(0);
var PutOrderCode = Option.GetATMPutRecent(0);
Main.SetUserValue("SellDate",YYYYMMDD);
Main.SetUserValue("CallOrderCode",CallOrderCode);
Main.SetUserValue("PutOrderCode",PutOrderCode);
Entry = false;
if (ExitTime > EntryTime)
Main.KillTimer(1);
Account1.OrderSell(CallOrderCode, 1, Option.GetBid(CallOrderCode, 2),0);
Account1.OrderSell(PutOrderCode, 1, Option.GetBid(PutOrderCode, 2), 0);
CurrentVol = 1;
Main.SetTimer(2, 5000);
}
if (Exit == true && HHMMSS >= ExitTime)
{
Exit = false;
if (ExitTime > EntryTime)
Main.KillTimer(1);
var SellDate = Main.GetUserValue("SellDate")
var CallOrderCode = Main.GetUserValue("CallOrderCode");
var PutOrderCode = Main.GetUserValue("PutOrderCode");
if (YYYYMMDD == SellDate)
{
if (CallOrderCode != "")
{
Account1.SetBalance(CallOrderCode, 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
CSV = Account1.Balance.count;
else
CSV = 0;
if (PSV > 0)
{
Main.SetTimer(3, 5000);
CSX = 1;
Account1.OrderBuy(CallOrderCode, 1, Option.GetAsk(CallOrderCode, 2),0);
}
}
if (PutOrderCode != "")
{
Account1.SetBalance(PutOrderCode, 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
PSV = Account1.Balance.count;
else
PSV = 0;
if (PSV > 0)
{
Main.SetTimer(4, 5000);
PSX = 1;
Account1.OrderBuy(PutOrderCode, 1, Option.GetAsk(PutOrderCode, 2),0);
}
}
}
}
}
if (nEventID == 2)
{
CurrentVol = CurrentVol+1;
if (CurrentVol <= MaxEnryVol)
{
Account1.OrderSell(CallOrderCode, 1, Option.GetBid(CallOrderCode, 2),0);
Account1.OrderSell(PutCode, 1, Option.GetBid(PutCode, 2), 0);
}
else
{
Main.KillTimer(2);
}
}
if (nEventID == 3)
{
CSX = CSX+1;
if (CSX <= CSV)
{
Account1.OrderBuy(CallOrderCode, 1, Option.GetAsk(CallOrderCode, 2),0);
}
else
{
Main.KillTimer(3);
}
}
if (nEventID == 4)
{
PSX = PSX+1;
if (PSX <= PSV)
{
Account1.OrderBuy(PutOrderCode, 1, Option.GetAsk(PutOrderCode, 2),0);
}
else
{
Main.KillTimer(4);
}
}
}
즐거운 하루되세요
> 팡팡 님이 쓴 글입니다.
> 제목 : 수식 부탁합니다
> 수고하십니다.
10시30분에 양매도 하여 14시 30분에 청산하는 식을 원합니다.
차트 매수 매도 신호에 상관없이 설정 시간으로 작동되게 원하며 매도시 5초간격으로 1계약씩 증가하면서 매도주문하고 청산 시간에도 5초마다 1계약씩 청산하는식 원합니다.
첨부 예시는 매수하여 매도청산하는 식이며 반대로 매도하여 매수 청산하는식으로 변경 원합니다. 부팅이 되거나 설정시간(10시 30분)이 지나서 실행시키면 시간 관계없이 다시 작동(매도)되는 오류가 있는데 해결방법을 알고 싶습니다.
안녕하세요!
주신 수식 실행하니 첫번째 매도 체결은 되나 두번째부터 아래와 같은 오류 메세지가 나옵니다. 청산도 안됩니다.
주문가격 호가유형 주문수량
1.-2147483648 1 * 종목코드값 미확인 (종목코드:undefined) [ddd22]
예스스탁
예스스탁 답변
2021-06-24 14:37:27
안녕하세요
예스스탁입니다.
수정한 식입니다.
종목코드 저장변수가 지역변수로 되어 있어 전역변수로 변경해 드립니다.
var EntryTime = 103000;
var ExitTime = 144500;
var MaxEnryVol = 10;
var Entry,Exit,CurrentVol;
var CSV,PSV,CSX,PSX;
var CallOrderCode,PutOrderCode;
function Main_OnStart()
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
Main.MessageList(HHMMSS,"Start");
Entry = true;
if (HHMMSS >= EntryTime)
{
Entry = false;
}
Exit = true;
if (HHMMSS >= ExitTime)
{
Exit = false;
}
if (Entry == true || Exit == true)
{
Main.MessageList(HHMMSS,"1번 타이머동작");
Main.SetTimer(1, 5000);
}
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 1)
{
if (Entry == true && HHMMSS >= EntryTime)
{
//양매도종목
CallOrderCode = Option.GetATMCallRecent(0);
PutOrderCode = Option.GetATMPutRecent(0);
Main.SetUserValue("SellDate",YYYYMMDD);
Main.SetUserValue("CallOrderCode",CallOrderCode);
Main.SetUserValue("PutOrderCode",PutOrderCode);
Entry = false;
if (ExitTime > EntryTime)
Main.KillTimer(1);
Account1.OrderSell(CallOrderCode, 1, Option.GetBid(CallOrderCode, 2),0);
Account1.OrderSell(PutOrderCode, 1, Option.GetBid(PutOrderCode, 2), 0);
CurrentVol = 1;
Main.SetTimer(2, 5000);
}
if (Exit == true && HHMMSS >= ExitTime)
{
Exit = false;
if (ExitTime > EntryTime)
Main.KillTimer(1);
var SellDate = Main.GetUserValue("SellDate")
if (YYYYMMDD == SellDate)
{
CallOrderCode = Main.GetUserValue("CallOrderCode");
PutOrderCode = Main.GetUserValue("PutOrderCode");
if (CallOrderCode != "")
{
Account1.SetBalance(CallOrderCode, 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
CSV = Account1.Balance.count;
else
CSV = 0;
if (PSV > 0)
{
Main.SetTimer(3, 5000);
CSX = 1;
Account1.OrderBuy(CallOrderCode, 1, Option.GetAsk(CallOrderCode, 2),0);
}
}
if (PutOrderCode != "")
{
Account1.SetBalance(PutOrderCode, 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
PSV = Account1.Balance.count;
else
PSV = 0;
if (PSV > 0)
{
Main.SetTimer(4, 5000);
PSX = 1;
Account1.OrderBuy(PutOrderCode, 1, Option.GetAsk(PutOrderCode, 2),0);
}
}
}
}
}
if (nEventID == 2)
{
CurrentVol = CurrentVol+1;
if (CurrentVol <= MaxEnryVol)
{
Account1.OrderSell(CallOrderCode, 1, Option.GetBid(CallOrderCode, 2),0);
Account1.OrderSell(PutCode, 1, Option.GetBid(PutCode, 2), 0);
}
else
{
Main.KillTimer(2);
}
}
if (nEventID == 3)
{
CSX = CSX+1;
if (CSX <= CSV)
{
Account1.OrderBuy(CallOrderCode, 1, Option.GetAsk(CallOrderCode, 2),0);
}
else
{
Main.KillTimer(3);
}
}
if (nEventID == 4)
{
PSX = PSX+1;
if (PSX <= PSV)
{
Account1.OrderBuy(PutOrderCode, 1, Option.GetAsk(PutOrderCode, 2),0);
}
else
{
Main.KillTimer(4);
}
}
}
즐거운 하루되세요
> 팡팡 님이 쓴 글입니다.
> 제목 : 수식 수정 부탁합니다
> 안녕하세요!
주신 수식 실행하니 첫번째 매도 체결은 되나 두번째부터 아래와 같은 오류 메세지가 나옵니다. 청산도 안됩니다.
주문가격 호가유형 주문수량
1.-2147483648 1 * 종목코드값 미확인 (종목코드:undefined) [ddd22]
안녕하세요!
매도는 순차적으로 되나 청산은 전혀 작동하지 않습니다.