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
Puede alguien decirme qué hice mal, el código de abajo es 2 EMA cruzar con alerts.It se niegan a work.Pls puede alguien ayudar a compilar y trabajar en mt4 construir 600 +:
#propiedad copyright "wnk"
#property link "www.wnk.com"
#propiedad indicator_chart_window
#propiedad indicator_buffers 2
#property indicador_color1 Cal
#property indicator_color2 Red
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//variable externa......
//+------------------------------------------------------------------+
//| Función de inicialización de los indicadores personalizados
//+------------------------------------------------------------------+
int init()
{
//---- indicadores
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,217);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Función de desinicialización del indicador personalizada ||
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizada ||
//+------------------------------------------------------------------+
int inicio()
{
static datetime LastAlertTime = TimeCurrent();
int counted_bars=IndicatorCounted(),
límite;
if(counted_bars<0)
return(-1);
if(barras_contadas>0)
barras_contadas--;
limit=Barras_contadas;
while(límite)
{
double ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
double ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1);
double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);
double mom=iMomentum(NULL,0,14,PRECIO_CIERRE,0);
double b4mom=iMomentum(NULL,0,14,PRECIO_CIERRE,1);
//subir las alertas
if((LastAlertTime!=Time[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(mom>b4mom)&&(mom>98.6591))
ExtMapBuffer1[limit]=Alto[limit]+5*Punto;
ÚltimaHoraDeAlerta = Hora[0];
Alert(Symbol()," ",Period(), "M Price UP");
/alertas de venta
if((LastAlertTime!=Time[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(mom<b4mom)&&(mom<100.6872))
ExtMapBuffer2[limit]=Low[limit]-5*Point;
ÚltimaHoraDeAlerta = Hora[0];
Alert(Símbolo()," ",Periodo(), "M Precio a la baja");
}
return(0);
}
//+------------------------------------------------------------------+Mastercash
Pruébalo ahora
Axel
Se puede hacer.
Simplemente se deben escanear las órdenes abiertas del tipo deseado y comparar sus precios de apertura con el nuevo precio de apertura deseado o se pueden comparar las barras en las que se abrieron con la barra que sirve de criterio de aperturaEDIT: Parece que me olvidé de añadir la función.
¿Funcionaría escribir una función como la siguiente 20 veces más o menos para diferentes "i=Total de Pedidos()-1" y luego llamar en toda la función y compararlos con el nuevo precio de apertura?
double PrecioDeOrden()
{
double TempOrderPrice = 0;
for(int i=TotalOrdenes()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
return(TempOrderPrice);
}
EDIT: Parece que se me olvidó añadir la función.
¿Funcionaría escribir una función como la siguiente 20 veces más o menos para diferentes "i=Total de Pedidos()-1" y luego llamar a todas las funciones y compararlas con el nuevo precio de apertura?
double PrecioDeOrden()
{
double TempOrderPrice = 0;
for(int i=TotalOrdenes()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
return(TempOrderPrice);
}Pruebe algo como esto :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Tienes que pasar el precio al que debe abrirse y la desviación máxima (un valor absoluto: por ejemplo no 5 para cinco puntos, sino 5*_Punto) del precio, y si la diferencia es menor o igual a esa desviación del precio devolverá el precio de la orden abierta a ese precio aproximado. En caso contrario devolverá -1 como resultado (lo que significa en ese caso que no hay órdenes con precios similares)
Pruebe algo como esto :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Tienes que pasar el precio al que debe abrirse y la desviación máxima (un valor absoluto : por ejemplo no 5 para cinco puntos, sino 5*_Punto) del precio, y si la diferencia es menor o igual a esa desviación del precio devolverá el precio de la orden abierta a ese precio aproximado. En caso contrario devolverá -1 como resultado (lo que significa en ese caso que no hay órdenes con precios similares)Así que si quiero comprobar si hay alguna orden abierta que se desvíe 2 pips del precio al que quiero comprar, llamo a esta función
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1;
for(int i=Total de Pedidos()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
desviación del precio = 2*Punto;
priceToCompareTo = Ask;
romper;
}
}
return(PrecioTemporal);
}
¿Y luego hacer otro para los cortos?
Así que si quiero comprobar si hay alguna orden abierta que se desvíe 2 pips del precio al que quiero comprar, llamo a esta función:
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1;
for(int i=Total de Pedidos()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
desviación del precio = 2*Punto;
priceToCompareTo = Ask;
romper;
}
}
return(PrecioTemporal);
}
¿Y luego hacer otro para los pantalones cortos?No
Se llama a la función así :
si (OpenOrderPrice(OP_BUY,Ask ,2.0*_Point) == -1) permite los largos y
if (OpenOrderPrice(OP_SELL,Ask,2.0*_Point) == -1) permite los cortos
La llamada debe ser desde tu parte de código donde tienes una lógica para abrir una orden.
Pero entonces la función tiene que ser diferente (así) :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
La función cubre ambos casos ahora y no debes cambiar el código dentro de la función
___________________
PD: La variable _Point no existe en las versiones más antiguas de Metatrader 4. El ejemplo superior está escrito para el nuevo metatrader4. Si usted utiliza una versión más antigua (509 o anterior) entonces "_Point" debe ser "Point".
No
Llame a la función así:
La llamada debe ser desde su parte de código donde tiene una lógica para abrir una orden.
Pero entonces la función tiene que ser diferente (así) :
La función cubre ambos casos ahora y no debes cambiar el código dentro de la función
___________________
PD: La variable _Point no existe en las versiones más antiguas de metatrader 4. El ejemplo superior está escrito para el nuevo metatrader4. Si usted utiliza una versión más antigua (509 o anterior) entonces "_Point" debe ser "Point".Gracias. He copiado la función en el EA y la he llamado como has escrito, pero por alguna razón abre posiciones aunque haya otras dentro de la desviación del nuevo precio. ¿Esa función comprueba todos los precios abiertos o sólo el último?
Incluyendo el EA de abajo.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----Gracias. He copiado la función en el EA y la he llamado como has escrito, pero por alguna razón abre posiciones aunque haya otras dentro de la desviación del nuevo precio. ¿Esa función comprueba todos los precios abiertos o sólo el último?
Incluyendo el EA de abajo.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----Hay un error en el código de esa función. Asumí que el OrderSelect() funcionaba en la posición y no lo comprobé. Utilice este:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Ahora debería funcionar correctamente
Hay un error en el código de esa función. Asumí que el OrderSelect() funcionaba en la posición y no lo comprobé. Utiliza este otro:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Y así es. Gracias de nuevo por tu gran trabajo, Mladen.
Hola Mladen ,
podría por favor echar un vistazo a este código estoy tratando de seleccionar la última orden y abrir órdenes adicionales basadas en el último precio abierto. Todo parece funcionar excepto que
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
parecen estar interfiriendo entre sí, si comento uno de los dos como el siguiente, la orden funcionará bien.
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
me pueden decir que estoy haciendo mal.
Hola Mladen ,
podría por favor echar un vistazo a este código estoy tratando de seleccionar la última orden y abrir órdenes adicionales basadas en el último precio abierto. Todo parece funcionar excepto que
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
parecen estar interfiriendo entre sí, si comento uno de los dos como el siguiente, la orden funcionará bien.
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
puedes decirme qué estoy haciendo mal.sulaimoney
Creo que el problema no estaba en esas dos funciones, sino en la forma en que el nuevo metatrader 4 comprueba las condiciones booleanas (si estabas usando alguna de las nuevas builds de metatrader 4). Simplifiqué el código un poco y resolví el único lugar donde las condiciones booleanas debían ser definidas estrictamente. Pruébalo