Gracias por el consejo, Alexey! Primero esperaré una respuesta en este hilo, pero si no pasa nada, entonces pasaré al hilo de Errores, Bugs, Preguntas.
Sinceramente, Vladimir.
No obtendrás ninguna respuesta de los desarrolladores en este hilo. Si has encontrado un error, asegúrate de que es realmente un error, comunícalo a la rama que dirige Alexey. No hay que esperar que los moderadores actúen en esto, también somos humanos y a veces no tenemos tiempo.
Es poco probable que obtengas respuestas de los desarrolladores en este hilo. Si encuentras un error, asegúrate de que es realmente un error, infórmalo a la rama de Alexey. No hay que esperar acciones de los moderadores en esta ocasión, también somos personas y tampoco tenemos tiempo.
Aquí hay dos funciones para el asesor de la red la primera función es el cálculo de beneficios, teniendo en cuenta el cierre parcial de las órdenes perdedoras
La segunda función es el cierre de órdenes con cierre parcial de órdenes perdedoras
//+----------------------------------------------------------------------------+//| Закрытие сетки ордеров при заданной команде с учетом части ордеров |//+----------------------------------------------------------------------------+void ClosseAll()
{
int i,j,tkt;
for(i = OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES) || OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic)
continue;
tkt=OrderTicket();
RefreshRates();
if(OrderProfit()>=0)
{
if(OrderType() == OP_BUY)
{
if(!OrderClose(OrderTicket(), OrderLots(), Bid, slip))
Print("Не удалось закрыть ордера на покупку!");
}
elseif(OrderType() == OP_SELL)
{
if(!OrderClose(OrderTicket(), OrderLots(), Ask, slip))
Print("Не удалось закрыть ордер на продажу!");
}
}
elsefor(j=0; j<nOrd; j++)
if(tkt==Ord_ticket[j])
{
if(OrderLots()<Ord_lot[j])
Ord_lot[j]=OrderLots();
Ord_lot[j]=NRL(Ord_lot[j]);
if(OrderType() == OP_BUY)
{
if(!OrderClose(OrderTicket(), Ord_lot[j], Bid, slip))
Print("Не удалось закрыть ордера на покупку!");
}
elseif(OrderType() == OP_SELL)
{
if(!OrderClose(OrderTicket(), Ord_lot[j], Ask, slip))
Print("Не удалось закрыть ордер на продажу!");
}
break;
}
}
}
La situación es la siguiente: si cierro una parrilla de órdenes teniendo en cuenta el cierre parcial de las órdenes perdedoras, obtengo una pérdida como resultado del redondeo hacia el lado mayor de algunos lotes que deben cerrarse
La pregunta es si se pueden utilizar estas dos funciones para escribir una función para calcular las órdenes perdidas, o más bien una parte de una orden que se va a cerrar.
¡¡¡el truco clave es mirar el índice en el bucle y modificarlo con la opción ticket!!!
//--- при таком методе мы будет сюда попадать на каждом тике.for(int i=PositionsTotal()-1;i>=0;i--)
if(m_position.SelectByIndex(i))
if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
{
//--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позицииif(m_position.PositionType()==POSITION_TYPE_BUY)
{
//--- когда у позиции ещё нет StopLossif(m_position.StopLoss()==0)
{
//--- пока StopLoss равен 0.0, TrailingStep не учитываемif(m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
{
//--- модификация позиции
m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
}
}
2022.02.2613:56:48.489 test (NZDUSD,H4) 0000000891001213131313001302022.02.2613:56:48.489 test (NZDUSD,H4) 12345678910111213131313131313132022.02.2613:56:48.489 test (NZDUSD,H4) 123456711
Se espera:
2022.02.2613:56:48.489 test (NZDUSD,H4) 0000000891001213131313001302022.02.2613:56:48.489 test (NZDUSD,H4) 12345678910111213131313131313132022.02.2613:56:48.489 test (NZDUSD,H4) 123456711131313
ArrayJ es dinámico, parece que hay algo que no funciona... Pero tampoco necesito una estática.
Me ha roto la cabeza. ¿QUÉ PASA? ¿O es el equivalente a la vieja canción
2. ArrayRemove no hace que un elemento del array esté "vacío", sino que "desplaza" los elementos siguientes a su lugar. Por lo tanto, la coincidencia de elementos en los índices posteriores se rompe.
2. ArrayRemove no hace que un elemento del array esté "vacío", sino que "desplaza" los elementos posteriores en su lugar. Por lo tanto, la coincidencia de elementos en los índices posteriores se rompe.
No hay duda sobre la 2, sólo he puesto los intervalos para que quede más claro. Además, en Help dice sobre un array estático:"Si la función se utiliza para un array de tamaño fijo, el tamaño del array en sí no cambia: la "cola" restante se copia físicamente a la posición inicial."El ejemplo de la Ayuda también utiliza un array de tamaño fijo, y yo tengo uno dinámico.
Re 1. No podemos ponerlo fuera de un bucle, ya que en una tarea real no sabemos de antemano ni el tamaño de ArrayJ ni el de ArrayI, y mucho menos el de CommonArray, ya que no coinciden todos.
También tengo un ejemplo en el que el vertido de elementos no se rompe a medias, como en este ejemplo:
Pero necesitas esa variante para que funcione. Al parecer, el problema se produce si hay elementos con el mismo valor (véase el post anterior) en la cola de la derecha, lo que es similar al problema al que me refería más arriba.
No hay preguntas sobre la 2, pongo los intervalos para mayor claridad. Además, en la Ayuda dice sobre el array estático:"Si la función se utiliza para un array de tamaño fijo, el tamaño del propio array no cambia: copia físicamente la "cola" restante a la posición inicial."El ejemplo de la Ayuda también utiliza un array de tamaño fijo, y yo tengo uno dinámico.
Re 1. No podemos ponerlo fuera de un bucle, ya que en una tarea real no sabemos de antemano ni el tamaño de ArrayJ ni el de ArrayI, y mucho menos el de CommonArray, ya que no coinciden todos.
También tengo un ejemplo en el que el barajado de elementos no se interrumpe a mitad de camino, como en el ejemplo anterior:
El resultado es bueno:
Pero necesito que esa variante funcione. Al parecer, el problema se produce si hay elementos con el mismo valor en la cola de la derecha (véase el post anterior), lo que es similar al problema al que me refería antes.
1. Puedes y debes sacarlo del bucle, de la manera que he mostrado. A menos que el tamaño de ArrayI cambie a lo largo del bucle.
2. Entonces algo como esto
int k=0; // объявляем до цикла - чтобы использовать послеfor(int i=0; i<ArraySize(ArrayI); i++) // после предыдущего кода (1) размеры ArrayI и ArrayJ равныif(ArrayI[i]!=ArrayJ[i])
{
ArrayJ[k++]=ArrayI[i];
}
ArrayResize(ArrayJ,k);
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
Gracias por el consejo, Alexey! Primero esperaré una respuesta en este hilo, pero si no pasa nada, entonces pasaré al hilo de Errores, Bugs, Preguntas.
Sinceramente, Vladimir.
No obtendrás ninguna respuesta de los desarrolladores en este hilo. Si has encontrado un error, asegúrate de que es realmente un error, comunícalo a la rama que dirige Alexey. No hay que esperar que los moderadores actúen en esto, también somos humanos y a veces no tenemos tiempo.
Es poco probable que obtengas respuestas de los desarrolladores en este hilo. Si encuentras un error, asegúrate de que es realmente un error, infórmalo a la rama de Alexey. No hay que esperar acciones de los moderadores en esta ocasión, también somos personas y tampoco tenemos tiempo.
¡Hola Artem!
Todo está claro.
Sinceramente, Vladimir.
¡¡¡¡Buenas tardes!!!!
Aquí hay dos funciones para el asesor de la red la primera función es el cálculo de beneficios, teniendo en cuenta el cierre parcial de las órdenes perdedoras
La segunda función es el cierre de órdenes con cierre parcial de órdenes perdedoras
La situación es la siguiente: si cierro una parrilla de órdenes teniendo en cuenta el cierre parcial de las órdenes perdedoras, obtengo una pérdida como resultado del redondeo hacia el lado mayor de algunos lotes que deben cerrarse
La pregunta es si se pueden utilizar estas dos funciones para escribir una función para calcular las órdenes perdidas, o más bien una parte de una orden que se va a cerrar.
Si es así, por favor ayúdame a escribirlo
Gracias
¡¡¡¡Buenas tardes!!!!
Si es así, ayúdame a escribirlo.
No es un buen momento.
¿Te refieres a escribirlo para ti?
No son buenos tiempos.
¿Te refieres a escribir para ti?
No te destroces Alexander
perdido en lo elemental:
cómo organizo una pose de arrastre - codirigida, por alguna razón arrastra una pose, es decir, no arrastra... MT5
puedo utilizar una simple sección de código como enumeración de posiciones para un arrastre con posiciones de mercado HEDGE - gracias.
¡el problema está resuelto! ¡¡¡Enhorabuena una vez más a Vladimir Karputov!!!
¡con su red de arrastre!
https://www.mql5.com/ru/code/17263
¡¡¡el truco clave es mirar el índice en el bucle y modificarlo con la opción ticket!!!
Una tarea sencilla: hay que eliminar todos los elementos de la matriz J que tengan el mismo índice y valor que los elementos de la matriz I:
La cadena de claves está resaltada. Resultado:
Se espera:
ArrayJ es dinámico, parece que hay algo que no funciona... Pero tampoco necesito una estática.
Me ha roto la cabeza. ¿QUÉ PASA? ¿O es el equivalente a la vieja canción
https://www.mql5.com/ru/forum/1111/page3141#comment_27152680
и
https://www.mql5.com/ru/forum/1111/page3142#comment_27371998
sobre las constantes con nombre?
La cadena de claves está resaltada. Resultado:
Se espera:
ArrayJ es dinámico, parece que hay algo que no funciona... Pero tampoco necesito una estática.
1. ArrayResize sería mejor moverlo fuera del bucle.
2. ArrayRemove no hace que un elemento del array esté "vacío", sino que "desplaza" los elementos siguientes a su lugar. Por lo tanto, la coincidencia de elementos en los índices posteriores se rompe.
1. ArrayResize debería salir del bucle
2. ArrayRemove no hace que un elemento del array esté "vacío", sino que "desplaza" los elementos posteriores en su lugar. Por lo tanto, la coincidencia de elementos en los índices posteriores se rompe.
No hay duda sobre la 2, sólo he puesto los intervalos para que quede más claro. Además, en Help dice sobre un array estático:"Si la función se utiliza para un array de tamaño fijo, el tamaño del array en sí no cambia: la "cola" restante se copia físicamente a la posición inicial."El ejemplo de la Ayuda también utiliza un array de tamaño fijo, y yo tengo uno dinámico.
Re 1. No podemos ponerlo fuera de un bucle, ya que en una tarea real no sabemos de antemano ni el tamaño de ArrayJ ni el de ArrayI, y mucho menos el de CommonArray, ya que no coinciden todos.
También tengo un ejemplo en el que el vertido de elementos no se rompe a medias, como en este ejemplo:
El resultado es bueno:
Pero necesitas esa variante para que funcione. Al parecer, el problema se produce si hay elementos con el mismo valor (véase el post anterior) en la cola de la derecha, lo que es similar al problema al que me refería más arriba.
No hay preguntas sobre la 2, pongo los intervalos para mayor claridad. Además, en la Ayuda dice sobre el array estático:"Si la función se utiliza para un array de tamaño fijo, el tamaño del propio array no cambia: copia físicamente la "cola" restante a la posición inicial."El ejemplo de la Ayuda también utiliza un array de tamaño fijo, y yo tengo uno dinámico.
Re 1. No podemos ponerlo fuera de un bucle, ya que en una tarea real no sabemos de antemano ni el tamaño de ArrayJ ni el de ArrayI, y mucho menos el de CommonArray, ya que no coinciden todos.
También tengo un ejemplo en el que el barajado de elementos no se interrumpe a mitad de camino, como en el ejemplo anterior:
El resultado es bueno:
Pero necesito que esa variante funcione. Al parecer, el problema se produce si hay elementos con el mismo valor en la cola de la derecha (véase el post anterior), lo que es similar al problema al que me refería antes.
1. Puedes y debes sacarlo del bucle, de la manera que he mostrado. A menos que el tamaño de ArrayI cambie a lo largo del bucle.
2. Entonces algo como esto