En lugar de Close[2] ponga el valor del indicador en la segunda barra (por ejemplo iRSI(.......,2) ) y en lugar de Close[1] ponga el valor del indicador en la primera barra. Y uroven es el valor del nivel.
Me podéis decir si alguien ha visto un volumen lateral del día en la parte derecha del gráfico para mt5, para mt4 lo he encontrado aquí https://www.mql5.com/ru/code/9777. Tengo dos variantes: o reescribir las variables en él o encontrar uno ya hecho. O no veo el punto en ordenar,,,,,,, , necesito comprobar una teoría de equilibrio ,,,,. Encontré un trabajo para mt5 donde el perfil del día de ayer se dibuja a la izquierda pero hay un inconveniente importante, no muestra lo que sucede hoy. Así que quiero añadir a la información del patrón gráfico de la derecha lo que está sucediendo en el momento de la negociación
Tral_Start__Upgr se equipara a una variable externa de tipo int y es igual a 5.
Tral_Size__Upgr es igualmente igual a 4
TV - valor de la garrapata, =10
SumLotSellDBL = 0,04
Lo he leído. Vi cómo funcionaría si Tral_Start__Upgr, Tral_Size__Upgr y sus variables externas fueran definidas como double. Es decir, cuando todo es del mismo tipo sin ninguna conversión ni pérdida de datos. El resultado es el mismo. ¿En qué me he equivocado?
Maria Baburina: Lee. Vi cómo funcionaría si Tral_Start__Upgr, Tral_Size__Upgr y sus variables externas fueran definidas como double. Es decir, cuando todo es del mismo tipo sin ninguna conversión ni pérdida de datos. El resultado es el mismo. ¿En qué me he equivocado?
Un ciego hablando con un sordo. Si quieres que alguien lo pruebe, necesitas el mínimo código posible que pueda ser compilado en otra máquina y probado. No hay código, no hay nada de qué hablar.
#property indicator_chart_window#property indicator_buffers1#property indicator_plots1class CLASS
{
public:
double Buffer[];
CLASS( void )
{
SetIndexBuffer(0, this.Buffer);
}
};
CLASS* Class;
voidOnInit( void )
{
Class = new CLASS;
delete Class;
Class = new CLASS;
Class.Buffer[0] = 0; // array out of rangedelete Class;
return;
}
intOnCalculate( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[] )
{
return(rates_total);
}
¡En cuatro funcionó bien! En el cinco es un fastidio. ¿Se trata de otra limitación arquitectónica en comparación con el quad? Dame un enlace a una discusión sobre esto, no pude encontrarlo yo mismo.
¿He entendido bien que sólo se puede asignar algo a los buffers de los indicadores después de la primera llamada del propio terminal (no manualmente) a OnCalculate?
Se puede acceder a los búferes de los indicadores después de llamar a OnCalculate(). Al mismo tiempo, el propio búfer del indicador debe declararse en el área de variables globales:
Se puede acceder a los buffers de los indicadores después de llamar a OnCalculate().
Resulta que se equivoca. Sólo se puede aplicar cuando el terminal llama a OnCalculate. En este caso, la condición en MT4 es más flexible, porque basta con llamar a OnCalculate una sola vez. Pero en MT5, hay que esperar a la llamada de OnCalculate por el propio terminal cada vez después del SetIndexBuffer. Prueba
#property strict#property indicator_chart_window#property indicator_buffers1#ifdef __MQL5__#property indicator_plots1#endif
#ifdef __MQL5__#define TRUEtrue#define FALSEfalse#endif
class CLASS
{
public:
double Buffer[];
CLASS( void )
{
::SetIndexBuffer(0, this.Buffer);
}
#define TIMESERIES(X) \
::ArraySetAsSeries(X, TRUE); \
Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);
staticint FullOnCalculate( void )
{
int Spread[];
long RealVolume[];
int Size = INT_MAX;
#ifdef __MQL4__constint bars = ::Bars;
#endif
#ifdef __MQL5__constint bars = ::Bars(::Symbol(), ::Period());
#endif
TIMESERIES(Spread)
TIMESERIES(RealVolume)
#ifdef __MQL4__return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
#endif
#ifdef __MQL5__datetimeTime[];
doubleOpen[];
doubleHigh[];
doubleLow[];
doubleClose[];
long TickVolume[];
TIMESERIES(Time)
TIMESERIES(Open)
TIMESERIES(High)
TIMESERIES(Low)
TIMESERIES(Close)
TIMESERIES(TickVolume)
return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
#endif
}
};
CLASS* Class;
bool FirstRunOnCalculate = TRUE; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буферvoidOnChartEvent( constint id, constlong& lparam, constdouble& dparam, conststring& sparam )
{
if (id == CHARTEVENT_CHART_CHANGE)
{
Print(__FUNCTION__);
::OnDeinit();
::Class = new CLASS;
if (!FirstRunOnCalculate)
CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
}
return;
}
voidOnDeinit( constint Reason = 0 )
{
if (::CheckPointer(::Class) == POINTER_DYNAMIC)
delete ::Class;
return;
}
intOnCalculate( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[] )
{
Print(__FUNCTION__);
if (FirstRunOnCalculate)
FirstRunOnCalculate = FALSE;
if (::CheckPointer(::Class) != POINTER_INVALID)
::Class.Buffer[0] = 0; // array out of range - MT5-ERROR!!!return(rates_total);
}
En MT4 este indicador funciona sin problemas, en MT5 se bloquea con un error. Resulta que en MT4 sólo hay que esperar a la primera llamada de OnCalculate por parte del terminal y luego hacer lo que se quiera con los buffers, incluyendo su redefinición mediante SetIndexBuffer. Pero en MT5 después de cada SetIndexBuffer es necesario esperar a la primera llamada de OnCalculate por parte del terminal.
Esta característica no está documentada en ninguna parte. Y no parece encajar en la definición de "principiante".
¿Podemos esperar que en MT5 este comportamiento sea el mismo que en MT4? Es decir, ¿después de la primera llamada de OnCalculate por el propio terminal sería posible llamar a SetIndexBuffer sin problemas?
Resulta que se equivoca. Sólo se puede llamar cuando OnCalculate es llamado por el propio terminal. En este caso, en MT4 la condición es más flexible, porque sólo hay que llamar a OnCalculate una vez. Pero en MT5, hay que esperar a la llamada de OnCalculate por el propio terminal cada vez después del SetIndexBuffer. Prueba
En MT4 este indicador funciona sin problemas, en MT5 se bloquea con un error. Resulta que en MT4 sólo hay que esperar a la primera llamada de OnCalculate por parte del terminal y luego hacer lo que se quiera con los buffers, incluyendo su redefinición mediante SetIndexBuffer. Pero en MT5 después de cada SetIndexBuffer es necesario esperar a la primera llamada de OnCalculate por parte del terminal.
Esta característica no está documentada en ninguna parte. Y no parece ajustarse a la definición de "principiante".
¿Podemos esperar que en MT5 este comportamiento sea el mismo que en MT4? Es decir, ¿después de la primera llamada de OnCalculate por el propio terminal se podrá llamar a SetIndexBuffer sin problemas?
No se enreda en la verborrea - naturalmente, la llamada de OnCalculate implica una llamada del propio terminal, porque
La función OnCalculate() se llama sólo en los indicadores personalizados cuando es necesario calcular los valores del indicador mediante el eventoCalculate. Esto suele ocurrir cuando se recibe un nuevo tick para el símbolo para el que se calcula el indicador. El indicador no necesita estar unido a ningún gráfico de precios de este símbolo.
En lugar de Close[2] ponga el valor del indicador en la segunda barra (por ejemplo iRSI(.......,2) ) y en lugar de Close[1] ponga el valor del indicador en la primera barra. Y uroven es el valor del nivel.
Y el resto ya te lo han dicho más arriba.
Requisito previo:
ProfitSellDBL se calcula aquí
Profit_Upgr = 0,01
Tral_Start__Upgr se equipara a una variable externa de tipo int y es igual a 5.
Tral_Size__Upgr es igualmente igual a 4
TV - valor de la garrapata, =10
SumLotSellDBL = 0,04
Lee. Vi cómo funcionaría si Tral_Start__Upgr, Tral_Size__Upgr y sus variables externas fueran definidas como double. Es decir, cuando todo es del mismo tipo sin ninguna conversión ni pérdida de datos. El resultado es el mismo. ¿En qué me he equivocado?
Un ciego hablando con un sordo. Si quieres que alguien lo pruebe, necesitas el mínimo código posible que pueda ser compilado en otra máquina y probado. No hay código, no hay nada de qué hablar.
Añadido: Uso de la depuración(Debugging):
-Preconfiguración
-Puntosdeparada
-Iniciar ladepuración
-Expresionesobservables
-Llamar ala vista dela pila
-Depuraciónpaso a paso
-Parar, reanudar y finalizar la depuración
-Depuracióndela historia
Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading
Bichos, errores, preguntas
comp, 2016.04.03 18:21
Error de tiempo de ejecución
¡En cuatro funcionó bien! En el cinco es un fastidio. ¿Se trata de otra limitación arquitectónica en comparación con el quad? Dame un enlace a una discusión sobre esto, no pude encontrarlo yo mismo.
¿He entendido bien que se puede asignar algo a las memorias intermedias de los indicadores sólo después de la primera llamada del terminal (no manual) OnCalculate?
Se puede acceder a los búferes de los indicadores después de llamar a OnCalculate(). Al mismo tiempo, el propio búfer del indicador debe declararse en el área de variables globales:
Creo que he encontrado lo que buscaba, pero la antigüedad del código da un error
Ayúdame a arreglarlo ...... si no es mucha molestia.
y si me puedes ayudar a girarlo hacia el lado derecho de la pantalla sería genial.
Se puede acceder a los buffers de los indicadores después de llamar a OnCalculate().
Resulta que se equivoca. Sólo se puede aplicar cuando el terminal llama a OnCalculate. En este caso, la condición en MT4 es más flexible, porque basta con llamar a OnCalculate una sola vez. Pero en MT5, hay que esperar a la llamada de OnCalculate por el propio terminal cada vez después del SetIndexBuffer. Prueba
En MT4 este indicador funciona sin problemas, en MT5 se bloquea con un error. Resulta que en MT4 sólo hay que esperar a la primera llamada de OnCalculate por parte del terminal y luego hacer lo que se quiera con los buffers, incluyendo su redefinición mediante SetIndexBuffer. Pero en MT5 después de cada SetIndexBuffer es necesario esperar a la primera llamada de OnCalculate por parte del terminal.
Esta característica no está documentada en ninguna parte. Y no parece encajar en la definición de "principiante".
¿Podemos esperar que en MT5 este comportamiento sea el mismo que en MT4? Es decir, ¿después de la primera llamada de OnCalculate por el propio terminal sería posible llamar a SetIndexBuffer sin problemas?
Resulta que se equivoca. Sólo se puede llamar cuando OnCalculate es llamado por el propio terminal. En este caso, en MT4 la condición es más flexible, porque sólo hay que llamar a OnCalculate una vez. Pero en MT5, hay que esperar a la llamada de OnCalculate por el propio terminal cada vez después del SetIndexBuffer. Prueba
En MT4 este indicador funciona sin problemas, en MT5 se bloquea con un error. Resulta que en MT4 sólo hay que esperar a la primera llamada de OnCalculate por parte del terminal y luego hacer lo que se quiera con los buffers, incluyendo su redefinición mediante SetIndexBuffer. Pero en MT5 después de cada SetIndexBuffer es necesario esperar a la primera llamada de OnCalculate por parte del terminal.
Esta característica no está documentada en ninguna parte. Y no parece ajustarse a la definición de "principiante".
¿Podemos esperar que en MT5 este comportamiento sea el mismo que en MT4? Es decir, ¿después de la primera llamada de OnCalculate por el propio terminal se podrá llamar a SetIndexBuffer sin problemas?