답변완료
수식변경부탁합니다.
안녕하세요
아래 수식은 매수만 되고 매수청산, 매도, 매도청산, 손절매도 안됩니다.
당일매매이며 매수,매도 신호 후 주문수량을 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
2662
글번호 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
2601
글번호 224189
답변완료
종목 선정 문의
안녕하세요 항상 주신 답변 잘 활용하고 있습니다. 미리 감사드립니다.
아래는 이용중인 스팟전략 중 일부로 종목 선정 부분입니다.
여기에 다음과 같은 조건을 추가하고 싶습니다
ㅇ 현재 : 9시 35초에 설정된 2.7에 가까운 콜풋 종목 선정
ㅇ 추가내용 : 9시 35초에 2.7에 가까은 콜풋, 2.1에 가까운 콜풋 종목을 각각 선정하여
2.7에 가까운 콜풋종목의 절대값의 차이가 0.8 이상이면
2.1에 가까운 콜풋종목으로 최종 거래종목을 선정
현재의 수식은 아래와 같습니다.
==========================================================================
var Start = 0;
var BC; var BP; var SC; var SP;
var CPEntryPrice = 0; var PEntryPrice = 0; var CEntryPrice = 0;
var CPLsum = 0; var PLsum = 0; var CLsum = 0;
var EntryPercent = 0;
var Entry1; var Entry2; var InHMS;
var SCP1; var SCP2; var SCP3; var SCP4;
var SPP1; var SPP2; var SPP3; var SPP4;
var CPLsumin = 0;
function Main_OnStart()
{
Start = 0;
Main.MessageList("시작");
Entry1 = false;
Entry2 = false;
//타이머 셋팅(1번,5초)
Main.SetTimer(1, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번 타이머 동작
if (nEventID == 1 && HHMMSS >= 090035 && Entry1 == false)
{
//ATM위 행사가 갯수
var UNum = Option.uppersATM;
//ATM아래 행사가 갯수
var LNum = Option.lowersATM;
//각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언
var CallCode = new Array(UNum+LNum+1);
//각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언
var CallPrice = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언
var PutCode = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언
var PutPrice = new Array(UNum+LNum+1);
//콜종목 찾기
//콜옵션중 2.7에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.7);
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.7에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.7);
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)
{
Start = 1;
SC = CallOrderCode;
SP = PutOrderCode;
CEntryPrice = Option.GetCurrentByCode(SC);
PEntryPrice = Option.GetCurrentByCode(SP);
CPEntryPrice = Math.round(CEntryPrice*100 + PEntryPrice*100)/100;
Entry1 = true;
Main.MessageList("콜종목:", SC, "풋종목:", SP, "기준양합:", CPEntryPrice);
//청산신호발생했으므로 타이머 종료
Main.KillTimer(1);
//타이머 셋팅(2번,5초)
Main.SetTimer(2, 5000);
}
}
2017-06-15
2293
글번호 224181
답변완료
함수 작성 방법 검토 부탁드립니다.
아래 예와 같이 전역변수 C2_f_rsi1, C2_f_rsi2, C2_f_rsi4에 차트에 적용된 indicator 값을 받아오는 코딩을 하려고 하는데요... case3는 잘동작하는데, 사용자정의 모듈 함수로 처리하고자 할 때 case1, case2 어떤 방식이 맞는 건가여?
var C2_f_rsi1, C2_f_rsi2, C2_f_rsi4;
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
// case1
CollectIndicators_Test1();
Main.MessageList("test1", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2));
// case2
CollectIndicators_Test2(C2_f_rsi1, C2_f_rsi2, C2_f_rsi4);
Main.MessageList("test2", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2));
// case3
C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0);
C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0);
C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0);
Main.MessageList("test3", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2));
}
CollectIndicators_Test1()
{
C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0);
C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0);
C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0);
}
CollectIndicators_Test2(_C2_f_rsi1, _C2_f_rsi2, _C2_f_rsi4)
{
_C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0);
_C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0);
_C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0);
}
2017-05-31
2208
글번호 224178