mql5 언어의 특징, 미묘함 및 작업 방법

 
이 주제 에서는 mql5 언어로 작업하는 문서화되지 않은 방법, 특정 작업을 해결하는 예에 대해 설명합니다. 이 스레드가 토론보다 FAQ에 더 가까운 내용이 되었으면 합니다. 모든 경험 많은 프로그래머를 초대하여 찾은 솔루션과 프로그래밍 기술을 공유합니다. 도움말에 설명되지 않은 가능성의 범위는 특히 환영합니다.
 
fxsaber :

시장가 주문 에 의해 포지션이 성공적으로 열렸을 때 결과가 0이 될 때마다 Result.deal?

SD에서
결과 거래의 티켓 완료는 보장되지 않습니다. 채우기 여부는 도구의 실행 모드와 특정 서버의 설정에 따라 다릅니다.
0이 아닌 Result.deal에 누워있는 사람 - 조치를 취하십시오.
 
OrderSend 를 실행한 후 해당 주문, 위치 또는 거래에 액세스하는 것이 항상 성공적인 것은 아닙니다. 과거 또는 현재 거래 정보가 정확해질 때까지 수십 밀리초를 기다려야 하는 상황이 있습니다.
 
fxsaber :
OrderSend를 실행한 후 해당 주문, 위치 또는 거래에 액세스하는 것이 항상 성공적인 것은 아닙니다. 과거 또는 현재 거래 정보가 정확해질 때까지 수십 밀리초를 기다려야 하는 상황이 있습니다.
MT4에서도 동일하며 특정 서버에 따라 다릅니다.
 
거래를 발생시킨 주문의 가격을 항상 알 수 있는 것은 아닙니다.
 
클로즈드 포지션 의 SL/TP 레벨을 찾는 것이 항상 가능한 것은 아닙니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

클로즈드 포지션의 TakeProfit(및 StopLoss)

fxsaber , 2016.07.17 20:19

TakeProfit 헤지가 도입되기 전에는 오픈 포지션이 지정가 주문 형태로 거래소에 저장되지 않고 MT5 거래 서버에 저장되었습니다. 동시에, 승낙 당시에는 명시된 가격의 지정가 주문이 아닌, 명시된 가격의 시장가 주문으로 거래소에 보내졌습니다.

이 기능은 TP가 트리거될 때 테스터에서 매우 명확하게 볼 수 있습니다. 해당 시장 주문(한도가 아닌)이 나타납니다. TakeProfit은 기존 교환 유형의 주문이 아니기 때문에(시장과 제한만 있음) 이 상태는 "시장" 주문에 맞습니다.

헤지의 출현으로 상황은 바뀌지 않았습니다. 이익실현은 가상으로 남아 있습니다. 동시에 MT4에서는 상황이 다릅니다. 수년 동안 MT4 브리지가 존재하면서 MT4-takeprofit이 지정가 주문이라는 표준이 되었습니다.

MT5의 일부 기능이 흔적처럼 뒤따르는 것은 이러한 가상성 때문입니다. MT5에서 이익실현을 설정하지 않는 것이 좋을 뿐만 아니라 제한 아날로그를 원할 경우 포지션을 청산한 MQL5를 사용하여 이익실현 및 손절매 값을 찾을 수 없습니다 .

이것은 근거 없는 비난이 아니라 모든 것이 어떻게 작동하는지 알아내려고(HistorySelectByPosition 등의 도움 없이) 많은 시간을 보낸 결과입니다. 그리고 제가 틀렸다면 기꺼이 사과할 준비가 되어 있습니다. 근거가 없는 말을 하지 않기 위해 RoboForexEU-MetaTrader 5 서버에 테스터를 위한 고문(이해하기 쉬움)을 데려와 포지션을 연 다음 SL 및 TP 수준을 설정합니다.

 void OnTick ()
{
   static bool Flag = true ;

   if (Flag)
  {
     // Открываем SELL-позицию
     MqlTradeRequest Request = { 0 };

    Request.action = TRADE_ACTION_DEAL ;

    Request.symbol = Symbol ();
    Request.volume = 1 ;
    Request.price = SymbolInfoDouble ( Symbol (), SYMBOL_BID );

    Request.type = ORDER_TYPE_SELL ;

     MqlTradeResult Result;

     if ( OrderSend (Request, Result))
    {
       // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP ;

      Request.tp = Result.ask - 10 * _Point ;
      Request.sl = Result.ask + 10 * _Point ;

       if ( OrderSend (Request, Result))
         Print ( "Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста" )    ;

      Flag = false ;
    }
  }
}

이 Expert Advisor에서는 단일 마감 포지션의 SL 및 TP를 (OnDeinit에서) 결정하는 것이 불가능합니다. 그렇게 의도된 것인가?


또한 MT5 포지션의 TP는 항상 시장가 주문이라는 인용문을 따릅니다. 한계 아날로그에 베팅하지 마십시오. 위 참조.
 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

테스터에서 테스트를 위한 절전 모드의 대안

슬라바 , 2017.02.22 11:16

예, 하지만 테스트 중인 Expert Advisor에만 해당됩니다. 전문가가 사용하는 지표의 경우 - 아니오

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

슬라바 , 2017.02.14 13:46

무엇 때문에? 한 번의 행동으로 충분합니다.

그리고 마켓 리뷰에서 심볼이 선택되고 심볼의 히스토리가 전문가에 의해 유지되는 한 동기화된 상태로 유지됩니다. 전문가가 보유한다는 것은 예를 들어 하나의 막대를 복사하여 2분에 한 번 이상 이 기록에 액세스하는 것을 의미합니다. 히스토리가 동기화되면 하나의 막대를 복사하는 데 시간이 소요되지 않습니다. 단 몇 번의 프로세서 주기입니다. 또는 방금 말했듯 이 막대의 수와 몇 사이클을 요청하십시오.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

알렉세이 코지친 , 2017.02.14 13:47

표시기에 2분 간격이 포함되어 있습니까?

네, 동기화 사실을 확인하면 동기화도 진행되나요?

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

슬라바 , 2017.02.14 13:50

지표에도 동일하게 적용됩니다. 1분 타이머를 만들고 관심 있는 모든 시계열 의 막대 수를 물어보세요.

동기화 사실 확인에 의해 동기화가 보류되지 않습니다.

 
fxsaber :
OrderSend를 실행한 후 해당 주문, 위치 또는 거래에 액세스하는 것이 항상 성공적인 것은 아닙니다. 과거 또는 현재 거래 정보가 정확해질 때까지 수십 밀리초를 기다려야 하는 상황이 있습니다.

몇 밀리초를 기다릴 필요가 없습니다.

메시지가 OnTradeTransaction 으로 전송됩니다.

코드 참조

파일:
 
단순 상인 :

몇 밀리초를 기다릴 필요가 없습니다.

메시지가 OnTradeTransaction 으로 전송됩니다.

코드 참조

이것은 스크립트에 없습니다 . 스크립트 대신 Expert Advisor + ExpertRemove를 많이 사용하는 것은 어리석은 일입니다.

게다가 180초 동안 서버로부터 응답이 없으면 OrderSend는 타임아웃으로 떨어진다. 이는 영원히 기다려온 티켓이 OnTradeTransaction에 누적될 수 있음을 시사합니다. 그리고 스크립트에서와 같이 OnTradeTransaction에 대해 하나의 order_ticket 옵션은 좋지 않습니다. 비동기 전송 후 주문 목록에서 작업이 시작됩니다. 그 점에서 팩과 함께 작동하는 비동기식입니다. 그리고 팩에 대한 작업이 없으면 비동기가 필요하지 않습니다.

 
MT4-OrderClosePrice-chip 은 MT5에서도 작동합니다. PositionGetDouble(POSITION_PRICE_CURRENT) .
사유: