[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 61

 

Cari esperti, per favore rispondete alla domanda:

MetaEditor ha file di testo di modelli di creazione di programmi. Sono utilizzati dalla procedura guidata quando si crea un programma. Nel testo del modello vengono specificati i parametri del tipo di file del programma creato. Ci sono dei tag tra i parametri che non sono mostrati nel testo del codice. Ma il terminale li riconosce in qualche modo. Se viene creato un Expert Advisor, la funzione Start viene lanciata dopo il prossimo tick. Se viene creato un indicatore, la funzione Start viene lanciata senza tick. Dove vanno a finire le etichette e tutto quello che c'è dentro?

 

Ho fatto altri due test per vedere da dove viene tutto:


1. Leggo da ini non in array di stringhe, ma in variabili separate. Il risultato è quello atteso, cioè la copia non è un valore ma un riferimento:

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


il risultato ottenuto:

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. ha restituito l'array di stringhe, ma invece della funzione che legge i valori delle stringhe 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);
  }

usato una funzione di test, che non chiama nulla da win api

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

risultato

2009.04.10 14:41:12 esempio AUDUSD,H4: init.4: CrossName[3]=CROSS_3
2009.04.10 14:41:12 esempio AUDUSD,H4: init.4: CrossName[2]=CROSS_2
2009.04.10 14:41:12 esempio AUDUSD,H4: init.4: CrossName[1]=CROSS_1
2009.04.10 14:41:12 esempio AUDUSD,H4: init.3: read complete
2009.04.10 14:41:12 example AUDUSD,H4: init.3: CrossName[3]=CROSS_3
2009.04.10 14:41:12 example AUDUSD,H4: init.3: CrossName[2]=CROSS_2
2009.04.10 14:41:12 example AUDUSD,H4: init.3: CrossName[1]=CROSS_1
2009.04.10 14:41:12 esempio AUDUSD,H4: -------------------------------

2009.04.10 14:41:12 esempio AUDUSD,H4: init.2: CrossName[3]=CROSS_3
2009.04.10 14:41:12 esempio AUDUSD,H4: init.2: CrossName[2]=CROSS_2
2009.04.10 14:41:12 esempio AUDUSD,H4: init.2: CrossName[1]=CROSS_1
2009.04.10 14:41:12 example AUDUSD,H4: init.1: read complete
2009.04.10 14:41:12 example AUDUSD,H4: init.1: CrossName[3]=CROSS_3
2009.04.10 14:41:12 example AUDUSD,H4: init.1: CrossName[2]=CROSS_2
2009.04.10 14:41:12 example AUDUSD,H4: init.1: CrossName[1]=CROSS_1

ha dimostrato che il problema sembra essere nella conversione di

LPTSTR lpReturnedString [out] Un puntatore al buffer che riceve la stringa recuperata win api di GetPrivateProfileString fi  alla stringa mql4.
 
xruss >> :

Come dovrebbe essere? Logicamente stavo pensando di determinare l'ORDtype prima che il segnale sia formato. altrimenti come sarà preso in considerazione nei criteri di trading. e un altro intoppo - le posizioni non sono aperte anche con una storia vuota((

Rispondere a voi in privato - penso che sarà più produttivo in questo modo.

 
Reshetov >> :

È molto più facile, non reinventare la ruota, e prendere uno degli Expert Advisors già pronti, fare trading sulla martingala e vedere come è già implementato.


Per esempio, Universum 3.0.


Grazie, sono completamente d'accordo - tutto è stato inventato molto tempo fa

 

Esecuzione della funzione init() quando si testa l'EA in tester.


Voglio normalizzare alcune variabili esterne nella funzione init() dell'EA

e usare questi valori normalizzati per chiamare l'indicatore da start().

Non voglio includere questa normalizzazione in start().

La funzione init() sarà eseguita ogni volta che una variabile esterna viene cambiata durante l'ottimizzazione dell'EA nello strategy tester?
 
begemot61 писал(а) >>

Esecuzione della funzione init() quando si testa l'EA nel tester.


Voglio normalizzare alcune variabili esterne nella funzione init() dell'EA

e usare questi valori normalizzati (nuovi) per chiamare l'indicatore da start().

Non voglio includere questa normalizzazione in start().

La funzione init() sarà eseguita ogni volta che una variabile esterna viene cambiata durante l'ottimizzazione dell'EA nello strategy tester?

Sì, sarà

 

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


Qualcuno può dirmi perché un ordine non si apre qui? Cosa sto facendo di sbagliato?
 
Dimoncheg писал(а) >>
Qualcuno ha idea del perché un ordine non si apre qui? Cosa sto facendo di sbagliato?

Ok, questo... Bisogna aspettare fino a venerdì, se c'è un tick entro quel minuto, dovrebbe aprirsi.

 
Roger >> :

Ok, questo... Bisogna aspettare fino a venerdì, se c'è un tick in quel minuto, dovrebbe aprirsi.

>> Questa è la cosa, lo faccio il venerdì o qualsiasi altro giorno della settimana e l'allarme funziona e l'ordine non si apre affatto.

Motivazione: