Errores, fallos, preguntas - página 696

 

Ayúdenme a salir de aquí

intente el multithreading pero el terminal se bloquea

Time        : 2012.03.27 14:38 (0:00:22)
Program     : Client Terminal
Version     : 500.607 (09 Mar 2012)
Revision    : 40583
OS          : Windows 7 Professional (Build 7600)
Processors  : 4 x Intel Core i5-2410 M  @ 2.30 GHz
Memory      : 1551 free of 4003 Mb
Virtual     : 1188 free of 2047 Mb
CrashMD5    : 83 B4200991F2E548704A4F35763F5DAD
Exception   : C0000005 at 400067 A4 read to 400067 A4

Modules     : 00400000 00 E38000 terminal.exe (5.0.0.607)
            : 0 F000000 00006000 detoured.dll
            : 72640000 0003 D000 nvd3d9wrap.dll (8.17.12.9573)
            : 72610000 0002 F000 nvdxgiwrap.dll (8.17.12.9573)
            : 72 F60000 00027000 wlidnsp.dll (7.250.4225.0)
            : 10000000 00265000 mql5.dll (5.0.0.607)
            : 51660000 0002 C000 pdm.dll (7.0.9466.0)
            : 51580000 0002 B000 msdbg2.dll (7.0.9466.0)
            : 013 F0000 0000 B000 borlndmm.dll

75 B73665:00012 [75 B73677] AcquireSRWLockExclusive (kernel32.dll)
77 B89F8F:00063 [77 B89FF2] RtlInsertElementGenericTableAvl (ntdll.dll)
77 B89F8F:00036 [77 B89FC5] RtlInsertElementGenericTableAvl (ntdll.dll)

Registers   : EAX=75 B73665  EIP=400067 A4  EFLGS=00010246  ES=002 b
            : EBX=32 E44168  ESP=3313 FF8C  EBP=3313 FF94    FS=0053
            : ECX=00000000  ESI=00000000  CS=0023         GS=002 b
            : EDX=400067 A4  EDI=00000000  DS=002 b         SS=002 b

He escrito una dll en C++.

Este es el código

//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TMyThread : public TThread
        {
                private:
                protected:
                        void __fastcall Execute();
                public:
                        __fastcall TMyThread(bool CreateSuspended);
        };
//---------------------------------------------------------------------------

TMyThread *Thr = new TMyThread(true);


__fastcall TMyThread::TMyThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{

        FreeOnTerminate = true;
        for (int i=0;i<1000;i++)
                {}
}


//---------------------------------------------------------------------------
extern "C" __declspec(dllexport)    int __stdcall GetIntValue()
{
        Thr->Resume();
        return (10);
}

Y el guión

#import "Project1.dll"
  int GetIntValue();
#import 

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   Comment(GetIntValue());
  }
//+------------------------------------------------------------------+


Si cambias el código de la dll por este

void __fastcall TMyThread::Execute()
{
        //---- Place thread code here ----
        FreeOnTerminate = true;
        for (int i=0;i<1000;i++)
                {

                }
        MessageBox(NULL,"Ïðèâåò!","Äàé ïÿòü",MB_YESNO | //Äà íåò (êíîïêè)
        MB_DEFBUTTON1 | //Âûäåëåíàÿ êíîïêà
        MB_ICONEXCLAMATION | //Òèï èêîíêè
        MB_DEFAULT_DESKTOP_ONLY);

}

Tengo el número 10 en la pantalla en el lugar del comentario (debería ser así) y luego me sale msgbox y 2 botones

el terminal no se bloquea hasta que pulso uno de los botones.

en cuanto lo pulso, aparece el mensaje que explica por qué se ha producido el fallo y cómo solucionarlo...

 
papaklass:

Señores, ¿alguien ha ejecutado la multidivisa en modo de visualización de precios de apertura con referencia a otros TFs?

Aquí está el gráfico diario:


El gráfico ha sido ordenado y arreglado. Gracias por el ejemplo.
 
olyakish:

El terminal no se bloquea hasta que pulso al menos uno de los botones.

En cuanto lo pulso, aparece el mensaje sobre la búsqueda de la causa del fallo y cómo solucionarlo...

Tenga en cuenta que el script MQL5 se descarga automáticamente después de la finalización de OnStart, incluyendo su DLL.

Es decir, has creado un hilo con una ventana modal colgada en la memoria, y el taburete se ha desprendido de él. Después de cerrar la ventana modal vuelve a la nada.

En tu caso, necesitas esperar explícitamente hasta que todos los hilos de la DLL terminen de forma normal y garantizada antes de terminar el script MQL5.

 
Renat:

Tenga en cuenta que el script MQL5 se descarga automáticamente después de la finalización de OnStart, incluyendo su DLL.

Es decir, hay un hilo con una ventana modal colgada en la memoria, y el taburete se ha desprendido de él. Después de cerrar la ventana modal, vuelve a la nada.

En tu caso, antes de terminar el script MQL5, tienes que esperar explícitamente a que todos los hilos de la DLL terminen normalmente y se garantice.

Gracias, ahora lo entiendo.
 
Si no hay una sola pérdida en una serie de operaciones, el FACTOR DE GANANCIA y el RATIO DE PARTICIPACIÓN toman algunos valores irreales/extremos. ¿Es un error o hay que tener en cuenta esos momentos y procesarlos de alguna manera? ¿Cómo hacerlo correctamente?
 
tol64:
Si no hay una sola pérdida en una serie de operaciones, el FACTOR DE GANANCIA y el RATIO DE PARTICIPACIÓN toman algunos valores irreales/extremos. ¿Es un error o hay que tener en cuenta esos momentos y procesarlos de alguna manera? ¿Cómo hacerlo correctamente?

EMPTY_VALUE (igual que DBL_MAX)

Por supuesto, se puede aplicar algún nan indefinido, pero entonces no se pueden hacer comparaciones.

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы - Документация по MQL5
 
stringo:

EMPTY_VALUE (igual que DBL_MAX)

Por supuesto, puedes utilizar algún nan indefinido, pero entonces no puedes hacer comparaciones.

En realidad, esos momentos no ocurren tan a menudo, así que los pondré a cero para que los gráficos no se vuelvan locos. ))
 
tol64:
Si no hay pérdidas en una serie de operaciones, los valores de PROFIT FACTOR y SHARPE RATIO toman algunos valores irreales/extremos. ¿Es un error o hay que tener en cuenta esos momentos y procesarlos de alguna manera? ¿Cómo hacerlo correctamente?

Aparentemente hay un error, porque el Factor de Ganancia no debería calcularse con valores negativos, y como en este caso con ausencia de operaciones negativas.

Simplemente, si tomamos la fórmula de forma global (Beneficio Bruto/Pérdida Bruta) entonces en ausencia de operaciones negativas obtenemos la división por cero, y cuando la Pérdida Bruta es mayor obtenemos un número inferior a 1, lo que tampoco es correcto para el análisis posterior, porque la diferencia entre dos factores de beneficio positivo será muchas veces mayor que la diferencia entre dos convencionalmente negativos.

 
Urain:

Aparentemente hay un error, ya que el factor de beneficio no debería calcularse con valores negativos, y como en este caso con ninguna operación negativa.

Ya se ha dicho dos posts más arriba que esto no es un error, sino una señal de imposibilidad de calcular este indicador.
 
Rosh:
Ya se ha dicho dos posts más arriba que esto no es un error, sino una señal de imposibilidad de calcular este indicador.
El autor de la pregunta no especificó un valor prohibitivo en particular, así que asumí que era #IND. Y en el caso de DBL_MAX, es bastante lógico que no se pueda calcular.
Aunque puedes hacer un truco, en cada cálculo añade 1 céntimo tanto al Porofit Bruto como a la Pérdida Bruta.
Entonces la fórmula de avance sería ((Porofit bruto+0,01)/(Pérdida bruta+0,01))
La fórmula para calcular el valor recíproco (cuando la pérdida bruta es mayor)
Hacer -((Pérdida bruta+0,01)/(Porofit bruto+0,01))
Bueno, está claro que la Pérdida Bruta y el Porofit Bruto son módulos.

Entonces la línea será simétrica en ambos lados, lo cual es bueno para el AG y no habrá situaciones no calculables en absoluto.

Pero lo más probable es que no le sirva a usted, sino a la gente que está escribiendo sus propios criterios de optimización.