KimIV의 유용한 기능 - 페이지 49

 
KimIV писал (а) >> 를 썼습니다.

ExistOrders() 함수 사용의 예.

5. 설치 시간이 2시간 이내인 주문이 있는지 확인합니다.

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);

좋은 저녁이에요! 이 댓글이 좀 헷갈리네요. 앉아서 생각한다! "5분 이내" 또는 "5분 이내"와 같이 내 상태를 올바르게 공식화하는 방법을 알 수 없습니다! (생각하기 전까지는 모든 것이 명확했습니다!)

지정된 시간 내에 실행되지 않으면 보류 중인 주문을 삭제해야 합니다. 예를 들어 설치 후 5분 이내!

나는 이것을 좋아했다:

 if ( ExistOrders ( NULL , OP_BUYSTOP , Magic , TimeCurrent () - 5 * 60 ) > 0 ) //ЕСЛИ ЕСТЬ ОРДЕР BUYSTOP > 5 min 
                 DeleteOrders ( NULL , OP_BUYSTOP , Magic ) ;
if ( ExistOrders ( NULL , OP_SELLSTOP , Magic , TimeCurrent () - 5 * 60 ) > 0 ) //ЕСЛИ ЕСТЬ ОРДЕР SELLSTOP > 5 min  
                 DeleteOrders ( NULL , OP_SELLSTOP , Magic ) ;

맞나요? 그러나 테스터에서는 작동하지 않습니다. 주문이 접수되고 즉시 삭제됩니다.

제발. ExistOrders() 함수를 올바르게 작성하는 방법을 알려주십시오.

 
rid писал (а) >>
좀 헷갈리네요...

저도 헷갈리는 것 같습니다. 함께 풀어보아요.. :-)

ot 매개변수(주문 배치 시간)는 오류 128, 142 및 143을 올바르게 처리하기 위해 ExistOrders 함수에 도입되었습니다. 이러한 오류를 처리하는 목적은 동일한 주문의 이중(및 실제 경우에는 삼중) 배치를 제거하는 것입니다. 이를 위해 거래 주문을 보낸 시간이 기억 되고 거래 시도가 일시 중지됩니다. 일시정지 후, 기억된 설치 시간 이후에 설치 시간으로 주문 유무를 확인합니다. 주문이 있는 경우 목표에 도달한 것으로 결론(주문이 완료됨)되고 거래 시도가 중지됩니다. 즉, 시간이 ot 매개변수로 전달된 후 주문이 확인됩니다. 나중에 = 이전이 아닙니다 .

제거 작성 (a) >>
지정된 시간 내에 실행되지 않으면 보류 중인 주문을 삭제해야 합니다. 예를 들어 설치 후 5분 이내!

ExistOrders 함수의 ot 매개변수는 여기서 도움이 되지 않습니다. 그는 다른 방식으로 일합니다. 현재에 더 가깝습니다. 그리고 과거로의 삭제를 사용해야 합니다. Expiration(만료), OrderSend 함수의 만료 매개변수 ( 또는 내 SetOrder 함수의 ex 매개변수)는 이에 적합합니다.

 

테스터용 ClosePosBySelect() 함수.

하나의 미리 선택된 위치의 청산을 수행합니다. 이것은 이전에 13페이지 에 게시된 동일한 이름의 함수의 경량 버전입니다. 추가 사항은 없습니다. 주름이 없습니다. 내 연습에서는 테스터에서 포지션이 닫히지 않은 경우가 없었다. 따라서 이 기능에는 검사가 없습니다. 테스터에서는 중복됩니다.

 //+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect () {
   double pp ;

   if ( OrderType () == OP_BUY ) {
     pp = MarketInfo ( OrderSymbol () , MODE_BID ) ;
     OrderClose ( OrderTicket () , OrderLots () , pp , Slippage , clCloseBuy ) ;
   }
   if ( OrderType () == OP_SELL ) {
     pp = MarketInfo ( OrderSymbol () , MODE_ASK ) ;
     OrderClose ( OrderTicket () , OrderLots () , pp , Slippage , clCloseSell ) ;
   }
}

추신. 테스터용 OpenPosition() 함수와 함께 ClosePosBySelect() 함수를 나중에 사용하는 예를 보여 드리겠습니다.

 

안녕하세요. 매번 페이지를 삽질하지 않기 위해 가지를 따라 콘텐츠를 만들어야 했습니다.

어떤 곳에서는 비슷한 주제에 대한 기능을 결합했습니다. 1~40페이지의 내용입니다.

원하는 사람들은 계속해서 다른 페이지를 추가하고 여기에 게시할 수 있습니다.

파일:
 

안녕하세요 이고르입니다! 당신의 도움이 필요합니다. e-CloseByPercentProfit과 유사한 e-CloseByProfit Expert Advisor에 터미널 닫기 기능을 추가하기로 결정했습니다.

모든 것이 잘되고 고문이 작동하고 터미널이 닫힙니다. 그러나 터미널이 다시 열리면 어드바이저는 즉시 닫습니다.

이 문제를 해결하기 위해 코드를 변경하도록 도와주세요.

//+----------------------------------------------- ------------------------------+
//| e-CloseByProfit.mq4 |
//| Kim Igor V. 일명 KimIV |
//| http://www.kimiv.ru |
//| |
//| 2006년 10월 22일 Expert Advisor는 지정된 |
//| 이익 수준 포인트. |
//| 2008년 6월 20일 포인트에서 수익 계산 오류가 수정되었습니다. |
//+----------------------------------------------- ------------------------------+
#property copyright "Kim Igor V. aka KimIV"
#속성 링크 " http://www.kimiv.ru "
#define MAGIC 20061022

//------- EA의 외부 매개변수 ------------------------------------ ------
extern string _P_Expert = "---------- 전문가 고문 옵션";
외부 부울 CurSymbolOnly = 거짓; // 현재 문자만
외부 정수 TakeProfit = 100; // 가져가다
extern bool CloseTerminal = False; // 터미널 닫기
extern bool ShowComment = True; // 주석 표시
외부 정수 번호 계정 = 0; // 거래 계좌 번호
extern bool UseSound = True; // 사운드 신호 사용
외부 문자열 NameFileSound = "manycoin.wav"; // 사운드 파일 이름
extern int 미끄러짐 = 3; // 가격 하락
외부 정수 NumberOfTry = 5; // 시도 횟수

//------- Expert Advisor 전역 변수 ----------------------- -
색상 clCloseBuy = 파란색; // 닫기 구매 아이콘의 색상
색상 clCloseSell = 빨간색; // 클로즈 세일 아이콘의 색상
int CurProfit;

//------- 외부 모듈 연결 --------------------------------------- ------
#include <stdlib.mqh>
#include <WinUser32.mqh>

//+----------------------------------------------- ------------------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- ------------------------------+
무효 init() { if (!IsTesting()) 주석(""); }

//+----------------------------------------------- ------------------------------+
//| 전문가 초기화 해제 기능 |
//+----------------------------------------------- ------------------------------+
무효 deinit() { if (!IsTesting()) 주석(""); }

//+----------------------------------------------- ------------------------------+
//| 전문가 시작 기능 |
//+----------------------------------------------- ------------------------------+
무효 시작() {
if (!IsTesting()) {
if (숫자계정>0 && 숫자계정!=계정숫자()) {
Message("거래는 금지된 계정 "+AccountNumber());
반품;
} else 주석("");
}

CloseByProfit();
if (댓글 표시) {
Comment(IIFs(CurSymbolOnly, "CurSymbolOnly ",""),
"현재 이익=",CurProfit," p.",
" 마감 이익=",TakeProfit," p."
);
}
}


//+----------------------------------------------- ------------------------------+
//| 저자 : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------- ------------------------------+
//| 버전 : 2008년 2월 19일 |
//| 설명: 미리 선택된 하나의 포지션 닫기 |
//+----------------------------------------------- ------------------------------+
무효 ClosePosBySelect() {
부울 fc;
색상 닫기;
이중 ll, pa, pb, pp;
잘못, 그것;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
동안 (!IsTradeAllowed()) 절전(5000);
새로 고침();
pa=시장 정보(주문 기호(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (주문유형()==OP_BUY) {
pp=pb; clClose=cl닫기구매;
} 또 다른 {
pp=파; clClose=cl닫기판매;
}
ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, 슬리피지, clClose);
if (fc) {
if (UseSound) PlaySound(이름파일사운드); 부서지다;
} 또 다른 {
err=GetLastError();
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
Print("오류(",err,") 닫기 ",GetNameOP(OrderType())," ",
ErrorDescription(err),", 시도 ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
수면(1000*5);
}
}
} else Print("잘못된 거래 조작입니다. 닫기 ",GetNameOP(OrderType()));
}

