Ayuda a la codificación - página 242

 
Mastercash:
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

Archivos adjuntos:
_test_mc.mq4  3 kb
 
mladen:
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 apertura

EDIT: 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);

}

 
BlackCoq:
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 OpenOrderPrice(double priceToCompareTo, double priceDeviation)

{

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)

 
mladen:
Pruebe algo como esto :
double OpenOrderPrice(double priceToCompareTo, double priceDeviation)

{

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?

 
BlackCoq:
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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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".

 
mladen:
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.

//+------------------------------------------------------------------+//| expert start function |

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

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)

//----
 
BlackCoq:
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.

//+------------------------------------------------------------------+//| expert start function |

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

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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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

 
mladen:
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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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

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.

Archivos adjuntos:
564.mq4  10 kb
 
sulaimoney:
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

Archivos adjuntos:
564_1.mq4  10 kb
Razón de la queja: