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

 

Hola a todos. Necesito ayuda.

En mi EA se abren series de órdenes en número dado por el parámetro MaxOrders, a continuación he dado un ejemplo de cómo se ve, no juzgues por lotes

lote de 1 orden=128

lote-orden-lote=256

orden de 3 lotes=512

4-order-lot=1024

Lote de 5 órdenes=2048

esto es lo que necesita para su probador.

MaxOrders=5, y 5 órdenes están abiertas. El problema es que en el probador del broker, el lote limitado a 1000 es de 4 y 5 órdenes no se abren como es debido.

He buscado en Internet la forma de cambiar este parámetro en el Probador de Estrategias, pero no he encontrado cómo hacerlo.

Por lo tanto, he decidido resolver esta cuestión mediante la programación. He decidido abrir varios pedidos para 4 pedidos y conseguir dos

4-order-lot=1000

lote de 4 órdenes=24

para 5 pedidos 3:

Lote de 5 órdenes=1000

Lote de 5 órdenes=1000

lote de 5 órdenes=48

pero hay dos problemas,

- cómo dividir el MM adecuadamente para que se divida en lotes según el lote máximo

- Cómo abrir órdenes adicionales sin perturbar el orden, es decir, habrá más órdenes que en maxOrders pero no se consideran las adicionales que se abren para mantener el volumen.

 
solnce600:

¡Alexei! ¡Buenas tardes!

Nuestra comunicación no sale de mi cabeza...... y aquí está el porqué.....

Con respecto a mi codificación, he escuchado repetidamente comentarios sobre la falta de lógica.

Ayer me explicaste que significa álgebra booleana. Este tema es muy amplio y muy profundo.

El hecho es que no soy un matemático y, desde luego, no soy un algebraico.

Entiendo algunas cosas matemáticas no tan complicadas.... , pero no a la vez y las cosas complejas mi cerebro no las percibe en absoluto.

Hace más de seis meses, antes de empezar a estudiar el libro de texto de programación de ACM, me preguntaba

si podría entenderlo sin la habilidad matemática.

Pero el Sr. Kozlov, en el prefacio de su libro de texto, dice que en realidad es mucho más sencillo de lo que parece a primera vista.

a primera vista.

Y de hecho el 60-70% de su tutorial creo que ahora soy capaz de entenderlo (probablemente no sea la primera vez) y como resultado ya puedo codificar algo.

Hasta ayer me parecía que todos los complejos cálculos matemáticos (que no puedo entender) hacer el programa, y sólo necesito saber las reglas por las que

el programa funciona y hace los cálculos.

Pero nuestra conversación de ayer me llevó a la idea de que si no aprendo álgebra booleana, mis códigos estarán ausentes de lógica.

Si mis códigos carecen de lógica booleana, mis programas no funcionarán correctamente, o no funcionarán en absoluto.

Pero ayer eché un vistazo a la Wikipedia y me di cuenta de que el álgebra booleana, y probablemente la lógica, no es para mi mente.

Ayer has deducido rápidamente de un vistazo superficial a un fragmento de mi código que carece de lógica booleana.

Si no le importa, ¿podría explicar el curso de su razonamiento, que precedió a su conclusión sobre la ausencia de lógica en este fragmento?

Si te entiendo, seguiré adelante. Si no lo entiendo ..... probablemente concluiré que la programación es algo que supera ampliamente mis capacidades.

Gracias.

si (ot==0)
si (Oferta==Precio)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))
if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Andrei, ¡no es tan trágico! Utiliza lo que entiendas. Todo lo demás vendrá con el tiempo.

Por ejemplo, después de haber comprobado el cierre por parada mediante la función de Kim, hay que introducir una variable adicional Lots y antes de abrir una nueva posición con un lote duplicado hay que escribir la siguiente línea: Lots = Lot*2.0 y ¡eso es todo! Y pones un Lote normal, ¡donde no necesitas doblar!

¿Por qué se necesitan códigos complejos para cosas sencillas? ¿Por el bien de la ciencia, para que nadie pueda entenderlos? Una especie de protección contra el "plagio".

 
borilunad:

Andrei, ¡no es tan trágico! Utiliza lo que entiendas. Todo lo demás vendrá a su debido tiempo.

Por ejemplo, habiendo comprobado el cierre por stop, debe introducir una variable adicional Lots, y antes de abrir una nueva posición con un lote duplicado, debe escribir la siguiente línea: Lots = Lot*2.0 y ¡eso es todo! Y pones un Lote normal, ¡donde no necesitas doblar!

¿Por qué se necesitan códigos complejos para cosas sencillas? ¿Por el bien de la ciencia, para que nadie pueda entenderlos? Una especie de protección contra el "plagio".

¡Boris! Gracias por los ánimos. Me has calmado un poco....

Pero sigo sufriendo los repetidos comentarios sobre la falta de lógica de mis códigos.

Y lo que más me jode es que no puedo entender de qué estoy hablando exactamente.

Me parece que la ausencia de lógica booleana en el código es importante.

Pero, ¿cómo puedo saber si existe o no?

Alexey me dijo que podría tener problemas debido a este fragmento (aunque el probador está bien).

si (ot==0)

si (Oferta==Precio)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

En caso de que haya un error de codificación, todo está claro: me lo dirá el MetaEditor o el Terminal Log.

Y si me falta la lógica ....... ¿cómo puedo saberlo? Sólo con una pista de los compañeros más experimentados.

Pero incluso después de sus indicaciones no entiendo de qué se trata exactamente.

Estudiar álgebra booleana es irreal para mí.

 

Olvídate de ese álgebra booleana y no lo vuelvas a mencionar.

Una anécdota:

Un profesor de psiquiatría visitó un hospital para enfermos mentales y preguntó al médico jefe cómo determinan si un paciente se ha recuperado o sigue enfermo.

- Llenamos la bañera con agua, ponemos una taza de té con una cuchara en el borde y ofrecemos al paciente que remueva el agua.

- ¿Debemos suponer que si el paciente está bien, toma la taza y no la cuchara?

- Si el paciente está sano, tira del corcho en la bañera.

* * *

Deberías ser capaz de responder a tu propia pregunta sobre si las acciones que intentas hacer en código son razonables, y no es una pregunta tan difícil.

Apertura[1]-Cierre[1] puede ser negativo. Así que para el caso de Cerrar>Abrir hay una opción, para el caso de Cerrar<Abrir hay otra opción. O debería calcular el tamaño del cuerpo para que no dependa de la dirección de la vela.

 
solnce600:

¡Boris! Gracias por tu apoyo. Me has calmado un poco....

Pero aún así me han dicho repetidamente que no hay lógica en mis códigos.

Y lo que más me jode es que no puedo entender de qué estoy hablando exactamente.

Me parece que la ausencia de lógica booleana en el código es importante.

Pero, ¿cómo puedo saber si existe o no?

Alexey dijo que está ausente en este fragmento y que puedo tener problemas debido a este fragmento (aunque el probador está bien).

si (ot==0)

si (Oferta==Precio)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

En caso de un error en la codificación todo está claro - o me lo dice el MetaEditor o el Terminal Log.

Pero si me falta la lógica ......., ¿cómo puedo saberlo? Sólo con una pista de colegas más experimentados.

Pero ni siquiera después de sus indicaciones entiendo de qué estoy hablando.

Aprender álgebra booleana es irreal para mí.

"Primero, haré que tu código sea legible, eliminaré los paréntesis y las condiciones innecesarias, ¡y luego podrás decirme por qué necesitas esas condiciones!

if (ot==0)                    //если Buy, значит эти условия для закрытия или модификации?!

if (Bid==Price)               //это не будет работать на Реале! 
                              //Надо так: (Bid>=Price) или (Bid<=Price) в зависимости от направления
if(Open[1]-Close[1]>100*Point && Open[1]-Close[1]<120*Point)
if(High[1]-Open[1]>40*Point && High[1]-Open[1]<60*Point)  

if(Close[1]-Low[1]>40*Point && Close[1]-Low[1])<60*Point) 

 
borilunad:

"Primero haré que tu código sea legible, eliminaré los paréntesis innecesarios y las condiciones innecesarias, ¡y luego me dirás por qué necesitas esas condiciones!

Te digo por qué necesito estas condiciones innecesarias.

Necesito las condiciones que has enviado al horno, para que el programa calcule los parámetros específicos de la vela con un hueco de 1 punto.

Es decir, una vela bajista con un tamaño específico de su cuerpo, con un tamaño específico entre los precios de apertura y de cierre, con el tamaño específico de la distancia entre los precios de apertura y de cierre.

Tengo entendido que para este propósito, si no me equivoco, también se puede utilizar NormalizeDouble (MathAbs ()), pero no he notado ninguna diferencia entre esta versión y la que he utilizado.

 
solnce600:

Te digo para qué necesito esas condiciones extra.

Las condiciones que me enviaste al horno, necesito el programa para calcular los parámetros específicos de la vela +, - 1 punto.

Es decir, una vela bajista con un tamaño específico de su cuerpo, con un tamaño específico entre los precios de apertura y de cierre, con el tamaño específico de la distancia entre el precio de cierre y el de apertura.

Tengo entendido que para este propósito, si no me equivoco, también se puede utilizar NormalizeDouble (MathAbs ()), pero no he notado ninguna diferencia entre esta versión y la que he utilizado.

Entonces vea lo de arriba, ¡corregido!
 
Integer:

Olvídate de ese álgebra booleana y no lo vuelvas a mencionar.

Una anécdota:

Un psiquiatra visitó un hospital para enfermos mentales y preguntó al médico jefe cómo determinan si un paciente se ha recuperado o sigue enfermo.

- Llenamos la bañera de agua, ponemos una taza de té con una cuchara en el borde y ofrecemos al paciente que remueva el agua.

- ¿Debemos suponer que si el paciente está bien, toma la taza y no la cuchara?

- Si el paciente está sano, tira del corcho en la bañera.

* * *

Deberías ser capaz de responder a tu propia pregunta sobre si las acciones que intentas hacer en código son razonables, y no es una pregunta tan difícil.

Apertura[1]-Cierre[1] puede ser negativo. Así que para el caso de Cerrar>Abrir hay una opción, para el caso de Cerrar<Abrir hay otra opción. O debería calcular el tamaño del cuerpo para que no dependa de la dirección de la vela.

Gracias por la anécdota.....a partir de ahora intentaré pensar sólo en el enchufe.

Pero de todos modos ... cuando personas reputadas de esta rama dicen repetida y simultáneamente sobre la ausencia de lógica en mi código.... como resulta después el álgebra booleana - significa escupir sobre la autoridad de los profesionales serios de esta rama..... no me pondré inmediatamente a su altura.... y puede que no me ponga en absoluto..... no lo he intentado todavía.

 
borilunad:
Entonces vea lo de arriba, ¡corregido!

¿Tenía muchos paréntesis de más? ¿Son perjudiciales?

Bueno, si el compilador no me dio un error al introducir estos paréntesis .... pensé que todo estaba bien.

Hasta hace poco pensaba que si el compilador no se quejaba y el EA funcionaba en el Probador de Estrategias de acuerdo con su código, entonces estaba bien.

Parece que no es del todo así.....

 
solnce600:

¡Boris! Gracias por tu apoyo. Me has calmado un poco....

Pero aún así me han dicho repetidamente que no hay lógica en mis códigos.

Y lo que más me jode es que no puedo entender de qué estoy hablando exactamente.

Me parece que la ausencia de lógica booleana en el código es importante.

Pero, ¿cómo puedo saber si existe o no?

Alexey dijo que está ausente en este fragmento y que puedo tener problemas debido a este fragmento (aunque el probador está bien).

si (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

En caso de un error en la codificación todo está claro - o me lo dice el MetaEditor o el Terminal Log.

Pero si me falta la lógica ......., ¿cómo puedo saberlo? Sólo con una pista de colegas más experimentados.

Pero ni siquiera después de sus indicaciones entiendo de qué estoy hablando.

Estudiar álgebra booleana es irreal para mí.


No hace falta ser un experto en álgebra booleana para exponer los términos con claridad...

Déjame facilitarte las cosas un poco... Sustituya if por el habitual si, else por otherwise, && por and, || por or , etc. Entonces podrás leer con tus propias palabras normales lo que está escrito o decidir lo que quieres escribir.

Lo que has escrito (omitamos por ahora la descripción incorrecta de las condiciones):

1. if (ot==0) Si no hay órdenes de mercado (ni órdenes de mercado, ni pendientes, ni abiertas por este EA, otro EA o manualmente)... Si la respuesta es afirmativa, se ejecuta la línea 2, si es negativa, se pasa a la línea 3.

2. if (Bid==Price) Si el precio es igual al precio de apertura de la vela actual... Si lo es, se ejecuta la línea 3, si no, pasamos a la línea 4.

3. if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point)) Si el precio de apertura de la primera vela es superior al precio de cierre de la primera vela en más de 100 puntos y menos de 120 puntos... Si lo es, pase a la línea 4, si no, pase a la línea 5.

4. if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point)) Si el máximo de la primera vela es superior al precio de apertura de la primera vela en más de 40 puntos y menos de 60 puntos... Si lo es, entonces ejecutamos la línea 5, si no, pasamos a la línea 6.

5. if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point)) Si el cierre de la primera vela es superior al mínimo de la primera vela en más de 40 puntos y menos de 60 puntos. Si lo es, se ejecuta la línea 6, si no, se pasa a la línea 7.

6.

7.

Como puedes ver en esta descomposición, o bien haces que todas las líneas de código se ejecuten una tras otra (en caso de que cada línea devuelva true), o bien te saltas la línea que viene después de la que devuelve false.

Para evitar confusiones en sus términos, y para componer correctamente su lógica, encierre todas las sentencias entre llaves, independientemente de si se debe ejecutar una sola línea después del valor de verdad, o un bloque entero.

Por ejemplo:

if (ot==0) {
   if (Bid==Price) {
      // сюда можно вписать целый блок, который будет исполняться лишь при одном условии, что bid==Price
      // только вот вряд ли он когда-либо исполнится в реале
      }
   }
Por lo tanto, trata de descomponer tu código en componentes, eliminando los paréntesis extra, que son innecesarios en este caso...