lo que nesecito que me realizes como un buen programador de programas MQL4 con 3 medias moviles 1ra de 9 amarilla , 2da de 50 azul ,3ra de 100 roja , con entradas y salidas al crusase lo mismo al comprar o para vender , tambien incluye los indicadores
A continuación te proporciono un ejemplo de un Expert Advisor (EA) en MQL4 que utiliza tres medias móviles, junto con los indicadores RSI y MACD, para realizar operaciones de compra y venta basadas en el cruce de las medias móviles y las condiciones de los otros dos indicadores.
Este código incluye lo siguiente:
- Tres medias móviles: 9 (amarilla), 50 (azul) y 100 (roja).
- Condiciones de entrada y salida basadas en el cruce de las medias móviles.
- Indicadores RSI y MACD para confirmar las señales de entrada.
### Código MQL4
```mql4
//+------------------------------------------------------------------+
//| TripleMA.mq4 |
//| Copyright 2023, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property strict
// Parámetros de las medias móviles
input int maPeriod1 = 9; // Periodo de la primera media móvil
input int maPeriod2 = 50; // Periodo de la segunda media móvil
input int maPeriod3 = 100; // Periodo de la tercera media móvil
input double rsiOverbought = 70; // Nivel de sobrecompra para el RSI
input double rsiOversold = 30; // Nivel de sobreventa para el RSI
input double lotSize = 0.1; // Tamaño de lote
input int slippage = 3; // Slippage
double ma1, ma2, ma3;
double rsiValue;
double macdCurrent, macdSignal;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Calcular las medias móviles
ma1 = iMA(NULL, 0, maPeriod1, 0, MODE_SMA, PRICE_CLOSE, 0);
ma2 = iMA(NULL, 0, maPeriod2, 0, MODE_SMA, PRICE_CLOSE, 0);
ma3 = iMA(NULL, 0, maPeriod3, 0, MODE_SMA, PRICE_CLOSE, 0);
// Calcular el RSI
rsiValue = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);
// Calcular el MACD
macdCurrent = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0);
macdSignal = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 0);
// Lógica de entrada y salida
if (ma1 > ma2 && ma2 > ma3 && rsiValue < rsiOversold && macdCurrent > macdSignal) {
// Condición de compra
if (OrderSelect(0, SELECT_BY_POS) == false || OrderType() != OP_BUY) {
CloseOrders(OP_SELL); // Cerrar ventas si hay alguna
OpenBuy();
}
} else if (ma1 < ma2 && ma2 < ma3 && rsiValue > rsiOverbought && macdCurrent < macdSignal) {
// Condición de venta
if (OrderSelect(0, SELECT_BY_POS) == false || OrderType() != OP_SELL) {
CloseOrders(OP_BUY); // Cerrar compras si hay alguna
OpenSell();
}
}
}
//+------------------------------------------------------------------+
//| Abrir orden de compra |
//+------------------------------------------------------------------+
void OpenBuy()
{
double price = Ask;
double sl = price - 100 * Point; // Stop Loss (opcional)
double tp = price + 100 * Point; // Take Profit (opcional)
int ticket = OrderSend(Symbol(), OP_BUY, lotSize, price, slippage, sl, tp, "Buy Order", 0, 0, clrYellow);
if (ticket < 0)
Print("Error en la orden de compra: ", GetLastError());
}
//+------------------------------------------------------------------+
//| Abrir orden de venta |
//+------------------------------------------------------------------+
void OpenSell()
{
double price = Bid;
double sl = price + 100 * Point; // Stop Loss (opcional)
double tp = price - 100 * Point; // Take Profit (opcional)
int ticket = OrderSend(Symbol(), OP_SELL, lotSize, price, slippage, sl, tp, "Sell Order", 0, 0, clrRed);
if (ticket < 0)
Print("Error en la orden de venta: ", GetLastError());
}
//+------------------------------------------------------------------+
//| Cerrar órdenes por tipo |
//+------------------------------------------------------------------+
void CloseOrders(int orderType)
{
for (int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS)) {
if (OrderType() == orderType) {
if (OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), slippage, clrRed) == false) {
Print("Error cerrando la orden: ", GetLastError());
}
}
}
}
}
```
### Explicación del código:
- Se definen tres medias móviles, un RSI y un MACD.
- En cada tick, se calculan los valores actuales de estas indicadores.
- Se establece la lógica para abrir o cerrar órdenes de compra y venta basándose en el cruce de las medias móviles y los valores del RSI y del MACD.
- La función `CloseOrders` cierra todas las órdenes del tipo especificado (compra o venta).
### Notas:
1. **Tamaño de lote y manejo de riesgos:** Asegúrate de ajustar el tamaño del lote y otros parámetros de gestión de riesgos según tus preferencias.
2. **Backtesting:** Es recomendable hacer pruebas en un entorno de backtesting antes de implementar cualquier EA en una cuenta en vivo.
3. **Mejoras:** Puedes agregar más funcionalidades como gestión de beneficios, trailing stop, y optimización de los parámetros.
Si tienes alguna pregunta adicional o necesitas más ajustes, ¡no dudes en preguntar!