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
Artículo publicado Redes neuronales: así de sencillo (Parte 48): Métodos para reducir la sobreestimación de los valores de la función Q:
Autor: Dmitriy Gizlyk
mi duda es basicamente la que esta puesta en el foro en ingles
https://www.mql5.com/en/forum/458346
donde me encuentro con que me dice estos errores de que el backtesting no funciona y dice que hay mucho volumen, pero los ticks aparentemente estan bien , igual el historial, no es que el mt4 este limpio o no pero si es complicado encontrar alguna solucion, pueden ayudarme porfavor
Buenas noches, soy nuevo aquí, y además estoy empezando en esto de la programación en MQL4.Tengo un código que no me funciona y necesito que alguien me ayude. Basicamente persigo que todos los días a una misma hora y a partir de que se cumpla una elemental condición se envíe una orden de mercado con un stoploss y takeprofit fijos. El código no me ejecuta ninguna orden de mercado, y ni me funciona en backtesting que es en realidad mi verdadero objetivo. Por favor necesito ayuda!
Disculpen si en mi intento de resolver la situación escribo código muy ineficiente pero repito estoy iniciándome
//+------------------------------------------------------------------+
//| EAdePrueba.mq4 |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Este es mi primer EA."
#property strict
#property show_inputs
// --- Includes
#include <stdlib.mqh>
// Definition of an hour. This is necessary for a drop down menu for hours input.
enum enum_horas
{
h00 = 0, // 00:00
h01 = 1, // 01:00
h02 = 2, // 02:00
h03 = 3, // 03:00
h04 = 4, // 04:00
h05 = 5, // 05:00
h06 = 6, // 06:00
h07 = 7, // 07:00
h08 = 8, // 08:00
h09 = 9, // 09:00
h10 = 10, // 10:00
h11 = 11, // 11:00
h12 = 12, // 12:00
h13 = 13, // 13:00
h14 = 14, // 14:00
h15 = 15, // 15:00
h16 = 16, // 16:00
h17 = 17, // 17:00
h18 = 18, // 18:00
h19 = 19, // 19:00
h20 = 20, // 20:00
h21 = 21, // 21:00
h22 = 22, // 22:00
h23 = 23, // 23:00
};
enum enum_minutos
{
m00 = 0, // 00:00:00
m01 = 1, // 00:01:00
m02 = 2, // 00:02:00
m03 = 3, // 00:03:00
m04 = 4, // 00:04:00
m05 = 5, // 00:05:00
m06 = 6, // 00:06:00
m07 = 7, // 00:07:00
m08 = 8, // 00:08:00
m09 = 9, // 00:09:00
m10 = 10, // 00:10:00
m11 = 11, // 00:11:00
m12 = 12, // 00:12:00
m13 = 13, // 00:13:00
m14 = 14, // 00:14:00
m15 = 15, // 00:15:00
m16 = 16, // 00:16:00
m17 = 17, // 00:17:00
m18 = 18, // 00:18:00
m19 = 19, // 00:19:00
m20 = 20, // 00:20:00
m21 = 21, // 00:21:00
m22 = 22, // 00:22:00
m23 = 23, // 00:23:00
m24 = 24, // 00:24:00
m25 = 25, // 00:25:00
m26 = 26, // 00:26:00
m27 = 27, // 00:27:00
m28 = 28, // 00:28:00
m29 = 29, // 00:29:00
m30 = 30, // 00:30:00
m31 = 31, // 00:31:00
m32 = 32, // 00:32:00
m33 = 33, // 00:33:00
m34 = 34, // 00:34:00
m35 = 35, // 00:35:00
m36 = 36, // 00:36:00
m37 = 37, // 00:37:00
m38 = 38, // 00:38:00
m39 = 39, // 00:39:00
m40 = 40, // 00:40:00
m41 = 41, // 00:41:00
m42 = 42, // 00:42:00
m43 = 43, // 00:43:00
m44 = 44, // 00:44:00
m45 = 45, // 00:45:00
m46 = 46, // 00:46:00
m47 = 47, // 00:47:00
m48 = 48, // 00:48:00
m49 = 49, // 00:49:00
m50 = 50, // 00:50:00
m51 = 51, // 00:51:00
m52 = 52, // 00:52:00
m53 = 53, // 00:53:00
m54 = 54, // 00:54:00
m55 = 55, // 00:55:00
m56 = 56, // 00:56:00
m57 = 57, // 00:57:00
m58 = 58, // 00:58:00
m59 = 59, // 00:59:00
};
enum enum_segundos
{
s00 = 0, // 00:00:00
s01 = 1, // 00:01:00
s02 = 2, // 00:02:00
s03 = 3, // 00:03:00
s04 = 4, // 00:04:00
s05 = 5, // 00:05:00
s06 = 6, // 00:06:00
s07 = 7, // 00:07:00
s08 = 8, // 00:08:00
s09 = 9, // 00:09:00
s10 = 10, // 00:10:00
s11 = 11, // 00:11:00
s12 = 12, // 00:12:00
s13 = 13, // 00:13:00
s14 = 14, // 00:14:00
s15 = 15, // 00:15:00
s16 = 16, // 00:16:00
s17 = 17, // 00:17:00
s18 = 18, // 00:18:00
s19 = 19, // 00:19:00
s20 = 20, // 00:20:00
s21 = 21, // 00:21:00
s22 = 22, // 00:22:00
s23 = 23, // 00:23:00
s24 = 24, // 00:24:00
s25 = 25, // 00:25:00
s26 = 26, // 00:26:00
s27 = 27, // 00:27:00
s28 = 28, // 00:28:00
s29 = 29, // 00:29:00
s30 = 30, // 00:30:00
s31 = 31, // 00:31:00
s32 = 32, // 00:32:00
s33 = 33, // 00:33:00
s34 = 34, // 00:34:00
s35 = 35, // 00:35:00
s36 = 36, // 00:36:00
s37 = 37, // 00:37:00
s38 = 38, // 00:38:00
s39 = 39, // 00:39:00
s40 = 40, // 00:40:00
s41 = 41, // 00:41:00
s42 = 42, // 00:42:00
s43 = 43, // 00:43:00
s44 = 44, // 00:44:00
s45 = 45, // 00:45:00
s46 = 46, // 00:46:00
s47 = 47, // 00:47:00
s48 = 48, // 00:48:00
s49 = 49, // 00:49:00
s50 = 50, // 00:50:00
s51 = 51, // 00:51:00
s52 = 52, // 00:52:00
s53 = 53, // 00:53:00
s54 = 54, // 00:54:00
s55 = 55, // 00:55:00
s56 = 56, // 00:56:00
s57 = 57, // 00:57:00
s58 = 58, // 00:58:00
s59 = 59, // 00:59:00
};
input enum_horas horaInicioTrading = h08; // Start operation hour
input enum_minutos minutosInicioTrading = m15; // Start operation minuts
input enum_segundos segundosInicioTrading = s00; // Start operation seconds
input enum_horas horaFinalTrading = h15; // Last operation hour
input enum_minutos minutosFinalTrading = m30; // Last operation minuts
input enum_segundos segundosFinalTrading = s00; // Last operation seconds
input int magicNumber = 2023;
double altoMasAlto;
double bajoMasBajo;
input enum_horas horaInicioAsia = h00;
input enum_minutos minutosInicioAsia = m00;
input enum_segundos segundosInicioAsia = s00;
input enum_horas horaFinalAsia = h08;
input enum_minutos minutosFinalAsia = m00;
input enum_segundos segundosInFinalAsia = s00;
double valorMedioRecuadroAsia;
double cierreUltimaVelaAsia;
long ticket;
double stopLevel; // Variable global para el nivel mínimo de stop
double precio_stoploss;
double precio_takeprofit;
double precio_entrada;
double preciosMasAltos[];
double preciosMasBajos[];
datetime tiempoAhora, tiempoAnterior;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
altoMasAlto = 0;
bajoMasBajo = MarketInfo(Symbol(), MODE_ASK);
valorMedioRecuadroAsia = 0;
cierreUltimaVelaAsia = 0;
ticket = 0;
tiempoAhora = tiempoAnterior = 0;
stopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(!Filtro())
return;
if(HoraDeOperacion())
{
if(!Operaciones_Abiertas(magicNumber)) //Aquí evaluaremos si tenemos alguna posición abierta con este magicNumber.
{
if(Hour() == horaInicioTrading && Minute() == minutosInicioTrading && Seconds() == segundosInicioTrading)
{
MercadoAsiatico();
}
if((horaInicioTrading < horaFinalTrading) && (Hour() >= horaInicioTrading) && (Hour() <= horaFinalTrading))
{
if(cierreUltimaVelaAsia > valorMedioRecuadroAsia) //Cierre por arriba entonces posible señal de venta
{
Abrir_Operacion(OP_SELL);
}
if(cierreUltimaVelaAsia < valorMedioRecuadroAsia) //Cierre por debajo posible señal de compra
{
Abrir_Operacion(OP_BUY);
}
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------------+
//| Función para calcular los valores que caracterizan al mercado asiático | |
//+------------------------------------------------------------------------+
void MercadoAsiatico()
{
Print("Entró al mercado asiatico, y la hora con minutos y con segundos es ", Hour(), ":", Minute(), ":", Seconds());
for(int i = 1; i <= 33; i++)
{
preciosMasAltos[i] = iHigh(NULL, PERIOD_M15, i);
}
altoMasAlto = ArrayMaximum(preciosMasAltos);
for(int j = 1; j <= 33; j++)
{
preciosMasBajos[j] = iLow(NULL, PERIOD_M15, j);
}
bajoMasBajo = ArrayMinimum(preciosMasBajos);
valorMedioRecuadroAsia = (altoMasAlto + bajoMasBajo) / 2;
cierreUltimaVelaAsia = iClose(NULL, PERIOD_M15, 1);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Función que abre una operación del tipo especificado. |
//+------------------------------------------------------------------+
void Abrir_Operacion(int tipo_operacion) //Función que abre operaciones
{
if(OrderType() == OP_BUY)
{
//RefreshRates();
precio_entrada = NormalizeDouble(Ask, Digits);
precio_stoploss = (NormalizeDouble(Ask - (stopLevel / 10000), Digits));
precio_takeprofit = (NormalizeDouble(Ask + (stopLevel / 10000), Digits));
}
if(OrderType() == OP_SELL)
{
//RefreshRates();
precio_entrada = NormalizeDouble(Bid, Digits);
precio_stoploss = NormalizeDouble(Bid + (stopLevel / 10000), Digits);
precio_takeprofit = NormalizeDouble(Bid - (stopLevel / 10000), Digits);
}
RefreshRates();
ticket = OrderSend(NULL, tipo_operacion, 1, precio_entrada, 10, precio_stoploss, precio_takeprofit, NULL, 2023, 0, clrNONE); //Enviamos orden de mercado
if(ticket < 0) //Significaría que hemos tenido un error
{
tiempoAnterior = Time[0];
Alert(ErrorDescription(GetLastError())); //Alertamos del error
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool Filtro() //Compara el tiempo registrado de la operación anterior, ésto es "TiempoAnterior", con el tiempo registrado cuando se cumple las condiciones para una nueva operación lo que es "TiempoAhora"
{
tiempoAhora = Time[0];
if(tiempoAnterior == tiempoAhora)
return(false);
else
return(true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool Operaciones_Abiertas(int magicNumber_PLBP) //Esta función devuelve "true" si hay operaciones abiertas con este magic number, en caso contrario devuelve "false"
{
int tipoDeOperacion;
int error = 0; //Esta variable contendrá el número de errores que ocurran, si ocurren
if(OrdersTotal() != 0) //Orderstotal() devuelve el numero total de ordenes abiertas y pendientes
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) //OrderSelect() nos devuelve true si la seleccionó, o false en caso contrario
{
//MODE_TRADES comprueba ordenes de mercado y pendientes, no las históricas
tipoDeOperacion = OrderType(); //Aquí guardamos el tipo de orden que tehemos seleccionado actualmente (con la función OrderSelect() llamada previamente)
if((tipoDeOperacion == OP_BUY || tipoDeOperacion == OP_SELL) && magicNumber_PLBP == OrderMagicNumber()) //La función OrderMagicNumber() nos devuelve el magic number de la orden seleccionada actualmente
{
return (true);
}
}
}
return (false);
}
else
return (false);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool HoraDeOperacion()
{
bool horaDeOperar = false;
int hora_deseada = 8;
int minutos_deseados = 15;
// Obtiene la hora actual del servidor
datetime hora_actual = TimeCurrent();
int hora_actual_server = TimeHour(hora_actual);
int minutos_actual_server = TimeMinute(hora_actual);
int tiempo_hasta_ejecucion = (hora_deseada - hora_actual_server) * 3600 + (minutos_deseados - minutos_actual_server) * 60;
if(tiempo_hasta_ejecucion > 0)
{
Sleep(tiempo_hasta_ejecucion * 1000); // Espera hasta la hora deseada
// Coloca aquí tu código para abrir la operación de compra
horaDeOperar = true;
}
return horaDeOperar;
}
//+------------------------------------------------------------------+
La cuenta de 50 k la tengo en 51 k, pero me da error de dinero insuficiente con 30 lotes y 1.5 pips de SL, osea que incluso estoy usando menos lotes del que me toca y además hasta ayer podía abrir operaciones con ese lotaje, alguien sabe por qué pasa esto, si es por diciembre que sube el costo o algo ?
Desconozco el apalancamiento que está utilizando, pero suponiendo que por ejemplo sea de 1:500 e intente abrir 30 lotes en el EURUSD el margen requerido es de +82.000€ ($90.000).