Errores, fallos, preguntas - página 452

 

Gracias.

 
alexvd:

Sí, en el primer punto estoy claramente confundido. ¿Explique qué es exactamente lo que está mal en la descripción, para que se devuelva una copia?

Y sobre la concatenación en tu caso deberías haber escrito algo como

Para aclarar. Dice"Devuelve una copia de la cadena con un valor modificado del carácter en la posición especificada. "El prototipo de la función es boolStringSetCharacter(...). Obviamente, no se puede poner una cadena en un bool. Si efectivamente se devuelve un booleano, entonces aparentemente esto es una señal de éxito/error. Normalmente, otras páginas de documentación tienen una sección separada de valores devueltos, pero esta página no la tiene. Debería añadirse, y en la descripción textual formular una frase relativa a la semántica de la función, no al valor de retorno.


En cuanto a la concatenación, si lo que has escrito es correcto, también habría que cambiar la descripción de la función StringConcatenate . La descripción dice que el parámetrostring_var es un String [in][out] que se generará como resultado de la concatenación. Usted indica que este parámetro es sólo [out].

 
Nueva pregunta. ¿Qué significa cuando BarsCalculated devuelve 0. No parece ser un error, pero ¿cómo se pueden calcular 0 barras? De hecho, no se ha contado nada. ¿No es un error?
 
MoneyJinn:

Lamentablemente, el problema es que el terminal sólo publica las órdenes de cierre de posiciones con comentarios en la pestaña "Resultados".

El pedido correspondiente no se añade a la lista de HistoryDealsTotal().

En la lista general de pedidos HistoryOrdersTotal(), también falta el pedido, aunque se seleccione un periodo con cierta redundancia.

Te puedo asegurar que tanto las órdenes como los tratos, en el caso de cerrar por "fin de prueba", están presentes en el historial. Mi multidivisa calcula el beneficio obtenido en cada símbolo. Las operaciones cerradas en el probador por "fin de prueba" se corrigen en la desinicialización para reflejar estas operaciones. El beneficio total de todos los símbolos coincide con los datos del informe de pruebas. Este es el código;

       if(HistorySelect(0,TimeTradeServer()))   // Поправка для 'end of test'
        {
         int DeelsTotal=HistoryDealsTotal();
         for(int i=0;i<SymbolsNumber;i++)
           {
            ulong ticket=HistoryDealGetTicket(DeelsTotal-1-i);
            string comment=HistoryDealGetString(ticket,DEAL_COMMENT);
            if(comment!="end of test"&&StringSubstr(comment,0,3)!="so ")
               break;
            for(int j=0;j<SymbolsNumber;j++)
              {
               if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=m_expert[j].Name())
                continue;
               m_Profit[j]=m_Profit[j]+HistoryDealGetDouble(ticket,DEAL_PROFIT)+  // Добавим профит закрытой позиции для "end of test" и "so"
                           HistoryDealGetDouble(ticket,DEAL_SWAP)+HistoryDealGetDouble(ticket,DEAL_COMMISSION);
              }
           }
        }
 

Colegas, ¿hay alguna manera de hacer que SymbolInfoSessionTrade funcione en el probador de estrategias?

Una entrada trivial no funciona:

void OnTick() {
  datetime from, to;
  if (SymbolInfoSessionTrade(_Symbol, FRIDAY, 0, from, to)) Print("WOW!");
}
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - Документация по MQL5
 

Una pregunta más, si es posible. Me gustaría entender el significado del nuevo operador. ¿Cuál es la idea que hay detrás? ¿Por qué no crear el objeto de la forma habitual? Después de todo, tras el final del bloque se perderá el acceso al objeto declarado a través de new, así que ¿para qué lo necesitamos?

P.D. Sinceramente, no lo he encontrado en la documentación :)

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
220Volt:

Una pregunta más, si es posible. Me gustaría entender el significado del nuevo operador. ¿Cuál es la idea que hay detrás? ¿Por qué no crear el objeto de la forma habitual? Después de todo, tras el final del bloque se perderá el acceso al objeto declarado a través de new, así que ¿para qué lo necesitamos?

Todo pasa en algún momento. ¿Significa eso que no hay que hacer nada...?


P.S honestamente no pude encontrarlo en la documentación :)

Te creo... :))
 
Valmars:

Gracias. Lo he descubierto. Es necesario y suficiente utilizarTimeTradeServer() en lugar de TimeCurrent().

Al final de la semana de negociación no hay cotizaciones frescas y por eso TimeCurrent() no se actualiza durante mucho tiempo.

Al desinicializar el Asesor Experto, TimeCurrent() muestra la hora 23:00; TimeTradeServer() muestra la hora 23:59, que coincide con el final de la prueba.

 
MoneyJinn:

Gracias. Lo he descubierto. Es necesario y suficiente utilizarTimeTradeServer() en lugar de TimeCurrent().

Al final de la semana de negociación no hay cotizaciones frescas y, por tanto, TimeCurrent() no se actualiza durante mucho tiempo.

La cuestión no está entre comillas, sino en que las operaciones de "fin de prueba" se ejecutan una vez finalizado el periodo de prueba. Así, ni 'OnTick' ni 'OnTimer' pueden obtenerlos del historial. Al menos era así hace un año, por lo que moví su comprobación a 'OnDeinit'.
 
220Volt:

Una pregunta más, si es posible. Me gustaría entender el significado del nuevo operador. ¿Cuál es la idea que hay detrás? ¿Por qué no crear el objeto de la forma habitual? Al fin y al cabo, tras el final del bloque se perderá el acceso al objeto declarado mediante new, así que ¿para qué lo necesitamos?

P.D. honestamente no pude encontrarlo en la documentación :)

No cree objetos dinámicos - no tendrá que usar ahora y todo lo que está asociado a estos objetos (Aunque no podrá hacer mucho entonces).

Quieres entender no el significado de ahora, sino el significado de trabajar con objetos dinámicos...

Inicialización y desinicialización de objetos colocados dinámicamente

Los punteros a objetos sonun caso especial, porque la declaración de un puntero no requiere la inicialización del objeto en cuestión. Los objetos colocados dinámicamente se inicializan sólo en el momento de crear una instancia de una clase mediante el operador new. La inicialización de un objeto implica una llamada al constructor de la clase correspondiente. Si no hay un constructor correspondiente en una clase, sus miembros de tipo simple no se inicializarán automáticamente; los miembros de tipo cadena, matriz dinámica y objeto complejo se inicializarán automáticamente.

Los punteros pueden ser declarados local o globalmente, y pueden ser inicializados con un valor NULL vacío o con un puntero del mismo tipo o de un tipo engendrado . Si se llama anewsobre un puntero declarado en el nivel local , la sentencia deletede ese puntero debe ejecutarse también antes de salir del nivel local. De lo contrario, el puntero se perderá y el objeto no podrá ser eliminado explícitamente.

Todos los objetos creados por la expresión puntero_objeto=nuevo_nombre_clase deben ser destruidos posteriormente con el operador delete(puntero_objeto).Si, por alguna razón, esta variable no fue destruida por el operador de borrado, el mensaje sobre ella aparecerá en el Diario de Expertos. Puedes declarar múltiples variables, y asignar a todas ellas punteros al mismo objeto.

Si el objeto que se crea dinámicamente tiene un constructor, este constructor será llamado cuando se ejecute el operador new. Si el objeto tiene un destructor, éste será llamado cuando se ejecute el operador deborrado.

Porlo tanto, los objetos colocados dinámicamente se crean sólo cuando se crean utilizando el operador new, y se garantiza que se eliminan mediante el operador delete o automáticamente por el sistema de ejecución MQL5 en el momento de la descarga del programa.El orden de declaración de los punteros de los objetos creados dinámicamente no afecta al orden de su inicialización. El orden de inicialización y desinicialización está totalmente controlado por el programador.


Razón de la queja: