무료로 어드바이저를 작성할 수 있도록 도와주세요. 5가지 다른 아이디어. - 페이지 15 1...89101112131415 새 코멘트 [삭제] 2013.12.02 05:50 #141 글쎄, 모든 것. 알았습니다. 도움을 주려고 노력했습니다. 더 많은 아이디어를 공유할 때라고 생각합니다. Vladyslav Goshkov 2013.12.02 05:57 #142 GeneratorID : 글쎄, 모든 것. 알았습니다. 도움을 주기 위해 "시도"했습니다. 더 많은 아이디어를 공유할 때라고 생각합니다. 누가 "오래된 자전거"에 관심을 가질 것입니까? 당신은 당신이 막 배우려고 하는 것이 포럼에서 사라진 지 오래이고 코드 기반에 무료 구현이 있다는 것을 여전히 이해하지 못하고 있습니다. 나만의 아이디어가 있나요? 그렇지 않으면 논의할 것이 없습니다. Vadim Podoprigora 2017.01.04 21:05 #143 어드바이저에 미결 주문의 최대 수를 추가하도록 도와주세요! //+----------------------------------------------- --------------------+ //| v128-2.mq4 | //| Copyright © 2011, Andrey N. Bolkonsky | //| 2011년 3월 21일 | //| 이메일: abolk@yandex.ru | 스카이프: abolk1 | //+----------------------------------------------- --------------------+ #property copyright "Copyright © 2011, Andrey N. Bolkonsky" #속성 링크 "abok@yandex.ru" // extern string rem2 = "=== 로트 수 ==="; 외부 이중 _Lots0_1 = 0.1; // 기본 레벨(1차 주문의 경우) 외부 이중 _Lots0_2 = 0.1; // 기본 레벨(2차 주문용) // extern string rem3 = "=== 추가 매개변수 ==="; 외부 정수 _TakeProfit1_Proc = 50; // 첫 번째 주문의 이익실현에 대한 퍼센트 위험 외부 정수 _SpaseFromMaxMin = 1; // 위/아래에서 오프셋 // extern string rem4 = "=== 손익분기 매개변수 ==="; 외부 부울 _IsStopLoss_0 = 거짓; // 손익분기점 사용 가능 extern int _StopLoss_0_From = 0; // 손익분기점에서 오프셋(포인트) 외부 int _StopLoss_0_Level = 15; // 손익분기점 // extern string rem5 = "=== 후행 중지 매개변수 ==="; 외부 부울 _IsTrailingStop = 거짓; // 후행 정지 활성화 부울 _IsTrailingStopProfit = true; // 손익분기점에서 후행 정지 활성화 //extern int _TrailingStopProfit_From = 0; // 손익분기점에서 오프셋(포인트) 외부 정수 _TrailingStopLevel = 15; // 후행 정지 레벨 외부 int _TrailingStopStep = 5; // 후행 정지 이동 단계 // extern string rem6 = "=== 도구 설정 ==="; 외부 문자열 _Symboll = ""; // 악기의 기호 이름: "" - 현재 기호 외부 정수 _Timeframe = 0; // 기간: 0 - 현재 차트의 기간 int_Digitss; // 가격의 소수점 이하 자릿수 더블 _포인트; // 견적 통화의 포인트 크기 extern int _Slippage = 2; // 미끄러짐 외부 정수 _Magic1 = 1281; // EA 주문의 고유 번호(첫 번째 주문) 외부 정수 _Magic2 = 1282; // EA 주문의 고유 번호(2차 주문) // extern 문자열 rem7 = "=== MA1 표시기 매개변수 ==="; 외부 정수 _MA1_Timeframe = PERIOD_D1; // 기간: 0 - 현재 차트의 기간 외부 int _MA1_Period = 20; // 이동 평균을 계산하기 위한 평균 주기 외부 정수 _MA1_Shift = 0; // 가격 차트를 기준으로 한 표시기 이동 외부 int _MA1_메소드 = 0; // 평균화 방법: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA 외부 정수 _MA1_Applied_Price = 0; // 중고 가격: 0 - 종가, 1 - 시가, 2 - 고가, 3 - 저가 // extern 문자열 rem8 = "=== MA2 표시기 매개변수 ==="; 외부 정수 _MA2_Timeframe = PERIOD_H4; // 기간: 0 - 현재 차트의 기간 외부 int _MA2_Period = 20; // 이동 평균을 계산하기 위한 평균 주기 외부 정수 _MA2_Shift = 0; // 가격 차트를 기준으로 한 표시기 이동 외부 정수 _MA2_Method = 0; // 평균화 방법: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA 외부 정수 _MA2_Applied_Price = 0; // 중고 가격: 0 - 종가, 1 - 시가, 2 - 고가, 3 - 저가 // extern string rem9 = "=== 볼린저 밴드 지표 매개변수 ==="; //외부 정수 _BB_Timeframe = 0; // 기간: 0 - 현재 차트의 기간 외부 정수 _BB_Period = 20; // 메인 인디케이터 라인의 평균 주기 외부 int _BB_편차 = 2; // 본선과의 편차 외부 int _BB_Bands_Shift = 0; // 가격 차트를 기준으로 한 표시기 이동 외부 정수 _BB_Applied_Price = 0; // 중고 가격: 0 - 종가 // extern string rem10 = "=== 지그재그 표시기 매개변수 ==="; //외부 정수 _ZZ_Timeframe = 0; // 기간: 0 - 현재 차트의 기간 외부 정수 _ZZ_ExtDepth = 12; 외부 int _ZZ_ExtDeviation = 5; 외부 int _ZZ_ExtBackstep = 3; // datetime_Time이전; 날짜 시간 _TimeCurrent; // string_fstr; int_tp; // 무효 MaxOrders(int max_orders=5); //=++=============================================== ================++= 정수 초기화() { if(_Symbol == "") _Symboll = 기호(); // _Digitss = MarketInfo(_Symbol, MODE_DIGITS); _포인트 = MarketInfo(_Symbol, MODE_POINT); // if(_Timeframe == 0) _Timeframe = 기간(); Print("v128-2 > 초기화() >> _Timeframe=", _Timeframe, "rem4=",_IsStopLoss_0, "rem5=",_IsTrailingStop,_IsTrailingStopProfit); // _fstr = "v128_"; _tp = _FileReadWriteDouble(_fstr+"_tp.dat", 0); // 파일이 존재하는지 확인하고 존재하지 않으면 생성 Print("v128-2 > 초기화() >> _Timeframe=", _Timeframe, " _tp=",_tp); // _TimePrevious=iTime(_Symbol, _Timeframe, 0); // Print("v128-2 > 완료: init() >> _TimePrevious=", _TimePrevious, " (", TimeToStr(_TimePrevious,TIME_DATE|TIME_MINUTES), ")"); 리턴(0); } //=++=============================================== ================++= 정수 시작() { 이중 P_Close1, P_Close2; 더블 BB_1_위, BB_1_아래; 이중 MA1_0, MA2_0; 이중 P_ask, P_bid; bool is_signal_2_buy, is_signal_2_sell; 이중 P1_구매, P2_구매, P3_구매; 이중 P1_sell, P2_sell, P3_sell; 부울 is_b1 = 거짓, is_s1 = 거짓; 부울 is_b2 = 거짓, is_s2 = 거짓; 인트 티켓; // _TimeCurrent = iTime(_Symbol, _Timeframe, 0); if(_TimeCurrent != _TimePrevious) { MA1_0 = iMA(_Symbol, _MA1_Timeframe, _MA1_Period, _MA1_Shift, _MA1_Method, _MA1_Applied_Price, 0); MA2_0 = iMA(_Symbol, _MA2_Timeframe, _MA2_Period, _MA2_Shift, _MA2_Method, _MA2_Applied_Price, 0); BB_1_upper = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_UPPER, 1); BB_1_lower = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_LOWER, 1); P_Close1 = iClose(_Symbol, _Timeframe, 1); P_Close2 = iClose(_Symbol, _Timeframe, 2); P_ask = MarketInfo(_Symbol, MODE_ASK); P_bid = MarketInfo(_Symbol, MODE_BID); Print("v120-4 > ", _Symbol, " | ", _Timeframe, " -> MA1_0=", MA1_0, " | MA2_0=", MA2_0, " -> BB_1_upper=", BB_1_upper, " | BB_1_lower=", BB_1_lower, " -> P_Close1=", P_Close1, " | P_Close2=", P_Close2, " -> 물음=", P_ask, " | 입찰=", P_bid); // is_signal_2_buy = P_bid >= MA1_0 && P_bid >= MA2_0 && P_Close1 >= BB_1_lower && P_Close2 <= BB_1_lower && P_bid >= BB_1_lower; is_signal_2_sell = P_bid <= MA1_0 && P_bid <= MA2_0 && P_Close1 <= BB_1_upper && P_Close2 >= BB_1_upper && P_bid <= BB_1_upper; Print("v128-2 > ", _Symbol, " | ", _Timeframe, " -> is_signal2 -> buy=", is_signal_2_buy, " | Sell=", is_signal_2_sell); // =========== 시장별 // =========== 구매 주문 열기 if( is_signal_2_buy ) { Print("v128-2 > ", _Symbol, " | ", _Timeframe, " -> BUY 주문을 여는 신호"); 주문DeleteAll(OP_SELL); // if(!is_b1 || !is_b2) { P1_구매 = P_ask; P3_buy = FindPriceMinMax(false) - (_SpaseFromMaxMin) * _Point; _tp = (P1_구매 - P3_구매) / _포인트 * (_TakeProfit1_Proc / 100.0); P2_buy = DoubleTestZero(_tp, P1_buy + (_tp) * _Point); // _FileWriteDouble(_fstr+"_tp.dat", _tp); // Print("v128-2 > ", _Symbol, " | ", _Timeframe, " -> 구매 -> P1_buy=", P1_buy, " | P2_buy=", P2_buy, " | P3_buy=", P3_buy, "_tp=", _tp); // 티켓 = OrderSend(_Symbol, OP_BUY, _Lots0_1, ND(P1_buy), _Slippage, ND(P3_buy), ND(P2_buy), NULL, _Magic1, 0, CLR_NONE); if(티켓 == -1) Print("v128-2 > ", _Symbol, " | ", _Timeframe, " -> BUY (1) > Error (opening) #", GetLastError()); 그렇지 않으면 is_b1 = 참; // 티켓 = OrderSend(_Symbol, OP_BUY, _Lots0_2, ND(P1_buy), _Slippage, ND(P3_buy), 0, NULL, _Magic2, 0, CLR_NONE); if(티켓 == -1) Print("v128-2 > ", _Symbol, " | ", _Timeframe, " -> BUY (2) > Error (opening) #", GetLastError()); 그렇지 않으면 is_b2 = 참; // } 그렇지 않으면 { is_b1 = 참; is_b2 = 참; } } 그렇지 않으면 { is_b1 = 참; is_b2 = 참; } //Print("= 구매 +++",is_b1,is_b2,"==",is_s1,is_s2); // ========== 판매 주문 열기 if( is_signal_2_sell ) { Print("v128-2 > ", _Symbol, " | ", _Timeframe, " -> 매도 주문을 열라는 신호"); 주문DeleteAll(OP_BUY); // if(!is_s1 || !is_s2) { P1_판매 = P_bid; P3_sell = FindPriceMinMax(true) + (_SpaseFromMaxMin) * _Point; _tp = (P3_sell - P1_sell) / _Point * (_TakeProfit1_Proc / 100.0); P2_sell = DoubleTestZero(_tp, P1_sell - (_tp) * _Point); // _FileWriteDouble(_fstr+"_tp.dat", _tp); // Print("v128-2 > ", _Symbol, " | ", _Timeframe, " -> 구매 -> P1_sell=", P1_sell, " | P2_sell=", P2_sell, " | P3_sell=", P3_sell); // 티켓 = OrderSend(_Symbol, OP_SELL, _Lots0_1, ND(P1_sell), _Slippage, ND(P3_sell), ND(P2_sell), NULL, _Magic1, 0, CLR_NONE); if(티켓 == -1) Print("v128-2 > ", _Symbol, " | ", _Timeframe, " -> 판매(1) > 오류(열기) #", GetLastError()); 그렇지 않으면 is_s1 = 참; // 티켓 = OrderSend(_Symbol, OP_SELL, _Lots0_2, ND(P1_sell), _Slippage, ND(P3_sell), 0, NULL, _Magic2, 0, CLR_NONE); if(티켓 == -1) Print("v128-2 > ", _Symbol, " | ", _Timeframe, " -> 판매(2) > 오류(열기) #", GetLastError()); 그렇지 않으면 is_s2 = 참; // } 그렇지 않으면 { is_s1 = 참; is_s2 = 참; } } 그렇지 않으면 { is_s1 = 참; is_s2 = 참; } //Print("= 판매 +++",is_b1,is_b2,"==",is_s1,is_s2); // =========== if(is_b1 && is_s1 && is_b2 && is_s2) _TimePrevious=_TimeCurrent; } // if(_IsTrailingStop) { if( !FindOrders(_Magic1) ) TrailingStop(_tp); } // if(_IsStopLoss_0) StopLoss_0(_StopLoss_0_From); // 리턴(0); } //=++=============================================== ================++= 더블 DoubleTestZero(더블 값, 더블 new_value) { if(값==0) 반환(값); 그렇지 않으면 반환(new_value); } //=++=============================================== ================++= 더블 ND(더블 값) { 반환( NormalizeDouble(값, _Digits) ); } //=++=============================================== ================++= // 마감 주문. 모두 닫기에서 종료 무효 OrdersDeleteAll(int cmd) { 동안(주문수(cmd) > 0) { for(int i = OrdersTotal() - 1; i >= 0 ; i--) { if(주문선택(i, SELECT_BY_POS, MODE_TRADES)) { if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) && (주문 유형() == cmd) ) { if(주문 유형() == OP_BUY) if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), _Slippage, CLR_NONE)) Print("v128-2 > ", _Symbol, " > BUY -> ticket=", OrderTicket(), " -> 오류(닫기) #", GetLastError()); if(주문 유형() == OP_SELL) if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), _Slippage, CLR_NONE)) Print("v128-2 > ", _Symbol, " > SELL -> ticket=", OrderTicket(), " -> 오류(닫기) #", GetLastError()); } } } } // 주문 수 } //=++=============================================== ================++= // 방향의 주문 수를 계산합니다. int CountOrders(int cmd) { 정수 n = 0; for(int i = OrdersTotal() - 1; i >= 0 ; i--) { if(주문선택(i, SELECT_BY_POS, MODE_TRADES)) { if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) && (주문 유형() == cmd) ) n++; } } 리턴(n); } //=++=============================================== ================++= // 마법으로 주문 검색 bool FindOrders(int 마법) { for(int i = OrdersTotal() - 1; i >= 0 ; i--) { if(주문선택(i, SELECT_BY_POS, MODE_TRADES)) { if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == 마법) ) 반환(참); } } 반환(거짓); } //=++=============================================== ================++= // 마법으로 손익분기점 계산 무효 StopLoss_0(int from) { 이중 이익 포인트, 입찰, 요청; 부울은; 이중 P3_구매, P3_판매; // for(int i = OrdersTotal() - 1; i >= 0 ; i--) { if(주문선택(i, SELECT_BY_POS, MODE_TRADES)) { if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) 계속; // if(주문 유형() == OP_BUY) { 입찰가 = MarketInfo(_Symbol, MODE_BID); 이익점 = (입찰가 - OrderOpenPrice()) / _Point; is = 이익점 >= _StopLoss_0_Level + from; P3_buy = ND( OrderOpenPrice() + from * _Point ); // if( is && ( OrderStopLoss() == 0 || OrderStopLoss() < P3_buy ) ) { Print("v128-2 b4 >", _Symbol, " | ", _Timeframe, " -> 입찰 =", MarketInfo(_Symbol, MODE_BID), " | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_buy=", P3_buy, " | d=", _StopLoss_0_Level, " | 이익점=", 이익점); if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_buy, OrderTakeProfit(), 0, CLR_NONE)) Print("v128-2 b4 > ", _Symbol, " | ", _Timeframe, " -> 구매 > 티켓=", OrderTicket(), " > 오류(손익분기점) #", GetLastError()); } } // 그렇지 않으면(주문 유형() == OP_SELL) { 질문 = MarketInfo(_Symbol, MODE_ASK); 이익점 = (OrderOpenPrice() - 물음) / _Point; is = 이익점 >= _StopLoss_0_Level + from; P3_sell = ND( OrderOpenPrice() - from * _Point ); // if( is && ( OrderStopLoss() == 0 || OrderStopLoss() > P3_sell ) ) { Print("v128-2 b4 >", _Symbol, " | ", _Timeframe, " -> 묻기 =", MarketInfo(_Symbol, MODE_ASK), " | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_sell=", P3_sell, " | d=", _StopLoss_0_Level, " | 이익점=", 이익점); if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_sell, OrderTakeProfit(), 0, CLR_NONE)) Print("v128-2 b4 > ", _Symbol, " | ", _Timeframe, " -> 판매 -> 티켓=", OrderTicket(), " > 오류(손익분기점) #", GetLastError()); } } } } } //=++=============================================== ================++= // 마법으로 후행 정지를 계산합니다. 무효 TrailingStop(int from) { 이중 이익 포인트, 입찰, 요청; 가격에서 두 배; // for(int i = OrdersTotal() - 1; i >= 0 ; i--) { if(주문선택(i, SELECT_BY_POS, MODE_TRADES)) { if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) 계속; // if(주문 유형() == OP_BUY) { if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() + from * _Point; 그렇지 않으면 fromprice = OrderStopLoss(); // 입찰가 = MarketInfo(_Symbol, MODE_BID); 이익점 = (입찰가 - ND(fromprice)) / _Point; // if( 이익점 >= _TrailingStopLevel && 입찰 > (OrderStopLoss() + (_TrailingStopLevel + _TrailingStopStep) * _Point) ) { Print("v128-2 v4 >", _Symbol, " | ", _Timeframe, " -> 입찰 =", MarketInfo(_Symbol, MODE_BID), " | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | d=", _TrailingStopLevel, " | 이익점=", 이익점); if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(입찰 - (_TrailingStopLevel) * _Point), OrderTakeProfit(), 0, CLR_NONE)) { Print("v128-2 v4 >", _Symbol, " | ", _Timeframe, " -> BUY > ticket=", OrderTicket(), " > 오류(후행 정지) #", GetLastError()); } } } // 그렇지 않으면(주문 유형() == OP_SELL) { if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() - 시작점 * _Point; 그렇지 않으면 fromprice = OrderStopLoss(); // 질문 = MarketInfo(_Symbol, MODE_ASK); 이익점 = (ND(fromprice) - 물음) / _Point; // if( 이익점 >= _TrailingStopLevel && 질문 < (OrderStopLoss() - (_TrailingStopLevel + _TrailingStopStep) * _Point) ) { Print("v128-2 v4 >", _Symbol, " | ", _Timeframe, " -> Ask=", MarketInfo(_Symbol, MODE_ASK), " | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | d=", _TrailingStopLevel, " | 이익점=", 이익점); if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(ask + (_TrailingStopLevel) * _Point), OrderTakeProfit(), 0, CLR_NONE)) { Print("v128-2 v4 >", _Symbol, " | ", _Timeframe, " -> 판매 > 티켓=", OrderTicket(), " > 오류(후행 정지) #", GetLastError()); } } } } } } //=++=============================================== ================++= // 로컬 바닥을 찾습니다. 가격을 반환 더블 FindPriceMinMax(bool isUp) { 정수 시프트 = 1; 이중 가격 = 0, p0,p1,p2; 동안(가격 == 0) { p0 = iCustom(_Symbol, _Timeframe, "지그재그", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 0, shift); p1 = iCustom(_Symbol, _Timeframe, "지그재그", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 1, shift); p2 = iCustom(_Symbol, _Timeframe, "지그재그", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 2, shift); //Print("v128-2 >", _Symbol, " | ", _Timeframe, // " > sift=", shift, " | p0=", p0, " | p1=", p1, " | p2=", p2); if(isUp) { if(p0 !=0 && p0 == p1) // 정점을 찾았습니다. 가격 = p0; } 또 다른 { if(p0 != 0 && p0 == p2) // 하단 발견 가격 = p0; } 시프트++; } //Print("v128-2 >", _Symbol, " | ", _Timeframe, // " -> return(price)=", price); 반품(가격); } //================================================== ===================== // 파일에서 변수를 읽습니다. // 파일이 존재하지 않으면 파일을 생성하고 파일에 변수를 씁니다. double _FileReadWriteDouble(문자열 파일 이름, 이중 값) { int h1 = 파일열기(파일명, FILE_BIN); if(h1 > 0) { 값 = FileReadDouble(h1, DOUBLE_VALUE); 파일닫기(h1); } 또 다른 { h1 = 파일열기(파일명, FILE_BIN|FILE_WRITE); FileWriteDouble(h1, 값, DOUBLE_VALUE); 파일닫기(h1); } 반환(값); } //================================================== ===================== // 파일에 변수 쓰기 무효 _FileWriteDouble(문자열 파일 이름, 이중 값) { int h1 = 파일열기(파일명, FILE_BIN|FILE_WRITE); FileWriteDouble(h1, 값, DOUBLE_VALUE); 파일닫기(h1); } MQL4 및 MQL5에 대한 Please help write EAs Any questions from newcomers 1...89101112131415 새 코멘트 트레이딩 기회를 놓치고 있어요: 무료 트레이딩 앱 복사용 8,000 이상의 시그널 금융 시장 개척을 위한 경제 뉴스 등록 로그인 공백없는 라틴 문자 비밀번호가 이 이메일로 전송될 것입니다 오류 발생됨 Google으로 로그인 웹사이트 정책 및 이용약관에 동의합니다. 계정이 없으시면, 가입하십시오 MQL5.com 웹사이트에 로그인을 하기 위해 쿠키를 허용하십시오. 브라우저에서 필요한 설정을 활성화하시지 않으면, 로그인할 수 없습니다. 사용자명/비밀번호를 잊으셨습니까? Google으로 로그인
글쎄, 모든 것. 알았습니다. 도움을 주려고 노력했습니다. 더 많은 아이디어를 공유할 때라고 생각합니다.
글쎄, 모든 것. 알았습니다. 도움을 주기 위해 "시도"했습니다. 더 많은 아이디어를 공유할 때라고 생각합니다.
누가 "오래된 자전거"에 관심을 가질 것입니까? 당신은 당신이 막 배우려고 하는 것이 포럼에서 사라진 지 오래이고 코드 기반에 무료 구현이 있다는 것을 여전히 이해하지 못하고 있습니다. 나만의 아이디어가 있나요? 그렇지 않으면 논의할 것이 없습니다.
어드바이저에 미결 주문의 최대 수를 추가하도록 도와주세요!
//+----------------------------------------------- --------------------+
//| v128-2.mq4 |
//| Copyright © 2011, Andrey N. Bolkonsky |
//| 2011년 3월 21일 |
//| 이메일: abolk@yandex.ru | 스카이프: abolk1 |
//+----------------------------------------------- --------------------+
#property copyright "Copyright © 2011, Andrey N. Bolkonsky"
#속성 링크 "abok@yandex.ru"
//
extern string rem2 = "=== 로트 수 ===";
외부 이중 _Lots0_1 = 0.1; // 기본 레벨(1차 주문의 경우)
외부 이중 _Lots0_2 = 0.1; // 기본 레벨(2차 주문용)
//
extern string rem3 = "=== 추가 매개변수 ===";
외부 정수 _TakeProfit1_Proc = 50; // 첫 번째 주문의 이익실현에 대한 퍼센트 위험
외부 정수 _SpaseFromMaxMin = 1; // 위/아래에서 오프셋
//
extern string rem4 = "=== 손익분기 매개변수 ===";
외부 부울 _IsStopLoss_0 = 거짓; // 손익분기점 사용 가능
extern int _StopLoss_0_From = 0; // 손익분기점에서 오프셋(포인트)
외부 int _StopLoss_0_Level = 15; // 손익분기점
//
extern string rem5 = "=== 후행 중지 매개변수 ===";
외부 부울 _IsTrailingStop = 거짓; // 후행 정지 활성화
부울 _IsTrailingStopProfit = true; // 손익분기점에서 후행 정지 활성화
//extern int _TrailingStopProfit_From = 0; // 손익분기점에서 오프셋(포인트)
외부 정수 _TrailingStopLevel = 15; // 후행 정지 레벨
외부 int _TrailingStopStep = 5; // 후행 정지 이동 단계
//
extern string rem6 = "=== 도구 설정 ===";
외부 문자열 _Symboll = ""; // 악기의 기호 이름: "" - 현재 기호
외부 정수 _Timeframe = 0; // 기간: 0 - 현재 차트의 기간
int_Digitss; // 가격의 소수점 이하 자릿수
더블 _포인트; // 견적 통화의 포인트 크기
extern int _Slippage = 2; // 미끄러짐
외부 정수 _Magic1 = 1281; // EA 주문의 고유 번호(첫 번째 주문)
외부 정수 _Magic2 = 1282; // EA 주문의 고유 번호(2차 주문)
//
extern 문자열 rem7 = "=== MA1 표시기 매개변수 ===";
외부 정수 _MA1_Timeframe = PERIOD_D1; // 기간: 0 - 현재 차트의 기간
외부 int _MA1_Period = 20; // 이동 평균을 계산하기 위한 평균 주기
외부 정수 _MA1_Shift = 0; // 가격 차트를 기준으로 한 표시기 이동
외부 int _MA1_메소드 = 0; // 평균화 방법: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
외부 정수 _MA1_Applied_Price = 0; // 중고 가격: 0 - 종가, 1 - 시가, 2 - 고가, 3 - 저가
//
extern 문자열 rem8 = "=== MA2 표시기 매개변수 ===";
외부 정수 _MA2_Timeframe = PERIOD_H4; // 기간: 0 - 현재 차트의 기간
외부 int _MA2_Period = 20; // 이동 평균을 계산하기 위한 평균 주기
외부 정수 _MA2_Shift = 0; // 가격 차트를 기준으로 한 표시기 이동
외부 정수 _MA2_Method = 0; // 평균화 방법: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
외부 정수 _MA2_Applied_Price = 0; // 중고 가격: 0 - 종가, 1 - 시가, 2 - 고가, 3 - 저가
//
extern string rem9 = "=== 볼린저 밴드 지표 매개변수 ===";
//외부 정수 _BB_Timeframe = 0; // 기간: 0 - 현재 차트의 기간
외부 정수 _BB_Period = 20; // 메인 인디케이터 라인의 평균 주기
외부 int _BB_편차 = 2; // 본선과의 편차
외부 int _BB_Bands_Shift = 0; // 가격 차트를 기준으로 한 표시기 이동
외부 정수 _BB_Applied_Price = 0; // 중고 가격: 0 - 종가
//
extern string rem10 = "=== 지그재그 표시기 매개변수 ===";
//외부 정수 _ZZ_Timeframe = 0; // 기간: 0 - 현재 차트의 기간
외부 정수 _ZZ_ExtDepth = 12;
외부 int _ZZ_ExtDeviation = 5;
외부 int _ZZ_ExtBackstep = 3;
//
datetime_Time이전;
날짜 시간 _TimeCurrent;
//
string_fstr;
int_tp;
//
무효 MaxOrders(int max_orders=5);
//=++=============================================== ================++=
정수 초기화()
{
if(_Symbol == "") _Symboll = 기호();
//
_Digitss = MarketInfo(_Symbol, MODE_DIGITS);
_포인트 = MarketInfo(_Symbol, MODE_POINT);
//
if(_Timeframe == 0) _Timeframe = 기간();
Print("v128-2 > 초기화() >> _Timeframe=", _Timeframe,
"rem4=",_IsStopLoss_0,
"rem5=",_IsTrailingStop,_IsTrailingStopProfit);
//
_fstr = "v128_";
_tp = _FileReadWriteDouble(_fstr+"_tp.dat", 0); // 파일이 존재하는지 확인하고 존재하지 않으면 생성
Print("v128-2 > 초기화() >> _Timeframe=", _Timeframe, " _tp=",_tp);
//
_TimePrevious=iTime(_Symbol, _Timeframe, 0);
//
Print("v128-2 > 완료: init() >> _TimePrevious=", _TimePrevious, " (", TimeToStr(_TimePrevious,TIME_DATE|TIME_MINUTES), ")");
리턴(0);
}
//=++=============================================== ================++=
정수 시작()
{
이중 P_Close1, P_Close2;
더블 BB_1_위, BB_1_아래;
이중 MA1_0, MA2_0;
이중 P_ask, P_bid;
bool is_signal_2_buy, is_signal_2_sell;
이중 P1_구매, P2_구매, P3_구매;
이중 P1_sell, P2_sell, P3_sell;
부울 is_b1 = 거짓, is_s1 = 거짓;
부울 is_b2 = 거짓, is_s2 = 거짓;
인트 티켓;
//
_TimeCurrent = iTime(_Symbol, _Timeframe, 0);
if(_TimeCurrent != _TimePrevious)
{
MA1_0 = iMA(_Symbol, _MA1_Timeframe, _MA1_Period, _MA1_Shift, _MA1_Method, _MA1_Applied_Price, 0);
MA2_0 = iMA(_Symbol, _MA2_Timeframe, _MA2_Period, _MA2_Shift, _MA2_Method, _MA2_Applied_Price, 0);
BB_1_upper = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_UPPER, 1);
BB_1_lower = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_LOWER, 1);
P_Close1 = iClose(_Symbol, _Timeframe, 1);
P_Close2 = iClose(_Symbol, _Timeframe, 2);
P_ask = MarketInfo(_Symbol, MODE_ASK);
P_bid = MarketInfo(_Symbol, MODE_BID);
Print("v120-4 > ", _Symbol, " | ", _Timeframe,
" -> MA1_0=", MA1_0, " | MA2_0=", MA2_0,
" -> BB_1_upper=", BB_1_upper, " | BB_1_lower=", BB_1_lower,
" -> P_Close1=", P_Close1, " | P_Close2=", P_Close2,
" -> 물음=", P_ask, " | 입찰=", P_bid);
//
is_signal_2_buy = P_bid >= MA1_0 && P_bid >= MA2_0 && P_Close1 >= BB_1_lower && P_Close2 <= BB_1_lower && P_bid >= BB_1_lower;
is_signal_2_sell = P_bid <= MA1_0 && P_bid <= MA2_0 && P_Close1 <= BB_1_upper && P_Close2 >= BB_1_upper && P_bid <= BB_1_upper;
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> is_signal2 -> buy=", is_signal_2_buy, " | Sell=", is_signal_2_sell);
// =========== 시장별
// =========== 구매 주문 열기
if( is_signal_2_buy )
{
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> BUY 주문을 여는 신호");
주문DeleteAll(OP_SELL);
//
if(!is_b1 || !is_b2)
{
P1_구매 = P_ask;
P3_buy = FindPriceMinMax(false) - (_SpaseFromMaxMin) * _Point;
_tp = (P1_구매 - P3_구매) / _포인트 * (_TakeProfit1_Proc / 100.0);
P2_buy = DoubleTestZero(_tp, P1_buy + (_tp) * _Point);
//
_FileWriteDouble(_fstr+"_tp.dat", _tp);
//
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> 구매 -> P1_buy=", P1_buy, " | P2_buy=", P2_buy, " | P3_buy=", P3_buy, "_tp=", _tp);
//
티켓 = OrderSend(_Symbol, OP_BUY, _Lots0_1, ND(P1_buy), _Slippage, ND(P3_buy), ND(P2_buy),
NULL, _Magic1, 0, CLR_NONE);
if(티켓 == -1)
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> BUY (1) > Error (opening) #", GetLastError());
그렇지 않으면 is_b1 = 참;
//
티켓 = OrderSend(_Symbol, OP_BUY, _Lots0_2, ND(P1_buy), _Slippage, ND(P3_buy), 0,
NULL, _Magic2, 0, CLR_NONE);
if(티켓 == -1)
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> BUY (2) > Error (opening) #", GetLastError());
그렇지 않으면 is_b2 = 참;
//
}
그렇지 않으면 { is_b1 = 참; is_b2 = 참; }
}
그렇지 않으면 { is_b1 = 참; is_b2 = 참; }
//Print("= 구매 +++",is_b1,is_b2,"==",is_s1,is_s2);
// ========== 판매 주문 열기
if( is_signal_2_sell )
{
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> 매도 주문을 열라는 신호");
주문DeleteAll(OP_BUY);
//
if(!is_s1 || !is_s2)
{
P1_판매 = P_bid;
P3_sell = FindPriceMinMax(true) + (_SpaseFromMaxMin) * _Point;
_tp = (P3_sell - P1_sell) / _Point * (_TakeProfit1_Proc / 100.0);
P2_sell = DoubleTestZero(_tp, P1_sell - (_tp) * _Point);
//
_FileWriteDouble(_fstr+"_tp.dat", _tp);
//
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> 구매 -> P1_sell=", P1_sell, " | P2_sell=", P2_sell, " | P3_sell=", P3_sell);
//
티켓 = OrderSend(_Symbol, OP_SELL, _Lots0_1, ND(P1_sell), _Slippage, ND(P3_sell), ND(P2_sell),
NULL, _Magic1, 0, CLR_NONE);
if(티켓 == -1)
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> 판매(1) > 오류(열기) #", GetLastError());
그렇지 않으면 is_s1 = 참;
//
티켓 = OrderSend(_Symbol, OP_SELL, _Lots0_2, ND(P1_sell), _Slippage, ND(P3_sell), 0,
NULL, _Magic2, 0, CLR_NONE);
if(티켓 == -1)
Print("v128-2 > ", _Symbol, " | ", _Timeframe,
" -> 판매(2) > 오류(열기) #", GetLastError());
그렇지 않으면 is_s2 = 참;
//
}
그렇지 않으면 { is_s1 = 참; is_s2 = 참; }
}
그렇지 않으면 { is_s1 = 참; is_s2 = 참; }
//Print("= 판매 +++",is_b1,is_b2,"==",is_s1,is_s2);
// ===========
if(is_b1 && is_s1 && is_b2 && is_s2)
_TimePrevious=_TimeCurrent;
}
//
if(_IsTrailingStop)
{
if( !FindOrders(_Magic1) ) TrailingStop(_tp);
}
//
if(_IsStopLoss_0)
StopLoss_0(_StopLoss_0_From);
//
리턴(0);
}
//=++=============================================== ================++=
더블 DoubleTestZero(더블 값, 더블 new_value)
{
if(값==0) 반환(값);
그렇지 않으면 반환(new_value);
}
//=++=============================================== ================++=
더블 ND(더블 값)
{
반환( NormalizeDouble(값, _Digits) );
}
//=++=============================================== ================++=
// 마감 주문. 모두 닫기에서 종료
무효 OrdersDeleteAll(int cmd)
{
동안(주문수(cmd) > 0)
{
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(주문선택(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol)
&& (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)
&& (주문 유형() == cmd) )
{
if(주문 유형() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), _Slippage, CLR_NONE))
Print("v128-2 > ", _Symbol, " > BUY -> ticket=", OrderTicket(),
" -> 오류(닫기) #", GetLastError());
if(주문 유형() == OP_SELL)
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), _Slippage, CLR_NONE))
Print("v128-2 > ", _Symbol, " > SELL -> ticket=", OrderTicket(),
" -> 오류(닫기) #", GetLastError());
}
}
}
}
// 주문 수
}
//=++=============================================== ================++=
// 방향의 주문 수를 계산합니다.
int CountOrders(int cmd)
{
정수 n = 0;
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(주문선택(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol)
&& (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)
&& (주문 유형() == cmd) ) n++;
}
}
리턴(n);
}
//=++=============================================== ================++=
// 마법으로 주문 검색
bool FindOrders(int 마법)
{
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(주문선택(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == 마법) )
반환(참);
}
}
반환(거짓);
}
//=++=============================================== ================++=
// 마법으로 손익분기점 계산
무효 StopLoss_0(int from)
{
이중 이익 포인트, 입찰, 요청;
부울은;
이중 P3_구매, P3_판매;
//
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(주문선택(i, SELECT_BY_POS, MODE_TRADES))
{
if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) 계속;
//
if(주문 유형() == OP_BUY)
{
입찰가 = MarketInfo(_Symbol, MODE_BID);
이익점 = (입찰가 - OrderOpenPrice()) / _Point;
is = 이익점 >= _StopLoss_0_Level + from;
P3_buy = ND( OrderOpenPrice() + from * _Point );
//
if( is && ( OrderStopLoss() == 0 || OrderStopLoss() < P3_buy ) )
{
Print("v128-2 b4 >", _Symbol, " | ", _Timeframe,
" -> 입찰 =", MarketInfo(_Symbol, MODE_BID),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_buy=", P3_buy,
" | d=", _StopLoss_0_Level, " | 이익점=", 이익점);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_buy, OrderTakeProfit(), 0, CLR_NONE))
Print("v128-2 b4 > ", _Symbol, " | ", _Timeframe,
" -> 구매 > 티켓=", OrderTicket(), " > 오류(손익분기점) #", GetLastError());
}
}
//
그렇지 않으면(주문 유형() == OP_SELL)
{
질문 = MarketInfo(_Symbol, MODE_ASK);
이익점 = (OrderOpenPrice() - 물음) / _Point;
is = 이익점 >= _StopLoss_0_Level + from;
P3_sell = ND( OrderOpenPrice() - from * _Point );
//
if( is && ( OrderStopLoss() == 0 || OrderStopLoss() > P3_sell ) )
{
Print("v128-2 b4 >", _Symbol, " | ", _Timeframe,
" -> 묻기 =", MarketInfo(_Symbol, MODE_ASK),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_sell=", P3_sell,
" | d=", _StopLoss_0_Level, " | 이익점=", 이익점);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_sell, OrderTakeProfit(), 0, CLR_NONE))
Print("v128-2 b4 > ", _Symbol, " | ", _Timeframe,
" -> 판매 -> 티켓=", OrderTicket(), " > 오류(손익분기점) #", GetLastError());
}
}
}
}
}
//=++=============================================== ================++=
// 마법으로 후행 정지를 계산합니다.
무효 TrailingStop(int from)
{
이중 이익 포인트, 입찰, 요청;
가격에서 두 배;
//
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(주문선택(i, SELECT_BY_POS, MODE_TRADES))
{
if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) 계속;
//
if(주문 유형() == OP_BUY)
{
if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() + from * _Point;
그렇지 않으면 fromprice = OrderStopLoss();
//
입찰가 = MarketInfo(_Symbol, MODE_BID);
이익점 = (입찰가 - ND(fromprice)) / _Point;
//
if( 이익점 >= _TrailingStopLevel &&
입찰 > (OrderStopLoss() + (_TrailingStopLevel + _TrailingStopStep) * _Point) )
{
Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,
" -> 입찰 =", MarketInfo(_Symbol, MODE_BID),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),
" | d=", _TrailingStopLevel, " | 이익점=", 이익점);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(입찰 - (_TrailingStopLevel) * _Point),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,
" -> BUY > ticket=", OrderTicket(), " > 오류(후행 정지) #", GetLastError());
}
}
}
//
그렇지 않으면(주문 유형() == OP_SELL)
{
if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() - 시작점 * _Point;
그렇지 않으면 fromprice = OrderStopLoss();
//
질문 = MarketInfo(_Symbol, MODE_ASK);
이익점 = (ND(fromprice) - 물음) / _Point;
//
if( 이익점 >= _TrailingStopLevel &&
질문 < (OrderStopLoss() - (_TrailingStopLevel + _TrailingStopStep) * _Point) )
{
Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,
" -> Ask=", MarketInfo(_Symbol, MODE_ASK),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),
" | d=", _TrailingStopLevel, " | 이익점=", 이익점);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(ask + (_TrailingStopLevel) * _Point),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,
" -> 판매 > 티켓=", OrderTicket(), " > 오류(후행 정지) #", GetLastError());
}
}
}
}
}
}
//=++=============================================== ================++=
// 로컬 바닥을 찾습니다. 가격을 반환
더블 FindPriceMinMax(bool isUp)
{
정수 시프트 = 1;
이중 가격 = 0, p0,p1,p2;
동안(가격 == 0)
{
p0 = iCustom(_Symbol, _Timeframe, "지그재그", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 0, shift);
p1 = iCustom(_Symbol, _Timeframe, "지그재그", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 1, shift);
p2 = iCustom(_Symbol, _Timeframe, "지그재그", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 2, shift);
//Print("v128-2 >", _Symbol, " | ", _Timeframe,
// " > sift=", shift, " | p0=", p0, " | p1=", p1, " | p2=", p2);
if(isUp)
{
if(p0 !=0 && p0 == p1) // 정점을 찾았습니다.
가격 = p0;
}
또 다른
{
if(p0 != 0 && p0 == p2) // 하단 발견
가격 = p0;
}
시프트++;
}
//Print("v128-2 >", _Symbol, " | ", _Timeframe,
// " -> return(price)=", price);
반품(가격);
}
//================================================== =====================
// 파일에서 변수를 읽습니다.
// 파일이 존재하지 않으면 파일을 생성하고 파일에 변수를 씁니다.
double _FileReadWriteDouble(문자열 파일 이름, 이중 값)
{
int h1 = 파일열기(파일명, FILE_BIN);
if(h1 > 0)
{
값 = FileReadDouble(h1, DOUBLE_VALUE);
파일닫기(h1);
}
또 다른
{
h1 = 파일열기(파일명, FILE_BIN|FILE_WRITE);
FileWriteDouble(h1, 값, DOUBLE_VALUE);
파일닫기(h1);
}
반환(값);
}
//================================================== =====================
// 파일에 변수 쓰기
무효 _FileWriteDouble(문자열 파일 이름, 이중 값)
{
int h1 = 파일열기(파일명, FILE_BIN|FILE_WRITE);
FileWriteDouble(h1, 값, DOUBLE_VALUE);
파일닫기(h1);
}