Discusión sobre el artículo "Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes" - página 29
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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.
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.
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();
}
//+------------------------------------------------------------------+
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.
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:
Pero posteriormente se establecen de nuevo si hay una posición en consecuencia.
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😉 .
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;
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.
Probador - "Modo de llenado no soportado"
Probado en 3 brokers diferentes. ¿Cuál es el problema?