//+----------------------------------------------- ------------------------------+
//| 저자 : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------- ------------------------------+
//| 버전 : 2008년 2월 19일 |
//| 설명: 시장 가격에 우선적으로 수익성 있는 포지션 청산 |
//+----------------------------------------------- ------------------------------+
//| 옵션: |
//| sy - 기기 이름("" - 모든 기호, |
//| NULL - 현재 문자) |
//| 연산 - 연산(-1 - 임의의 위치) |
//| mn - MagicNumber(-1 - 모든 마법) |
//+----------------------------------------------- ------------------------------+
무효 ClosePosFirstProfit(문자열 sy="", int op=-1, int mn=-1) {
정수 i, k=OrdersTotal();
if (sy=="0") sy=Symbol();

// 첫 번째 마감 수익성 있는 포지션
(i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// 나머지는 모두
k=주문 총계();
(i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}

//+----------------------------------------------- ------------------------------+
//| 이익을 위해 모든 포지션을 닫습니다. |
//+----------------------------------------------- ------------------------------+
무효 CloseByProfit() {
이중 pa, pb, pp;
정수 i, k=OrdersTotal(), pr=0;

(i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (!CurSymbolOnly || OrderSymbol()==Symbol()) {
pa=시장 정보(주문 기호(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
pp=시장 정보(주문 기호(), MODE_POINT);
if (pp==0) if (StringFind(OrderSymbol(), "JPY")<0) pp=0.0001; 그렇지 않으면 pp=0.01;
if (주문유형()==OP_BUY) {
pr+=NormalizeDouble((pb-OrderOpenPrice())/pp, 0);
}
(주문 유형()==OP_SELL) {
pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp, 0);
}
}
}
}
CurProfit=pr;
if (CurProfit>=TakeProfit) ClosePosFirstProfit();
if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
//+----------------------------------------------- ------------------------------+
//| 거래 터미널을 닫습니다. |
//+----------------------------------------------- ------------------------------+
무효 CloseTerminal() {
Print("CloseTerminal() 함수가 작동했습니다.");
int hwnd=WindowHandle(Symbol(), 마침표());
int hwnd_parent=0;

동안(!Isstopped()) {
hwnd=GetParent(hwnd);
if (hwnd==0) break;
hwnd_parent=hwnd;
}
if (hwnd_parent!=0) PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);
}

//+----------------------------------------------- ------------------------------+
//| 위치 존재 플래그를 반환합니다 |
//| 옵션: |
//| sy - 기기 이름("" - 모든 기호, |
//| NULL - 현재 문자) |
//| 연산 - 연산(-1 - 임의의 위치) |
//| mn - MagicNumber(-1 - 모든 마법) |
//+----------------------------------------------- ------------------------------+
부울 ExistPositions(문자열 sy="", int op=-1, int mn=-1) {
정수 i, k=OrdersTotal();

if (StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Symbol();
(i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) return(True);
}
}
}
}
}
반환(거짓);
}
//+----------------------------------------------- ------------------------------+
//| 저자 : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------- ------------------------------+
//| 버전: 2005년 9월 1일 |
//| 설명: 거래 작업의 이름을 반환합니다. |
//+----------------------------------------------- ------------------------------+
//| 옵션: |
//| op - 거래 작업 식별자 |
//+----------------------------------------------- ------------------------------+
문자열 GetNameOP(int op) {
스위치(작동) {
케이스 OP_BUY : return("구매");
케이스 OP_SELL : return("판매");
케이스 OP_BUYLIMIT : return("BuyLimit");
케이스 OP_SELLLIMIT: return("SellLimit");
케이스 OP_BUYSTOP : return("구매 중지");
케이스 OP_SELLSTOP : return("SellStop");
기본값 : return("알 수 없는 작업");
}
}

//+----------------------------------------------- ------------------------------+
//| 저자 : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------- ------------------------------+
//| 버전: 2008년 2월 1일 |
//| 설명 : 조건에 따라 두 값 중 하나를 반환합니다. |
//+----------------------------------------------- ------------------------------+
문자열 IIFs(bool 조건, 문자열 ifTrue, 문자열 ifFalse) {
if(조건) return(ifTrue); 그렇지 않으면 반환(ifFalse);
}

//+----------------------------------------------- ------------------------------+
//| 댓글과 저널에 메시지 표시하기 |
//+----------------------------------------------- ------------------------------+
무효 메시지(문자열 m) {
코멘트(m);
if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------- ------------------------------+

 
Vkorch писал (а) >> 를 썼습니다.
안녕하세요 이고르입니다! 당신의 도움이 필요합니다. e-CloseByPercentProfit과 유사한 e-CloseByProfit Expert Advisor에 터미널 닫기 기능을 추가하기로 결정했습니다.

모든 것이 잘되고 고문이 작동하고 터미널이 닫힙니다. 그러나 터미널이 다시 열리면 어드바이저는 즉시 닫습니다.
이 문제를 해결하기 위해 코드를 변경하도록 도와주세요.

다음과 같이 하십시오.

CurProfit=pr;
if (CurProfit>=TakeProfit) {
  ClosePosFirstProfit();
  if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
 
KimIV писал(а) >>

다음과 같이 하십시오.

이고르 감사합니다. 수정했습니다. 하지만 컴파일할 때 오류가 발생합니다.

'(' - 예기치 않은 함수 정의 C:\Program Files\MetaTrader - Alpari\experts\e-CloseByProfit.mq4 (180, 19)

어떻게 될 것인가?

 

Igor는 라이브러리 형태로 배열하는 것을 어렵게 만들지 않을 것입니다-함수 명령과 직책으로 일하십시오. 아마도 그것이 유용할 것입니다. 제가 지금 사용하고 있는 것, 그것이 어떻게 이루어지는지, 라이브러리가 2년 이상 개발 및 테스트되었습니다. 파일을 첨부하고 있습니다. 몇 가지 아이디어가 유용할 수 있습니다.

에 대한

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

OpenPosition (" GBPJPY ", OP _ SELL , 0.1, 23, 44)을 호출하는 것이 더 나을 수도 있습니다.

더블 pa = MarketInfo ( " USDCAD " , MODE_ASK ) ;
 더블 pb = MarketInfo ( " USDCAD " , MODE_BID ) ;
 더블 po = MarketInfo ( " USDCAD " , MODE_POINT ) ;
 그리고 여기 이것 끼워 넣다 
   이중 lot_min = MarketInfo(Symbol(),MODE_MINLOT);
    if(Lots<lot_min) 반환;

함수 내에서 계산, 즉 값 을 보내다 sl tp , 내부에서 모든 것을 계산하고 정규화하는 것이 이미 정확합니다.


	          
 

안녕하세요 이고르입니다!

포지션 분할을 이해할 수 없습니다. 0.3 랏의 포지션이 열려 있으면 다음을 수행해야 합니다.

1. 포지션 0.1 랏의 일부를 청산합니다.

수정(손절매를 다른 수준으로 이동)

2. 여전히 포지션 0.1 랏의 일부를 마감합니다.

수정(손절매를 다른 수준으로 이동)

3.포지션을 닫습니다.

그리고 질문 하나 더 ? 부품 및 위치를 닫을 때

OrderClose (OrderTicket(),NormalizeDouble(OrderLots()/3,2),Ask,3,바이올렛);

오류 131(잘못된 볼륨)이 발생합니다. 해결 방법은?

뉴비 답변 부탁드립니다 말로 가능합니다.

.

 
Prival писал (а) >> 를 썼습니다.
Igor는 라이브러리 형태로 배열하는 것을 어렵게 만들지 않을 것입니다-함수 명령과 직책으로 일하십시오.

아니요, 어렵지 않습니다... 원칙적으로 이미 형식이 지정되어 있어야 합니다... 게시하지 않습니다. 이 라이브러리의 모든 기능이 아직 게시되지 않았기 때문입니다... 몇 개만 남아서 등장했습니다. 이 주제의 시작 후.

나머지는 생각해볼게...

사유: