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

 
Youri Lazurenko:


Si no hay un código completo, no podré ayudarle. Por favor, adjunte el código completo (adjunte utilizando el botón Adjuntar archivo)

 
Si en el void OnTick(), se ve así:
   if(currentTime >= OpenTrade && currentTime < CloseTrade)
   {
      if(SignalBuy1() || SignalBuy2())
      { 
         if(timeBarInside != iTime(NULL, 0, 1))
         {
            OpenOrderBuy();
            PositionModifiBuy();
            CandleColor(ColorCandleBuy);
            timeBarInside = iTime(NULL, 0, 1);
         }
      }
      
      if(SignalSell1() || SignalSell2()) 
      {
         if(timeBarInside != iTime(NULL, 0, 1))
         {
            OpenOrderSell();
            PositionModifiSell();
            CandleColor(ColorCandleSell);
            timeBarInside = iTime(NULL, 0, 1);
         }
      }  
   }
¿Qué significa código completo? ¿Todo el EA? Es bastante engorroso, y el resto de las funciones no tienen nada que ver con la modificación. Entiendo que podemos poner inmediatamente el SL y el TP cuando se abre una posición, pero yo quiero hacerlo así, ya me estoy preguntando por qué no funciona. En mql4 se hace como dos dedos... y aquí es un coñazo.
 

Y volvemos a dibujar la línea de tendencia. Si necesita un código.

bool CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
{
   ObjectDelete(0, name);  
      
   if(ObjectCreate(0, name, OBJ_TREND, 0, time1, price1, time2, price2))
   {
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr); 
      ObjectSetInteger(0, name, OBJPROP_STYLE, TrendStyle); 
      ObjectSetInteger(0, name, OBJPROP_WIDTH, TrendWidth); 
      
      ChartRedraw(); 
      Sleep(10);
      
      return(true);
   }
   else 
   {
      Print("Ошибка в создании линии"); 
      return (false);
   }
}
Archivos adjuntos:
1.png  82 kb
2.png  36 kb
 
Youri Lazurenko:

Y volvemos a dibujar la línea de tendencia. Si necesitas un código.

¡¡¡Leer la documentación!!!

OBJ_TREND

Nota

Se puede especificar el modo de extensión de la línea de tendencia hacia la derecha y/o hacia la izquierda (propiedades OBJPROP_RAY_RIGHT y OBJPROP_RAY_LEFT respectivamente).

Por defecto, estas propiedades están establecidas en falso.

Así que mi pregunta es: ¿Por qué borrar el objeto y crearlo de nuevo? ¿No es más fácil crear sólo si no se encuentra tal objeto en el gráfico? E incluso si es necesario cambiar las coordenadas del ancla, no es necesario borrar el objeto y crearlo de nuevo.

 
Youri Lazurenko:


Por tercera y última vez: adjunte el código completo.

 
Alexey Viktorov:

¡¡¡Lee la documentación!!!

Estas propiedades están establecidas en falso por defecto.

Y pregunta: ¿Por qué borrar un objeto y crearlo de nuevo? ¿No es más fácil crear sólo si no se encuentra tal objeto en el gráfico? Y aunque sea necesario cambiar las coordenadas del ancla, no es necesario borrar el objeto y crearlo de nuevo.

Gracias, voy a echar un vistazo ahora. Y gracias por los valiosos comentarios. No soy un programador, sólo para mí, a menudo uso el trabajo de otra persona.

 
Vladimir Karputov:

Por favor, por tercera y última vez: adjunte el código completo.

Ya se ha resuelto el problema. Modifico a través de Tisket, no de Symbol. No entiendo qué tiene que ver el código completo, por ejemplo, ¿qué tiene que ver la condición de apertura de la posición con la modificación?

Y ahora se ve así, tal vez alguien lo necesite.

void PositionModifiSell()
{
   int    i;
   ulong  ticket;
   double sl    = 0; 
   double tp    = 0;  
   int    total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {               
               if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
               {
                  ticket = m_position.Ticket();
                  
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                   
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  }
                  
                  if(!m_trade.PositionModify(ticket, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
               }
            }
         }
      }
   }
}
 
Youri Lazurenko:


Estudie la ayuda: cuál es la diferencia entre seleccionar una posición por billete y por símbolo. Te será útil para no cometer errores:

PositionSelect

bool  PositionSelect(
   string  symbol     // имя инструмента
   );

Nota

Con la contabilidad de posiciones de "compensación" (ACCOUNT_MARGIN_MODE_RETAIL_NETTING yACCOUNT_MARGIN_MODE_EXCHANGE) sólo se puede abrir unaposición porsímbolo en un momento dado, que resulta de una o másoperaciones. Las posiciones y lasórdenes pendientes activas, que también se muestran en la pestaña "Comercio" del panel "Caja de herramientas", no deben confundirse entre sí.

Si las posiciones se muestran de forma independiente (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), se pueden abrir varias posiciones para cada símbolo simultáneamente. En este caso, PositionSelect seleccionará la posición con el tick más pequeño.

Документация по MQL5: Торговые функции / PositionSelect
Документация по MQL5: Торговые функции / PositionSelect
  • www.mql5.com
PositionSelect - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

¡¡¡Lee la documentación!!!

Estas propiedades están establecidas en falso por defecto.

Y pregunta: ¿Por qué borrar un objeto y crearlo de nuevo? ¿No es más fácil crear sólo si no se encuentra tal objeto en el gráfico? E incluso si es necesario cambiar las coordenadas del ancla, no es necesario borrar el objeto y crearlo de nuevo.

Gracias de nuevo, ahora la línea es como una línea, agradable de ver. Pero necesitoObjectDelete(0, nombre); de lo contrario la línea una vez dibujada no se redibuja. Lo mismo en mql4, sólo que lo olvidé.

 
Youri Lazurenko:

Gracias de nuevo, ahora la línea es como una línea, agradable de ver. Sólo se necesitaObjectDelete(0, nombre);; de lo contrario, una vez dibujada la línea no se vuelve a dibujar. Lo mismo en mql4, se me olvidó.

Qué idea más absurda. El objeto gráfico dibujado se mueve suavemente. En la ayuda de cada objeto se ofrece un ejemplo (para la línea horizontalOBJ_HLINE).

También puedes cambiar cualquier propiedad a un objeto ya dibujado: color, estilo, olor...
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_HLINE
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_HLINE
  • www.mql5.com
OBJ_HLINE - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5