1 Adjunto (s)
No (detiene la actualización) Bars () excede el número máximo de barras en los casos en que se alcanza (y se excede) la configuración de barras máximasIniciado por ;
Publi |
Gracias, son muy amables al proporcionar estos ejemplos, aquí y en mis otros hilos. Entiendo lo que has hecho aquí, pero la lingüística me escapa aún, ya que aún tengo que aprender el lado OO del MQL4. Tampoco estoy completamente seguro de que tu código funcione dentro del contexto de un script, pero no estoy tan bien informado.Iniciado por ;
1 Adjunto (s)
No (detiene la actualización) Bars () excede el número máximo de barras en los casos en que se alcanza (y se excede) la configuración de barras máximasIniciado por ;
Sí, estoy de acuerdo, definitivamente no uses el método Bars. La forma más confiable de utilizar SeriesInfoInteger y llamarlo para LASBAR_DATE, verifique si hay errores y si hay errores en el bucle y vuelva a preguntar hasta que se agote el tiempo de espera de su función o obtenga un resultado limpio. Aquí hay un ejemplo de una función MTF isNewBar ... Inserted Code #include lt; Arrays \ ArrayObj.mqhgt; clase NewBars: public CObject {ENUM_TIMEFRAMES m_timeframe; datetime m_last_bar_time; public: NewBars (ENUM_TIMEFRAMES tf): m_timeframe (tf), m_last_bar_time (0) {} bool isNewBar () {uint ms = GetTickCount (); datetime curr; do {ResetLastError (); curr = (datetime) SeriesInfoInteger (_Symbol, m_timeframe, SERIES_LASTBAR_DATE); } while (_LastError! = ERR_NO_ERROR GetTickCount () - ms lt; 500); if (curr gt; 0 _LastError == ERR_NO_ERROR curr! = m_last_bar_time) {bool res = true; if (m_last_bar_time == 0) res = falso; m_last_bar_time = curr; devolver res; } falso retorno; } bool isMatching (ENUM_TIMEFRAMES tf) {return m_timeframe == tf? verdadero Falso;} }; bool isNewBar (const ENUM_TIMEFRAMES timeframe) {static CArrayObj tfs; for (int i = tfs.Total () - 1; igt; = 0; i--) {NewBars * tf = dynamic_castlt; NewBars * gt; (tfs.At (i)); if (tf.isMatching (timeframe)) devuelve tf.isNewBar (); } tfs.Add (new NewBars (timeframe)); falso retorno; }Iniciado por ;
Tenga en cuenta que este método no es confiable, ya que MT deja de actualizar el conteo de barras una vez que se alcanza la configuración de barras máximas. Entonces, ¡el único! método confiable es verificar el tiempo.Iniciado por ;
Inserted Code #property strict #property show_inputs input int ExtraTrades = 10; tiempo de tiempo estático T0;/ ----------------------------------------------- ------------------- void OnStart () {int contador = 0; T0 = ??????0; while (! IsStopped () counterlt; ExtraTrades) {if (T0! = Time # 91; 0 # 93 {T0 = Time # 91; 0 # 93 ;; RefreshRates (); Abrelo(); contador ; Sueño (1000); }}}/ -------------------------------------------- ----------------------
Gracias, estoy haciendo algo similar en mi EA, aunque no estoy seguro de que OnTick sea válido para un guión.Iniciado por ;
Inserted Code static datetime T0;/ ----------------------------------------------- ------------------- int OnInit () {T0 = Time # 91; 0 # 93 ;;/o T0 = 0; ??? return (INIT_SUCCEEDED); }/ ---------------------------------------------- -------------------- void OnTick () {if (T0! = Time # 91; 0 # 93 {T0 = Time # 91; 0 # 93 ;; RefreshRates (); Abrelo(); } ..............................}
Gracias por eso, si lo hubiera visto antes, podría haberme salvado la cabeza contra todo lo que se cruzó en mi camino antes de darme cuenta de que RefreshRates () era el culpable. Lo he hecho usando la función Bars, no estoy seguro de que sea a prueba de balas, pero creo que es el truco, así como Inserted Code void start () {OpenIt (); RefreshRates (); int nBars = Bars (Symbol (), PERIOD_CURRENT); while (counter lt; = ExtraTrades) {RefreshRates (); if (nBars lt; Bars (Symbol (), PERIOD_CURRENT)) {OpenIt (); nBars = Bars (Symbol (), PERIOD_CURRENT); }}}Iniciado por ;
Desafortunadamente tenemos que hacerlo fuerza bruta con RefreshRates (). MetaTrader es malo. Esto funciona: Inserted Code #property strict void OnStart () {datetime time = 0; int count = 0; int target = 3; while ((count lt; target)! IsStopped ()) {if (tiempo! = iTime (_Symbol, PERIOD_CURRENT, 0)) {count ; Imprimir (tiempo cambiado:, contar); time = iTime (_Symbol, PERIOD_CURRENT, 0); } Dormir (1); RefreshRates (); }}Iniciado por ;
Aviso legal: Ni forosforex.com ni ninguna persona involucrada en forosforex.com aceptarán ninguna responsabilidad por cualquier pérdida o daño en el trading como resultado de la confianza en la información contenida en este sitio web, incluidos datos, cotizaciones, gráficos y señales de compra/venta. Por favor, infórmese plenamente de los riesgos y costes asociados a las operaciones en los mercados financieros, una de las formas de inversión que más riesgos entrañan.
forosforex.com le quiere recordar que los datos contenidos en este sitio web no son necesariamente en tiempo real ni exactos. forosforex.com no asume responsabilidad alguna por las pérdidas en que usted podría incurrir como resultado de la utilización de estos datos. Este acuerdo se rige por su versión en inglés, que prevalecerá siempre que haya alguna discrepancia entre la versión en inglés y la versión en español.
Los CFD son un producto difícil de entender, varios organismos reguladores consideran que no es adecuado para inversores minoristas debido a su complejidad y riesgo.
Advertencia de riesgo: Los CFDs son un producto difícil de entender, y puede no ser adecuado para inversores minoristas debido a su complejidad y riesgo. Existe la posibilidad de sufrir una pérdida igual o superior a la inversión. Por lo tanto, no debe invertir o arriesgar dinero que no pueda permitirse perder. Debe asegurarse de que comprende todos los riesgos. Antes de abrir una cuenta en un broker por favor sea consciente e infórmese de los riesgos asociados con el trading. El contenido de este sitio web no debe interpretarse como asesoramiento personal. ForosForex recomienda que busque el consejo de un asesor financiero independiente.