[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 470

 
tol64:

¿Cómo se optimizan los parámetros multidivisa? En el probador de MT4 no hay posibilidad de probar varios símbolos a la vez... Estoy pensando en la multidivisa y hasta ahora he llegado a la idea de que optimizo los parámetros para cada símbolo por separado, y luego transfiero todos estos parámetros a mi Asesor Experto en el modo multidivisa.

¿Me estoy moviendo en la dirección correcta o es más fácil de hecho)?

En mql5 se puede implementar todo en un EA para probar y operar, pero por ahora he decidido estudiar mql4.

Sólo he pensado que si no puedes probar algunos símbolos a la vez, para qué molestarte con un EA si puedes poner tu propia copia del gráfico de cada símbolo y será el mismo. Me gustaría escuchar las opiniones de los miembros de la comunidad)))

No tengo una multidivisa, simplemente cuelgo el mismo EA en cada instrumento.
 
Roman.:

respuesta
Lo siento, no entendí la respuesta
 
demlin:
Lo siento, no entiendo la respuesta.

Busca en google "cómo optimizar un sitio:mql4.com": El siguiente libro también está disponible aquí: "cómo optimizar un Asesor Experto site:mql4.com", también aquí.

Recomiendo un buen libro sobre este tema: "Development, Testing and Optimization of Trading Systems for the Stock Trader" (Desarrollo, prueba y optimización de sistemas de negociación para el operador de bolsa), de Ralph Vince.

 

Problema: La figura muestra una curva (por ejemplo, MA). Los puntos A,C,E son máximos locales, y los puntos B,D son mínimos locales. Pregunta: ¿cómo los calculamos si la distancia entre el máximo y el mínimo más cercanos es superior a N puntos? He intentado hacerlo, pero parece ser demasiado engorroso. ¿Quizás haya un algoritmo listo para resolver tal problema? Por favor, si alguien tiene experiencia en ello, aconséjelo.

 
Elenn:

Problema: La figura muestra una curva (por ejemplo, MA). Los puntos A,C,E son máximos locales, y los puntos B,D son mínimos locales. Pregunta: ¿cómo los calculamos si la distancia entre el máximo y el mínimo más cercanos es superior a N puntos? He intentado hacerlo, pero parece ser demasiado engorroso. ¿Quizás haya un algoritmo listo para resolver tal problema? Por favor, si alguien tiene experiencia en ello, aconséjelo.


Determinación de la dirección de deslizamiento.

Si es hacia arriba y las variables B,C,D y E están vacías, entonces introducimos el valor actual del ángulo móvil en la variable A.

Si la variable A no está vacía, y la dirección de deslizamiento es hacia abajo, y las variables C,D,E están vacías, entonces el valor actual del indicador de deslizamiento se introduce en la variable B. Si las variables A y B no están vacías, y la media móvil apunta hacia arriba, y las variables D y E están vacías, la variable C se rellenará con el valor actual de la media móvil.

Y así sucesivamente, rellenamos los valores de las variables con valores.

Ahora, si las variables A y C no están vacías, y si el módulo de diferencia entre A y C es mayor o igual a un número predefinido de puntos, entonces se ejecutará la acción que tiene en mente.

En general, el código es muy posible. Sólo tenemos que determinar el punto del algoritmo en el que vamos a reiniciar las variables, para que el EA se dé cuenta de que ha llegado a un nuevo punto de partida. El código se puede escribir a través de un bucle y arrays, y puede ser menos complejo, pero es mejor escribir el algoritmo a través de variables para evitar la confusión con los índices del array y los números de las velas en el bucle.

 

Chicos, hace poco me encontré con este problema. Quien esté al tanto, que lo comente. Yo mismo he encontrado el error - gracias a Dios - rápidamente... Al escribir el código - todo compila sin errores, pero el arrastre no funciona... Es decir, no avanzamos en el bucle de pedido. Aquí están los fragmentos de código... El fallo estaba en lo siguiente - dábamos órdenes mágicas en variables externas, pero en la búsqueda de órdenes en el bucle - con minúscula, la búsqueda a través de CTRL + F - solicitando "magia" iba seguida de "magia"... El compilador no daba error, pero en el bucle, el programa no se cambiaba a un arrastre... el bucle se interrumpiría en la "magia"... ¿Se supone que esto es así? Siempre creí que "magia" y "mago" eran variables diferentes... y por lo tanto el compilador debería haber indicado este error de que la variable "mágica" es indefinida... En el código, como ahora se ejecuta antes de seleccionar la red de arrastre y Printa () ya no viene - la salida del bucle por esta condición - por la magia - es decir, esta condición - nunca se cumplirá, debido a los diferentes nombres - "magia" y "Magic".

if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))
      {
         continue;
      }

// глоб переменные
...
...
extern int  Magic = 10;     // MagicNumber

//----------------------------------------------------------------------------
int start()                            // Спец. функция start
  {
  
   
   int orderCount = 0; 
  
   //---------------------------ТРАЛ ОРДЕРОВ---------------------------------------------------------------------------------------
   int orderType;
    for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
    {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))
      {
         continue;
      }

      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))
      {
         continue;
      }

      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))
      {
         continue;
      }
                ticket = OrderTicket( );                         // Номер ордера
       double   orderLots = OrderLots();                         // Lots   
       double   orderProfit = OrderProfit() + OrderSwap();       // Profit
       double   Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
       double   SL =  OrderStopLoss();                           // Значение StopLoss ордера
       double   TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }
                 
         
      orderCount++;                     // считаем ордера (не больше 10)
     
            
       while (!IsTradeAllowed() || !IsConnected()) Sleep(5000); RefreshRates();
       
      //----------------------------Тралим последовательно все наши ордера по виду трала------------------
      if (UseTrailing && orderCount > 0 && type ==0)   // простой трал по аналогии учебнику - в зависимости от параметра trlinloss (тралить ли в зоне лоссов)
          {     
           if (orderType == OP_BUY)  SampleTrailing_texbook (0);          // если бай
           if (orderType == OP_SELL) SampleTrailing_texbook (1);          // если селл
          }      
      ...
      ...
      ...   
     Print( "Эксперт база: Всего наших ордеров = " ,orderCount);
     }   
//--------------------------------------------------------------------------------------------------------------------------------------     
   
   
  
//----------------------------------------------------------------  
   return;                             // Выход из start()
  }

P.D. Quien no lo sepa, que lo tenga en cuenta, porque si no, no está claro lo que se puede hacer con el código...

 
Roman.:

Chicos, hace poco me encontré con este problema. Quien esté al tanto, que lo comente. Yo mismo he encontrado el error - gracias a Dios - rápidamente... Al escribir el código - todo compila sin errores, pero el arrastre no funciona... Es decir, no avanzamos en el bucle de pedido. Aquí están los fragmentos de código... El error estaba en lo siguiente - dábamos órdenes mágicas en variables externas, pero en la búsqueda de órdenes en el bucle - con una letra pequeña, la búsqueda a través de CTRL + F - solicitando "mágico" era seguido por la transición a "mágico" ... El compilador no dio ningún error, pero la ejecución del programa no cambió a modo de arrastre en el bucle ... el bucle se interrumpiría en la "magia"... ¿Se supone que esto es así? Siempre creí que "magia" y "mago" eran variables diferentes... y por lo tanto el compilador debería haber indicado este error de que la variable "mágica" es indefinida... En el código, como ahora se ejecuta antes de seleccionar la red de arrastre y Printa () ya no aparece - la salida del bucle en esta condición - debido a lamagia - es decir, esta condición - nunca se ejecutará, debido a los diferentes nombres - "magia" y "Magic".

P.D. Quien no lo sepa, que lo sepa, porque si no, no sabrá lo que tendrá que hacer con el código...


Si se declara la magia y se utiliza la magia, el compilador dice que la variable mágica no está declarada.

MetaEditor 4 401.

 
Roman.:

Chicos, hace poco me encontré con este problema. Quien esté al tanto, que lo comente. Yo mismo he encontrado el error - gracias a Dios - rápidamente... Al escribir el código - todo compila sin errores, pero el arrastre no funciona... Es decir, no avanzamos en el bucle de pedido. Aquí están los fragmentos de código... El fallo estaba en lo siguiente - dábamos órdenes mágicas en variables externas, pero en la búsqueda de órdenes en el bucle - con minúscula, la búsqueda mediante CTRL + F - solicitando "magia" iba seguida de "magia"... El compilador no daba error, pero el programa no cambiaba a modo de arrastre en el bucle... el bucle se interrumpiría en la "magia"... ¿Se supone que esto es así? Siempre creí que "magia" y "mago" eran variables diferentes... y por lo tanto el compilador debería haber indicado este error de que la variable "mágica" es indefinida... En el código, como ahora se ejecuta antes de seleccionar la red de arrastre y Printa () ya no aparece - la salida del bucle en esta condición - debido a lamagia - es decir, esta condición - nunca se ejecutará, debido a los diferentes nombres - "magia" y "Magic".

P.D. Quien no lo sepa, que lo sepa, porque si no, no entenderá lo mucho que tendrá que lidiar con el código...

Compárelo con mi simple arrastre. En concreto, se trata de un bucle de búsqueda de órdenes:

   // В глоб. переменных
   string sy=Symbol();
   // ...................................................................
   color  cl;
   double sl, StopLevel;
   for (int i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderSymbol()!=sy)           continue;
         if (OrderMagicNumber()!=Magic)   continue;
         if (OrderType()>1)               continue;
         sl=OrderStopLoss();
         if (OrderType()==OP_BUY) {
            cl=clModifyBuy;
            StopLevel=NormalizeDouble(strG-DeltaStop*PointX, dg);
            if (sl<StopLevel) ModifyOrder(-1, StopLevel, -1, -1, cl);
            }
         if (OrderType()==OP_SELL) {
            cl=clModifySell;
            StopLevel=NormalizeDouble(strR+DeltaStop*PointX, dg);
            if (sl>StopLevel) ModifyOrder(-1, StopLevel, -1, -1, cl);
            }
         }
      }

Creo que el principio le quedará claro.

Y la magia y las variables mágicas son realmente diferentes. Cuando los busques con Ctrl+F, marca "distingue entre mayúsculas y minúsculas".

En algún lugar del código declaraste ambos

 
artmedia70:

Y la magia y las variables mágicas son realmente diferentes. Cuando los busques con Ctrl+F, marca la casilla "distingue entre mayúsculas y minúsculas".

En algún lugar del código declaraste ambos después de todo

Exactamente. Acabo de encontrarlo gracias a ti... :-))) En la parte inferior de Variables además de la variable extern int Magic = 10; declaré una variable -
int magic = 12345;

:-)))

Resulta que estaba teniendo en cuenta la Magia en la fie de apertura de la orden y la Magia en el bucle, por eso el bucle de órdenes para arrastrarlas no funcionaba...:-)))

Gracias de todo corazón, ya he resuelto el problema. Comprobado "Usar el registro" - ponerlo allí y todo funciona correctamente.

P.D. ¡¡¡Cómo pasa!!! (Cuando la suerte va en el código - listo y no sólo unos majiks a declarar...:-))))

 
artmedia70:

Compárelo con mi más sencillo arrastre. En particular, el ciclo de búsqueda de pedidos:

Creo que el principio será claro.

Gracias por la opción de arrastre. El principio es claro.
Razón de la queja: