Discusión sobre el artículo "Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes" - página 29

 
El archivo dentro de la descarga es incorrecto, por favor, arréglelo.
 

Hola a todos,

Actualmente tengo el EA de Samuel funcionando en una cuenta demo y estoy bastante satisfecho. ¡Buena programación!

Muestra buenas operaciones de vez en cuando, pero tiene un punto débil:

Las opciones de VENTA se acumulan en los puntos de inflexión en el valle de los gráficos y lo mismo en los picos correspondientes con las opciones de COMPRA, que luego golpean primero los libros masivamente como negativos. Me gustaría reprogramar esto, es decir, COMPRAS en el día, VENTAS en el pico, y hasta ahora mis intentos han fracasado. También sólo tengo un conocimiento rudimentario de MQL5.

¿Puede alguien ayudarme?

¡SG y muchas gracias!

 

Esto no suele funcionar porque los otros puntos en los que el EA toma una posición rentable también se invierten ....

Pero lea esto:

Especificaciones de EA-freelancer : https://www.mql5.com/es/articles/4368
Indi : https://www.mql5.com/es/articles/4304
Cómo Ordenar un Robot de Trading en MQL5 y MQL4 : https://www.mql5.com/es/articles/117

Con las pistas que hay ahí puedes concretar más tu idea, ya sea sólo para que veas si funciona, o ya sea para pedirle a alguien que lo haga, con o sin pago.

So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
  • www.mql5.com
Handeln Sie nach Ihrer eigenen Strategie? Wenn Sie Ihre Handelsregeln formalisieren und als Algorithmus für ein Programm beschreiben können, wäre es doch besser, Ihren Handel einem automatisierten Expert Advisor anzuvertrauen. Ein Roboter braucht weder Schlaf noch Nahrung und ist keinen menschlichen Schwächen unterworfen. In diesem Artikel zeigen wir Ihnen, wie Sie, um einen Handelsroboter im Freelance-Service in Auftrag zu geben, das sogenannte Pflichtenheft erstellen.
 

Hola a todos (Especialmente el querido autor)

He codificado junto con este artículo. Lo disfruté mucho y aprendí mucho de él.

Gracias por escribir un artículo tan informativo.

Sin embargo tengo un problema. Mi EA no coloca ninguna orden. He descargado el código del autor, pero no colocó ninguna orden también.

Dado que el artículo es 13 años de edad, supongo que el código es ahora obsoleto. ¿Alguien puede ayudarme?

Mi código está en el archivo de abajo. Gracias de antemano.

Archivos adjuntos:
myFirstEA.mq5  25 kb
 

Hola, quiero avisar que soy principiante, así que no digan muchas palabrotas si acaso).

Quería crear un Asesor Experto a través del generador (y todo parece ir bien, pero hay un pero)

Me gustaría abrir una operación no inmediatamente después de que se cierre la anterior, sino por ejemplo después de una vela,

He intentado escribir algo, pero al final da error.

¿Puede alguien ayudarme con esto, o indicarme cual es el error y como solucionarlo?

y aqui esta el codigo actual:


//+------------------------------------------------------------------+

//| ParExpert.mq5 //|

//| Copyright 2022, MetaQuotes Ltd. | | |

/ /| http s://www.mql5.com

//+------------------------------------------------------------------+

#property copyright "Copyright 2022, MetaQuotes Ltd."

#property link"https://www.mql5.com"

#property version "1.00"

//+------------------------------------------------------------------+

//| Incluir |

//+------------------------------------------------------------------+

#include <Expert\Expert.mqh>

//--- señales disponibles

#include <ExpertoSeñalSAR.mqh>

//--- señales disponibles

#include <Expert\Trailing\TrailingFixedPips.mqh>

//--- gestión monetaria disponible

#include <Expert\Money\MoneyFixedLot.mqh>

//+------------------------------------------------------------------+

//| Entradas |

//+------------------------------------------------------------------+

//--- entradas para el experto

input string Título_Experto = "ParExperto"; // Nombre del documento

ulong Expert_MagicNumber = 24195; //

bool Expert_EveryTick = false; //

//--- entradas para la señal principal

input int Señal_UmbralAbrir = 10; // Valor umbral de la señal a abrir [0...100]

input int Signal_ThresholdClose = 0; // Valor umbral de la señal para cerrar [0...100]

input double Signal_PriceLevel = 0.0; // Nivel de precio para ejecutar una operación

input double Signal_StopLevel = 500; // Nivel de Stop Loss (en puntos)

input double Signal_TakeLevel = 70; // Nivel de Take Profit (en puntos)

input int Signal_Expiration = 4; // Vencimiento de órdenes pendientes (en barras)

input double Signal_SAR_Step = 0.02; // Incremento de velocidad del SAR Parabólico(0.02,0.2)

input double Signal_SAR_Maximum = 0.2; // Parabolic SAR(0.02,0.2) Velocidad máxima

