Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 64

 
Leser: Por favor, indique cómo y dónde especificar en el EA la MA perteneciente a la ventana nº 2. Por ejemplo, he añadido una MA a MFI y quiero registrar esta MA en mi EA. No sé dónde y cómo hacerlo.
¿Quieres entrar en detalles? ¿Su Asesor Experto ya está usando el indicador MFI y usted quiere que use el segundo indicador - el indicador MA? O bien, ¿su Asesor Experto no utiliza ningún indicador en absoluto y necesita que utilice el indicador MA?
 
Yedelkin:

1. Yo diría lo siguiente: utiliza el código de otra persona con mucho cuidado. Porque el código de otro significa también los errores de otro.

2. Aquí(https://www.mql5.com/ru/forum/6343/page64#comment_357008) te sugerí que intentaras poner a cero correctamente las variables antes de utilizarlas. Pero su código aún no ha implementado esta sugerencia. Además, su código contiene construcciones del tipo

Como ves, en esta construcción las variables request y result se ponen a cero no antes de ser utilizadas sino después de serlo. Además, cuando estas variables locales se ponen a cero, la función deja de funcionar, es decir, dicha puesta a cero no tiene sentido. En otras palabras, esta construcción es un buen ejemplo de cómo las variables MqlTradeRequest y MqlTradeResult no deben ponerse a cero. Por lo tanto, si usted está ansioso, por favor, trate de limpiar las variables correctamente. Si algo va mal, por favor, describa con detalle qué es lo que "no funciona".

3. La Biblioteca Estándar tiene una clase de comercio"MQL5 Reference / Standard Library / Trade Classes / CTrade". Intenta averiguar cómo aplicarlo en la práctica. En la fase inicial de inmersión en el idioma, esta clase puede ser suficiente. Por ejemplo, esta clase tiene el siguiente método:"MQL5 Reference / Standard Library / Trade Classes / 2CTrade/ PositionModify". Se implementa de la siguiente manera:

La línea 'ClearStructures();' en ella borra la variable m_request antes de usarla.

Yedelkin,

Muchas gracias :)

Lo busqué y vi mi error.

Puedo hacerlo así:

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

Pero me han gustado tus sugerencias:

   MqlTradeRequest request={0};
   MqlTradeResult result={0};
En cualquier caso, los resultados son los mismos.

Ahora el puesto no se encuentra, me esforzaré con esta tarea.

Gracias.

 

Yedelkin,

Le escribo porque está respondiendo adecuadamente.

Tengo dos sors-MT4 y MT5.

Por qué no funciona en MT5, son iguales.

Archivos adjuntos:
MTB_1E.mq4  4 kb
MTB_E.mq5  9 kb
 
mario065: Dos sors-MT4 y MT5. ¿Por qué no funciona en MT5-son lo mismo.

Desgraciadamente, no entiendo nada de MT4. Echaré un vistazo y si pillo algo, te lo haré saber.

Adenda. En general, esperará a la apertura del mercado e informará de lo que exactamente debería haber funcionado, pero no lo hizo.

 
Yedelkin:

Desgraciadamente, no entiendo nada de MT4. Echaré un vistazo y si pillo algo, te lo haré saber.

Adenda. En general, se espera a que el mercado abra y se describe lo que debería haber funcionado, pero no lo hizo.

Así que lo hago por mí y por quién, si es necesario.

Aquí están los comentarios:

Si la indicación de los pips bolshego cero para la modificación de dos yazikas (MT4 y MT5):

if(TradeTrailing>0)

if(MStop > 0)

Si estos pips (Bid - pips) bolshe abrir posishon:

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

if(NormalizeDouble(Bid - MStop,4) >= Open)
Si stop = 0 o Bid - pipsi dal trailing >= de la definición de Open Posishon + pips:
if(OrderStopLoss()==0 || (NormalizeDouble(Bid, Digits)-TradeTrailing)>=(OrderStopLoss()+0.0005))

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

modificación:

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

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

Eso es todo.

Quiero hacer una función separada para la modificación.

 
Yedelkin:
¿Puede ser más específico? ¿Su Asesor Experto ya está utilizando el indicador MFI y ahora necesita que utilice el segundo indicador - el indicador MA? ¿O su Asesor Experto no utiliza ningún indicador, pero usted necesita que utilice el indicador MA?
¡Mi Asesor Experto utiliza MFI, pero no puedo averiguar cómo escribir el indicador MA! La condición principal es la ubicación de MA. La MA no está en el gráfico (ventana 1), sino en la ventana con el indicador MFI (ventana 2).
 
Leser: ¡Mi Asesor Experto utiliza MFI, pero no puedo averiguar cómo escribir el indicador MA! La condición principal es la ubicación de la AM. La MA no está en el gráfico (ventana #1), sino en la ventana con el indicador MFI (ventana #2).

Si el Asesor Experto utiliza MFI, entonces su código debe contener una línea con la obtención del mango de este indicador:"MQL5 Reference / Technical Indicators / iMFI ". Por lo tanto, el manejo del indicador de media móvil se describe aquí:"MQL5 Reference Guide / Technical Indicators / iMA ".

Intente también leer el artículo"Indicador por indicador en MQL5".

 
mario065: Aquí está el comentario: Si un Bid-STOPS_LEVEL es más que cero para la modificación: Si este Bid-STOPS es más que Posiciones Abiertas: Si Stop = 0 o Bid-STOPS es trailing >= de Posiciones Abiertas + definición de Pips: Modificación: Eso es todo. Me gustaría hacer una función separada para la modificación.

1. Lamentablemente, no has especificado lo que "no funciona". Has dicho la lógica del programa (cómo debería funcionar), pero no has dicho dónde se rompe la lógica y cómo se rompe. Sin una descripción detallada del problema, sólo se pueden hacer comentarios sobre el código.

2. La función bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit) contiene estas líneas:

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

Si mira la descripción de la estructura de MqlTradeResult, puede ver que el campo deal se describe de la siguiente manera

acuerdo

Ticket de transacción, si se ha ejecutado una transacción. Se comunica durante una operación comercial TRADE_ACTION_DEAL

Como su función ModifyPosition() realiza una operación completamente diferente, el valor de result.deal debe ser siempre cero. En consecuencia, el operador
if(!OrderSend(request,result) || result.deal==0)

siempre se activará, incluso si la modificación fue exitosa, y al mismo tiempo imprimirá un mensaje de error.

2. Mira las líneas del punto 2 anterior. Allí se utiliza la función GetLastError() que tiene por objeto devolver el código del último error. Pero no se borra la variable que contiene el código de error antes de usarla, por lo que, aunque la modificación sea exitosa, se imprime un error que podría haber ocurrido mucho antes de que se enviara la solicitud de modificación de la posición. Debería ser algo así:

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

3. Mira estas líneas:

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

Supongamos que en el siguiente tick se activa su condiciónNormalizeDouble(Bid - MStop,4) == SL. Supongamos que SL==1,11110. Pero entonces también ModifyPosition(Symbol(),1.11110,TP). Es decir, esta modificación especificará los niveles previamente establecidos.

¿Y qué ocurrirá si la igualdad NormalizeDouble(Bid - MStop,4) == SL vuelve a funcionar en el siguiente tick?) Sobre todo si tenemos en cuenta que (a) la normalización se realiza sobre cuatro dígitos, cuando puede haber cotizaciones de cinco dígitos, (b) las solicitudes de negociación pueden ejecutarse en el servidor con cierto retraso.

4. También existe una propiedad de carácter como SYMBOL_TRADE_STOPS_LEVEL. Pero este nivel no se comprueba en su código. Es decir, si el candidato a un nuevo stop loss para una posición de compra se especifica como SL_nuevo, sería útil comprobar la condición if(Bid-STOPS_LEVEL>SL_nuevo).

 

De hecho, intente buscar en el Manual de Referencia la comparación de números reales. Por lo que recuerdo, se desaconseja encarecidamente comparar dos números reales así: if(doble_1 == doble_2).

 

Yedelkin,

Muchas gracias, Reshetov también me mostró dónde está el error.

Esta es la función propiamente dicha:

//+------------------------------------------------------------------+
//| 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);
  }

Y aquí está cómo debería haber hecho la función en sí:

  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);
           }
        }
      }
     }

Ahora todo funciona bien.

Gracias.

Razón de la queja: