기고글 토론 "초보자를 위한 MQL5 Expert Advisor 코드 작성 가이드" - 페이지 22

 
안녕하세요, 누군가 저를 도와주실 수 있나요? 내 이해에, 나는 기사에 표시된 모든 것을했다. 그러나 나는 저자가 이미 구매가 있으면 구매를하지 않거나 이미 판매가 있으면 판매하지 않으려는 것을 이해하는 것 이상으로 두 개의 동시 오픈 작업을 관리 할 수 없습니다. 예를 들어, 내 전략은 오픈 매수 주문이있을 때 매도 신호를 보내고 매도를 여는 대신 코드가 tp / sl을 건드리지 않고 매수 작업을 닫습니다. 따라서 매수 또는 매도가 없습니다. 매도는 매수를 마감하고 매수는 매도를 마감합니다. 저는 전략에서 한 쌍, 한 시간대, 한 랏 크기만 사용하고 있습니다. 전략이 트리거되는 경우 매수 및 매도가 동시에 열리도록하는 방법을 알려주시겠습니까? 즉, 주문은 tp / sl에 의해서만 마감됩니다. 미리 감사드립니다.
 
좋은 기사입니다!
 
Sella170:
이 EA를 미니 지수 또는 미니 달러에 사용할 수 있는지 아는 사람이 있나요?
예, 차트 또는 메뉴 > 삽입 > 전문가 조언자 > {노메도세로보}로 마우스를 드래그하여 EA를 사용할 수 있습니다.

질문에 도움이 되었기를 바랍니다.

 
훌륭한 글에 감사드립니다. 일중 시간 필터 모듈을 코드에서 어디에 어떻게 구현할 수 있나요?
 

안녕하세요, 안녕하세요.

가이드 마지막에 있는 이 파일을 사용하여'전략 테스터'를 실행하고 있는데 다음과 같은 오류가 발생합니다:

*이 오류는 이 문서에서 이미 논의되었지만 문서화된 해결책을 찾지 못하여 도움이 필요합니다.


OF      0       12:44:39.040    EA_ADX (XAUUSD,H1)      2020.01.03 19:00:00   Alert: The Buy order request could not be completed -error:4756
ED      2       12:44:39.043    Trades  2020.01.03 20:00:00   failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP      0       12:44:39.043    EA_ADX (XAUUSD,H1)      2020.01.03 20:00:00   Alert: The Buy order request could not be completed -error:4756
ER      2       12:44:39.049    Trades  2020.01.03 21:00:00   failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR      0       12:44:39.049    EA_ADX (XAUUSD,H1)      2020.01.03 21:00:00   Alert: The Buy order request could not be completed -error:4756
PP      2       12:44:39.053    Trades  2020.01.03 22:00:00   failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]


이 파일은 가이드 끝에 있습니다.

이 문제를 해결하려면 어떻게 해야 하나요?

 
surfdoode2:


제안된 수정 방법을 모두 적용한 후에도 여전히 이 오류가 발생하고 있습니다:

제로메모리(mrequest);

그리고 또한

if(Buy_opened || Sell_opened)

4756 오류에 대해 도와주실 수 있나요? 구매 주문을 할 수 없는 것 같습니다.

SymbolInfoTick 함수를 사용하고 이 부분을 코드에 작성했는지 확인하세요:

//--- MQL5 MqlTick 구조를 사용하여 최종 가격 견적 받기
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
Documentation on MQL5: Market Info / SymbolInfoTick
Documentation on MQL5: Market Info / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Market Info - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
여기 알고리즘의 논리에 오류가 있습니다:
 //--- 이미 포지션이 개설되어 있나요?
     bool Buy_opened= false ;   // 매수 오픈 포지션의 결과를 보관할 변수
     bool Sell_opened= false ; 매도 오픈 포지션의 결과를 보관하는 // 변수
    
     if ( PositionSelect ( _Symbol ) == true )   // 오픈 포지션이 있습니다.
    {
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ;   //매수입니다.
         }
         else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // 판매입니다.
         }
    }

PositionSelect가 _Symbol의 첫 번째 포지션을 선택하기 때문에 EA가 매수 포지션을 개시하면 매수 포지션이 열려 있는 동안 Sell_opened 변수는 항상 거짓이 되어 매도 신호가 있을 때마다 여러 매도 포지션이 실현됩니다.

이를 수정하고 매수 포지션과 매도 포지션이 동시에 개설되어 있는지 확인하려면 다음 로직을 사용할 수 있습니다:

 //--- 이미 포지션이 개설되어 있나요?
   bool Buy_opened = false ;   // 매수 오픈 포지션의 결과를 보관할 변수
   bool Sell_opened = false ; 매도 포지션의 결과를 보관할 변수 // 변수

   if ( PositionSelect ( _Symbol ) == true ) // 오픈 포지션이 있습니다.
   {
       for ( int i= 0 ;i< PositionsTotal ();i++){
	 
         PositionSelectByTicket ( PositionGetTicket (i));

         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // 판매입니다.
         } else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ; //매수입니다.
         }
      }
   
Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Vitor Gama Barreto:

안녕하세요, 여러분, 좋은 아침입니다.

가이드 마지막에 있는 이 파일을 사용하여'전략 테스터'를 실행하고 있는데 다음과 같은 오류가 표시됩니다:

*이 오류는 이 문서에서 이미 논의되었지만 문서화된 해결 방법이 없으므로 도움이 필요합니다.



파일은 가이드 끝에 있습니다.

이 문제를 해결하려면 어떻게 해야 하나요?

요청하는 판매 가격을 확인하려면 중단점을 사용하여 mrequest.price, mrequest.sl 및 mrequest.tp 변수를 디버깅하세요.

다음을 변경해 보세요.

mrequest.type_filling = ORDER_FILLING_FOK;                               // 주문 실행 유형

로 변경해 보세요:

mrequest.type_filling = ORDER_FILLING_IOC;                               // 주문 실행 유형


일부 페이퍼에는 최소 손절매 규칙이 있습니다. 자세한 내용은 여기를 참조하세요: https://www.mql5.com/pt/forum/319474

ERRO 4756 - INVALID PRICE
ERRO 4756 - INVALID PRICE
  • 2019.08.06
  • www.mql5.com
Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz??? E retorna o : 2019.08.05 13:42:51.236 Core 1 2019.08...
 

안녕하세요,

기사 감사합니다 사무엘, 당신은 균열입니다!

기사가 "순"모드에 있고 "헤징"모드로 설정하기 위해 정보를 찾아야했기 때문에 브로커와 함께 작동하도록하는 것이 약간 어려웠습니다. 가장 먼저 발생한 문제는 mrequest.type_filling이었습니다 .

XM 브로커의 경우 작동하는 브로커가 있습니다:

mrequest.type_filling = ORDER_FILLING_IOC;                                          // 주문 실행 유형

MT5에서 어떤 것을 허용하는지 모를 경우, 제가 추천하는 것은 Print(TypeFilling()) 또는 Comment( TypeFilling( ))의 TypeFilling() 함수를 사용하여유형을 반환하는 것입니다; 1 (ORDER_FILLING_FOK ) 또는 2 (ORDER_FILLING_IOC )라고 표시되면 어느 것을 입력해야하는지 알 수있습니다 (https://www.mql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling ) 이 브로커에서는ORDER_FILLING_FOK (1)이 작동하지 않기 때문입니다.


이 문제가 해결되면 포지션 선택이 많은 포지션을 여는 것이 문제입니다. 사무엘이 전략에서 언급하지는 않았지만, 설정된 기준 (4 개의 부울 단계)으로 단일 매수 또는 매도 포지션 (둘 중 먼저 오는 것)을 여는 것이 목표이며이 포지션이 마감 될 때까지 다른 포지션을 열 수 없다는 것을 이해합니다.

제가 한 일은 이 코드를 변경하는 것입니다...

//--- 오류가 없으므로 계속 진행합니다.
//--- 아직 오픈 포지션이 있나요?
    bool Buy_opened=false;  // 오픈 포지션 매수 결과를 저장하는 변수
    bool Sell_opened=false; // 오픈 포지션 Sale의 결과를 저장하는 변수
    
    if (PositionSelect(_Symbol) ==true)  // 오픈 포지션이 있습니다.
    {
         if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            Buy_opened = true;  // 구매입니다
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            Sell_opened = true; // 세일 중입니다
         }
    }

이것의 경우...

//--- 오류가 없으므로 계속 진행합니다.
//--- 아직 오픈 포지션이 있나요?
   bool Buy_opened = false;               // 오픈 매수 포지션의 결과를 저장하는 변수
   bool Sell_opened = false;              // 오픈 매도 포지션의 결과를 저장하는 변수
   
   // 모든 주문을 살펴보고 미결 주문이 있는지 확인합니다.
   for(int i = 0; i < PositionsTotal(); i++)   
        {
         ulong ticket = PositionGetTicket(i);
         PositionSelectByTicket(ticket);
    
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          Buy_opened = true;       //는 구매입니다.
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          Sell_opened = true;      //는 판매 중입니다.
         }
   }

// 오픈 포지션이 있는 경우 활성 작업이 닫힐 때까지 기다립니다(SL 또는 TP 터치).
   if (Buy_opened || Sell_opened) return; 

참고 : 바로 뒤에 줄이 나옵니다 ...

//--- 이전 막대의 종가를 현재 막대(bar1)로 복사합니다.
   p_close=mrate[1].close;

이렇게하면 저에게는 잘 작동했습니다. 도움이 되었기를 바랍니다.

안부 인사.

 
surfdoode2:


제안된 수정 방법을 모두 적용한 후에도 여전히 이 오류가 발생하고 있습니다:

제로메모리(mrequest);

그리고 또한

if(Buy_opened || Sell_opened)

4756 오류에 대해 도와주실 수 있나요? 구매 주문을 할 수 없는 것 같습니다.


브로커의 주문 유형이 ORDER_FILLING_IOC일 수 있으니 다음 코드를 수정해 보세요:

mrequest.type_filling = ORDER_FILLING_FOK;

에서:

mrequest.type_filling = ORDER_FILLING_IOC;

나도 같은 문제가 있었는데 이제 성공적으로 해결했습니다.