[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 318

 
gyfto:

O simplificarlo aún más.

Aquí Δ es el significado de la diferencia, es decir,Cierre[i] - Apertura[i], y ^ es un signo de grado. const - constante en esta expresión, es decir,i_sizeOfSequentialCorrectionBar * pt, notación matemática estándar, no me he inventado nada. 2*bVar-1 es similar a±1, bVar aquí es cualquier variable bool. Y la expresión 2*bVar-1 no toma valores 0 y 1, sino -1 y +1.≥ es MQL4 >=, también una notación matemática estándar.step es un paso, es decir, step es igual a 1 en cnt++, y step es igual a -cnt en cnt=0. ¿Qué más no quedó claro de las notaciones?

gyfto, gracias por la explicación. Pero hay un punto. De todos modos, no podemos resolver el problema cambiando el dígito de salida de la expresión. Actualmente, cuando se produce la puesta a cero, los precios de apertura y cierre deben ser "intercambiados". Es decir, tal y como yo lo veo, la universalidad no se puede conseguir. Esto es lo que me ha intrigado.

Vadim escribió hace tiempo que poner una función dentro del bucle ralentiza el código en un orden de magnitud. Me pregunto si se aplica sólo a los casos en que una función calcula sus valores en cada iteración del bucle o a cualquier otro caso. Por ejemplo, hasta que terminé de escribir el Asesor Experto, reescribí la función que intentaba simplificar utilizando el siguiente esquema:

//+-------------------------------------------------------------------------------------+
//| Расчитываем количество идущих один за одним баров одного признака                   |
//+-------------------------------------------------------------------------------------+
int LastCandlesType(int directionMA)
{
   int cntUp,                                                                            // Счётчик идущих друг за другом свечей с..
       cntDn;                                                                                // .. требуемыми признаками
       
   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if (directionMA == CROSS_UP)
      {
         if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntDn++;                                                                     // .. прибавим 1 к счётчику

         if ((Close[i] - Open[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntDn = 0;                                                                   // .. счётчик обнуляем

         if (cntDn == i_sequentBarsСount)                                                   // Если cnt баров в подряд медвежьи..
             return (REQUIRED_SEQUENTIAL_BEARS_GOT);                                         // .. Выходим из функции
      }

      if (directionMA == CROSS_DN)
      {
         if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntUp++;                                                                     // .. прибавим 1 к счётчику

         if ((Open[i] - Close[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntUp = 0;                                                                   // .. счётчик обнуляем
     
         if (cntUp == i_sequentBarsСount)                                                   // Если cnt баров в подряд бычьи..
             return (REQUIRED_SEQUENTIAL_BULLS_GOT);                                         // .. Выходим из функции
      }
   }
}

He hecho que los contadorescntUp ycntDn sean diferentes, porque puedetener un valor a la vez y luegootro cuando se utilizan barras de cálculo en un ciclo.Y el contador puede sumar un valor y seguir sumando otro. Y si la variable es la misma, el número de barras de una característica se sumará al contador de barras de otra característica.

Aquí es donde se necesita el consejo, ¿quizás sea mejor resumir de alguna otra manera?

El asunto es que el Asesor Experto no es un grande todavía. Tengo mis vagones y esta función. Tengo la sensación de que en lugar de largo, el búho vende y viceversa. Estoy tratando de entender cómo puede suceder. ¿Quizás hay algo que no funciona aquí?

 

Hola, he empezado a aprender mql4, he escrito un script que bloquea las órdenes perdidas. No puedo resolver un problema: el script bloquea todas las órdenes con pérdidas a partir de -10, pero las sigue bloqueando mientras el precio esté por debajo de -10. ¿Cómo hacer que el bloqueo se produzca sólo una vez? Es decir, si la pérdida llega a -10, el script ha bloqueado esa orden y la deja ahí aunque la pérdida siga aumentando.

extern double StopLoss=150;

extern double Profit=-10;

//+------------------------------------------------------------------+

//----
void start()
{
double profit=Beneficio;
double Lots=0;
for(int i=0;i<OrdersTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS))
continue;

if(OrderType()==OP_BUY && OrderProfit()<Profit*Point)
Lots+=OrderLots();
if(OrderType()==OP_SELL && OrderProfit()<Profit*Point)
Lots-=OrderLots();


}
if(Lots>0)
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,0,NULL,Red);
if(Lots<0)
OrderSend(Symbol(),OP_BUY,-(Lots),Ask,3,Bid-StopLoss*Point,0,NULL,Blue);
//----
return(0);
}

 

Buenas tardes.

Por favor, mire el código, quiero calcular el tiempo medio de una operación ( operación de orden pendiente)

//+------------------------------------------------------------------+
//| Расчет среднего времени сделки            |
//+------------------------------------------------------------------+
double Sredneevremyasdelky(){
datetime Tsd=0; // общее время сделок
datetime Tsvsd=0; // среднее время сделки 
int n=0;
int orders=HistoryTotal();  // history orders total

        for(  int i=orders-1;i>=0;i--)
                  {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                  n++;
                 Tsd=Tsd+(OrderCloseTime()-OrderOpenTime());
                   }
            if (n>0) Tsvsd=Tsd/n/60;


            return(Tsvsd);
         }

Desde la activación del pedido hasta el cierre.

 
Stells:

Buenas tardes.

Por favor, mire el código, quiero calcular el tiempo medio de una operación (operación de orden pendiente)

Desde la activación del pedido hasta el cierre.


¿Por qué se calcula el tiempo medio del ciclo? Tal vez sería mejor hacerlo después del ciclo. Y sería una buena idea establecer el período de cálculo
 
Vinin:

¿Por qué se calcula el tiempo medio del ciclo? Es una operación innecesaria. Tal vez sería mejor hacerlo después del ciclo. Y sería una buena idea establecer el período de cálculo
Lo has sacado del bucle. ¿Cómo se establece el periodo de cálculo?
 
Stells:
Lo sacó del ciclo. ¿Cómo se hace el período de cálculo?

Variables externas, por ejemplo
 

Lo entiendo, hay que sacar la fecha de alguna manera

¿De qué función se trata?

 
Stells:

Lo entiendo, hay que sacar la fecha de alguna manera

¿De qué función se trata?


¿Por qué complicar las cosas cuando hay un externo
 

hoz , memudaré en cuanto esté libre.

Tengo esta pregunta sobre la optimización. Estoy tratando con el algoritmo EMA. Como sabes, es la recursividad la que realmente ahorra tiempo. Refiriéndose al código original:

...

Transferido ahttps://www.mql5.com/ru/forum/144691

 
gyfto:

hoz , memudaré en cuanto esté libre.

Tengo esta pregunta sobre la optimización. Estoy tratando con el algoritmo EMA. Como sabes, es la recursividad la que realmente ahorra tiempo. Refiriéndose al código original:

Tomé Matcad específicamente para tratar los pesos generados por EMA:

Por cierto, ahora me queda claro por qué los indicadores que usan EMA (que debería llamarse función de potencia, no expotencial) usan periodo de 14. Entonces, ¿por qué tomar el último peso tan alto cuando puedes simplemente envolver una función de potencia, si el siguiente peso es más importante que el anterior? Ya ni siquiera me pregunto por qué utilizar la recursión cuando los pesos finales después de la recursión se pueden derivar mediante una fórmula (véase F(n,x) e y(n,x)).


Quizá deberías abrir tu propia sucursal. ¿Por qué se necesita una "Rama para principiantes"?