Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1640

 
EVGENII SHELIPOV #:

¡¡¡Buenos días a todos!!!

Estoy escribiendo código para un EA para Trailing Stop de órdenes de grupo a partir del precio medio de una parrilla de órdenes.

No hay errores en el registro, pero la red de arrastre tampoco funciona. Aquí está el código, por favor, sugiera dónde está el error. Gracias.

¡La red de arrastre está en el lugar equivocado!

Debería ser algo así

¡Si el precio de equilibrio+beneficio-tral! = TakeProfit, ¡comienza el arrastre!

¿De dónde proceden estos datos?

//+----------------------------------------------------------------------------+
//| Трейлинг стоп групповых ордеров                                            |
//+----------------------------------------------------------------------------+
void TrailingGroupOrder()
{
    price += OrderOpenPrice() * OrderLots();
    order_lots += OrderLots() ;
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

OrderOpenPrice

Devuelve el precio de apertura de la orden seleccionada

dobleOrderOpenPrice();

Nota:

El pedido debe ser preseleccionado mediante la función OrderSelect().

 
MakarFX #:

Gracias).

 
MakarFX #:

¡Ahí no está la red de arrastre!

Debería ser así:

si el precio de equilibrio+beneficio-tral! = TakeProfit ejecuta la red de arrastre

¡¡¡¡Buenas tardes Makar!!!!

Según tengo entendido, esta es la línea en cuestión. En este caso una orden de compra:

if(Bid - NormalizeDouble(price / order_lots, Digits) > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)

Makar si pudieras explicar con más detalle

 
MakarFX #:

¡Ahí no está la red de arrastre!

Debería ser así:

si el precio de equilibrio+beneficio-tral! = TakeProfit ejecuta la red de arrastre

¿De dónde proceden estos datos?

Makar, hoy estás hablando en clave.

Puede haber otra pregunta por la que calculamos el precio de equilibrio sin comprobar????

 
MakarFX #:

¡Ahí no está la red de arrastre!

Debería ser así:

si el precio de equilibrio+beneficio-tral! = TakeProfit ejecuta la red de arrastre

¿De dónde proceden estos datos?

OrderOpenPrice

Devuelve el precio de apertura de la orden seleccionada

dobleOrderOpenPrice();

Nota:

El pedido debe ser preseleccionado mediante la función OrderSelect().

Sí, he pensado en eso y ya lo has escrito

 
EVGENII SHELIPOV #:

¡¡¡¡Buenas tardes Makar!!!!

Según tengo entendido, esta es la línea en cuestión. En este caso una orden de compra:

Makar si pudieras explicar con más detalle

Tienes un grupo de órdenes, defines un punto de equilibrio y creas una línea, ¡y esto es mejor hacerlo como una función separada!

    avg_price = NormalizeDouble(price / order_lots, Digits);
     {
     ObjectDelete(0, "AveragePriceLine");
     ObjectCreate(0,"AveragePriceLine" ,OBJ_HLINE, 0, 0, avg_price);
     ObjectSet("AveragePriceLine",OBJPROP_COLOR, Magenta);
     }

A continuación, tiene el valor de la ganancia en pips que desea obtener y añadir / restar a / de avg_price

    if (otype == OP_BUY) tp = NormalizeDouble (avg_price + TakeProfitGroupOrder*Point, Digits);
    if (otype == OP_SELL) tp = NormalizeDouble (avg_price - TakeProfitGroupOrder*Point, Digits);

Y luego una función de arrastre separada

para comprar: si BID > avg_price = OrderModify()

para ventas: si avg < avg_price = OrderModify()


Lamentablemente en su código no veo acciones lógicas (subjetivamente)

 
EVGENII SHELIPOV #:

Eso es lo que estaba pensando y ya has escrito.

Separe las funciones para que le resulte más fácil navegar.

Este es un ejemplo de OnTick()

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
     {
      CloseOrder();
     }
   sl  = MathMax(Stoploss, MarketInfo(_Symbol, MODE_STOPLEVEL)) * Point();
   SL  = NormalizeDouble(sl*Point(),Digits);
   tp  = MathMax(Takeprofit, MarketInfo(_Symbol, MODE_STOPLEVEL)) * Point();
   TP  = NormalizeDouble(tp*Point(),Digits);
   //---
   if(CountOrders()==0&&ObjectGetInteger(0,"lab_Button",OBJPROP_STATE))
     {
      if(TradeSignal()>=0)
        {
         SendOrder(TradeSignal());
        }
     }
   //---
   if (!IsTradeAllowed()) 
     {DrawLABEL("lab_Торговля",0,0,0,clrRed,"Торговля запрещена"); return;} 
   else
     {DrawLABEL("lab_Торговля",0,0,0,clrLime,"Торговля разрешена");}
  }
//+------------------------------------------------------------------+

Como puede ver, sólo hay llamadas a funciones

 
MakarFX #:

Separe las funciones para facilitar la navegación.

Este es un ejemplo de OnTick()

Como puede ver, sólo hay llamadas a funciones.

Gracias, Makar. Concentraré mis pensamientos y pensaré así

 
EVGENII SHELIPOV #:

Gracias, Makar. Pondré en común mis ideas y pensaré en esa dirección.

(Habla)
 
Pregunta: ¿Cómo puedo conseguir una orden de retirada de la custodia del EA? Tal vez ya hay algunas capturas de pantalla o funciones de mt4 que no conozco. Por favor, ilumíname. No tengo ningún afán y posibilidades de estudiar mql 3, 4, 5 etc.