답변완료
(글수정) 스팟 오류인것 같습니다.
글 수정합니다.
다른 질문을 올립니다.
스팟 오류를 발견한것 같습니다.
제가 Win7과 WinXP에서 매매를 하고 잇는데요.
같은 스팟 수식과 변수 설정으로 해놧는데 Win7에서는 오류없이 돌아가는데 WinXP는 오류가 납니다.
수식은 선물신호를 받아서 옵션 매수를 하는 수식입니다.
아래와 같습니다.
=======================================================================
//계좌객체 추가 : Account1
//챠트객체 추가 : Chart1 //예트챠트명과 일치
//옵션데이타 추가 : Option
//입력변수 추가 : Near //숫자형, 진입하고자 하는 가까운 옵션값
//입력변수 추가 : Vol // 진입수량
var T;
var CC, CallOrderCode;
var PP, PutOrderCode;
var BC, BP;
function Main_OnStart()
{
T = 0;
Main.MessageList("옵션매수 전용시작");
}
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
T = 1;
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
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)-Near);
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]
}
}
//종목을 찾았으면
if (CC < 99999999)
{
BC = CallOrderCode;
Account1.OrderBuy(BC, Vol, Option.GetAskByCode(BC, 5), 0);
}
}
if (T == 1 && Signal.signalKind == 2)
{
T = 0;
Account1.OrderSell(BC, Vol, Option.GetBidByCode(BC, 5), 0);
Main.MessageList("ExitLong신호 발생");
}
if (Signal.signalKind == 3)
{
T = -1;
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
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)-Near);
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 (PP < 99999999)
{
BP = PutOrderCode;
Account1.OrderBuy(BP, Vol, Option.GetAskByCode(BP, 5), 0);
}
}
if (T == -1 && Signal.signalKind == 4)
{
T = 0;
Account1.OrderSell(BP, Vol, Option.GetBidByCode(BP, 5), 0);
Main.MessageList("ExitShort신호 발생");
}
}
//동시호가 청산
function Main_OnStart()
{
Main.MessageLog("시작")
Main.SetTimer(3, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 3 && HHMMDD >= 153600)
{
Main.KillTimer(3);
num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
===============================================================
모든 설정(차트객체, 계좌객체, 옵션객체, Near변수, Vol변수)을 양쪽 컴퓨터에 다 똑같이 했는데요 Win7에서는 정상 작동하고 WinXP에서는 Range Error: Invalid array length 에러가 납니다.
제가 XP 노트북에 자동주문을 틀어놓고 하는데요. 다른분들은 계속 수식이 정상작동 한다는데 저만 오류가 나서 Win7에 세팅을 하고 보니까 에러가 나지 않는 것입니다.
스팟 프로그램상의 오류가 아닌가 합니다. XP에서도 오류 안나게 할 수 있는 방법은 없나요? 이 컴퓨터에 여러가지 메크로 세팅등등을 해놔서 다른 컴퓨터에 또 세팅하는게 여간 힘든데....
2017-07-12
2777
글번호 224192
답변완료
수식변경부탁합니다.
안녕하세요
아래 수식은 매수만 되고 매수청산, 매도, 매도청산, 손절매도 안됩니다.
당일매매이며 매수,매도 신호 후 주문수량을 5초 간격으로 1개씩 증가시켜 총 주문 수량을 5개로 한정되게 해주세요. 청산과 손절매는 전체 잔량을 한번에 청산 원합니다.
var Start;
var CallOrderCode,PutOrderCode;
function C1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1 )
{
Main.MessageList("매수신호발생");
Start = 1;
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
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)-3.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]
}
}
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)-3.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)
{
A1.OrderSell(CallOrderCode, 1, 0, 2);
A1.OrderSell(PutOrderCode, 1, 0, 2);
}
if (Start == 1 && Signal.signalKind == 2 )
{
Start = 0;
Main.MessageList("매수청산발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
A1.OrderBuy(CallOrderCode, 1, 0, 2);
A1.OrderBuy(PutOrderCode, 1, 0, 2);
}
//차트가 매도신호
if (Signal.signalKind == 3 )
{
Main.MessageList("매도신호발생");
Start = -1;
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
}
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)-3.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]
}
}
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)-3.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)
{
A1.OrderSell(CallOrderCode, 1, 0, 2);
A1.OrderSell(PutOrderCode, 1, 0, 2);
Main.SetUserValue("CallOrderCode", CallOrderCode);
Main.SetUserValue("PutOrderCode", PutOrderCode);
}
}
}
if (Start == -1 && Signal.signalKind == 4 )
{
Start = 0;
Main.MessageList("매도청산발생");
A1.OrderBuy(CallOrderCode, 1, 0, 2);
A1.OrderBuy(PutOrderCode, 1,0, 2);
}
//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(CallOrderCode,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)*250000;
}
A1.SetBalanceItem(PutOrderCode,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)*250000;
}
if ((Z1+Z2) <= loss)
{
A1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 0);
A1.OrderBuy(PutOrderCode, 2, Option.GetBidByCode(PutOrderCode, 2), 0);
}
}
//최근 SEll발생상태이면
if (Start == -1)
{
A1.SetBalanceItem(PutOrderCode,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)*250000;
}
A1.SetBalanceItem(CallOrderCode,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)*250000;
}
if ((Z1+Z2) <= loss)
{
Start = 0;
A1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 2), 0);
A1.OrderBuy(CallOrderCode, 2, Option.GetBidByCode(CallOrderCode, 2), 0);
}
}
}
2017-07-06
2671
글번호 224190
답변완료
스팟수식 작성 문의
안녕하세요~ 답변 늘 감사히 사용하고 있습니다.
워낙 코딩실력이 부족하다 보니 게시판 보면서 하나하나 해보고 있는데 잘되지 않아 문의드립니다.
바쁘시더라도 답변 꼭 부탁드립니다.
문의사항은 두개입니다.
질문1)
아래수식은 예트에서 선물신호 받아서 선물거래하는 당일 거래횟수 제한 수식인데요
여기에 다음과 같은 내용을 포함하고 싶습니다.
ㅁ진입 후 2.5P 이익시 익절
ㅁ진입 후 0.8P 손실시 손절
ㅁ진입 후 1.5P 이상 최대수익에서 0.5P 이상 수익반납시 청산(최대수익대비 하락청산)
//-------------------------------------------------------------------------------------
var T,daycount,YYYYMMDD;
//스팟시작시
function Main_OnStart()
{
T = 0;
var d = new Date();
YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();//오늘날짜
//오늘날짜를 당일진입횟수를 저장하는 변수로 이용
//내부변수에서 변수(오늘날짜)에 저장된 값을 불러와
//값이 없으면 daycount에 0, 있으면 해당 값을 저장
if (Main.GetUserValue(YYYYMMDD) == "")
daycount = 0;
else
daycount = Main.GetUserValue(YYYYMMDD);
}
function Chart1_OnRiseSignal(Signal)
{
//매수신호가 발생하고 당일 진입횟수가 3회이내일때
if (Signal.signalKind == 1 && daycount < 3)
{
T = 1;
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0);
//daycount를 1증가
daycount = daycount+1;
//변수(오늘날짜)에 daycount 저장
Main.SetUserValue(YYYYMMDD, daycount);
}
if (T == 1 && Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0);
}
if (Signal.signalKind == 3 && daycount < 3)
{
T = -1;
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0);
//daycount를 1증가
daycount = daycount+1;
//변수(오늘날짜)에 daycount 저장
Main.SetUserValue(YYYYMMDD, daycount);
}
if (T == -1 && Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0);
}
}
//------------------------------------------------------------------------------------------------
질문2)
아래 수식에서 다음 부분을 추가해 주시면 감사하겠습니다.
if(nEventID == 1 && MarketData1.current <= BPrice - 0.15) 에서
현재 : 예트 진입신호 발생시 MarketData1.code의 가격에서 0.15P 낮을때 진입
변경 : 예트 진입신호 발생시 MarketData1.code가 3봉 이내이면서 0.15P 낮을때 진입
예스랭귀지의 "BarsSinceEntry <= 3 and"표현하고 싶은데 안되서 그렇습니다.
//------------------------------------------------------------------------------------------------------
var T;
var Entry;
var BPrice;
function Main_OnStart()
{
Main.MessageList("시작");
T = 0;
Entry = false;
BPrice = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if(Signal.signalKind == 1 && T == 0 && Entry == false)
{
T = 1;
BPrice = Math.round(MarketData1.current*100)/100;
Main.MessageList("매수신호 발생");
Main.SetTimer(1,500);
}
if(Signal.signalKind == 2 && T == 1)
{
Main.KillTimer(1);
T = 0;
Main.MessageList("진입조건 미발생", "매도신호로 리셋");
if(Entry == true)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Vol, MarketData1.Bid(5), 0);
Main.MessageList("선물매수청산");
T = 0;
Entry = false;
}
}
}
function Main_OnTimer(nEventID)
{
if(nEventID == 1 && MarketData1.current <= BPrice - 0.15)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Vol, MarketData1.Ask(5), 0);
Main.MessageList("선물매수진입");
Entry = true;
Main.KillTimer(1);
}
}
//---------------------------------------------------------------------------------------------------------
답변에 대해 미리 진심으로 감사드립니다.
2017-07-04
2614
글번호 224189