초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 64

 
Leser : MA가 2번 창에 속해 있음을 Expert Advisor에 표시하는 방법과 위치를 알려주십시오. 예를 들어 MA를 MFI에 추가했는데 이 MA를 EA에 등록하고 싶습니다. 방법이나 위치를 모르겠습니다.
그리고 더 자세히? Expert Advisor는 이미 MFI 지표를 사용하고 있으며 이제 두 번째 지표인 MA 지표를 사용하는 데 필요합니까? 아니면 EA가 아직 지표를 전혀 사용하지 않고 MA 지표를 사용하기 위해 필요합니까?
 
Yedelkin :

1. 나는 이것을 말하고 싶다: 당신은 매우 주의해서 다른 사람의 코드를 사용해야 한다. 다른 사람의 코드도 다른 사람의 실수이기 때문입니다.

2. 여기( https://www.mql5.com/ru/forum/6343/page64#comment_357008 ) 변수를 사용하기 전에 올바르게 재설정해 볼 것을 제안했습니다. 그러나 귀하의 코드에서 이 제안은 아직 구현되지 않았습니다. 또한 코드에는 다음 유형의 구성이 있습니다.

이 구성에서 요청 및 결과 변수는 사용 전이 아니라 사용 후에 재설정됩니다. 또한 이러한 지역 변수를 0으로 만든 후 함수는 작업을 중지합니다. 즉, 이러한 0으로 설정 자체는 의미가 없습니다. 즉, 이러한 구성은 MqlTradeRequestMqlTradeResult 유형 의 변수 를 재설정하지 않는 방법에 대한 명확한 예입니다. 따라서 원하는 경우 결국 변수를 올바르게 재설정하십시오. 작동하지 않는 경우 정확히 "작동하지 않는" 것이 무엇인지 자세히 설명하십시오.

3. 표준 라이브러리에 " MQL5 Reference / Standard Library / Trade Classes / CTrade" 거래 클래스가 있습니다. 어떻게 하면 실천할 수 있을지 고민해보세요. 언어 몰입의 초기 단계에서는 이 수업으로 충분할 수 있습니다. 예를 들어, 이 클래스에는 " MQL5 Reference / Standard Library / Trade Classes / 2 CTrade / PositionModify" 메소드가 있습니다. 다음과 같이 구현됩니다.

'ClearStructures();' 사용 하기 전에 m_request 변수를 재설정합니다.

예델킨,

정말 감사합니다 :)

나는 보고 내 실수를 보았다.

다음과 같이 작성할 수 있습니다.

 //+------------------------------------------------------------------+
//| Clear structures request,result and check_result                 |
//+------------------------------------------------------------------+
void ClearStructures()
  {
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check_result;
   ZeroMemory (request);
   ZeroMemory (result);
   ZeroMemory (check_result);
  } 

그러나 나는 당신의 제안을 좋아합니다:

   MqlTradeRequest request={ 0 };
   MqlTradeResult result={ 0 };
어쨌든 결과는 같습니다.

잠깐, 위치를 찾지 못하면이 작업으로 고통받을 것입니다.

감사해요.

 

예델킨,

당신이 적절하게 응답했기 때문에 나는 당신에게 편지를 씁니다.

두 가지 소스 - MT4 및 MT5.

MT5에서 작동하지 않는 이유는 동일합니다.

파일:
MTB_1E.mq4  4 kb
MTB_E.mq5  9 kb
 
mario065 : 두 가지 소스 - MT4 및 MT5. MT5에서 작동하지 않는 이유는 동일합니다.

불행히도, 나는 MT4를 전혀 이해하지 못합니다. 살펴보고 뭔가를 잡을 수 있으면 게시하겠습니다.

덧셈. 일반적으로 시장이 열릴 때까지 기다렸다가 정확히 효과가 있었어야 했지만 작동하지 않은 항목을 기록합니다.

 
Yedelkin :

불행히도, 나는 MT4를 전혀 이해하지 못합니다. 살펴보고 뭔가를 잡을 수 있으면 게시하겠습니다.

덧셈. 일반적으로 시장이 열릴 때까지 기다렸다가 정확히 효과가 있었어야 했지만 작동하지 않은 항목을 기록합니다.

그래서 UTB는 나 자신에게, 그리고 필요한 경우 누구에게 합니다.

다음은 의견입니다.

수정을 위해 pip 표시가 0보다 큰 경우 두 언어(MT4 및 MT5):

 if (TradeTrailing> 0 )

if (MStop > 0 )

핍시(bid - pip) 더 많은 오픈 포지션이 있는 경우:

 if (( NormalizeDouble (Bid, Digits )-TradeTrailing)>=OrderOpenPrice())

if ( NormalizeDouble (Bid - MStop, 4 ) >= Open)
stop = 0 또는 Bid - pip dal trailing >= 오픈 포지션 + pip 정의인 경우:
 if (OrderStopLoss()== 0 || ( NormalizeDouble (Bid, Digits )-TradeTrailing)>=(OrderStopLoss()+ 0.0005 ))

if (SL == 0 || NormalizeDouble (Bid - MStop, 4 ) >= NormalizeDouble (SL + MStop, 4 ))

가감:

ОrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble (Bid, Digits )-TradeTrailing,OrderTakeProfit(), 0 ,Blue);

ModifyPosition( Symbol (), NormalizeDouble (Bid - MStop, 4 ),TP);

그게 다야.

수정을 위한 별도의 기능을 만들고 싶습니다.

 
Yedelkin :
그리고 더 자세히? Expert Advisor는 이미 MFI 지표를 사용하고 있으며 이제 두 번째 지표인 MA 지표를 사용하는 데 필요합니까? 아니면 EA가 아직 지표를 전혀 사용하지 않고 MA 지표를 사용하기 위해 필요합니까?
EA는 MFI를 사용하는데 MA 인디케이터를 어떻게 쓰는지 모르겠네요! 주요 조건은 MA의 위치입니다. Ma는 차트(창 1번)가 아니라 MFI 표시기가 있는 창(창 2번)에 있습니다.
 
Leser : EA는 MFI를 사용하지만 MA 표시기를 쓰는 방법을 알 수 없습니다! 주요 조건은 MA의 위치입니다. Ma는 차트(창 1번)가 아니라 MFI 표시기가 있는 창(창 2번)에 있습니다.

EA가 MFI를 사용하는 경우 해당 코드에는 이 표시기의 핸들을 가져오는 행이 포함되어야 합니다. " MQL5 Reference / Technical Indicators / iMFI". 따라서 이동 평균 지표의 핸들을 얻는 방법은 " MQL5 Reference / Technical Indicators / iMA"에 설명되어 있습니다.

또한 " MQL5의 지표 기반 지표 " 기사를 읽어보십시오.

 
mario065 : 의견이 있습니다. 수정을 위해 pip가 0보다 큰 경우 두 언어(MT4 및 MT5)의 경우: pipsi(Bid - pip)가 열린 위치보다 큰 경우: stop = 0 또는 Bid - pipsi dal 후행인 경우 >= 열린 위치에서 + pip 정의: 수정: 그게 전부입니다. 수정을 위한 별도의 기능을 만들고 싶습니다.

1. 유감스럽게도 정확히 "작동하지 않는" 항목을 지정하지 않았습니다. 저것들. 프로그램의 논리(작동 방식)를 설명했지만 프로그램의 논리가 위반된 위치와 이러한 위반이 정확히 무엇으로 표현되는지는 나타내지 않았습니다. 문제에 대한 자세한 설명이 없으면 코드에 대한 설명만 남습니다.

2. bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit) 함수에는 다음 행이 포함됩니다.

   if (! OrderSend (request,result) || result.deal== 0 )
     {
       Print ( "Modify error =" , GetLastError ());
       return ( false );
     }

MqlTradeResult 구조에 대한 설명을 보면 거래 필드가 다음과 같이 설명되어 있음을 알 수 있습니다.

거래

거래 티켓, 완료되면. 무역 작업 중 보고됨 TRADE_ACTION_DEAL

ModifyPosition() 함수는 완전히 다른 작업을 수행하므로 result.deal의 값은 항상 0이어야 합니다. 따라서 운영자
 if (! OrderSend (request,result) || result.deal== 0 )

수정이 성공한 경우에도 항상 작동하고 동시에 일부 오류에 대한 메시지를 인쇄합니다.

2. 이전 단락의 줄을 살펴봅니다. 2. 마지막 오류 코드를 반환하도록 설계된 GetLastError () 함수를 사용합니다. 하지만 에러코드가 포함된 변수를 사용하기 전에 절대 리셋하지 않기 때문에 수정이 성공하더라도 위치 수정 요청을 보내기 훨씬 전에 발생했을 수 있는 에러를 출력하게 됩니다. 다음과 같아야 합니다.

 ResetLastError ();   
if (! OrderSend (request,result))
   { 
    ... 
     Print ( "Modify error =" , GetLastError ());
    ...
   }

3. 다음 행을 보십시오.

           if (SL == 0 || NormalizeDouble (Bid - MStop, 4 ) >= SL) 
           {
            ModifyPosition( Symbol (), NormalizeDouble (Bid - MStop, 4 ),TP);
           }

다음 틱에서 NormalizeDouble (Bid - MStop, 4 ) == SL 조건이 효과가 있다고 가정해 보겠습니다. 이 경우 SL==1.11110이라고 가정합시다. 그러나 ModifyPosition( Symbol (), 1.11110 ,TP)도 마찬가지입니다. 저것들. 이러한 수정으로 인해 이전에 이미 설정된 수준이 표시됩니다.

그리고 다음 틱에서 NormalizeDouble (Bid - MStop, 4 ) == SL이 다시 작동하면 어떻게 됩니까? :) 특히 (a) 5자리 따옴표가 있을 수 있는 4자리로 정규화가 수행된다는 점을 고려하면 (b) 거래 요청이 서버에서 약간의 지연으로 실행될 수 있습니다.

4. SYMBOL_TRADE_STOPS_LEVEL과 같은 기호 속성도 있습니다. 그러나 코드에 이 레벨 검사가 없습니다. 즉, Buy 포지션에 대한 새로운 손절매 후보가 SL_new로 지정되면 if(Bid-STOPS_LEVEL>SL_new)와 같은 조건을 확인하는 것이 불필요할 것입니다.

 

예, 그리고 일반적으로 실수 비교 핸드북을 살펴보십시오. 내가 기억하는 한, 다음과 같은 방식으로 두 개의 실수를 비교하는 것은 절대 권장되지 않습니다: if( double_1 == double_2 ).

 

예델킨 ,

정말 감사합니다. Reshetov는 또한 실수가 어디에 있는지 보여주었습니다.

다음은 함수 자체입니다.

 //+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition( const string symbol, double StopLoss, double Takeprofit){
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request={ 0 };
   MqlTradeResult result={ 0 };
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = TRADE_ACTION_SLTP ;
   request.symbol       = symbol;
   request.sl           = StopLoss;
   request.tp           = Takeprofit;
   string word          = "" ;
   StringConcatenate (word,
                     "<<< ============ Modifyposition():   Модифицираме позицията  " ,
                     symbol, " ============ >>>" );
   Print (word);
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if (! OrderSend (request,result))
     {
       Print ( "Modify error =" , GetLastError ());
       return ( false );
     }
   return ( true );
  }

그리고 비자 기능 자체를 만드는 방법은 다음과 같습니다.

   double buy_trail = 0 ;
   double sel_trail = 0 ;
   double SL,TP,Open;
   if ( PositionSelect ( Symbol ())){
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
      {
      Open = PositionGetDouble ( POSITION_PRICE_OPEN );
      SL   = PositionGetDouble ( POSITION_SL );
      TP   = PositionGetDouble ( POSITION_TP );
      Bid  = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
      buy_trail = NormalizeDouble (Bid - Open, Digits ());
       if (buy_trail > MStop)
       {
         if ( NormalizeDouble ((Bid - MStop), Digits ()) >= Open && Open > SL)
          {
           ModifyPosition( Symbol (),Open,TP);
          }
           if ( NormalizeDouble ((Bid - MStop), Digits ()) > SL && Open <= SL)
           {
            ModifyPosition( Symbol (), NormalizeDouble ((SL + 0.001 ), Digits ()),TP);
           }
        }
      }
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
      {
      Open = PositionGetDouble ( POSITION_PRICE_OPEN );
      SL   = PositionGetDouble ( POSITION_SL );
      TP   = PositionGetDouble ( POSITION_TP );
      Ask  = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
      sel_trail = NormalizeDouble (Open - Ask, Digits ());
       if (sel_trail > MStop)
       { 
         if ( NormalizeDouble ((Ask + MStop), Digits ()) <= Open && Open < SL)
          {
           ModifyPosition( Symbol (),Open,TP);
          }
           if ( NormalizeDouble ((Ask + MStop), Digits ()) < SL && Open >= SL)
           {
            ModifyPosition( Symbol (), NormalizeDouble ((SL - 0.001 ), Digits ()),TP);
           }
        }
      }
     }

지금은 모든 것이 잘 작동합니다.

감사해요.

사유: