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

 
Alexey Viktorov:

Bueno, intentaré aportar mi granito de arena para educaros.

Me dirigiré a ti como "tú" cuando lo envíe. Tengo una instantánea del puntero...

Por favor, dime, ¿no te parece mal llamar a la misma función 5 veces en el mismo tick? Pero eso es la mitad del problema. Esta función recorre todos los pedidos. Y todo esto 5 veces en un tic... Y cuento con 4 funciones de este tipo. No podemos pensar lo suficiente en cómo encajar 3 funciones más con el bucle para buscar todos los pedidos en un ciclo.

Aquí hay dos de ellos.

Esto es

Ni siquiera se acerca a la cola.

Para entender esto, tenemos que comprender claramente la definición de arrastre. No recuerdo textualmente, pero es aproximadamente "Nivel de StopLoss móvil siguiendo el precio para disminuir las posibles pérdidas o aumentar el beneficio "garantizado".

Y esto

¿Qué aspecto tiene cuando se ejecuta el Asesor Experto? Probablemente cuatro líneas... ¿son necesarios?

Y lo último por hoy: no hace falta tener una biblioteca en la cabeza. Basta con tener la documentación y saber utilizarla. Todavía no recuerdo todos los parámetros de iMA(_Symbol, _Period, ,,,,,) y no puedo ir más allá sin estudiar la documentación. Y así casi todas las funciones. Afortunadamente, no hace mucho tiempo hicieron tooltips que no ayudan mucho. No estoy tratando de memorizar cómo escribir estos o aquellos enums. Así que tengo que mirar la documentación cada vez.


Alexey, gracias por la información. Sí, admito que el código no es óptimo, simplemente no soy programador y no conozco las sutilezas que has descrito. Simplemente no entiendo esos matices, no entiendo cómo optimizar todo, quizás lo haga más adelante, si es que avanzo. Ahora sé exactamente que si empiezo a optimizar, sólo romperé todo. He visto códigos de otros EAs en mi sitio web - ¡hay tantas cosas allí! - Seguro que si eres un codificador profesional, quizás su código sea menos exigente para el terminal que el mío, pero por ahora no puedo tener en cuenta tus comentarios ya que realmente no entiendo estos matices de optimización de la programación. Y si se eliminan algunas llamadas a funciones en el código - seguro que el Asesor Experto empezaría el caos allí y abriría órdenes cuando no fuera necesario. Allí codifiqué, probé - nada salió mal o se equivocó, corregí y como resultado el código final quedó así, no tuve tiempo de optimizar, como comprenderás con mi bagaje de conocimientos.

En cuanto al arrastre, lo más importante es que arrastre el beneficio, en esta fase de desarrollo estoy satisfecho con él)))) Seguro que el código antiguo y el nuevo trailing trailing es igual y la cantidad de tratos es la misma - por supuesto he llegado a la conclusión de que el trailing ha funcionado, pero cómo hacerlo correctamente en este entorno donde el trailing funciona nadie me lo ha dicho, y no tengo ninguna idea al respecto - todo mi código es constructor Lego - es decir, lo he montado a partir de materiales de tutoriales de vídeo. Por supuesto, hay un poco de mi propia - es en realidad el algoritmo del Asesor de Expertos en sí, mientras que todo el código y las funciones no son mi invención, pero vino de tutoriales en vídeo de TradeLikeaPro y "editado" el código exactamente por analogía y para mis necesidades - para mi algoritmo. Al final, conseguí lo que tenía.

 
geratdc:   Todo mi código es un constructor de Lego - es decir, lo he montado a partir de materiales de tutoriales de vídeo de TradeLikeaPro, además, he "editado" el código exactamente por analogía y para mis necesidades - para mi propio algoritmo. Al final, tengo lo que tengo.

Al ver el gráfico del depósito, me interesé y descargué la primera versión. Lo he copiado en MetaEdit. Tengo dos advertencias. La primera, la he eliminado sustituyendo int timeprev=0; por datetime timeprev=0; Porque esta variable contiene fecha. El segundo indica en

tp=TakeProfit;             // В переменную tp заносится значение переменной TakeProfit
if(tp>TakeProfit)          // А тут они сравниваются. А с чего им быть разными, если только что уравняли?
{
   TakeProfit+=tp;
}

He eliminado las tres últimas cuerdas. Se traduce limpiamente. Vamos a ir más allá...

//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)  // После этой строки нужны фигурные скобки.
      TakeProfit     *= 10;        // иначе эта строка будет выполняться по условию

      // а следующие строки будут выполняться всегда
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }

ha cambiado (para aclararlo, he adjuntado el script - ejecútalo, lo explicará) así que

//| Инициализация на пятизнак или иену                               |
//+------------------------------------------------------------------+
void OnInit()
{
   if(Digits == 3 || Digits == 5)
   {
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;
   }
}
//+-------------------------------------------------------+
//| Демонстрация назначения фигурных скобок      PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  // Без фигурных скобок
  if(2==5)
    Alert("Это сообщение будет пропущено");
    Alert("Без фигурных скобок это сообщается, хотя по логике зря");

  Alert("-------------------------------");
  Alert("А вот со скобками - полный молчок");
  if(2==5)
  {
    Alert("Это сообщение будет пропущено");
    Alert("Со скобками это тоже пропускается");
  }
}
Este es el resultado


Esta función se elimina - no hay llamadas de ella y su cuerpo está vacío.

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Intenté ejecutarlo y vi:

Fue

Lo cambié sólo al ejecutar el EA en dos gráficos con la misma herramienta y el deslizamiento - ¿por qué cambiar este parámetro? Luego lo pensé y aumenté los parámetros 10 veces. Y he eliminado la función OnInit. Al fin y al cabo, sólo uso el código de cinco dígitos. ¿Por qué? Porque la diferencia de cuatro dígitos es de 3 puntos, así que es de 30. Y la diferencia de cinco dígitos es de sólo 12.

se hizo más claro.

extern double  Lots           = 0.01;  // Размер лота
extern int     TakeProfit     = 5 0;    // Ограничение прибыли Take Profit
extern int     Step           = 2 0;    // Шаг - чего, выясним позже

extern int     TrailingStep   = 3 0;    // Шаг трала
extern int     TrailingStop   = 10;    // Ограничение убытка

extern int     MaPeriod       = 200;   // Период МА (надо поменьше?)
extern int     MaShift        = 1;     // Сдвиг МА (взял бы 0)

       int     Magic          = 123;   // Магик - нужен ли он?
       int     Slippage       = 50;    // Проскальзывание

datetime timeprev=0;

double price,op,cn,tp;  // Убрал extern

He recortado la parte superior de la cabecera. Eso es lo que dejé:

//+------------------------------------------------------------------+
//|                                                      -Э-1111.mq4 |
//+------------------------------------------------------------------+
#property strict

esta línea de aquí.

   op=CalculateProfit();
   if (CalculateProfit()>=tp) CloseAll();

lo trasladó a la reclamación. Es así.

   op=CalculateProfit();
   if (op>=tp)
   {
         CloseAll();    
   }

Entonces tiré la descripción de la variable op al principio y la sustituí por esto

   if (CalculateProfit()>=tp) CloseAll();

Al principio de la función OnTick hay un par de líneas. Esto es para asegurar que el procesamiento se realiza sólo una vez por barra en lugar de cada tick

   if(timeprev == Time[0]) return;   // сравнить  время начала последнего бара с временем обработанного бара. Если равны, то выход
   timeprev = Time[0];               // Запомнить время начала следующего бара      На часовом и далее это будет слабо

A continuación se calcula la MA. Esto debe ser estudiado en detalle. Para ello hice un script y mostré el resultado

   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
//+-------------------------------------------------------+
//| Проверка функции iMA                         PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  int MaPeriod=200;
  int MaShift=1;

  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));

  Alert("-------------------------");
  MaShift=0;
  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));
} 

Podemos ver que el cuarto parámetro MaShift y el último se suman, es decir, número de barra = su suma. Toma MA a partir del compás 2, tercero desde el final.

Lo estudiaré más a fondo. ¿Interesado?

 
STARIJ:
...

Seguiré buscando. ¿Interesado?

¿Sigues sacando el tema?

Ya está bien, la gente sigue el tema para los que están interesados y se desperdicia.

Si quieres que una persona te responda, llámala al hilo. Así: @STARIJ. Pero no hace falta que sigas sacando el tema editando tu último post.


 
Victor Nikolaev:

Significa que alguien no tiene suerte. Una vez más. Esto es un script, no un Asesor Experto o indicador

Lo resolví - aparentemente el terminal no tenía suficiente memoria - cerré un par de gráficos y funcionó.

Gracias - efectivamente, los cálculos tienen lugar.

Y si las variables no son de tipo int, sino bool, ¿qué hacer?

 

Hola, podría decirme por favor:

1 - ¿El registro es sólo como persona física o puede ser también como persona jurídica y existen restricciones y condiciones?

2 - ¿Hay alguna sincronización con las redes sociales, para tener una sola cuenta (nombre de usuario y contraseña)

3 - También vi una función "poner un widget en su página, compartir la señal" - estamos hablando del sitio o algo más


 
Hola, hace poco que he empezado a aprender Mql4. Si le he hecho una pregunta en el lugar equivocado, por favor diríjame al tema correcto. Mi pregunta es la siguiente: cómo trabajar con indicadores que construyen varias zonas, rectángulos, etc. Puedo programar un cruce de líneas o el precio más alto o más bajo, por ejemplo, MA.) Adjunté un indicador en la parte inferior, el buffer es cuatro y hay ocho tipos de zonas. Así que en realidad no puedo averiguar cómo codificar una ruptura o ruptura de estas zonas.
Archivos adjuntos:
 
STARIJ:

Al ver el gráfico del depósito, me interesé y descargué la primera versión. Lo he copiado en MetaEdit. Tengo dos advertencias. La primera, la he eliminado sustituyendo int timeprev=0; por datetime timeprev=0; Porque esta variable contiene fecha. El segundo apunta a

*

Respuesta

Tal vez, tiene que ver con el hecho de que el TP era de tipo int en la lección de vídeo, pero lo he convertido a doble y por lo tanto int timeprev sigue siendo como es. Vale, lo arreglaré, pero ¿cómo afecta al funcionamiento del EA? De hecho, estas barras y el tiempo eran relevantes para la función TrailingStop del video tutorial, pero desde que reemplacé esta función con la mía propia, simplemente permanece como una reliquia del código fuente y de hecho mi trailing stop no se basa en el tiempo de la barra.


He eliminado las tres últimas líneas. Se traduce limpiamente. Fui más allá...

Lo he cambiado (para aclararlo he adjuntado un script - ejecútalo, lo explicará) así

Este es el resultado

*Respuesta.

¿Dónde ha ido a parar este trozo de código?

   return(INIT_SUCCEEDED);
  }

¿Tal vez debería ser así?


void OnInit()

{

if(Dígitos == 3 || Dígitos = 5)

{

Paso *= 10;

TrailingStep *= 10;

TrailingStop *= 10;

Deslizamiento *= 10;

}

return(INIT_SUCCEED);

}

Pero, ¿por qué has hecho TakeProfit de tipo int? Significa que será el beneficio en puntos, mientras que la función CalculateProfit() es de tipo double, así que he hecho TakeProfit del mismo tipo para que sean coherentes.


He borrado esta función - no hay llamadas a ella y su cuerpo está vacío

*

Respuesta

En el código, está la función void CloseAll(). Pensé que estaba relacionado de alguna manera con esta función

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

*

Respuesta

Ok, vamos a quitarlo.


Intenté ejecutarlo y lo vi:

Fue

haciendo cambios - bueno, sólo añadí comentarios y eliminé extern de Magic

*

Respuesta

Sí, tal vez extern es redundante porque nunca lo he cambiado y tampoco Slippage - es todo desde el código fuente del video tutorial

- lo cambiamos sólo cuando se ejecuta el EA en dos gráficos con la misma herramienta y el deslizamiento - ¿por qué cambiar este parámetro? Luego lo pensé y aumenté los parámetros 10 veces. Y he eliminado la función OnInit. Al fin y al cabo, sólo uso el código de cinco dígitos. ¿Por qué? Porque la diferencia de cuatro dígitos es de 3 puntos, así que es de 30. En un diferencial de cinco dígitos, sólo son 12.

*

La respuesta es .

Esta es la configuración por defecto para que el EA funcione en todas las divisas. Me quedaré con Oninit ().

se hizo más claro.

He recortado la cabecera en la parte superior. Esto es lo que he dejado:

*

Respuesta

Esta cabecera está hecha por el editor por defecto. Lo dejaré como estaba, por si algo no pasa en el broker o en el terminal por la ausencia de estas líneas.

He movido esta línea

se trasladó a la reclamación. Fue así

Entonces eliminé la descripción de la variable op al principio y la sustituí por

*

Respuesta

Es bastante lógico.



Al principio de la función OnTick, hay un par de líneas. Esto es para asegurar que el procesamiento se realiza sólo una vez por barra en lugar de cada tick

A continuación se calcula la MA. Esto debe ser estudiado en detalle. Para ello he hecho un script y he sacado el resultado.


Puedes ver que el cuarto parámetro MaShift y el último parámetro se suman, es decir, número de barra = su suma. Tomamos el MA del compás 2, el tercero desde el final.

*

Respuesta

Debido al hecho de que he cambiado trailing - fecha-tiempo Media móvil no es relevante creo. Es una reliquia del código fuente, solía intentar rastrear por la última de las 3 (tres) órdenes abiertas. La cosa es que si el mercado va en una dirección equivocada por el valor de STep, el EA abre una contraorden y luego si el mercado sigue yendo en dirección contraria, se añade una tercera orden del tipo de la segunda posición, O viceversa, si el precio volvió a la dirección, entonces la tercera orden se abrirá con el primer tipo de orden (compra o venta). Allí, el trailing se realiza en tres órdenes utilizando la función CalculateProfit(); sin embargo, si la primera orden se abre con éxito y el precio se mueve como debería, en esta situación, el trailing en la barra se haría utilizando datetime como en el video tutorial - repito, incluso en 1 orden trailing utilizando la función calculateprofit()

Lo estudiaré más a fondo. ¿Interesado?

*

Respuesta

Sí, tengo algunos problemas con la pesca de arrastre. Parece que sigue la pista pero no quiero que nadie entienda lo que he hecho con ella. Las funciones Trailing() sin barras y datetime - funciona con Trailing().

El periodo MA es de unos 200, pero la cuestión es que es un valor ajustable. Y parece que falta el parámetro clave Valor - he explicado su significado en la descripción del archivo README.



Gracias por tomarse la molestia de todo esto. De hecho, el Asesor Experto no es realmente tan bueno, mecánico diría yo. Pero, básicamente, si lo configuras y supervisas de vez en cuando su trabajo, puede ser bastante bueno. El tiempo lo dirá. Probablemente, pueden ganar algo, pero se irán a la quiebra sin ni siquiera pestañear y no enviarán un mensaje de texto. Ni siquiera me he molestado con él, aunque mi idea era enviar un SMS si el drawdown es más del 30% del depósito ha sucedido - esto significa que 3 órdenes ya se han abierto y el mercado comenzó contra-movimiento, en esta situación, huele a parafina. Todos los demás casos son resueltos por el Asesor Experto, si se ajusta al historial de comportamiento del gráfico del instrumento comercial.


He hecho los cambios recomendados (pero no todos) en el código en el Bloc de notas por ahora. Por favor, compruebe si he corregido el código.

Estoy a favor de la optimización, sólo que no he considerado los momentos en que se ha eliminado oninit - lo necesito para poder probar y trabajar en todas las monedas)))

Archivos adjuntos:
 
Aleksandr Verkhozin:
Hola, hace poco que he empezado a aprender Mql4. Si le he hecho una pregunta en el lugar equivocado, por favor diríjame al tema correcto. Mi pregunta es la siguiente: cómo trabajar con indicadores que construyen varias zonas, rectángulos, etc. Puedo programar un cruce de líneas o el precio más alto o más bajo, por ejemplo, MA.) Adjunté un indicador en la parte inferior, el buffer es cuatro y hay ocho tipos de zonas. Así que no puedo averiguar cómo codificar una ruptura o ruptura de estas zonas.

Si quieres saber cómo hacerlo, deberías mirar los ejemplos de programación, pero no sabes cómo hacerlo. Se puede preguntar: ¿Cómo se pasa mucho tiempo con el programador mql4, pero no se sabe cómo hacerlo). Tal vez progreses.
 

geratdc:

...
Sí, tengo algunas preguntas sobre la red de arrastre. Parece que se arrastra, pero nadie quiere saber lo que he hecho con él.

...

Si lo sabéis, justo en este hilo he colgado una plantilla para la red de arrastre que utiliza en sus cálculos el valor del indicador que se le envía. Búscalo, no seas perezoso.
 
geratdc:

Es posible que tengas que descargar los videotutoriales de programación de mql4 de TradeLikeApro en RuTracker. Creo que el principio básico de mql4 es que no hay que hacer nada complicado y no hay que hacer nada en absoluto). Tal vez progreses.


He visto el vídeo sobre el trabajo con el indicador externo, escribí un poco de código para ver los valores de los buffers en el probador:

void OnTick()

{

double Buf1=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",0,1);

double Buf2=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",1,1);

double Buf3=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",2,1);

double Buf4=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",3,1);

Comment("Buf1=",Buf1,"\n", "Buf2=",Buf2,"\n","Buf3=",Buf3,"\n","Buf4=",Buf4);

}

Las zonas aparecen y desaparecen en el modo de visualización. Pero el valor de los búferes es siempre cero de todos modos. ¿No hay forma de formalizar estas zonas en el código?

¿Tal vez haya una función, distinta de iCustom, que sea adecuada para estos indicadores? ¿Tal vez alguien ha escrito búhos con tales indicadores?