input double Señal_SAR_Peso = 0.6; // Parabólica SAR(0.02,0.2) Peso [0...1.0]

//--- entradas para trailing

input int Trailing_FixedPips_StopLevel = 0; // Nivel de Stop Loss (en puntos)

input int Trailing_FixedPips_ProfitLevel= 10; // Nivel de arrastre de Take Profit (en puntos)

//--- entradas para dinero

input double Money_FixLot_Percent = 10.0; // Porcentaje

input double Money_FixLot_Lots = 0.1; // Volumen fijo

//--- entradas para el enfriamiento de la operación

input int Expert_TradeCooldown = 1; // Periodo de enfriamiento entre operaciones (en barras)

//+------------------------------------------------------------------+

//| Objeto experto global

//+------------------------------------------------------------------+

CExpert ExtExpert;

//+------------------------------------------------------------------+

//| Función de inicialización del experto

//+------------------------------------------------------------------+

int OnInit()

{

//--- Inicialización del experto

if (!ExtExpert.Init(Symbol(), Period(), Expert_EveryTick, Expert_MagicNumber))

{

//--- fallido

printf(__FUNCTION__ + ": error inicializando experto");

ExtExpert.Deinit();

return (INIT_FAILED);

}


//--- Creando señal

CExpertSignal *signal = new CExpertSignal;

if (signal == NULL)

{

//--- error

printf(__FUNCTION__ + ": error creando señal");

ExtExpert.Deinit();

return (INIT_FAILED);

}


//---

ExtExpert.InitSignal(señal);

signal.ThresholdOpen(Señal_UmbralAbrir);

signal.ThresholdClose(Señal_UmbralCierre);

signal.PriceLevel(Nivel_Precio_señal);

signal.StopLevel(Signal_StopLevel);

signal.TakeLevel(Señal_TakeLevel);

signal.Expiration(Señal_Expiración);


//--- Creación del filtro CSignalSAR

CSignalSAR *filter0 = new CSignalSAR;

if (filter0 == NULL)

{

//--- fallido

printf(__FUNCTION__ + ": error al crear filter0");

ExtExpert.Deinit();

return (INIT_FAILED);

}

signal.AddFilter(filter0);


//--- Establece los parámetros del filtro

filter0.Paso(Señal_SAR_Paso);

filter0.Máximo(Señal_SAR_Máximo);

filter0.Peso(Señal_SAR_Peso);


//--- Creación del objeto trailing

CTrailingFixedPips *trailing = nuevo CTrailingFixedPips;

if (trailing == NULL)

{

//--- failed

printf(__FUNCTION__ + ": error creating trailing");

ExtExpert.Deinit();

return (INIT_FAILED);

}


//--- Añadir trailing al experto (se borrará automáticamente))

if (!ExtExpert.InitTrailing(trailing))

{

//--- fallido

printf(__FUNCTION__ + ": error inicializando trailing");

ExtExpert.Deinit();

return (INIT_FAILED);

}


//--- Establecer parámetros de trailing

trailing.StopLevel(Trailing_FixedPips_StopLevel);

trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);


//--- Creación del objeto dinero

CMoneyFixedLot *money = new CMoneyFixedLot;

if (dinero == NULL)

{

//--- fallido

printf(__FUNCTION__ + ": error creando dinero");

ExtExpert.Deinit();

return (INIT_FAILED);

}


//--- Añadir dinero al experto (se borrará automáticamente))

if (!ExtExpert.InitMoney(dinero))

{

//--- fallido

printf(__FUNCTION__ + ": error inicializando dinero");

ExtExpert.Deinit();

return (INIT_FAILED);

}


//--- Establecer parámetros de dinero

money.Porcentaje(Money_FixLot_Percent);

money.Lots(Money_FixLot_Lots);


//--- Comprobar todos los parámetros de los objetos de negociación

if (!ExtExpert.ValidationSettings())

{

//--- failed

ExtExpert.Deinit();

return (INIT_FAILED);

}


//--- Ajuste de todos los indicadores necesarios

if (!ExtExpert.InitIndicators())

{

//--- fallido

printf(__FUNCTION__ + ": error inicializando indicadores");

ExtExpert.Deinit();

return (INIT_FAILED);

}


//--- Inicializar la variable lastTradeTime

datetime lastTradeTime = 0;

ExtExpert.SetVariable("LastTradeTime", lastTradeTime);


//--- ok

return (INIT_SUCCEED);

}

//+------------------------------------------------------------------+

//| Función de desinicialización del experto |--- ok

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

ExtExpert.Deinit();

}

//+------------------------------------------------------------------+

//| Función manejadora del evento "Tick" |

//+------------------------------------------------------------------+

void OnTick()

{

//--- Comprueba el tiempo desde la última operación

datetime lastTradeTime = ExtExpert.GetVariable("LastTradeTime");

int cooldownBars = Bars - ExtExpert.GetBarShiftByTime(Symbol(), Period(), lastTradeTime);


if (cooldownBars < Expert_TradeCooldown)

{

//--- El periodo de enfriamiento de la operación no ha transcurrido, omite la apertura de una nueva operación

devolver;

}


ExtExpert.OnTrade();

}

//+------------------------------------------------------------------+

//| Función manejadora del evento "Trade" |

//+------------------------------------------------------------------+

void OnTrade()

{

ExtExpert.OnTrade();

}

//+------------------------------------------------------------------+

//| Función manejadora de eventos "Timer" |

//+------------------------------------------------------------------+

void OnTimer()

{

ExtExpert.OnTimer();

}

//+------------------------------------------------------------------+

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.05.27
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Joosy #:

Hola a todos😊

@Mario31415927

Esto es simplemente porque en el ticker, cada vez que un nuevo período o nueva barra (lo que sea) las variables:

se reinician, independientemente de si ya hay posiciones abiertas o no.

Esto se puede encontrar relativamente rápido en el código.

Sin embargo, surge la pregunta de si esto era lo que se pretendía y, en caso afirmativo, ¿cómo se vuelven a cerrar todas las posiciones?

¿Quizás no entiendo el tipo de orden TRADE_ACTION_DEAL en este contexto?

El proceso de la orden comercial también podría adaptarse simplemente a la clase comercial Trade. Como por ejemplo:

Saludos cordiales:-)

Leer: https://www.mql5.com/es/articles/232

Esto explica la diferencia y las relaciones entre órdenes, posiciones y operaciones. Estas últimas reflejan los procesos de registro en el lado del intermediario.

Handelsereignisse in MetaTrader 5
Handelsereignisse in MetaTrader 5
  • www.mql5.com
Eine Überwachung des aktuellen Status eines Handels-Account bedeutet offene Positions und Order kontrollieren zu können. Bevor ein Handelssignal zu einem Abschluss wird, sollte es vom Client-Terminal als Anfrage zum Handels-Server geschickt werden, wo es in eine Order-Warteschlange gestellt wird und auf seine Bearbeitung wartet. Eine Anfrage vom Handels-Server annehmen, sie löschen, wenn sie abläuft oder auf ihrer Grundlage einen Abschluss ausführen - alle diese Handlungen haben Handelsereignisse zur Folge, und der Handels-Server informiert das Terminal entsprechend darüber.
 
Carl Schreiber #:

Leer: https://www.mql5.com/es/articles/232

Esto explica la diferencia y las relaciones entre órdenes, posiciones y operaciones. Estas últimas reflejan los procesos de registro en el lado del intermediario.

Hola Carl

gracias por el consejo.

Sin embargo, debo corregirme.

Es cierto que las variables se restablecen para cada nuevo período de tiempo:

   bool Buy_opened = false, Sell_opened = false; // variables para mantener el resultado de la posición abierta

Pero posteriormente se establecen de nuevo si hay una posición en consecuencia.

   if(PositionSelect(_Symbol) == true) { // tenemos una posición abierta

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {

         Buy_opened = true;  //Es una Compra

      }

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) {

         Sell_opened = true; // Es una Venta

      }

   }

Sin embargo, estoy experimentando el fenómeno de que la compra (POSITION_TYPE_BUY) se consulta correctamente, pero no la venta (POSITION_TYPE_SELL). ¿Simplemente la variable ya no está activada?

Tengo que depurar el código paso a paso. Sólo puede tratarse de un error lógico😉 .

Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
  • www.mql5.com
Dieser Beitrag beschäftigt sich mit dem Objekt-orientierten Ansatz, um das zu machen, was wir bereits im Artikel "Schrittweiser Leitfaden zum Schreiben eines Expert Advisors in MQL5 für Anfänger" getan haben - einen einfachen Expert Advisor erstellen. Die meisten Menschen glauben, das sei schwer, doch ich darf Ihnen versichern: wenn Sie diesen Beitrag gelesen haben, dann können Sie Ihren eigenen Objekt-orientierten Expert Advisor schreiben.
 
Joosy #:
Venta_abierta = true; // Es una Venta

Vaya, qué espabilado estoy hoy.

Sólo se consulta una vez. Ese es el error;-)

Todas las posiciones deben buscarse de la siguiente manera;

   bool Buy_opened = false, Sell_opened = false; // variables para mantener el resultado de la posición abierta
   
   for(int i=0; i < PositionsTotal(); i++) {
      ticket = PositionGetTicket(i);
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == EA_Magic) {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { 
            Buy_opened = true; 
         }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { 
            Sell_opened = true; 
         }
      }   
   }
 

Efectivamente era un error, parece ser un archivo web.

Lo reescribí yo mismo basándome en el contenido y lo subí. No sé si hay algún detalle porque soy nuevo en esto. Espero que os sirva de ayuda.

Archivos adjuntos:
my_first_ea.mq5  12 kb
 

Probador - "Modo de llenado no soportado"

Probado en 3 brokers diferentes. ¿Cuál es el problema?