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

 
Snajper007 orden de venta, la función calcula el precio medio. Sin embargo, cuando se abre la tercera orden, esta función muestra el valor anterior y el nuevo (he mirado en la impresión del diario), pero como resultado, el valor anterior permanece. ¿Qué he hecho mal?
//+----------------------------------------------------------------------------+
//| Расчет среденй цены (0)-buy (1)-sell                                       |
//+----------------------------------------------------------------------------+
double GetAveragePrice(int ot=-1)
  {
   double order_lots = 0, order_price = 0, avg_price = 0;
     {
      for(int i = OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType()==ot||ot<0)
                 {
                  order_lots += OrderLots();
                  order_price += OrderOpenPrice() * OrderLots();
                 }
              }
           }
        }
     }
   avg_price = NormalizeDouble(order_price / order_lots, Digits);
   return(avg_price);
  }
//+----------------------------------------------------------------------------+
 
MakarFX #:
Gracias.
 
Buenas tardes, ¿quién puede ayudar a implementar un filtro para abrir operaciones basado en indicadores?
 
Sergei Pimenov #:
Buenas tardes, ¿quién puede ayudar a implementar un filtro de apertura de operaciones basado en indicadores?
Leer más
 

Ayúdame a refinar la lógica. Necesito una pausa en horas entre las órdenes cerradas y la apertura de una nueva. He resuelto algunas cosas. Pero no funciona.

OrderCloseTime() > 0 && TimeCurrent() - OrderCloseTime() > FstOrderTimeHour*3600 // сигнал на открытие ордера

OrderCloseTime() == 0 // сигнал на открытие первого ордера

где int FstOrderTimeHour = 1 // пауза в часах
 
Порт-моне тв #:

Ayúdame a refinar la lógica. Necesito una pausa en horas entre las órdenes cerradas y la apertura de una nueva. He resuelto algunas cosas. Pero no funciona.

//--- input parameters
input int HourPause = 1;   // Пауза в часах
//--- global parameters
datetime  pause;
//+------------------------------------------------------------------+
void OnTick()
  {
   pause=GetInfoLastPos(3)+(HourPause*60*60);
   // выключаем торговлю
   if(TimeCurrent()<pause) return;
  .......
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                             MakarFX|
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos(int a=1)
  {
   datetime t=0;
   double result=0,l=0,p=0,f=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if(a==1) {result=l;} else
   if(a==2) {result=p;} else
   if(a==3) {result=(double)t;}
   else     {result=0;}
   return(result);
  }
//+----------------------------------------------------------------------------+

Si el mago no es necesario - eliminar el amarillo.

 
MakarFX #:

Antes de abrir un pedido, se almacena el max_ticket actual en el prev_ticket

En buena hora Makar, este método de la definición del penúltimo billete de orden tiene una seria desventaja. Este método funciona cuando se abre la orden máxima de la parrilla y si eso no ocurre, la penúltima orden es la última de la parrilla (ver la imagen). Estoy intentando escribir una función pero no funciona, se detecta la última entrada, la condición resaltada no quiere funcionar.

//+----------------------------------------------------------------------------+
//| Расчет тикета предпоследнего ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketPenultimateOrder()
  {
   penultimate_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > penultimate_ticket)
                     if(penultimate_ticket < GetTicketMaxOrder())
                        penultimate_ticket = OrderTicket();

                 }
              }
           }
        }
     }
   return(penultimate_ticket);
  }

 
EVGENII SHELIPOV #:

Buen tiempo Makar, este método para el penúltimo billete de pedido tiene una seria desventaja. Este método funciona cuando la orden máxima está abierta en la parrilla. Si no lo está, la penúltima orden es igual a la última, véase la imagen. Estoy intentando escribir una función pero no funciona, se detecta la última entrada, la condición resaltada no quiere funcionar.

¡Te he dado un código que funciona!
 
MakarFX #:
¡Te he dado un código que funciona!

Este código es el que escribí arriba y hasta hay una foto de él

 
EVGENII SHELIPOV #:

Este código es el que escribí arriba y hasta hay una foto de él

El error no está en el código de la penúltima búsqueda, sino muy probablemente en la salida de la información a texto
Razón de la queja: