Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1332

 
DanilaMactep:

Hice lo que me aconsejaste con el código. Al principio del código tengo una condición para elegir el tipo de parada - atp o fija

Entonces comenté mi normalización y la puse de esta manera

El cálculo del beneficio es el siguiente en el código. No hay problemas ahí y después de calcular el beneficio he añadido la fórmula de miedo que me han aconsejado.

Todo fue compilado sin errores. Pero cuando ejecuté la prueba el error aparece en el registro, es una división por cero por lo que entiendo y la prueba se detiene. ¿En qué me he equivocado o qué he hecho mal?


Simplemente bórralo.

     sl = fabs(OrderOpenPrice()-OrderStopLoss())/_Point;// ПРИСВОИЛ ЗНАЧЕНИЕ КАК СОВЕТОВАЛИ
     //sl= NormalizeDouble(sl,Digits());// НОРМАЛИЗАЦИЯ ЗНАЧЕНИЯ СТОП ЛОССА ДЛЯ ОТКРЫТИЯ СДЕЛКИ ТО  ЧТО БЫЛО ЗАКОМЕНТИРОВАЛ
 
DanilaMactep:

Hice lo que me aconsejaste con el código. Al principio del código tengo una condición para elegir el tipo de parada - atp o fija

Entonces comenté mi normalización y la puse de esta manera

El cálculo del beneficio es el siguiente en el código. No hay problemas ahí y después de calcular el beneficio he añadido la fórmula de miedo que me han aconsejado.

Todo fue compilado sin errores. Pero cuando ejecuto la prueba el registro muestra un error, que me da división por cero y la prueba se detiene. ¿En qué me he equivocado aquí o qué no he hecho bien?


Cuando le den dos opciones diferentes, no debe aplicar las dos a la vez.

¿Estás contando sl como dos opciones diferentes

sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1);// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА

o

sl= razmer_fikc_sl*Point; // ПЕЕРМЕННОЙ СТОП ЛОССА ПРИСВАЕВАЕМ ФИКСИРОВАНОНЕ ЗНАЧЕНИЕ ПУНКТОВ И ДОМНОЖАЕМ НА ПОИНТ

se obtiene el valor en los valores de los precios. Y la fórmula debe contener puntos desde ... hasta ....

Por lo tanto, la parada a una distancia del precio es iATR(.........)/_Point o razmer_fikc_sl pero el uso de dos valores diferentes en la función no es muy conveniente, por lo tanto es mejor dejar sólo una variante

double lot =MathFloor((Free*MaxRisk/100)/(sl/Point*LotVal)/Step)*Step; //СТРАШНАЯ ФОРМУЛА РАСЧЁТА ОБЪЁМА ЛОТА

Y no olvides que el sl debe calcularse ANTES de intentar calcular el tamaño del lote.

 
sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1)/Point;// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА
Asegúrese de
 

Hazlo así...

void OnTick()
  {
//---
if(tip_sl==en_po_atr)
     { //ЕСЛИ ТИП СТОП ЛОССА СТОИТ ПО АТР ТО ВЫСЧИТЫВАЕМ ЕГО ИЗ АТР
     sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1)/Point;// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА
      Print("СТОП ПО АТР, ЕГО РАЗМЕР "+sl);
     }
     else //ИНАЧЕ- ТО ЕСТЬ ЕСЛИ СТОП ЛОСС ФИКСИРОВАННЫЙ В ПУНКТАХ
     {
     sl= razmer_fikc_sl; // ПЕЕРМЕННОЙ СТОП ЛОССА ПРИСВАЕВАЕМ ФИКСИРОВАНОНЕ ЗНАЧЕНИЕ ПУНКТОВ И ДОМНОЖАЕМ НА ПОИНТ
      Print("СТОП ПО АТР, ЕГО РАЗМЕР "+sl);
     }
double lot =MathFloor((Free*MaxRisk/100)/(sl*LotVal)/Step)*Step; //СТРАШНАЯ ФОРМУЛА РАСЧЁТА ОБЪЁМА ЛОТА
 
MakarFX:

Simplemente bórralo.

Arreglé la línea y la prueba comenzó - ¡Muchas gracias! Simplemente no entendí por qué al obtener el stoploss de iATR en una variable, ¿por qué dividir por el punto al final? P/S Me están costando las matemáticas, no me ando con chiquitas :-( Pero supongo que la prueba salió bien y con un lote de 100 puso el mínimo, y con un lote de 10000 diferente todo el tiempo, así que funciona bien... Gracias de nuevo por la ayuda...

 
DanilaMactep:

He arreglado el hilo y la prueba ha comenzado - ¡Muchas gracias! Simplemente no entendí por qué al obtener el stoploss de iATR en una variable, ¿por qué dividir por el punto al final? P/S Me cuesta mucho las matemáticas, no me ando con chiquitas :-( Pero supongo que la prueba salió bien y a 100 depo el lote es mínimo, y a 10000 depo es diferente todo el tiempo, así que funciona bien... Gracias de nuevo por la ayuda...

ATR da un número decimal, como 0.00120

razmer_fikc_sl es un número entero.

para calcular el lote, se necesitan puntos, es decir, números enteros

ATR/Point da un número entero

 
Es un tema antiguo, pero no encuentro la solución. Cómo especificar el intervalo de tiempo (por ejemplo de 12:00 a 14:00) y abrir una orden sólo una vez dentro de este intervalo y que cumpla alguna condición (RSI<30 por ejemplo).

O

Algo análogo a Dormir: abrir una orden en una condición determinada y no hacer nada durante 2 horas. Pero el sueño no funciona en el probador.
 
Порт-моне тв:
Este es un tema antiguo, pero no encuentro la solución. Cómo especificar la franja horaria (por ejemplo, de 12:00 a 14:00) y sólo una vez en esta franja abrir una orden que satisfaga alguna condición (RSI<30 por ejemplo).

O

Algo análogo a Dormir: abrir una orden en una condición determinada y no hacer nada durante 2 horas. Pero el sueño no funciona en el probador.

primera condición - el tiempo ha llegado
segunda condición - rsi
tercera condición - no existe tal orden en el historial al precio de apertura en intervalos

 

Buenas tardes.

Hay un indicador Elliott Wave Oscillator, que da valores numéricos de la variable EWO. Hay EWOs positivos que están por encima de cero y EWOs negativos que están por debajo de cero.

A partir de las últimas 100 lecturas de EWO, es necesario calcular el valor medio de EWO positivo y por separado el valor medio de EWO negativo

Obtengo los valores del indicador double EWO=iCustom(Symbol(),0, "Elliott Wave Oscillator",0,0);

Por favor, aconsejar que el código mql4 puede implementar esto en un EA?


Conseguí encontrar la media del módulo.

double avarage_EWO = 0;
for(int g=0;g<100;g++)
avarage_EWO = avarage_EWO + MathAbs( iCustom(Symbol(),0, "Elliott Wave Oscillator",0,g) ); // modulo average
avarage_EWO = avarage_EWO/100;


Pero, ¿cómo calcular por separado la media positiva y la media negativa del EWO?

Gracias.



 

Take Profit

No puedo entender cómo y para qué sirve ORDER_REASON_TP,

Sé cómo funcionaDEAL_REASON_TP, pero no sé qué pasa con las órdenes aquí