커뮤니티

스팟수식 작성 문의

프로필 이미지
탄젠트80
2017-07-04 13:02:31
2602
글번호 224189
답변완료
안녕하세요~ 답변 늘 감사히 사용하고 있습니다. 워낙 코딩실력이 부족하다 보니 게시판 보면서 하나하나 해보고 있는데 잘되지 않아 문의드립니다. 바쁘시더라도 답변 꼭 부탁드립니다. 문의사항은 두개입니다. 질문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); } } //--------------------------------------------------------------------------------------------------------- 답변에 대해 미리 진심으로 감사드립니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2017-07-28 16:49:45

안녕하세요 예스스탁입니다. 아래 내용 참고하시기 바랍니다. 1. var T,daycount,YYYYMMDD,HH,LL; var BEID,SEID,BENUM,SENUM; //스팟시작시 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; BEID = 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); //매수청산 신호 발생하면 1번 타이머 종료 Main.KillTimer(1); } 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번 타이머 종료 Main.KillTimer(2); } } //주문응답수신 function Main_OnOrderResponse(OrderResponse) { //매수진입주문 주문번호 저장 if (OrderResponse.orderID == BEID) { BENUM = OrderResponse.orderNum; } //매도진입주문 주문번호 저장 if (OrderResponse.orderID == SEID) { SENUM = OrderResponse.orderNum; } } //체결응답수신 function Main_OnNotifyFill(NotifyFill) { //매수진입주문 체결 if (NotifyFill.orderNum == BENUM) { //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code),0); //체결이후 최고가 저장변수의 초기값은 평단가 HH = Account1.Balance.avgUnitCost; //1초 타이머 셋팅(타이머 이이디는 1) Main.SetTimer(1, 1000); } //매도진입주문 체결 if (NotifyFill.orderNum == SENUM) { //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code),0); //체결이후 최저가 저장변수의 초기값은 평단가 LL = Account1.Balance.avgUnitCost; //타이머 셋팅(타이머 아이디는 2) Main.SetTimer(1, 1000); } } function Main_OnTimer(nEventID) { //1번 타이머 동작 if (nEventID == 1) { //최고가 갱신 if ( MarketData1.current > HH) { HH = MarketData1.current; } //잔고가 매수포지션이고 수량이 있을&#46468;만 if (Account1.Balance.position == 2 && Account1.Balance.count > 0) { //현재가가 잔고평단가 대비 +2.5 이상이면 청산 if (MarketData1.current >= Account1.Balance.avgUnitCost + 2.5) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(5), 0); Main.KillTimer(1); } //현재가가 잔고평단가 대비 -0.8 이하이면 청산 if (MarketData1.current <= Account1.Balance.avgUnitCost - 0.8) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(5), 0); Main.KillTimer(1); } //진입이후 최고가가 잔고평단가대비 +1.5 이상이고 현재가가 최고가 대비 0.5 이상 하락했으면 청산 if (HH >= Account1.Balance.avgUnitCost + 1.5 && MarketData1.current <= HH - 0.5) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(5), 0); Main.KillTimer(1); } } } //2번 타이머 동작 if (nEventID == 1) { //최저가 갱신 if ( MarketData1.current < LL) { LL = MarketData1.current; } //잔고가 매도포지션이고 수량이 있을&#46468;만 if (Account1.Balance.position == 1 && Account1.Balance.count > 0) { //현재가가 잔고평단가 대비 -2.5 이하이면 청산 if (MarketData1.current <= Account1.Balance.avgUnitCost - 2.5) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(5), 0); Main.KillTimer(2); } //현재가가 잔고평단가 대비 +0.8 이상이면 청산 if (MarketData1.current >= Account1.Balance.avgUnitCost + 0.8) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(5), 0); Main.KillTimer(2); } //진입이후 최저가가 잔고평단가대비 -1.5 이하이고 현재가가 최저가 대비 0.5 이상 상승했으면 청산 if (LL <= Account1.Balance.avgUnitCost - 1.5 && MarketData1.current >= LL + 0.5) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(5), 0); Main.KillTimer(2); } } } } 2 //------------------------------------------------------------------------------------------------------ var T; var Entry; var BPrice; var Bars = 0,Bong; function Main_OnStart() { Main.MessageList("시작"); T = 0; Entry = false; BPrice = 0; bars = 0; } function Chart1_OnBarAppended(nData) { if( nData == 1) { Bars = Bars+1; } } function Chart1_OnRiseSignal(Signal) { if(Signal.signalKind == 1 && T == 0 && Entry == false) { T = 1; BPrice = Math.round(MarketData1.current*100)/100; Bong = bars; 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 && Bars < Bong+3) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Vol, MarketData1.Ask(5), 0); Main.MessageList("선물매수진입"); Entry = true; Main.KillTimer(1); } } //--------------------------------------------------------------------------------------------------------- 즐거운 하루되세요 > 탄젠트80 님이 쓴 글입니다. > 제목 : 스팟수식 작성 문의 > 안녕하세요~ 답변 늘 감사히 사용하고 있습니다. 워낙 코딩실력이 부족하다 보니 게시판 보면서 하나하나 해보고 있는데 잘되지 않아 문의드립니다. 바쁘시더라도 답변 꼭 부탁드립니다. 문의사항은 두개입니다. 질문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); } } //--------------------------------------------------------------------------------------------------------- 답변에 대해 미리 진심으로 감사드립니다.