커뮤니티

일정시간 매수, 청산 수식

프로필 이미지
팡팡
2018-09-29 00:06:22
2763
글번호 224609
답변완료
100분봉을 사용하면 몇일만에 신호가 발생되어 매수한 옵션종목이 바뀌게 되어 청산이 안됩니다.최초 매수한 종목이 저장되어 몇일 후에도 같은종목이 청산되는 수식 원합니다. 아래와 같이 만약 5계약을 매수 한다면 5초간격으로 1계약씩 매수되고 청산도 5초간격으로 청산하는 수식 원합니다. var Start, BE, SE; var CallCode, PutCode; function Main_OnStart() { Main.MessageList("시작"); //내부파일에 Start로 저장된 값 호출해 V에 저장 var V = Main.GetUserValue("Start"); //0이면 Start는 0 if (V == 0) Start = 0; //1이면 if (V == 1) { //Start는 1 Start = 1; //CallCode에 내부파일 Code에 저장된 값 호출해 저장 CallCode = Main.GetUserValue("Code"); } if (V == -1) { Start = 0; //Start는 -1 Start = 1; //PutCode에 내부파일 Code에 저장된 값 호출해 저장 PutCode = Main.GetUserValue("Code"); Main.SetTimer(1, 5000);//5초간격 타이머 셋팅 } } function C1_OnRiseSignal(Signal) { if (Signal.signalKind == 1 ) { Main.MessageList("매수신호발생"); Start = 1; CallCode = Option.GetATMCallRecent(0); var CallPrice = Option.GetAskByCode(CallCode,2); A1.OrderBuy(CallCode, Vo, CallPrice, 0); BE = 1; Main.SetTimer(1,5000); //Start와 종목코드 저장 Main.SetUserValue("Start", Start); Main.SetUserValue("Code", CallCode); } if (Start == 1 && Signal.signalKind == 2 ) { Start = 0; Main.MessageList("매수청산발생"); var BxPrice = Option.GetBidByCode(CallCode, 2); A1.OrderSell(CallCode, Vo, BxPrice, 0); Main.KillTimer(1); //저장값 초기화 Main.SetUserValue("Start", 0); Main.SetUserValue("Code", " "); } if (Signal.signalKind == 3 ) { Main.MessageList("매도신호발생"); Start = -1; PutCode = Option.GetATMPutRecent(0); var PutPrice = Option.GetAskByCode(PutCode, 2); A1.OrderBuy(PutCode, Vo, PutPrice, 0); SE = 1; Main.SetTimer(1,5000); //Start와 종목코드 저장 Main.SetUserValue("Start", Start); Main.SetUserValue("Code", PutCode); } if (Start == -1 && Signal.signalKind == 4 ) { Start = 0; Main.MessageList("매도청산발생"); var SxPrice = Option.GetAskByCode(PutCode, 2); A1.OrderSell(PutCode, Vo, SxPrice, 0); Main.KillTimer(2); //저장값 초기화 Main.SetUserValue("Start", 0); Main.SetUserValue("Code", " "); } } //5초단위로 잔고 체크 function Main_OnTimer(nEventID) { if (nEventID == 1 && Start == 1) { BE = BE+1; if (BE < 5) { A1.OrderBuy(CallCode, 1, 0, 1); } if (BE == 5) { Main.KillTimer(1); Main.SetTimer(2,1000); } } if (nEventID == 1 && Start == -1) { SE = SE+1; if (SE < 5) { A1.OrderBuy(PutCode, 1, 0, 1); } if (SE == 5) { Main.KillTimer(1); Main.SetTimer(2,1000); } } } } }
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2018-10-18 17:05:52

안녕하세요 예스스탁입니다. 기존에 올려주신 수식에도 진입신호 발생할 때 선정한 옵션 종목코드를 내부파일에 적고 청산에 이용하는 내용들과 진입청산신호시에 5초간격으로 주문 내용 내용이 있습니다. 가이드 내용을 다시 작성해 올려드립니다. 예스스팟의 답변은 단순한 가이드 입니다. 사용자분이 답변수식과 주석을 참고하셔서 수정보완해 사용하셔야 합니다. var Direction,Code,BEcnt,BXcnt,SEcnt,SXcnt; var MaxEntryVol = 5; var MaxExitVol; function Main_OnStart() { Main.MessageList("시작"); } function C1_OnRiseSignal(Signal) { if (Signal.signalKind == 1 ) { Main.MessageList("매수진입신호발생"); //내부파일에서 DD와 CC라는 이름으로 저장된 값을 가져와 Direction,Code변수에 저장 Direction = Main.GetUserValue("DD"); Code = Main.GetUserValue("CC"); //Direction이 1이나 -1이 아닐때 수행 if (Direction != 1 || Direction != -1) { Direction = 1; Code = Option.GetATMCallRecent(0); //방향과 종목코드를 내부파일에 DD,CC라는 이름으로 저장 Main.SetUserValue("DD", Direction); Main.SetUserValue("CC", Code); //매수주문 A1.OrderBuy(Code, 1, Option.GetAskByCode(Code,2), 0); BEcnt = 1; //1번 타이머 5초 셋팅 Main.SetTimer(1,5000); } } if (Signal.signalKind == 2 ) { Main.MessageList("매수청산신호발생"); //내부파일에서 DD와 CC라는 이름으로 저장된 값을 가져와 Direction,Code변수에 저장 Direction = Main.GetUserValue("DD"); Code = Main.GetUserValue("CC"); //Direction이 1이면 if (Direction == 1) { //Direction을 0으로 초기화 Direction = 0; //내부파일에 DD와 CC에 저장값도 초기화 Main.SetUserValue("DD", 0); Main.SetUserValue("CC", " "); //잔고를 세팅 A1.SetBalance(Code, 0); //잔고수량이 있으면 if (A1.Balance.count > 0) { //보유수량 저장 MaxExitVol = A1.Balance.count; //1계약 매도주문 A1.OrderSell(Code,1,Option.GetBidByCode(Code, 2), 0); BXcnt = 1; //보유수량이 2계약 이상이면 if (MaxExitVol >= 2) { //2번 타이머 5초 셋팅 Main.SetTimer(2,5000); } } } } if (Signal.signalKind == 3 ) { Main.MessageList("매도진입신호발생"); //내부파일에서 DD와 CC라는 이름으로 저장된 값을 가져와 Direction,Code변수에 저장 Direction = Main.GetUserValue("DD"); Code = Main.GetUserValue("CC"); //Direction이 1이나 -1이 아닐때 수행 if (Direction != 1 || Direction != -1) { //방향은 매도진입의 의미로 -1 Direction = -1; //ATM풋 종목코드 저장 Code = Option.GetATMPutRecent(0); //방향과 종목코드를 내부파일에 DD,CC라는 이름으로 저장 Main.SetUserValue("DD", Direction); Main.SetUserValue("CC", Code); //매수주문 A1.OrderBuy(Code, 1, Option.GetAskByCode(Code,2), 0); SEcnt = 1; //3번 타이머 5초 셋팅 Main.SetTimer(3,5000); } } if (Signal.signalKind == 4 ) { Main.MessageList("매도청산발생"); //내부파일에서 DD와 CC라는 이름으로 저장된 값을 가져와 Direction,Code변수에 저장 Direction = Main.GetUserValue("DD"); Code = Main.GetUserValue("CC"); //Direction이 -1이면 if (Direction == 1) { //Direction을 0으로 초기화 Direction = 0; //내부파일에 DD와 CC에 저장값도 초기화 Main.SetUserValue("DD", 0); Main.SetUserValue("CC", " "); //잔고를 세팅 A1.SetBalance(Code, 0); //잔고수량이 있으면 if (A1.Balance.count > 0) { //보유수량 저장 MaxExitVol = A1.Balance.count; //1계약 매도주문 A1.OrderSell(Code,1,Option.GetBidByCode(Code, 2), 0); SXcnt = 1; //보유수량이 2계약 이상이면 if (MaxExitVol >= 2) { //4번 타이머 5초 셋팅 Main.SetTimer(4,5000); } } } } } //타이머 동작 function Main_OnTimer(nEventID) { //1번 타이머 동작할 때마다 if (nEventID == 1) { //카운트 BEcnt = BEcnt+1; //카운트가 최대진입수량 이하이면 if (BEcnt <= MaxEntryVol) { //1계약씩 추가매수 A1.OrderBuy(Code, 1, Option.GetAskByCode(Code,2), 0); } //최대진입수량에 도달하면 타이머종료 if (BEcnt == MaxEntryVol) { Main.KillTimer(1); } } //2번타이머 동작할때마다 if (nEventID == 2) { //카운트 BXcnt = BXcnt+1; //카운트가 보유수량 이하이면 if (BXcnt <= MaxExitVol) { //1계약씩 매도주문 A1.OrderSell(Code, 1, Option.GetBidByCode(Code,2), 0); } //카운트가 보유수량에 도달하면 타이머 종료 if (BXcnt == MaxExitVol) { Main.KillTimer(2); } } if (nEventID == 3) { SEcnt = SEcnt+1; if (SEcnt <= MaxEntryVol) { A1.OrderBuy(Code, 1, Option.GetAskByCode(Code,2), 0); } if (SEcnt == MaxEntryVol) { Main.KillTimer(3); } } if (nEventID == 4) { SXcnt = SXcnt+1; if (SXcnt <= MaxExitVol) { A1.OrderSell(Code, 1, Option.GetBidByCode(Code,2), 0); } if (SXcnt == MaxExitVol) { Main.KillTimer(4); } } } 즐거운 하루되세요 > 팡팡 님이 쓴 글입니다. > 제목 : 일정시간 매수, 청산 수식 > 100분봉을 사용하면 몇일만에 신호가 발생되어 매수한 옵션종목이 바뀌게 되어 청산이 안됩니다.최초 매수한 종목이 저장되어 몇일 후에도 같은종목이 청산되는 수식 원합니다. 아래와 같이 만약 5계약을 매수 한다면 5초간격으로 1계약씩 매수되고 청산도 5초간격으로 청산하는 수식 원합니다. var Start, BE, SE; var CallCode, PutCode; function Main_OnStart() { Main.MessageList("시작"); //내부파일에 Start로 저장된 값 호출해 V에 저장 var V = Main.GetUserValue("Start"); //0이면 Start는 0 if (V == 0) Start = 0; //1이면 if (V == 1) { //Start는 1 Start = 1; //CallCode에 내부파일 Code에 저장된 값 호출해 저장 CallCode = Main.GetUserValue("Code"); } if (V == -1) { Start = 0; //Start는 -1 Start = 1; //PutCode에 내부파일 Code에 저장된 값 호출해 저장 PutCode = Main.GetUserValue("Code"); Main.SetTimer(1, 5000);//5초간격 타이머 셋팅 } } function C1_OnRiseSignal(Signal) { if (Signal.signalKind == 1 ) { Main.MessageList("매수신호발생"); Start = 1; CallCode = Option.GetATMCallRecent(0); var CallPrice = Option.GetAskByCode(CallCode,2); A1.OrderBuy(CallCode, Vo, CallPrice, 0); BE = 1; Main.SetTimer(1,5000); //Start와 종목코드 저장 Main.SetUserValue("Start", Start); Main.SetUserValue("Code", CallCode); } if (Start == 1 && Signal.signalKind == 2 ) { Start = 0; Main.MessageList("매수청산발생"); var BxPrice = Option.GetBidByCode(CallCode, 2); A1.OrderSell(CallCode, Vo, BxPrice, 0); Main.KillTimer(1); //저장값 초기화 Main.SetUserValue("Start", 0); Main.SetUserValue("Code", " "); } if (Signal.signalKind == 3 ) { Main.MessageList("매도신호발생"); Start = -1; PutCode = Option.GetATMPutRecent(0); var PutPrice = Option.GetAskByCode(PutCode, 2); A1.OrderBuy(PutCode, Vo, PutPrice, 0); SE = 1; Main.SetTimer(1,5000); //Start와 종목코드 저장 Main.SetUserValue("Start", Start); Main.SetUserValue("Code", PutCode); } if (Start == -1 && Signal.signalKind == 4 ) { Start = 0; Main.MessageList("매도청산발생"); var SxPrice = Option.GetAskByCode(PutCode, 2); A1.OrderSell(PutCode, Vo, SxPrice, 0); Main.KillTimer(2); //저장값 초기화 Main.SetUserValue("Start", 0); Main.SetUserValue("Code", " "); } } //5초단위로 잔고 체크 function Main_OnTimer(nEventID) { if (nEventID == 1 && Start == 1) { BE = BE+1; if (BE < 5) { A1.OrderBuy(CallCode, 1, 0, 1); } if (BE == 5) { Main.KillTimer(1); Main.SetTimer(2,1000); } } if (nEventID == 1 && Start == -1) { SE = SE+1; if (SE < 5) { A1.OrderBuy(PutCode, 1, 0, 1); } if (SE == 5) { Main.KillTimer(1); Main.SetTimer(2,1000); } } } } }
프로필 이미지

팡팡

2018-10-25 23:07:41

매수는 되나 청산이 안됩니다 var Direction,Code,BEcnt,BXcnt,SEcnt,SXcnt; var MaxEntryVol = 5; var MaxExitVol; function Main_OnStart() { Main.MessageList("시작"); } function C1_OnRiseSignal(Signal) { if (Signal.signalKind == 1 ) { Main.MessageList("매수진입신호발생"); //내부파일에서 DD와 CC라는 이름으로 저장된 값을 가져와 Direction,Code변수에 저장 Direction = Main.GetUserValue("DD"); Code = Main.GetUserValue("CC"); //Direction이 1이나 -1이 아닐때 수행 if (Direction != 1 || Direction != -1) { Direction = 1; Code = Option.GetATMCallRecent(0); //방향과 종목코드를 내부파일에 DD,CC라는 이름으로 저장 Main.SetUserValue("DD", Direction); Main.SetUserValue("CC", Code); //매수주문 A1.OrderBuy(Code, 1, Option.GetAskByCode(Code,2), 0); BEcnt = 1; //1번 타이머 5초 셋팅 Main.SetTimer(1,5000); } } if (Signal.signalKind == 2 ) { Main.MessageList("매수청산신호발생"); //내부파일에서 DD와 CC라는 이름으로 저장된 값을 가져와 Direction,Code변수에 저장 Direction = Main.GetUserValue("DD"); Code = Main.GetUserValue("CC"); //Direction이 1이면 if (Direction == 1) { //Direction을 0으로 초기화 Direction = 0; //내부파일에 DD와 CC에 저장값도 초기화 Main.SetUserValue("DD", 0); Main.SetUserValue("CC", " "); //잔고를 세팅 A1.SetBalance(Code, 0); //잔고수량이 있으면 if (A1.Balance.count > 0) { //보유수량 저장 MaxExitVol = A1.Balance.count; //1계약 매도주문 A1.OrderSell(Code,1,Option.GetBidByCode(Code, 2), 0); BXcnt = 1; //보유수량이 2계약 이상이면 if (MaxExitVol >= 2) { //2번 타이머 5초 셋팅 Main.SetTimer(2,5000); } } } } 중략