¿Cómo codificar? - página 304

 

...

1. En general. no, no tiene sentido comprobarlo ya que la mayoría de las veces tendrás muchas más barras de las que necesitas para que una media móvil se "estabilice" . No es un error antiguo, sino que es una simple comprobación de cuántas barras hay en el historial

2. Sí. Sólo hay que tener en cuenta que iClose() (y sus similares iOpen(), iHigh() y iLow()) son funciones mientras que Close[],Open,High[],Low[] son simples matrices con un acceso mucho, mucho más rápido a los valores, por lo que hay que sopesar si realmente se necesita la flexibilidad de la función por encima de la velocidad y simplicidad de las matrices de acceso.

zzz:
Hola, soy nuevo en la programación pero no en el trading. Llevo un tiempo sin publicar nada y ahora, desde que empecé a desarrollar mi EA, tengo muchas preguntas. Empecé con la construcción de un indicador primero, y una vez que hace lo que quiero voy a ir más allá. He leído todos los manuales que he podido encontrar, así que ahora es el momento de avanzar con la codificación.

Lo siento, si es un hilo incorrecto - por favor, hágamelo saber donde debo publicar tales preguntas entonces.

Tengo 2, probablemente, preguntas básicas por ahora, por favor:

1. En muchos indicadores que utilizan MAs veo líneas que comprueban cuántas barras hay en el gráfico. Entonces, si necesito MA200 y el gráfico sólo tiene, digamos, 100 barras, ¿funcionaría entonces iMA200? Creo que sí - lo he comprobado y cualquier MA se dibuja sin problemas en cualquier gráfico, por lo que creo que se trata de un antiguo error que Metaquotes ha corregido ahora. Entonces, ¿hay que comprobar cuántas barras hay en el gráfico para dibujar la MA o utilizar la función iMA?

2. ¿Cuál es la diferencia entre Close y iClose? Entiendo que Close puede devolver un cierre de las barras en el gráfico actual solamente, y iClose puede devolver cualquier cierre de cualquier par de divisas y cualquier marco de tiempo. Y en ambos casos, para obtener la última barra cerrada tengo que utilizar el índice [1]. ¿Estoy viendo bien?

Gracias.
 

DoubleStochastic para MT4, verdadero DoubleStochastic

Hola chicos - nuevo usuario de MT4.

Estoy luchando para encontrar el indicador DoubleStochastic para MT4. Era mi indicador favorito en la plataforma VTT. Y me refiero a DoubleStochastic REAL - no Bressert Double Stochastic que da indicación totalmente diferente que DoubleStochastic original. Véase el archivo adjunto - Doble de VTT da un poco diferentes indicaciones que Doble de MT4:

¿Alguien puede ayudarme a codificar VTT'2 DoubleStochastic en MT4? Aquí está el código VTT y la lógica:

Rápido %K = ((Cierre de hoy - Mínimo en periodos %K) / (Máximo en periodos %K - Mínimo en periodos %K)) * 100

%K lento = media móvil de N periodos del %K rápido

Doble %K = ((%K lento de hoy - %K lento más bajo en %K períodos) / (%K lento más alto en %K períodos - %K lento más bajo en %K períodos)) * 100

Doble Desaceleración %K = Media móvil de N periodos del Doble %K

%D = media móvil simple de 3 periodos de Double Slowing %K

y el propio código

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD);

¿Alguien domina MT4?

Me acostumbré tanto a la versión de VTT que no puedo usar otra.

 

...

gmailer

Publicado un doble estocástico aquí : https://www.mql5.com/en/forum/177239/page28 (con el fin de mantener todas las versiones de estocástico en un solo lugar)

Creo que es lo que usted está buscando

gmailer:
Hola chicos - nuevo usuario de MT4.

Estoy luchando para encontrar DoubleStochastic indicador para MT4. Era mi indicador favorito en la plataforma VTT. Y me refiero a REAL DoubleStochastic - no Bressert doble estocástico que da indicación totalmente diferente que original DoubleStochastic. Véase el archivo adjunto - Doble de VTT da un poco diferentes indicaciones que Doble de MT4:

¿Alguien puede ayudarme a codificar VTT'2 DoubleStochastic en MT4? Aquí está el código VTT y la lógica:

Rápido %K = ((Cierre de hoy - Mínimo en periodos %K) / (Máximo en periodos %K - Mínimo en periodos %K)) * 100

%K lento = media móvil de N periodos del %K rápido

Doble %K = ((%K lento de hoy - %K lento más bajo en %K períodos) / (%K lento más alto en %K períodos - %K lento más bajo en %K períodos)) * 100

Doble Desaceleración %K = Media móvil de N periodos del Doble %K

%D = Media móvil simple de 3 periodos de Double Slowing %K

y el propio código

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD);

¿Alguien domina MT4?

Me acostumbré tanto a la versión de VTT que no puedo usar otra.
 

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

 

gracias mladen. tiene sentido.

 

Hola a todos,

Estoy luchando para encontrar una manera de desencadenar el comercio cuando mi línea estocástica cruza dentro de la sobrecompra (80) o sobreventa (20) región. Soy capaz de desencadenar un comercio cuando mi línea cruza, sin embargo, no soy capaz de establecer que desencadenar un comercio sólo cuando está en la región de sobrecompra o sobreventa. ¿Alguien tiene alguna idea de cómo puedo hacer esto o hay algún otro lugar donde pueda hacer referencia?

Me encontré con algunos sitios que dijo algo acerca de la creación de algunos valores a 20,1 y 80,1, pero nada más.

Por favor, ayuda para arrojar algo de luz. Gracias.

Saludos

Terrance

 

...

Terrance,

Aquí hay un hilo con un código práctico que podría ser utilizado como un ejemplo para lo que usted necesita : https://www.mql5.com/en/forum/179114

tkuan77:
Hola a todos,

Estoy luchando por encontrar una manera de encontrar una manera de desencadenar el comercio cuando mi línea estocástica cruza dentro de la sobrecompra (80) o sobreventa (20) región. Soy capaz de desencadenar un comercio cuando mi línea cruza, sin embargo, no soy capaz de configurar para desencadenar un comercio sólo cuando está en la región de sobrecompra o sobreventa. ¿Alguien tiene alguna idea de cómo puedo hacer esto o hay algún otro lugar donde pueda hacer referencia?

Me encontré con algunos sitios que dijo algo acerca de la creación de algunos valores a 20,1 y 80,1, pero nada más.

Por favor, ayuda para arrojar algo de luz. Gracias.

Saludos

Terrance
 

Hola, he corregido las funciones y estoy contento con ellas ahora. Se ve bien. Sin embargo, el registro de los resultados de las operaciones cuando hago una prueba retrospectiva sólo contiene una orden de compra. Creo que podría tener que ver con mi función GetLots pero no estoy al 100% a pesar de haberla revisado varias veces - ¿te importaría echarle un ojo y decirme si ves algo que no está bien? Gracias.

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

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

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 (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

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

si no LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

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

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

return (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

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

si no LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

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

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

return (LotsLong);

}

 

...

GetLots() en la forma en que lo publiqué está probado y funciona como debería. No es necesario cambiarla. Utilízala como una función que determinará el tamaño del lote en el momento de abrir la orden. Mantenga el resto de la lógica fuera de ella (esa función debe hacer sólo eso: averiguar el tamaño de la orden en función del riesgo, el stop loss y el estado actual de la cuenta )

Sin el resto del código no puedo ayudarte. Sería como si pudiera mirar a través de un pequeño agujero y ver el mundo entero. Imposible. Si quieres mantener el resto del código en secreto todo lo que puedo ayudar es el código que publiques aquí, y te repito: ten por seguro que GetLots() en la forma original funciona como debe y debe ser usado en su forma original.

Si quieres usarlo con resultados variables cambia el riesgo o el stop loss de forma dinámica ("decide" el riesgo o el stop loss en el código previo a GetLots() y luego llámalo con ese riesgo o stop loss alterado - la función calculará correctamente para las entradas aleatorias dadas) No es necesario cambiar el código de la función

crsnape@btinternet.com:
Hola, he corregido las funciones y ahora estoy contento con ellas. Se ve bien. Sin embargo, el registro de los resultados de las operaciones cuando hago un backtest sólo contiene una orden de compra. Creo que podría tener que ver con mi función GetLots, pero no estoy al 100% a pesar de haberla revisado varias veces - ¿te importaría echarle un ojo y decirme si ves algo que no está bien? Gracias.

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

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

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 (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

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

si no LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

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

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

return (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

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

si no LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

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

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

return (LotsLong);

}
 

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.

Le he hecho cambios 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 :-)