[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 61

 

Estimados expertos, por favor, respondan a la pregunta:

MetaEditor dispone de archivos de texto de plantillas de creación de programas. Son utilizados por el asistente al crear un programa. En el texto de la plantilla se especifican los parámetros del tipo de archivo de programa creado. Hay etiquetas entre los parámetros que no se muestran en el texto del código. Pero el terminal los reconoce de alguna manera. Si se crea un Asesor Experto, la función de Inicio se lanza después del siguiente tick. Si se crea un indicador, la función de Inicio se lanza sin un tick. ¿Dónde van las etiquetas y todo lo que contienen?

 

Hice dos pruebas más para ver de dónde viene todo:


1. Leo del ini no en un array de cadenas, sino en variables separadas. El resultado es el esperado, es decir, la copia no es un valor sino una referencia:

int    numCross=0;

string Cross_1="-", Cross_2="-", Cross_3="-";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  string sectionName = "common";
  
  numCross = ReadIniInteger( config_path, sectionName, "numCross", 0);
  ArrayResize( CrossName, numCross);
  for (int i=0; i<numCross; i++) CrossName[i] = "-";
  
  sectionName = "cross1";
  Cross_1 = ReadIniString( config_path, sectionName, "name", "-");
  Print("init.1: Cross_1=", Cross_1);
  sectionName = "cross2";
  Cross_2 = ReadIniString( config_path, sectionName, "name", "-");
  Print("init.1: Cross_2=", Cross_2);
  sectionName = "cross3";
  Cross_3 = ReadIniString( config_path, sectionName, "name", "-");
  Print("init.1: Cross_3=", Cross_3);
  Print("init.1: read complete");

  Print("init.2: Cross_1=", Cross_1);
  Print("init.2: Cross_2=", Cross_2);
  Print("init.2: Cross_3=", Cross_3);
  Print("-------------------------------");
  
  sectionName = "cross1";
  Cross_1 = StringSubstr( ReadIniString( config_path, sectionName, "name", "-"), 0, 0);
  Print("init.3: Cross_1=", Cross_1);
  sectionName = "cross2";
  Cross_2 = StringSubstr( ReadIniString( config_path, sectionName, "name", "-"), 0, 0);
  Print("init.3: Cross_2=", Cross_2);
  sectionName = "cross3";
  Cross_3 = StringSubstr( ReadIniString( config_path, sectionName, "name", "-"), 0, 0);
  Print("init.3: Cross_3=", Cross_3);
  Print("init.3: read complete");

  Print("init.4: Cross_1=", Cross_1);
  Print("init.4: Cross_2=", Cross_2);
  Print("init.4: Cross_3=", Cross_3);

  return(0);
}


el resultado obtenido:

2009.04.10 14:31:42 example AUDUSD,H4: init.4: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.4: Cross_2=GBPUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.4: Cross_1=EURUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.3: read complete
2009.04.10 14:31:42 example AUDUSD,H4: init.3: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.3: Cross_2=GBPUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.3: Cross_1=EURUSD
2009.04.10 14:31:42 example AUDUSD,H4: -------------------------------
2009.04.10 14:31:42 example AUDUSD,H4: init.2: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.2: Cross_2=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.2: Cross_1=USDJPY

2009.04.10 14:31:42 example AUDUSD,H4: init.1: read complete
2009.04.10 14:31:42 example AUDUSD,H4: init.1: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.1: Cross_2=GBPUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.1: Cross_1=EURUSD


2. devuelve la matriz de cadena, pero en lugar de la función de lectura de los valores de la cadena ini

string ReadIniString(string FileName, string SectionName, string KeyName, 
                     string Default = "")
  {
   string ReturnedString = "";
   int nValue = GetPrivateProfileStringA( SectionName, KeyName, Default, 
                                          ReturnedString, 255, FileName);
   if( nValue > 0)
       return( ReturnedString);
   else 
       return( Default);
  }

usó una función de prueba, que no llama a nada de la api de win

string CrossName[];
int    numCross=0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  string sectionName = "common";
  
  numCross = ReadIniInteger( config_path, sectionName, "numCross", 0);
  ArrayResize( CrossName, numCross);
  for (int i=0; i<numCross; i++) CrossName[i] = "-";
  
  for (int i=0; i< numCross; i++)
  {
    sectionName = StringConcatenate("cross", i+1);
    CrossName[ i] = someFunc( i+1);
    Print("init.1: CrossName[", ( i+1), "]=", CrossName[ i]);
  }
  Print("init.1: read complete");
  
  for ( i=0; i< numCross; i++)
  {
    Print("init.2: CrossName[", ( i+1), "]=", CrossName[ i]);
  }
  

  Print("-------------------------------");
  for ( i=0; i< numCross; i++)
  {
    sectionName = StringConcatenate("cross", i+1);
    CrossName[ i] = StringSubstr( someFunc( i+1), 0, 0);
    Print("init.3: CrossName[", ( i+1), "]=", CrossName[ i]);
  }
  Print("init.3: read complete");
  
  for ( i=0; i< numCross; i++)
  {
    Print("init.4: CrossName[", ( i+1), "]=", CrossName[ i]);
  }

  return(0);
}
//+------------------------------------------------------------------+
string someFunc(int val)
{
  string ReturnedString = "CROSS_"+ val;
  return( ReturnedString);
}
//+------------------------------------------------------------------+

resultado

2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.4: CrossName[3]=CROSS_3
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.4: CrossName[2]=CROSS_2
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.4: CrossName[1]=CROSS_1
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.3: lectura completa
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.3: CrossName[3]=CROSS_3
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.3: CrossName[2]=CROSS_2
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.3: CrossName[1]=CROSS_1
2009.04.10 14:41:12 ejemplo AUDUSD,H4: -------------------------------

2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.2: CrossName[3]=CROSS_3
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.2: CrossName[2]=CROSS_2
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.2: CrossName[1]=CROSS_1
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.1: lectura completa
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.1: CrossName[3]=CROSS_3
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.1: CrossName[2]=CROSS_2
2009.04.10 14:41:12 ejemplo AUDUSD,H4: init.1: CrossName[1]=CROSS_1

ha demostrado que el problema parece estar en la conversión de

LPTSTR lpReturnedString [out] Un puntero al buffer que recibe la cadena recuperada win api de GetPrivateProfileString fi  a mql4 string.
 
xruss >> :

¿Cómo debería ser? Lógicamente estaba pensando en determinar el ORDtype antes de que se forme la señal. de lo contrario cómo se tendrá en cuenta en los criterios de negociación. y otro inconveniente - las posiciones no se abren incluso con un historial vacío((

Te respondí en privado - creo que será más productivo de esta manera.

 
Reshetov >> :

Es mucho más fácil, no reinventar la rueda, y tomar uno de los Asesores Expertos ya hechos, operando en la martingala y ver cómo ya se implementa.


Por ejemplo, Universum 3.0.


Gracias, estoy completamente de acuerdo, todo se inventó hace mucho tiempo

 

Ejecución de la función init() al probar el EA en el probador.


Quiero normalizar algunas variables externas en la función init() del EA

y utilizar estos valores normalizados para llamar al indicador desde start().

No quiero incluir esta normalización en start().

¿Se ejecutará la función init() cada vez que se cambie una variable externa durante la optimización del EA en el probador de estrategias?
 
begemot61 писал(а) >>

Ejecución de la función init() al probar el EA en el probador.


Quiero normalizar algunas variables externas en la función init() del EA

y utilizar estos valores normalizados (nuevos) para llamar al indicador desde start().

No quiero incluir esta normalización en start().

¿Se ejecutará la función init() cada vez que se cambie una variable externa durante la optimización del EA en el probador de estrategias?

Sí, será

 

int start()
{
if (OrdersTotal() == 0
&& TimeDayOfWeek(TimeCurrent()) == 5
&& TimeHour(TimeCurrent()) == 12
&& TimeMinute(TimeCurrent()) == 30
&& TimeSeconds(TimeCurrent()) >= 00)
{
Alert("Тра ляля");
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"sell",999999,0,Red);
}


¿Puede alguien decirme por qué no se abre un pedido aquí? ¿Qué estoy haciendo mal?
 
Dimoncheg писал(а) >>
¿Alguien tiene idea de por qué no se abre un pedido aquí? ¿Qué estoy haciendo mal?

Bien, este... Hay que esperar hasta el viernes, si hay una garrapata en ese minuto, debería abrirse.

 
Roger >> :

Bien, este... Hay que esperar hasta el viernes, si hay una garrapata en ese minuto, debería abrirse.

>> Esa es la cuestión, lo hago el viernes o cualquier otro día de la semana y la alerta funciona y la orden no se abre en absoluto.