[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 99

 
Lisi4ka330:


Buenas tardes! Por favor, ayúdenme con la función ArrayMo (devuelve el máximo de la curva de densidad).

double ArrayMo(double& x[], int d=4) {
  double e, s=0;
  double m[][2];             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
  int    i, k=ArraySize(x);
  int    n;                  // номер строки временного массива m
  int    r;                  // количество строк во временном массиве m

  if (k>0) {
    for (i=0; i<k; i++) {
      e=NormalizeDouble(x[i], d);
      n=ArraySearchDouble(m, e);
      if (n<0) {
        r=ArrayRange(m, 0);
        ArrayResize(m, r+1);
        m[r][0]++;
        m[r][1]=e;
      } else m[n][0]++;
    }
    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];
  } else Print("ArrayMo(): Массив пуст!");

  return(s);
}

Se han planteado las siguientes preguntas:

1.¿Cuál es el objetivo de crear una matriz temporal

m[][2]

2. No está claro de dónde se tomarán los valores del array temporal, y por tanto no está claro cómo se puede buscar en este array:

n=ArraySearchDouble(m, e)

3. Y en general para mí la verdad está profundamente escondida))))) Una vez que hemos comprobado que no hay ningún valor, empezamos a determinar el tamaño de la matriz de "valores poco claros".

Estaría muy agradecido por un rayo de luz en esta historia))))


Creo que la función no está escrita correctamente después de todo. La razón principal es que tras el anuncio

double m[][2];

es necesario

ArrayResize(m,0);

de lo contrario(cito)

int ArrayResize( void array[], int tamaño_nuevo)
Establece el nuevo tamaño en la primera dimensión del array. Si tiene éxito, la función devuelve el número de todos los elementos contenidos en el array tras el redimensionamiento, de lo contrario devuelve -1 y el array no se redimensiona.
Nota: un array declarado localmente en cualquier función, que ha sido redimensionado, permanecerá sin cambios después de la ejecución de la función. Cuando la función es llamada de nuevo, dicho array tendrá un tamaño diferente al declarado!!!!

Y así con múltiples llamadas la función "caerá en el pasado")

Sobre el funcionamiento del algoritmo. La propia matriz m[][2] es una representación directa de la distribución empírica del número de aciertos de la variable x[i] por sus diferentes valores. Es decir, cada elemento de la matriz se compone de dos números: el número de aciertos sobre algún valor (el primer campo) y el propio valor. El bucle busca el mismo valor en el array m para cada x[i], y si se encuentra, se añade el campo numérico, si no, se crea un nuevo elemento con ArrayResize() y se escribe allí nuestro x[i].

A continuación, una vez rellenada la matriz, sólo tenemos que encontrar el elemento con el máximo número de aciertos, es decir, por definición, el módulo de la distribución x.

Esto se hace mediante cadenas

    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];

Aunque me parece (no estoy seguro de la matriz multidimensional), que podrías tener simplemente

    s=m[ArrayMaximum(m)][1];

En definitiva, puedo decir (con el debido respeto al autor del código) que incluso corrigiendo todos los defectos, este algoritmo es extremadamente ineficiente y a menudo puede dar resultados erróneos. La razón es que estamos trabajando con el tipo double, lo que significa que la probabilidad de que los valores de x[i] estén cerca pero sean distinguibles es bastante alta. Esto puede no ser tan perceptible cuando el tamaño de la muestra es mucho mayor (cientos de veces o más) que el número total de intervalos en los que se define x[i]. Sin embargo, en los muchos casos en los que no se cumple esta restricción, habrá muchos cálculos erróneos.

La forma más correcta de calcular la moda es la siguiente: se construye una función de distribución empírica (no confundir con la distribución de frecuencias), luego se interpola de lineal a trozos a suave, y finalmente se busca el punto de máxima derivada. Este algoritmo no presenta los inconvenientes mencionados anteriormente y funciona con bastante eficacia incluso con muestras de pequeño tamaño. Al menos, tuve que resolver sólo la tarea de encontrar un modo para muestras de 50-100 elementos con un número comparable de intervalos utilizando MQL - y todo estaba bien. La única desventaja es que las interpolaciones suelen provocar una importante caída de la velocidad de cálculo, claro está, si queremos suavizar cualitativamente.

 
Hola estimados miembros del foro, con quién puedo hablar para escribir un EA. Un EA sin indicadores que se basa en doblar en un movimiento no en nuestra dirección.
 
Glazunov:
Hola estimados miembros del foro, con quién puedo hablar para escribir un EA. Un EA sin indicadores que se basa en doblar en un movimiento no en nuestra dirección.
aquí: https://www.mql5.com/ru/job
 
ilunga:
aquí: https://www.mql5.com/ru/job

Gracias. Quizá haya más opciones.
 
Glazunov:

Gracias. Tal vez haya más opciones.
Intente escribir "martingala" en una búsqueda en la web - se sorprenderá
 
YOUNGA:
Intenta escribir "martingala" en una búsqueda en la web y te sorprenderás

¡Ya he mirado! Pero falta lo que quiero(
 
Glazunov:
Hola estimados miembros del foro, con quién puedo hablar para escribir un EA. Un EA sin indicadores que se basa en doblar en un movimiento no en nuestra dirección.


Echa un vistazo aquí

https://www.mql5.com/ru/forum/136747

 

Hola. Acabo de empezar en MQL4.

Por favor, asesórese sobre la función OrderModify. Los manuales y los ejemplos muestran que esta función se utiliza para el arrastre, es decir, el cambio de stop loss. Necesito cambiar sólo el take profit en una orden abierta. El stop loss no se establece cuando se abre la orden y también debe permanecer en 0 durante la modificación .

¿Cómo debería ser el cálculo y la selección de los pedidos?

El objetivo final debería ser algo así

if (OrderType()==OP_BUY && OrderOpenPrice()-Bid>kof*Point) // hay una compra, pero ha bajado en kof
{
OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+tpnew*Point,0,CLR_NONE);// movemos TP más bajo que el colocado anteriormente

Lo mismo para vender.

Gracias por las respuestas.

 

Hola de nuevo :)

Como pensaba, han surgido problemas. Aquí está el código. La cuestión es que las órdenes en el probador se cierran por TP, y por función se elimina el TP cuando la orden se modifica durante el Trailing Stop.

double my_ord[31][2];                                           //ордера советника
                                                                //[][0] Ticket
                                                                //[][1] Вид операции 
//---------------------------------------------------------------------------------

void FindMyOrders()                                             //ищем свои ордера(от советника)
   {
    for (int a = 0;a<32;a++)                                    //во избежание ошибок заполняем все нулями
      {
       my_ord[a][0]=0;
       my_ord[a][1]=0;
      }
    int pos = 0;
    for(int i=0; i<32; i++)
      {
       if (Mas_Ord_New[i][8]==1)                                //есть ли комментарий
         {
          int num = Mas_Ord_New[i][4];
          OrderSelect(SELECT_BY_TICKET, num);
          string str = OrderComment();
          if (str == "AO Day Profiter Trade")                   //наш ли это комментарий
            {
             my_ord[pos][0] = num;
             my_ord[pos][1] = Mas_Ord_New[i][6];                //если наш, записываем Ticket и вид операции
             pos++;
            }
          else { }
         }
       else { }
      }
   }
//---------------------------------------------------------------
void TrailStop(int ticket, int TStop)                           //ф-ция трейлинг стопа, TStop-расстояние в пп
   {
    int minDist = MarketInfo(symb, MODE_STOPLEVEL);
    if (TStop<minDist)
      {
       TStop = minDist;
      }
    else { }
    if (TStop>0)
      {
       OrderSelect(ticket, SELECT_BY_TICKET);
       if(OrderType()==OP_BUY)
         {
          if(Bid - OrderOpenPrice()>Point*TStop)
            {
             if(OrderStopLoss()<Bid-Point*TStop)
               {
                OrderModify(OrderTicket(), OrderOpenPrice(), 
                Bid-Point*TStop, 0, 0, Blue);
                return;
               }
             else { }
            }
            else{ }
         }
       else if (OrderType()==OP_SELL)
         {
          if(OrderOpenPrice() - Ask>Point*TStop)
            {
             if(OrderStopLoss()>Ask + TStop*Point)
               {
                OrderModify(OrderTicket(), OrderOpenPrice(), 
                Ask+Point*TStop, 0, 0, Blue);                           //ordertakeprofit!!
                return;
               }
             else { }
            }
          else { }
         }
       else { }
      }
    else { }
    }
//-----------------------------------а это кусочек Start(), отвечающий за трейлинг стоп
   for (int i = 0; i<32; i++)                                   //трейлинг стоп для наших ордеров
      {
       if (my_ord[i][0]>0)
         {
          TrailStop(my_ord[i][0], TralingStop);
         }
       else {break;}
      }
Lo que significa que el trailing stop no se ejecuta, y no hubo errores con TP y SL erróneos en el registro del probador. Entonces, ¿qué es lo que está mal?
 

Estimados profesionales, ¿podrían decirme esta pregunta?

Tengo una matriz de cadenas unidimensional previamente escrita en un archivo de texto

EURUSD 1654.31

GBPUSD -1654.61

USDCAD 110.98

USDJPY 1180.17

Supongamos que el beneficio total de USDCAD ha cambiado y necesito reemplazar la 3ª línea con "USDCAD 115.64".

Leo estos datos como una matriz de cadenas unidimensional, pero no puedo reemplazar sólo este elemento en el archivo de texto (¿alguien puede escribir una función?)

¿O es mejor no molestarse y sobrescribir toda la matriz?

Sólo tengo datos que vienen de EAs de pie en diferentes pares - cada par tiene una cadena diferente - por supuesto, sería mejor cambiar sólo 1 elemento probablemente.

Razón de la queja: