Autoaprendizaje del lenguaje MQL5 desde cero - página 58

 
MrBrooklin:

He creado una plantilla estándar. Es donde empecé a escribir el código, y aquí he empezado a publicar los fragmentos ya escritos. No había pensado en el marco del algoritmo con mis propias funciones, ¡gracias por el consejo! ¡También gracias por el consejo sobre la cuenta de red!


Existe una técnica de alfabetización que permite escribir de forma muy rápida e inteligible.

En general, en estilo literario, escribe en los comentarios lo que vas a hacer (sólo la secuencia directa principal)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

Básicamente todo. Además, después de cada comentario se escribe un código de 3-5 (un poco en general) líneas. Toda su función, de principio a fin, debe caber en la pantalla que ve. Si obtienes más, significa que los fragmentos deben ser separados en funciones/métodos separados.

Cuando una cosa tan elemental empieza a funcionar en el probador, se puede generalizar, añadir condiciones de la vida real, cambio de paso o frecuencia por ejemplo, tener en cuenta las condiciones del mercado, no hay límite a la perfección...

 
Maxim Kuznetsov:

abstracto, existe una técnica de alfabetización que permite escribir con gran rapidez y claridad.

En general, en estilo literario, escribe en los comentarios lo que vas a hacer (sólo la secuencia directa principal)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

Básicamente todo. Además, después de cada comentario se escribe un código de 3-5 (un poco en general) líneas. Toda su función, de principio a fin, debe caber en la pantalla que ve. Si obtienes más, significa que los fragmentos deben ser separados en funciones/métodos separados.

Cuando una cosa tan elemental empieza a funcionar en el probador, se puede generalizar, añadir condiciones de la vida real, cambio de paso o frecuencia por ejemplo, tener en cuenta las condiciones del mercado, no hay límite a la perfección...

¡Hola Maxim! ¡Eres muy útil con tu consejo! Estoy aquí sentado preguntándome cómo rellenar una plantilla estándar de EA.

Saludos, Vladimir.

 
MrBrooklin:

Estimados expertos en programación

Por favor, explique dos cuestiones:

  1. Primera pregunta sobre el Número Mágico - ¿se crea en los parámetros de entrada sólo para las órdenes pendientes y las posiciones abiertas (o sólo para las posiciones abiertas?), o para el propio EA se puede crear también? Si la respuesta es "sí", con qué propósito debe hacerse. Realmente me he confundido con esta pregunta y no tengo una buena respuesta.
  2. La segunda pregunta sobre el Número Mágico - si hay más de una posición abierta en el gráfico actual, entonces es posible aplicar tal parámetro de entrada para determinar cada posición:

Tal vez tengo una comprensión errónea de la aplicación de los números mágicos en la programación en absoluto.

Saludos, Vladimir.

Cuando una orden es aceptada para su ejecución todas sus características (símbolo, hora, tipo de orden, ticket) son asignadas por el terminal (solicitadas por el usuario y asignadas por el terminal) y no por el usuario y lo mismo con la posición, la posición almacena información sobre sus órdenes pero puede haber muchas. Y el número mágico es un identificador de usuario. Cita:

Cuando creamos una nueva solicitud pendiente, necesitamos marcarla de alguna manera - para que el programa pueda saber que esta orden particular fue colocada por NAMI en esta solicitud pendiente particular - es decir, necesitamos identificar y asociar de manera única una orden o posición con una solicitud pendiente particular.

NAMI falta en el significado. Y entonces Artem pone la clasificación de las órdenes en el número de Magik. Por qué no, los 2 primeros dígitos indican algo, por ejemplo, el tipo de pedido, los 4 dígitos siguientes indican la fecha del pedido.

En cuanto al algoritmo de algo. Definir inicialmente las condiciones iniciales. Hay órdenes en nuestro símbolo y no las tenemos en cuenta o las tenemos en cuenta. Sin condiciones iniciales retrabajo al crear el algoritmo, y más aún el código puede ser eterno)

 
Maxim Kuznetsov:

abstracto, existe una técnica de alfabetización que permite escribir con gran rapidez y claridad.

En general, estilo alfabetización-programación, escribe en los comentarios lo que vas a hacer (sólo la secuencia directa principal) ...

... Básicamente todo. A continuación, después de cada comentario se escribe código de 3 a 5 (no mucho en general) líneas. Toda la función, desde el principio hasta el final, debe caber en la pantalla que ves. Si se obtienen más, significa que hay que separar los fragmentos en funciones/métodos distintos.

Maxim, por favor, comprueba si he entendido bien tu sugerencia o hay algo más que deba añadir. Me refiero a la parte de la prueba, porque aún no he escrito los códigos.

Saludos, Vladimir.

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры: "Уровень перестановки Stop Loss в безубыток" и "Шаг трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---

// 1. берём позицию Buy
// 2. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 4. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 
MrBrooklin:

Maxim, por favor, mira si he entendido bien tu sugerencia, o hay algo más que deba añadir? Me refiero a la parte de la prueba, aparte de los códigos.

Sinceramente, Vladimir.

Condiciones iniciales. Calculamos que hay una posición en nuestro símbolo y la vemos en el gráfico.

Si tenemos una posición, es sólo una, ya sea comprar o vender. Por lo tanto, empezamos por buscar posiciones en nuestro símbolo. Solicitar / obtener características. Determinación del tipo de posición: comprar o vender. Y así sucesivamente a través del texto.

 
Valeriy Yastremskiy:

Cuando una orden es aceptada para su ejecución todas sus características (símbolo, hora de emisión, tipo de orden, ticket) son asignadas por el terminal (solicitadas por el usuario y asignadas por el terminal), no por el usuario, y lo mismo con la posición, la posición almacena información sobre sus órdenes, pero pueden ser muchas. Y el número mágico es un identificador de usuario. Cita:

Cuando creamos una nueva solicitud pendiente, necesitamos marcarla de alguna manera - para que el programa pueda saber que esta orden particular fue colocada por NAMI en esta solicitud pendiente particular - es decir, necesitamos identificar y asociar de manera única una orden o posición con una solicitud pendiente particular.

NAMI falta en el significado. Y entonces Artem pone la clasificación de las órdenes en el número de Magik. Por qué no, los 2 primeros dígitos indican algo, por ejemplo, el tipo de pedido, los 4 dígitos siguientes indican la fecha del pedido.

En cuanto al algoritmo de algo. Definir inicialmente las condiciones iniciales. Hay órdenes en nuestro símbolo y no las tenemos en cuenta o las tenemos en cuenta. Sin las condiciones iniciales retrabajo al crear el algoritmo, y más aún, el código puede tomar para siempre)

Gracias, Valeriy, por la detallada respuesta. Muchas cosas se han aclarado. Opino lo mismo sobre el algoritmo, pero Vassily ya ha explicado por qué no necesitamos el Número Mágico en este EA.

Saludos, Vladimir

 
MrBrooklin:

Gracias, Valery, por la detallada respuesta. Ha aclarado mucho. Tengo la misma opinión sobre el algoritmo, pero Vasiliy ya ha explicado por qué no necesitamos Magic Number en este EA.

Sinceramente, Vladimir.

Abrimos un gráfico y hay una posición en el símbolo del gráfico, no sabemos cuál es y queremos abrirla en el punto de equilibrio y luego arrastrar el SL para reducir las pérdidas en caso de que el precio se revierta.

 

Con las correcciones de Valery, la plantilla de EA con comentarios ha adquirido un nuevo aspecto.

Saludos, Vladimir.

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// установим входные параметры для "Уровня перестановки Stop Loss в безубыток" и "Шага трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---
// 1. ищем все позиции на текущем символе:
//    - отправляем запрос на сервер и получаем характеристики открытых позиций
//    - определяем тип открытой позиции - Buy или Sell 
// 2. берём позицию Buy
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 4. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 5. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 

Vladimir, no tienes que aprovecharlo por mucho tiempo. Pasemos a la acción. He escrito una plantilla de la cola deseada para usted:

//+------------------------------------------------------------------+
//|                                                  TestingTral.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MrBrooklin"
#property link      "http://www.mql5.com"
#property version   "1.00"
input double BreakevenValue = 100.0; // Величина безубытка, в пунктах инструмента
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //-- Выбираем позиции по текущему символу. Если позиции нет выбирать нечего - выходим
   if(!PositionSelect(Symbol()))
      return;
   //-- Стоп-лосс длинной позиции переставляем в безубыток и тралим его
   if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
   {
      SetBreakevenForBuyPosition();
      TrailingStopLossForBuyPosition();
   }
   //-- Стоп-лосс короткой позиции переставляем в безубыток и тралим его
   else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
   {
      SetBreakevenForSellPosition();
      TrailingStopLossForSellPosition();
   }
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции BUY в безубыток                         |
//+------------------------------------------------------------------+
void SetBreakevenForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции SELL в безубыток                        |
//+------------------------------------------------------------------+
void SetBreakevenForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+

Todo lo que hay que hacer es llenar las funciones con la lógica correspondiente a sus nombres. Como puedes ver la plantilla es elemental. Y estructuralmente similar al TdR.

Observa que este código compila, es decir, desde el punto de vista del compilador, es correcto. Esfuérzate siempre por alcanzar este estado: es decir, haz pequeños cambios durante el desarrollo, para que después de hacerlos, el código pueda compilar. También se esfuerza por que el compilador informe "0 error, o advertencias". Está claro que no se puede ejecutar el programa con errores, pero las advertencias del compilador deben ser percibidas como nuestra Oración del Padre: si hay una advertencia debe ser corregida. Esta plantilla está hecha con "0 error, o advertencias" - guarde este estado hasta el final del desarrollo.

Una vez que hemos entendido la lógica y hemos entendido el compilador, lo único que tenemos que hacer es dotar a las funciones de la lógica que necesitamos.

El segundo parámetro, el valor del rastro, se trasladará por ahora a la próxima versión. Requerirá cálculos adicionales. Por eso no está presente en esta plantilla. La red de arrastre se levantará cada vez que haya una garrapata.

 
Vasiliy Sokolov:

Vladimir, no tienes que aprovecharlo por mucho tiempo. Pasemos a la acción. He escrito una plantilla de la cola deseada para usted:

Lo único que hay que hacer es llenar las funciones con la lógica correspondiente a sus nombres. Como puedes ver la plantilla es elemental. Y estructuralmente similar al TdR.

Observa que este código compila, es decir, desde el punto de vista del compilador, es correcto. Esfuérzate siempre por alcanzar este estado: es decir, haz pequeños cambios durante el desarrollo, para que después de hacerlos, el código pueda compilar. También se esfuerza por que el compilador informe "0 error, o advertencias". Está claro que no se puede ejecutar el programa con errores, pero las advertencias del compilador deben ser percibidas como nuestra Oración del Padre: si hay una advertencia debe ser corregida. Esta plantilla está hecha con "0 error, o advertencias" - guarde este estado hasta el final del desarrollo.

Una vez que hemos entendido la lógica y hemos entendido el compilador, todo lo que tenemos que hacer es equipar las funciones con la lógica que necesitamos.

El segundo parámetro, el valor del rastro, se trasladará por ahora a la próxima versión. Requerirá cálculos adicionales. Por eso no está presente en esta plantilla. La red de arrastre se actualizará cada vez que haya una garrapata.

Vasiliy, por supuesto que quiero agradecerte tu trabajo, pero no me ayuda a entender de dónde vienen estas funciones y operadores y, sobre todo, por qué están ahí. Hubiera sido más correcto llegar al punto de escribir ese código, que me has sugerido. Tenía muchas ganas de llegar a este punto y ahora quiero hacerlo.

Comprendo que tú, como muchos otros, estés cansado de que te deletree constantemente todas las líneas de código y te atropelle, pero el problema es que todavía no entiendo cómo se construye todo, desde el algoritmo hasta la escritura del código. Debo añadir la falta de conocimiento del inglés al problema, porque tengo que copiar y pegar casi todos los mensajes de error y advertencia del compilador, y otras palabras en inglés en el Google Translator. Por cierto, si alguien intentó ejecutar esos micro, incluso nano-códigos que publiqué en este hilo, todos pasaron la compilación con "0 error, 0 advertencias".

Ahora necesito algo de tiempo para darme cuenta, o más bien para entender por qué han aparecido estas funciones y operadores. Así que, en resumen, es un horror silencioso. Y soy un mal estudiante cuando no entiendo las cosas elementales.

Gracias a ti y a todos los demás programadores por tolerar mi lentitud. Aunque me doy cuenta de que su paciencia no es ilimitada.

Sinceramente, Vladimir.

Razón de la queja: