[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 61

 

Chers experts, veuillez répondre à la question suivante :

MetaEditor dispose de fichiers texte de modèles de création de programmes. Ils sont utilisés par l'assistant lors de la création d'un programme. Dans le texte du modèle, les paramètres du type de fichier de programme créé sont spécifiés. Il y a des balises entre ces paramètres qui n'apparaissent pas dans le texte du code. Mais le terminal les reconnaît en quelque sorte. Si un Expert Advisor est créé, la fonction Start est lancée après le prochain tick. Si un indicateur est créé, la fonction Start est lancée sans tick. Où vont les étiquettes et tout ce qu'elles contiennent ?

 

J'ai fait deux autres tests pour voir d'où ça vient :


1. je lis l'ini non pas dans un tableau de chaînes de caractères, mais dans des variables séparées. Le résultat est conforme aux attentes, c'est-à-dire que la copie n'est pas une valeur mais une référence :

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);
}


le résultat obtenu :

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. j'ai retourné le tableau de chaînes de caractères, mais au lieu que la fonction lise les valeurs des chaînes de caractères 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);
  }

utilisation d'une fonction de test, qui n'appelle rien de l'api 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);
}
//+------------------------------------------------------------------+

résultat

2009.04.10 14:41:12 exemple AUDUSD,H4 : init.4 : CrossName[3]=CROSS_3
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.4 : CrossName[2]=CROSS_2
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.4 : CrossName[1]=CROSS_1
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.3: lecture complète
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.3 : CrossName[3]=CROSS_3
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.3 : CrossName[2]=CROSS_2
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.3: CrossName[1]=CROSS_1
2009.04.10 14:41:12 exemple AUDUSD,H4 : -------------------------------

2009.04.10 14:41:12 exemple AUDUSD,H4 : init.2 : CrossName[3]=CROSS_3
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.2 : CrossName[2]=CROSS_2
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.2: CrossName[1]=CROSS_1
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.1 : lecture complète
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.1 : CrossName[3]=CROSS_3
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.1 : CrossName[2]=CROSS_2
2009.04.10 14:41:12 exemple AUDUSD,H4 : init.1 : CrossName[1]=CROSS_1

a montré que le problème semble être dans la conversion de

LPTSTR lpReturnedString [out] Un pointeur vers le tampon qui reçoit la chaîne récupérée par l'api de GetPrivateProfileString fi  à mql4 string.
 
xruss >> :

Comment cela devrait-il être ? logiquement, je pensais déterminer le type d'ORD avant la formation du signal. sinon, comment sera-t-il pris en compte dans les critères de trading. et un autre hic - les positions ne sont pas ouvertes même avec un historique vide(((

Je vous répondrai en privé - je pense que ce sera plus productif de cette façon.

 
Reshetov >> :

Il est beaucoup plus facile, de ne pas réinventer la roue, et de prendre l'un des Expert Advisors prêts à l'emploi, négociant sur la martingale et voir comment il est déjà mis en œuvre.


Par exemple, Universum 3.0.


Merci, je suis tout à fait d'accord. Tout a été inventé il y a longtemps.

 

Exécution de la fonction init() lors du test de l'EA dans le testeur.


Je veux normaliser certaines variables externes dans la fonction init() de l'EA.

et utiliser ces valeurs normalisées pour appeler l'indicateur à partir de start().

Je ne veux pas inclure cette normalisation dans start().

La fonction init() sera-t-elle exécutée chaque fois qu'une variable externe est modifiée pendant l'optimisation de l'EA dans le testeur de stratégie ?
 
begemot61 писал(а) >>

Exécution de la fonction init() lors du test de l'EA dans le testeur.


Je veux normaliser certaines variables externes dans la fonction init() de l'EA.

et utiliser ces (nouvelles) valeurs normalisées pour appeler l'indicateur à partir de start().

Je ne veux pas inclure cette normalisation dans start().

La fonction init() sera-t-elle exécutée chaque fois qu'une variable externe est modifiée pendant l'optimisation de l'EA dans le testeur de stratégie ?

Oui, ce sera

 

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);
}


Quelqu'un peut-il me dire pourquoi une commande ne s'ouvre pas ici ? Qu'est-ce que je fais de mal ?
 
Dimoncheg писал(а) >>
Quelqu'un sait-il pourquoi une commande ne s'ouvre pas ici ? Qu'est-ce que je fais de mal ?

Ok, celui-là... Il faut attendre jusqu'à vendredi, s'il y a un tic dans la minute, ça devrait s'ouvrir.

 
Roger >> :

Ok, celui-là... On doit attendre jusqu'à vendredi, s'il y a un tic dans la minute, ça devrait s'ouvrir.

>> C'est ça le problème, je le fais le vendredi ou n'importe quel autre jour de la semaine et l'alerte fonctionne et l'ordre ne s'ouvre pas du tout.

Raison: