Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 70

 

¡Estimados usuarios del foro!

Por favor, ayuda, los problemas son los siguientes: 1) Cómo prescribir en el código, de modo que el acuerdo, digamos, en la venta, se abrió cuando el límite superior del canal, y se cerró cuando llega a la parte inferior; 2) Cuando una señal debe abrir sólo un acuerdo; 3) al instalar el EA, el acuerdo se abre inmediatamente, pero desea que el acuerdo se abre sólo cuando la línea del canal se alcanza.

Le agradecería mucho su ayuda.

extern double Lots = 0.1;
extern int TakeProfit = 30; // TakeProfit (un número negativo o cero para evitar su uso);
extern int StopLoss = 20; // Nivel de Stop Loss para comprar;
extern inttern Deslizamiento = 2; // deslizamiento
extern string Comentario = "Keller";
extern inttern Magia = 333;

cadena externa Indi = "Datos del indicador";
extern string TimeFrame = " marcotemporal actual;
extern int MA_Period = 10; // 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern int Modo_MA = 0; // 0 - Cierre, 1 - Apertura, 2 - Alta, 3 - Baja, 4 - Mediana, 5 - Típica, 6 - Ponderada
extern int Tipo_de_precio = 5;

doble PriceHigh, PriceLow, SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| función de inicialización de expertos |
//+------------------------------------------------------------------+
int init()
{
if (Digits ==3 || Digits ==3) // para un corredor de cinco dígitos
{
TakeProfit *= 10;
StopLoss *= 10;
Deslizamiento *= 10;
}
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto |
//+------------------------------------------------------------------+
int inicio()
{
PriceHigh = iCustom (Symbol(), 0, "Keller", TimeFrame, MA_Period, Mode_MA, Price_Type, 0, 0); // top buffer rojo 0
PriceLow = iCustom (Symbol(), 0, "Tma", TimeFrame, MA_Period, Mode_MA, Price_Type, 2, 0); // buffer inferior rojo 2

if (Bid >= PriceHigh && CountSell() == 0) // donde Countsell comprueba que las órdenes se abren una a una y no en cada tick
{
SL = NormalizeDouble (Bid + StopLoss * Point, Digits);
TP = NormalizeDouble (Oferta - TakeProfit * Punto, Dígitos);

ticket = OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, Comment, Magic, 0, Red); // donde 0 es SL y TP (para ßn cuentas es 0) y el último 0 es una acción
if (ticket > 0) // comprueba si hay una orden abierta
{
if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0); // donde 0 es una expresión
}
}


if (Ask <= PriceLow && CountBuy() == 0)// donde Countsell comprueba que las órdenes se abren una a una, no en cada tick
{
SL = NormalizeDouble (Ask - StopLoss * Point, Digits);
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);

ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, Comment, Magic, 0, Blue); // donde 0 es SL y TP (esto es 0 para ßn cuentas), y el último 0 es una acción
if (ticket > 0) // comprueba si hay una orden abierta
{
if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0); // donde 0 es una expresión
}
}


if (Bid >= PriceHigh && CountBuy() > 0) // si el precio ha alcanzado el límite superior del canal y el número de órdenes es mayor que 0
{
for (int i=OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true)
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY) // comprueba si es nuestra orden de compra
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black); // cerrar la orden en el borde superior del canal
}
}
}
if (Ask <= PriceLow && CountSell() > 0) // si el precio ha alcanzado el límite inferior del canal y el número de órdenes es mayor que 0
{
for ( i=OrdersTotal()-1; i >= 0; i--) // no hay definición de variable para comprar
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true)
{
if(OrderMagicNumber() == Magic && OrderType() == OP_SELL) // comprueba si es nuestra orden de venta
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black); // cerrar la orden en el borde inferior del canal
}
}
}

return(0);
}

//+------------------------------------------------------------------+
int CountSell()// comprobar - número de órdenes de venta en curso
{
int Cuenta = 0;
for (int trade = OrdersTotal() - 1; trade >=0; trade --)
{
OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() = OP_SELL)
Cuenta++;
}
}
return(Count);
}
//+------------------------------------------------------------------+
int CountBuy()// comprobar - número de órdenes de compra que están en funcionamiento
{
int Cuenta = 0;
for (int trade = OrdersTotal() - 1; trade >=0; trade --)
{
OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() = OP_BUY)
Cuenta++;
}
}
return(Count);
}

 
Añadir una captura de pantalla
 
artmedia70:

No, no lo hicieron. He mirado su código y he respondido "sin mirar". Su línea:

- asigna al índice del ciclo i un valor igual al número total de líneas horizontales. Si tiene 3, el ciclo será de 2 a 0. No está claro qué hay en su ciclo, pero sólo habrá tres iteraciones de 2 a 0.


Sí, bueno... Y eso es exactamente lo que me preocupaba. El caso es que, sin experimentos especialmente establecidos, sino sólo por observación, sí que funcionaba en presencia de otros objetos.

for(int i=ObjectsTotal(OBJ_HLINE)-1; i>=0; i--) 

Y a simple vista ha funcionado correctamente. Pero había dudas sobre lo mismo que has descrito. Por eso quería aclarar este aspecto.

Y me alegro de que sus opiniones confirmen mi suposición. Podemos considerar que se ha alcanzado la certeza sobre el asunto.

Muchas gracias una vez más.

 
bistreevseh:


Tengo un indicador personalizado, es un histograma, todos los valores son máximos, solo importa el color de las barras en el histograma, no tiene parámetros de entrada, el buffer 2: 0 - con barra roja, y 1 - barra azul, descubrí por método imperial, que en el buffer 0, no cambia el valor, y en el 1 cambia. Como escribir los criterios de la transacción no lo entiendo, por favor expliquen como, gracias de antemano.


Si tiene el código fuente del indicador, no es difícil: mire el código fuente y encuentre las condiciones para el cambio de color en el indicador. Con ellas, formamos una señal. Hay 2 formas de hacerlo, la primera es escribiendo un "wrapper" para analizar las condiciones de cambio de valores del buffer, en eso no se cambia el código del indicador, se usa iCustom(), la segunda convierte el código del indicador en una función que puede ser llamada desde el Asesor Experto. Ambos métodos se describen en los artículos del sitio web.

Si está interesado, por ejemplo, en el indicador Heikin-Ashi suavizado, busque en el sitio web - para este indicador hubo una discusión, por lo que recuerdo, tanto la corrección del algoritmo como el análisis de la señal fueron discutidos. El código de su abierta y está disponible en la base de código (hay un montón de ellos allí).

Si el indicador es único y no tiene código fuente, el asunto es mucho más complicado: la ingeniería inversa, que, por cierto, no siempre justifica el esfuerzo.

 
VladislavVG:

Si tienes el código fuente del indicador, no es difícil: mira el código fuente y encuentra las condiciones para el cambio de color en el indicador. Con ellas formamos una señal. Hay 2 maneras de hacerlo: la primera - escribiendo un "wrapper" para el análisis de las condiciones de cambio de los valores del buffer, el código del indicador no se cambia, se utiliza iCustom(), la segunda - convirtiendo el código del indicador en la función que se puede llamar desde el Asesor Experto. Ambos métodos se describen en los artículos del sitio web.

Si está interesado, por ejemplo, en el indicador Heikin-Ashi suavizado, busque en el sitio web - para este indicador hubo una discusión, por lo que recuerdo, tanto la corrección del algoritmo como el análisis de la señal fueron discutidos. El código de su abierta y está disponible en la base de código (hay un montón de ellos allí).

Si el indicador es único y no tiene código fuente, el asunto es mucho más complicado: la ingeniería inversa, que, por cierto, no siempre justifica el esfuerzo.


muchas gracias, lo probaré. Podrías ayudarme a encontrar artículos sobre "envolver" y convertir el código de los indicadores, ya que me temo que no puedo interpretar esto en una consulta de búsqueda.
 
Ayuda, por favor. El indicador dibuja las líneas de máximos y mínimos del día anterior. Lo necesito para trazar líneas en la historia todos los días. Gracias.
Archivos adjuntos:
line.mq4  3 kb
 
prom18:
Ayuda, por favor. El indicador dibuja las líneas de máximos y mínimos del día anterior. Lo necesito para trazar líneas en la historia todos los días. Gracias.
Archivos adjuntos:
line_1.mq4  3 kb
 
bistreevseh:

Muchas gracias, lo probaré. Podrías ayudarme a encontrar artículos sobre el "wrapper" y la transformación del código de los indicadores, ya que me temo que no puedo interpretar esto en una consulta de búsqueda.


https://www.mql5.com/ru/forum/114117 aquí hay un ejemplo de creación de una función envolvente para interpretar las señales de los indicadores

aquí hay artículos sobre el uso de los códigos indicadores:

https://www.mql5.com/ru/articles/1456

https://www.mql5.com/ru/articles/1457

 
Vinin:



Gracias.
 
VladislavVG:


https://www.mql5.com/ru/forum/114117 aquí hay un ejemplo de creación de una función envolvente para interpretar las señales de los indicadores

aquí hay artículos sobre el uso de los códigos indicadores:

https://www.mql5.com/ru/articles/1456

https://www.mql5.com/ru/articles/1457


Una vez más, muchas gracias.