Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 100

 

¡Hola a todos, podéis ayudarme a encontrar un error en el código del EA, creo que lo he mirado todo, parece que todo está escrito correctamente en el código, pero el programa no opera correctamente por alguna razón! La idea es la siguiente: El asesor tiene que buscar dos velas largas de la misma dirección (la longitud entre las velas es ajustable en el asesor, es decir, entre las dos velas mínimas o máximas, dependiendo de la dirección), si el precio en la dirección opuesta rompe el mínimo o el máximo de la última vela, un acuerdo debe abrirse (Ejemplo situaciones de imagen en el gráfico adjunto al archivo). El asesor debería abrir operaciones en cada situación adecuada, pero por alguna razón sólo abre operaciones en las ventanas de negociación entre días. Esta es la situación, que no es difícil de los programadores, por favor, ayuda, arreglar el error. El código de EA se ve a continuación, así como en el archivo adjunto.


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

//| Espaciamiento_Candelas.mq4 |

//| Copyright 2017, Vladim |

//| vk.com/id229534564 |

//| Correo: Vladim120385@yandex.ru |

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

#property copyright "Copyright 2017, Vladim"

#enlace de propiedad "vk.com/id229534564"

#versión de la propiedad "1.00"

#propiedad estricta


//--- Parámetros EA

extern string paramEA = ""; // Parámetros EA

extern double volumen = 0.01; // Volumen

extern double stopLoss = 5; // StopLoss.

extern double takeProfit = 1.5; // TakeProfit

extern double maxSpacing = 150; // MaxSpacing

extern double minSpacing = 30; // MinSpacing

extern double TrailingStop = 0; // TrailingStop

extern int magic = 127; // Magia


//--- variables globales

datetime newCandle;

int tip;


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

int OnInit()

{

return(INIT_SUCCEED);

}

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

void OnDeinit(const int reason)

{

}

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

void OnTick()

{

if(newCandle != Time[0]) FindPattern();

nuevaVela = Tiempo[0];

}

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

void OpenOrder(int type) // Abrir una orden de mercado

{

if(type == OP_BUY) if(OrderSend(_Symbol, OP_BUY, volume, Ask, 0, 0, 0, "", magic, 0)) SetSLTP(OP_BUY);

if(type == OP_SELL) if(OrderSend(_Symbol, OP_SELL, volume, Bid, 0, 0, 0, 0, "", magic, 0)) SetSLTP(OP_SELL);

}

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

void SetSLTP(int type) //configuración de órdenes stop

{

doble sl = 0;

doble tp = 0;

if(type == OP_BUY)

for(int i = 0; i < OrdersTotal(); i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_BUY && OrderStopLoss() == 0)

{

sl = NormalizeDouble(Low[1] - stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() + (OrderOpenPrice() - Low[1]) * takeProfit, Dígitos);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;

}

if(type == OP_SELL)

for(int i = 0; i < OrdersTotal(); i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_SELL && OrderStopLoss() == 0)

{

sl = NormalizeDouble(High[1] + stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() - (High[1] - OrderOpenPrice()) * takeProfit, Dígitos);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;

}

}

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

void FindPattern() // Buscando la distancia entre velas

{

if(High[1] < High[2] && Bid > High[1] && Low[1] < Low[2])

{

double spacing = NormalizeDouble((High[2] - High[1]) / _Point, 0);

if(maxSpacing >= spacing && minSpacing <= spacing)

OpenOrder(OP_BUY);

}

if(Low[1] > Low[2] && Bid < Low[1] && High[1] > High[2])

{

double spacing = NormalizeDouble((Low[1] - Low[2]) / _Point, 0);

if(maxSpacing >= spacing && minSpacing <= spacing)

OpenOrder(OP_SELL);

}

{

if(TrailingStop!=0) TrailingStop();

}

}

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

void TrailingStop()

{

doble StLo,OSL,OOP;

bool error=true;

for (int i=0; i<OrdersTotal(); i++)

{

if (OrderSelect(i, SELECT_BY_POS))

{

punta = OrderType();

if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

{

OSL = NormalizeDouble(OrderStopLoss(),Digits);

OOP = NormalizeDouble(OrderOpenPrice(),Digits);

si (punta==0)

{

StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);

si (StLo < OOP) continuar;

si (StLo > OSL)

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);


}

si (punta==1)

{

StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);

si (StLo > OOP) continuar;

si (StLo < OSL || OSL==0 )

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);

}

if (!error) Alert("Error TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo);

}

}

}

}

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

Archivos adjuntos:
 
Vladim1203:

¡Hola a todos, podéis ayudarme a encontrar un error en el código del EA, creo que lo he mirado todo, parece que se ha escrito correctamente en el código, pero el programa no opera correctamente por alguna razón! La idea es la siguiente: El asesor tiene que buscar dos velas largas de la misma dirección (la longitud entre las velas es ajustable en el asesor, es decir, entre las dos velas mínimas o máximas, dependiendo de la dirección), si el precio en la dirección opuesta rompe el mínimo o el máximo de la última vela, un acuerdo debe abrirse (Ejemplo situaciones de imagen en el gráfico adjunto al archivo). El asesor debería abrir operaciones en cada situación adecuada, pero por alguna razón sólo abre operaciones en las ventanas de negociación entre días. Esta es la situación, que no es difícil de los programadores, por favor, ayuda, solucionar el error. El código de EA se ve abajo y también en el archivo adjunto.

Quizás ya es suficiente, has acumulado posts en todos los hilos, mientras creabas los tuyos propios.

 
kuzhakov:

Hola.
Me pueden decir cómo limitar el comercio de EA por el tiempo.
He probado muchos métodos del foro, pero nada ha funcionado, no entiendo nada de escritura.
Estaría bien que se pudiera señalar lo que hay que poner.


Introdúzcalo después del inicio. y el eXpert negociará cada día en un intervalo de tiempo determinado en el terminal


int val=Hour();
 double min=Minute();
 double Dl = val + min/100;  
 double L = xxxx+xxxx/100; //час + минуты вместо хххх - это начало времени
 double P = xxxx+xxxx/100; //час + минуты вместо хххх - это конец времени
 if(Dl<L)return;
 if(Dl>P)return;
 
Vladim1203:

¡Hola a todos, podéis ayudarme a encontrar un error en el código del EA, creo que lo he mirado todo, parece que todo está escrito correctamente en el código, pero el programa no opera correctamente por alguna razón! La idea es la siguiente: El asesor tiene que buscar dos velas largas de la misma dirección (la longitud entre las velas es ajustable en el asesor, es decir, entre las dos velas mínimas o máximas, dependiendo de la dirección), si el precio en la dirección opuesta rompe el mínimo o el máximo de la última vela, un acuerdo debe abrirse (Ejemplo situaciones de imagen en el gráfico adjunto al archivo). El asesor debería abrir operaciones en cada situación adecuada, pero por alguna razón sólo abre operaciones en las ventanas de negociación entre días. Esta es la situación, que no es difícil de los programadores, por favor, ayuda, solucionar el error. Vea el código de EA a continuación y también en el archivo adjunto.


comprobar la condición de entrada de compra y venta

 
Vladim1203:

¡Hola a todos, podéis ayudarme a encontrar un error en el código del EA, creo que lo he mirado todo, parece que se ha escrito correctamente en el código, pero el programa no opera correctamente por alguna razón! La idea es la siguiente: El asesor tiene que buscar dos velas largas de la misma dirección (la longitud entre las velas es ajustable en el asesor, es decir, entre las dos velas mínimas o máximas, dependiendo de la dirección), si el precio en la dirección opuesta rompe el mínimo o el máximo de la última vela, un acuerdo debe abrirse (Ejemplo situaciones de imagen en el gráfico adjunto al archivo). El asesor debería abrir operaciones en cada situación adecuada, pero por alguna razón sólo abre operaciones en las ventanas de negociación entre días. Esta es la situación, que no es difícil de los programadores, por favor, ayuda, solucionar el error. Vea el código de EA a continuación, así como en el archivo adjunto.

Es mejor escribir primero la parte del EA que marcaría en el gráfico las velas encontradas, para que todo quede claro. Y las siguientes líneas son innecesarias en su caso:

extern string paramEA    = "";     // Parameters EA

и

//+-----------------------------------------------------------------------------------------------+
int OnInit()
{
   
   return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 

Por favor, ayude a la comunidad ...
*
Descargué el indicador del filtro Kalman del foro (código fuente adjunto).
Todo está bien en el gráfico.


Cuando intento leerlo en Expert Advisor aparece la siguiente línea



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Da como resultado el mismo número grande, obviamente no relacionado con el indicador:

¿Qué puede ser?

Archivos adjuntos:
 
MikeZv:

Ayuda de la comunidad ...
*
Descargué el indicador del filtro Kalman del foro (código fuente adjunto).
Todo está bien en el gráfico.


Cuando intento leerlo en Expert Advisor aparece la siguiente línea



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Da como resultado el mismo número grande, obviamente no relacionado con el indicador:

¿Qué puede ser?

VALOR_VACÍO

Valor vacío en la memoria intermedia del indicador

2147483647 (0x7FFFFFFFF)

 
Alekseu Fedotov:

VALOR_VACÍO

Valor vacío en la memoria intermedia del indicador

2147483647 (0x7FFFFFF)


:) Ya lo he encontrado...
¿Por qué sale?

 
MikeZv:

:) Ya lo he encontrado...
¿Pero por qué sale?


El indicador tiene 2 matrices, porque 2 colores. Mientras haya una línea del primer color en la barra, el array con el segundo color es igual a VALOR_VACÍO,

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1);

iValue = EMPTY_VALUE, entonces la línea de 1 barra es naranja. (porque array blue = EMPTY_VALUE)

 
Nikolay Ivanov:

El indicador tiene 2 matrices, porque 2 colores. Mientras haya una línea del primer color en la barra, el array con el segundo color es igual a VALOR_VACÍO,

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1);

iValue = EMPTY_VALUE, entonces la línea de 1 barra es naranja. (Porque el array azul = EMPTY_VALUE)


Gracias, Nikolai...
Tomé de ambas líneas.
Luego los fusioné en uno solo (dejé un búfer). El mismo resultado.
*
Tengo una pregunta de este tipo:
El indicador tiene una variable draw_begin=500, es decir, el número de velas desde el final (desde la vela más reciente) donde se dibuja el gráfico.
Y cuando extraemos el valor del indicador utilizando el método iCustom(), ¿estos 500 puntos se cuentan a partir de qué vela?
Por qué es importante - draw_begin se utiliza no sólo para dibujar, sino que también participa en el cálculo del indicador ...