Autoaprendizaje del lenguaje MQL5 desde cero - página 14

 
MrBrooklin:

En el futuro, según el plan de autoestudio, la tarea consiste en modificar el guión paso a paso, a saber

  1. añadir Stop Loss y Take Profit;
  2. añadir el final;
  3. añadir el máximo riesgo;
  4. ampliar la gama de órdenes pendientes.
Atentamente, Vladimir.
Desde luego es una pena que no hayas seguido los consejos del tutorial. Aprenderás a poner líneas, órdenes, etc., pero de todas formas no podrás escribir una estrategia, porque no tienes una base teórica. Todas estas líneas y scripts no te ayudarán a entender las cosas básicas de la programación, y no podrás llegar lejos sin ellas. Los primeros 4 meses los pasé aprendiendo, sin intentar escribir nada. Por supuesto, podría haberlo hecho descaradamente, como tú, pero la calidad de esos conocimientos es baja: hay muchas lagunas en lo básico, que habrá que llenar en el futuro...
 
Реter Konow:
Por supuesto, no deberías haber seguido los consejos del tutorial. Puede que tengas los conocimientos de cómo establecer líneas, órdenes, etc., pero de todas formas no podrás desarrollar la estrategia, porque no tienes la base teórica. Todas estas líneas y scripts no te ayudarán a entender las cosas básicas de la programación, y no podrás llegar lejos sin ellas. Los primeros 4 meses los pasé aprendiendo, sin intentar escribir nada. Claro que podría haberlo hecho descaradamente, como tú, pero la calidad de esos conocimientos es pobre. Siempre hay lagunas en lo básico, que tendrán que llenarse en el futuro...

¡Hola, Peter! Estudio el libro de texto cuando lo necesito, es decir, cuando veo una laguna en mis conocimientos. Ahora, creo que tendré que hacer una pequeña pausa y estudiar el libro de texto más detenidamente. Todas las recomendaciones de los participantes en el foro son tenidas en cuenta y estoy tratando de ceñirme a ellas. Y ahora me sorprende que haya conseguido escribir algo utilizando sólo el libro de referencia MQL5 durante tan poco tiempo.

Saludos, Vladimir.

 
MrBrooklin:

¡Buenas noches a todos y buen humor!

Estoy pegando un nuevo script New6.mq5 que le ayuda a colocar una orden pendiente SellStop y una BuyStop con un tamaño de lote fijo a una cierta distancia del precio actual en el gráfico actual. En este script, he intentado describir todo como prometí antes, de forma clara y comprensible para un programador de primer grado.

¡Utilicé la información tomada de la Referencia MQL5 sólo al escribir el script!

Saludos cordiales, Vladimir.

Este es un buen ejemplo. Sugiero utilizarlo como punto de partida. Lo básico.

MrBrooklin:

En el futuro, según el plan de autoestudio, la tarea consiste en modificar el guión paso a paso, es decir

  1. añadir Stop Loss y Take Profit;
  2. añadir el final;
  3. añadir el máximo riesgo;
  4. ampliar la selección de órdenes pendientes.
Atentamente, Vladimir.

No, no. No conecte todavía la nueva funcionalidad. Ahora mejora la lógica existente. Al mismo tiempo, deshacerse de los problemas en la implementación de la secuencia de comandos (que ya están mostrando). Si quieres saber qué hay que reescribir, te lo diré.

 
Vasiliy Sokolov:

Este es un buen ejemplo. Sugiero utilizarlo como punto de partida. Línea de base.

No, no. No introduzcas todavía ninguna nueva funcionalidad. Ahora mejore la lógica existente. Al mismo tiempo, se eliminan los problemas en la implementación de los scripts (que ya se están mostrando). Lo que hay que reescribir exactamente, si te interesa, te lo digo.

¡Hola Vasily! Por supuesto, dígame qué necesita reescribir, ¡sería interesante para mí!

Saludos, Vladimir.

 
MrBrooklin:

¡Hola Vasily! Por supuesto, dime qué necesitas reescribir, ¡estoy muy interesado!

Sinceramente, Vladimir.

Los programadores tienen dos problemas: los errores producidos por el compilador y los problemas de arquitectura. Mientras eres un novato, te concentras en pelearte con el compilador mientras tu objetivo final es un programa que funcione correctamente. Sin embargo, muy rápidamente un programa para principiantes se convierte en el llamado código espagueti, que el propio autor no puede descifrar pronto. Por eso te sugiero que no te centres en el compilador y en la corrección del script final, sino en cuestiones de arquitectura. Es como aprender a tocar el piano: primero se aprende a sujetar los dedos correctamente y a sentarse ante el instrumento de forma adecuada, nadie exige tocar a Bach a un principiante.

//+------------------------------------------------------------------+
//|                                                         New6.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"
//---
#property script_show_inputs
//---

#define       orderType1 "BUY_STOP"   //Тип ордера UP
#define       orderType2 "SELL_STOP"  //Тип ордера DOWN
input int    Distance=100;           //Отступ отложенного ордера от текущей цены
input double Lots=0.01;              //Фиксированный размер лота
input long   Pending_magic=86513;    //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()                                                    
  {
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
   request.action=TRADE_ACTION_PENDING;
   request.symbol=Symbol();
   request.volume=Lots;
   request.deviation=2;
   request.magic=Pending_magic;
   double price;
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   if(orderType1=="BUY_STOP")
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   if(orderType2=="SELL_STOP")
     {
      request.type=ORDER_TYPE_SELL_STOP; 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

Tiene dos grupos de parámetros que determinan el comportamiento de su script: el primero se establece estáticamente, como una macro. El segundo lo establece el usuario al cargar el script en el gráfico. Ahora el usuario no podrá seleccionar el tipo de pedido a realizar sin recompilar este script. Esto no es bueno. Por lo tanto, sería mejor abandonar estas macros en favor del parámetro adicional:

enum ENUM_ORDER_TYPE_FLAGS
{
    BuyStop = 1,                // Только BuyStop
    SellStop = 2,               // Только SellStop
    BuyStopAndSellStop = 4      // BuyStop и SellStop
};

input ENUM_ORDER_TYPE_FLAGS TypeSendOrders = BuyStop;   // Тип Выставляемого ордера(ов)

En consecuencia, hemos definido una nueva enumeración, que hemos implementado como parámetro de selección para el usuario.

 
Vasiliy Sokolov:

Los programadores tienen dos problemas: los errores del compilador y los problemas de arquitectura. Mientras eres un principiante, te centras en luchar contra el compilador, y tu objetivo final es un programa que funcione correctamente. Sin embargo, muy rápidamente un programa para principiantes se convierte en el llamado código espagueti, que el propio autor no puede descifrar pronto. Por eso te sugiero que no te centres en el compilador y en la corrección del script final, sino en cuestiones de arquitectura. Es como aprender a tocar el piano: primero se aprende a sujetar los dedos correctamente y a sentarse ante el instrumento de forma adecuada, nadie exige tocar a Bach a un principiante.

Tiene dos grupos de parámetros que determinan el comportamiento de su script: el primero se establece estáticamente, como una macro. La segunda la establece el usuario al cargar el script en el gráfico. Ahora el usuario no podrá seleccionar el tipo de pedido a realizar sin recompilar este script. Esto no es bueno. Por lo tanto, sería mejor abandonar estas macros en favor del parámetro adicional:

En consecuencia, hemos definido una nueva enumeración, que hemos implementado como parámetro de selección para el usuario.

Estupendo, de hecho, me has impulsado lo que está escrito en el paso 4 de la modificación paso a paso del script, es decir, ampliar la selección de órdenes pendientes.

Gracias.

Saludos, Vladimir.

 

El siguiente problema con su código es que se extiende en una larga hoja de procedimiento. Todos los principiantes escriben así. Y este es un problema que les acompaña durante años. Aprende a dividir tu algoritmo en partes, empezando por lo más básico como este script. Hay dos maneras de hacerlo: mediante funciones y clases. El concepto de clases es demasiado difícil de entender al principio, así que te sugiero que te centres en trabajar con funciones. Piensa en la importancia de las funciones:

  • Todo el código escrito en MQL (y esto es todos los scripts, indicadores y Asesores Expertos en CodeBase por ejemplo) está dentro de las funciones del sistema o dentro de las funciones del usuario.
  • Cualquier código MQL llama a docenas de funciones MQL incorporadas. Toda la interacción con MetaTrader y su entorno comercial se lleva a cabo a través de la llamada de tal o cual función del sistema.
  • Cualquier función que no dependa de parámetros externos devuelve siempre el mismo resultado. Esta función puede copiarse simplemente de un script/indicador/consejero a otro y funcionará correctamente. En cambio, copiar un trozo arbitrario de código procedimental es poco probable que funcione.
  • Puedes escribir cualquier función personalizada que haga un trabajo útil. Y al hacerlo, ampliará la funcionalidad estándar de MQL de la manera que usted necesita. Por ejemplo, usted piensa: "Qué bueno sería que MQL tuviera esa función....". - Pero, ¿por qué no lo escribe usted mismo?
 
Vasiliy Sokolov:

El siguiente problema con su código es que se extiende en una larga hoja de procedimiento. Todos los principiantes escriben así. Y este es un problema que les acompaña durante años. Aprende a dividir tu algoritmo en partes, empezando por lo más básico como este script. Hay dos maneras de hacerlo: mediante funciones y clases. El concepto de clases es demasiado difícil de entender al principio, así que te sugiero que te centres en trabajar con funciones. Piensa en la importancia de las funciones:

  • Todo el código escrito en MQL (y esto es todos los scripts, indicadores y Asesores Expertos en CodeBase por ejemplo) está dentro de las funciones del sistema o dentro de las funciones del usuario.
  • Cualquier código MQL llama a docenas de funciones MQL incorporadas. Todas las interacciones con MetaTrader y su entorno comercial se llevan a cabo a través de la llamada de una función del sistema.
  • Cualquier función que no dependa de parámetros externos devuelve siempre el mismo resultado. Esta función puede copiarse simplemente de un script/indicador/consejero a otro y funcionará correctamente. En cambio, copiar un trozo arbitrario de código procedimental es poco probable que funcione.
  • Puedes escribir cualquier función personalizada que haga un trabajo útil. Y al hacerlo, ampliará la funcionalidad estándar de MQL de la manera que usted necesita. Por ejemplo, usted piensa: "Qué bueno sería que MQL tuviera esa función....". - Pero, ¿por qué no lo escribe usted mismo?

Gracias, Vasily, por un consejo tan completo. Sin duda lo tendré en cuenta y trataré de hacerlo lo mejor posible.

Saludos, Vladimir.

 
Vasiliy Sokolov:

El siguiente problema con su código es que se extiende en una larga hoja de procedimiento. Todos los principiantes escriben así. Y este es un problema que les acompaña durante años. Aprende a dividir tu algoritmo en partes, empezando por lo más básico como este script. Hay dos maneras de hacerlo: mediante funciones y clases. El concepto de clases es demasiado difícil de entender al principio, así que te sugiero que te centres en trabajar con funciones. Piensa en la importancia de las funciones:

  • Todo el código escrito en MQL (y esto es todos los scripts, indicadores y Asesores Expertos en CodeBase por ejemplo) está dentro de las funciones del sistema o dentro de las funciones del usuario.
  • Cualquier código MQL llama a docenas de funciones MQL incorporadas. Toda la interacción con MetaTrader y su entorno comercial se lleva a cabo a través de la llamada de tal o cual función del sistema.
  • Cualquier función que no dependa de parámetros externos devuelve siempre el mismo resultado. Esta función puede copiarse simplemente de un script/indicador/consejero a otro y funcionará correctamente. En cambio, copiar un trozo arbitrario de código procedimental es poco probable que funcione.
  • Puedes escribir cualquier función personalizada que haga un trabajo útil. Y al hacerlo, ampliará la funcionalidad estándar de MQL de la manera que usted necesita. Por ejemplo, usted piensa: "Qué bueno sería que MQL tuviera esa función....". - Pero, ¿por qué no lo escribe usted mismo?
Vasily, el hombre aún no domina las matrices. Es demasiado pronto para que escuche esas conferencias).
 
Реter Konow:
Vasily, el hombre aún no domina las matrices. Es demasiado pronto para que escuche esas conferencias).

Peter, todos los consejos constructivos son importantes para mí, incluidos los tuyos.

Saludos, Vladimir.