¿Cómo codificar? - página 305

 
gmailer:
^ Gracias - eso podría ser. ¿Sabe usted cómo deshacerse de esos "puntos verdes y rosas" en las partes inferiores y superiores?

Lo siento - en realidad estaba mirando mi otro Stoch donde tales puntos están presentes. El sugerido en respuesta a mi primer post estaba bien. Gracias.

 

Tal vez sólo un consejo :

Cuando tengas un "ladrillo" (una función, un fragmento, una parte de código) que funciona bien, no lo alteres. Las funciones son buenas porque puedes cambiar sus entradas y funcionan según las entradas. Y, una vez que has probado las funciones en todo tipo de situaciones, no tienes que pensar si funciona bien. De esta manera puedes reducir el código que tienes que mirar cuando buscas errores (y eso puede acelerar el tiempo de desarrollo inmensamente)

crsnape@btinternet.com:
Hola mladen Estoy totalmente de acuerdo contigo, la función GetLots que has proporcionado funciona como debería; la he probado como parte de mi código y ha funcionado.

He hecho cambios en él simplemente porque quiero cambiar mi peramter de riesgo dependiendo de si estoy ganando o perdiendo. Básicamente he elaborado el código existente (o lo he intentado de todos modos) incorporando reglas adicionales de gestión del dinero.

Puedo decir honestamente que mi código no es secreto; estoy seguro de que muchos otros han considerado e implementado en código lo que estoy tratando de hacer; pero supongo que hay un elemento de privacidad porque yo personalmente he pasado mucho tiempo desarrollándolo.

Seguiré revisando mi código, obviamente quiero intentar resolver cualquier problema por mí mismo, ya que me enorgullece aprender y hacer las cosas desde cero.

Pero entiendo tu párrafo final; utilizaré una variable "Riesgo" y cambiaré este riesgo según la salida de una función.

De todas formas gracias por responder una vez más, este foro sinceramente no sería lo mismo sin ti; me has ayudado infinidad de veces.

Saludos :-)
 

Algo de lo que no estoy seguro es de los paréntesis de la función y lo que va dentro de ella.

Si escribo una función dentro de otra función, ¿necesito poner el nombre de esta función dentro de los paréntesis?

Por ejemplo, si tengo una función LastOpenTicket() y ésta es llamada dentro de una función llamada GetLots, ¿necesito poner LastOpenTicket() entre los paréntesis, como GetLots (LastOpenTicket())?

¿También tengo que poner el () ahí dentro? ¿Y si es LastOpenTicket (int number, int digit, int anotherone), se pone todo esto en el paréntesis de la función GetLots también en este caso, por ejemplo GetLots (int number, int digit, int anotherone.. y cualquier otra variable en la función etc?)

 

...

1. Imagina el par de corchetes {} como "inicio" y "fin"

2. No puedes escribir funciones anidadas en mql (pascal lo permite, pero mql no - las funciones anidadas serían declarar una función dentro del cuerpo de otras funciones. Ver aquí : Función anidada - Wikipedia, la enciclopedia libre). 2. Puedes colocar una llamada a cualquier función en cualquier parte de tu código

3. puedes usar esa forma de llamada (una llamada directa, como tu ejemplo GetLots (LastOpenTicket())) o puedes asignar el retorno de LastOpenTicket() a alguna variable y luego usarla como argumento en una llamada a GetLots()

crsnape@btinternet.com:
Algo que no tengo claro es lo de los paréntesis de la función y lo que va dentro.

Si escribo una función dentro de otra función, ¿tengo que poner el nombre de esta función dentro de los paréntesis?

Por ejemplo, si tengo una función LastOpenTicket() y ésta es llamada dentro de una función llamada GetLots, ¿necesito poner LastOpenTicket() entre los paréntesis, como GetLots (LastOpenTicket())?

¿También tengo que poner el () allí también? ¿Qué pasa si es LastOpenTicket (int number, int digit, int anotherone), todo esto se pone en el paréntesis de la función GetLots también en este caso, por ejemplo GetLots (int number, int digit, int anotherone.. y cualquier otra variable en la función, etc?)
 

¿Cuál es la diferencia entre estos dos? ¿Hay alguna?

double GetLots (int number, int call, int specialcall, int order)

{

y..

double GetLots ()

{

int número;

int llamada;

int llamada especial;

int orden;

?

 

...

La primera es una función que acepta argumentos

La segunda es una función sin argumentos, por lo que no se pueden cambiar los valores "number", "call", "specialcall" y "order" fuera del cuerpo de la función

Puede encontrar más información útil sobre la declaración de funciones en este hilo : https://www.mql5.com/en/forum/173005

crsnape@btinternet.com:
¿Cuál es la diferencia entre estos dos? ¿Hay alguna?

double GetLots (int number, int call, int specialcall, int order)

{

y..

double GetLots ()

{

int número;

int llamada;

int llamada especial;

int orden;

?
 

He estado jugando con mis funciones durante el último par de días y todavía estoy recibiendo resultados en blanco. Estoy literalmente rasgando mi pelo hacia fuera.

He cambiado la función para calcular RiskSize como usted sugirió (estoy de acuerdo en que es un sistema mejor ahora) y lo he utilizado en mi función GetLots. Esto es:

//--- Función para calcular los lotes de las posiciones largas

double GetLotsLong (double SLDistanceLong)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

double LotsLong = 0;

int LoteDigito = 2;

int Riesgo = GetRiskLong (RiskLong);

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Los lotes deben ser normalizados para acomodar el LotStep.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // La normalización no redondea, sino que corta cualquier porción de lote que sea mayor que LotStep.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Así el riesgo es un poco menor.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

si (LotStep == 1.00) LotDigit = 0;

si (LotStep == 0.10) LotDigit = 1;

si (LotStep == 0.01) LotDigit = 2;

si (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (Risk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (Risk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}

También se queja RiskLong - variable no definida. Pero esto se define en la función GetRiskLong que su llamada.

Si es difícil de ayudar con sólo el código que he publicado podría enviarlo a usted?

 

...

En primer lugar, no hay necesidad de hacer lotes separados para un largo y para un corto. Utilice una función (que ya se le ha proporcionado) para ambos tipos de órdenes (el cálculo del tamaño del lote para ambos, corto y largo, debe ser exactamente el mismo).

El error que está obteniendo es porque las variables declaradas dentro de las funciones son "visibles" sólo dentro de las funciones. No importa que llames a la función que tiene una variable llamada con el nombre que dices: es local sólo para la función llamada, otras partes del código no "saben" de ella y no pueden acceder a ella

crsnape@btinternet.com:
He estado jugando con mis funciones durante el último par de días y todavía estoy recibiendo resultados en blanco. Estoy literalmente rasgando mi pelo hacia fuera.

Cambié la función para calcular RiskSize como sugeriste (estoy de acuerdo en que es un mejor sistema ahora) y lo usé en mi función GetLots. Esto es:

//--- Función para calcular los lotes de las posiciones largas

double GetLotsLong (double SLDistanceLong)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

double LotsLong = 0;

int LoteDigito = 2;

int Riesgo = GetRiskLong (RiskLong);

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Los lotes deben ser normalizados para acomodar el LotStep.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // La normalización no redondea, sino que corta cualquier porción de lote que sea mayor que LotStep.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Así el riesgo es un poco menor.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

si (LotStep == 1.00) LotDigit = 0;

si (LotStep == 0.10) LotDigit = 1;

si (LotStep == 0.01) LotDigit = 2;

si (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (Risk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (Risk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}

También se queja RiskLong - variable no definida. Pero esto se define en la función GetRiskLong que su llamada.

Si es difícil ayudar sólo con el código que he publicado, ¿podría enviárselo?
 
mladen:
First es una función que acepta argumentos

La segunda es una función sin argumentos por lo que no se pueden cambiar los valores "number", "call", "specialcall" y "order" fuera del cuerpo de la función

Puede encontrar más información útil sobre la declaración de funciones en este hilo : https://www.mql5.com/en/forum/173005

Gracias por esto. Entonces, si estoy llamando a una función llamada GetRisk desde dentro de una función llamada GetLots, tendría que poner las variables de la función GetRisk entre los paréntesis (...) de GetLots porque los valores se calculan fuera de la función GetLots?

 

...

Déjame probar de esta manera :

2 preguntas (suponiendo que conocemos el estado actual de la cuenta) :

pregunta 1 : Estoy dispuesto a arriesgar (no sé)%con (no sé) pips de stop loss. ¿Cuál debería ser el tamaño de mis lotes?

pregunta 2 : Estoy dispuesto a arriesgar el 1% con 100 pips de stop loss. ¿Cuál debería ser el tamaño de mis lotes?

Es obvio que la respuesta a la primera pregunta es imposible ya que no se sabe el porcentaje de riesgo que estoy dispuesto a arriesgar ni el stop loss que voy a utilizar. Pero en el segundo ejemplo es posible calcular el tamaño del lote ya que se conocen todos esos datos. Ahora bien, esos son los argumentos: ya que predecimos que el rsik% y el stop loss pueden variar, los proporcionamos al cálculo del tamaño del lote como argumentos variables que se van a "decir" a la función cada vez que se llame a la función

Espero que esto aclare para qué sirven los argumentos (parámetros) en las funciones. Todas y cada una de las funciones trabajan bajo el mismo principio: si usted predice que alguna parte del cálculo puede fallar, póngala como argumento a la función

Aquí tienes más ejemplos de codificación de funciones : https://en.wikipedia.org/wiki/Function_%28computer_science%29

crsnape@btinternet.com:
Gracias por esto. Entonces, si estoy llamando a una función llamada GetRisk desde dentro de una función llamada GetLots, necesitaría poner las variables de la función GetRisk en los paréntesis (...) de GetLots porque los valores se calculan fuera de la función GetLots?
Razón de la queja: