Características del lenguaje mql5, sutilezas y técnicas - página 133

 
Alexey Viktorov:
¿Por qué?
ya lo he probado
 
Nikolai Semko:
ya lo he probado

Pero aquí

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades de mql5, consejos y trucos

Nikolai Semko, 2019.04.03 22:33

Sí, gracias Alexey. Me había olvidado de esta función. Lo vi antes, pero nunca lo usé.

Lo he probado. Algo va mal. Lo borra, pero después de borrarlo, todo se detiene.

Simplemente añadí una línea de código a la función DrawSetup() antes del cálculo del indicador con los siguientes parámetros.

IndicatorRelease(handle);
handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
for(int i=0;i<N;i++) handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);

El indicador simplemente deja de funcionar y todavía no puedo entender la razón.

Estoy absolutamente de acuerdo con usted. Es sólo un juguete inútil.


No es así en absoluto.
 
Alexey Viktorov:

Pero aquí


no es así en absoluto.
Lo he intentado antes. He borrado el código de mí mismo como infructuoso.
 
También puedes probar a liberar todos los handels en cadena, empezando por el más enterrado.
 
Andrey Khatimlianskii:
También puedes probar a liberar todas las asas de una cadena, empezando por la más enterrada.

Bueno, no está funcionando. O si funciona, entonces se aplican algunos frenos.

void BuildMaFromMa()
  {
   static int h[];
   for(int i=0;i<ArraySize(h);i++) IndicatorRelease(h[i]);
   handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
   ArrayResize(h,N);
   if (N>0) h[0]=handle; 
   for(int i=0;i<N;i++)
     {
      handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);
      h[i]=handle;
     }
  }

Si se documenta la línea conIndicatorRelease, entonces todo funciona bien, pero de lo contrario algunos frenos se activan y no entiendo lo que está sucediendo.

Archivos adjuntos:
 

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Indicadores: MaFromMa

Nikolai Semko, 2019.04.04 01:00

Quería comparar el rendimiento de la recursión y la iteración.

Resulta que la recursión es más del doble de rápida...

Probablemente porque la pila es más rápida...

Es algo increíble. Esperaba el efecto contrario. ))

#define  size 1000000
uint sum1=0,sum2=0;
int i;
int X[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   ArrayResize(X,size);
   for(i=0;i<size;i++) X[i]=rand();

   ulong t=GetMicrosecondCount();
   i=0;
   while(i<size) { sum1+=X[i]; i++;}
//Recursion();
   ulong t1=GetMicrosecondCount()-t;

   t=GetMicrosecondCount();
   i=0;
//while(i<size) { sum1+=X[i]; i++;}
   Recursion();
   ulong t2=GetMicrosecondCount()-t;
   Print("время выполнения цикла    = "+string(t1)+" , контрольная сумма = "+string(sum1));
   Print("время выполнения рекурсии = "+string(t2)+" , контрольная сумма = "+string(sum2));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Recursion()
  {
   sum2+=X[i];
   i++;
   if(i<size) Recursion();
  }
//+------------------------------------------------------------------+
2019.04.03 19:06:40.776 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1667 , контрольная сумма = 3510404212
2019.04.03 19:06:40.776 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 697 , контрольная сумма = 3510404212
2019.04.03 19:06:41.697 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1653 , контрольная сумма = 3492310620
2019.04.03 19:06:41.697 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 699 , контрольная сумма = 3492310620
2019.04.03 19:06:42.549 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1529 , контрольная сумма = 3510953577
2019.04.03 19:06:42.549 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 696 , контрольная сумма = 3510953577
2019.04.03 19:06:43.332 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1559 , контрольная сумма = 3512212419
2019.04.03 19:06:43.332 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 698 , контрольная сумма = 3512212419
2019.04.03 19:06:44.098 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1707 , контрольная сумма = 3497178596
2019.04.03 19:06:44.098 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 472 , контрольная сумма = 3497178596
2019.04.03 19:06:44.839 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 2088 , контрольная сумма = 3485051380
2019.04.03 19:06:44.839 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 482 , контрольная сумма = 3485051380
2019.04.03 19:06:45.538 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1612 , контрольная сумма = 3487817581
2019.04.03 19:06:45.538 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 448 , контрольная сумма = 3487817581
2019.04.03 19:06:46.397 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1742 , контрольная сумма = 3475121003
2019.04.03 19:06:46.397 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 497 , контрольная сумма = 3475121003
2019.04.03 19:06:47.262 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1701 , контрольная сумма = 3485556615
2019.04.03 19:06:47.262 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 701 , контрольная сумма = 3485556615

 

¿Tienen ustedes una función de cálculo de lotes probada y fiable para MT5, sin un stop loss?

Compartir...

 
Durante la optimización, es posible que aparezca el siguiente mensaje en el registro de comprobación
Tester  OnTesterInit failed. Optimization cannot be started.


Es casi imposible entender la causa a partir de este mensaje, ya que no hay ninguna referencia al registro de la Terminal. Ahí es donde hay que buscar la causa.


Este es un ejemplo de este tipo de EA

input int Range = 0; // 1..9

int Tmp = 1 / Range;

void OnTesterDeinit() {}

double OnTester()
{
  return(Tmp);
}


El Asesor Experto optimiza en un rango en el que el Rango no llega a cero. Pero al mismo tiempo, la optimización falla.

La razón es que el modo Frame de los Asesores Expertos se lanza siempre con los parámetros de entrada prescritos rígidamente en EX5. En este caso, el modo Marco da lugar a unadivisión por cero.

Si se elimina OnTesterDeinit del código fuente, la optimización se ejecutará sin problemas.


Sería bueno que el TesterJournal en tales situaciones tenga una referencia al TerminalJournal. De lo contrario, no siempre es posible entender (la depuración no está disponible durante la optimización), lo que está pasando.

 

Puede encontrarse con una situación en la que los EAs no se inician en un gráfico.

A la izquierda está el cursor habitual al arrastrar un EA a un gráfico. A la derecha está nuestro caso.


No habrá entradas en el registro. En general, el cursor de barrado es el único identificador visual de estos gráficos.


Si guarda la plantilla tpl, estos gráficos se distinguirán por una sola línea

tester=1

Esta es probablemente la única opción programática para identificar el tipo de gráfico. Es un gráfico de marcos.


Por lo tanto, si quiere protegerse del comercio automatizado, puede trabajar sólo con estos gráficos.

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Nikolai Semko:

La fórmula de la herramienta sintética da el error "Unknown parsing error" si el nombre del símbolo comienza con (o contiene) un punto.

Slava, 2019.04.19 06:08

Si un nombre de carácter contiene un punto, un guión o algo que no se entiende (¿qué tal "RTS-12.19"?), entonces el nombre debe ir rodeado de apóstrofes

Razón de la queja: