Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 349

 
Pyro:

Tutto viene resettato durante l'inizializzazione tranne le variabili globali
E se si spegne il computer o il server su cui gira l'Expert Advisor?
 
artmedia70:
E qui dovremmo chiarire che GV sono variabili terminali, non variabili EA.

Ho iniziato a leggere e studiare. Ora so che le variabili globali e le variabili globali sono cose diverse.

A proposito, a proposito dell'errore 129, che ti ho chiesto così spesso. Il fatto è che ho un DC a 5 cifre,

Il mio Expert Advisor è uno slipage 2, probabilmente è per questo che non è stato in grado di tenere il passo con il prezzo. Ora l'ho impostato a 15 pips.

 
artmedia70:
E qui va chiarito che le GV sono variabili terminali, non variabili EA.


Beh, voglio dire che l'EA può lavorare con loro, solo per salvare i valori durante l'inizializzazione (tra le altre cose).
 
Forexman77:
Cosa succede se spengo il mio computer o se il server su cui gira l'EA si blocca?


Qui è dove diventa interessante. Le variabili globali sono memorizzate nella cache e in alcune circostanze sono scritte su file. Sembra che dopo qualche tempo o durante la deinizializzazione. A volte perdevo gvariables.dat (valori delle variabili globali) durante il riavvio. Questo deve essere preso in considerazione. O semplicemente non hanno avuto il tempo di copiarlo su disco dalla cache. Significa che non abbiamo alcuna garanzia che siano già sul disco e non nella cache. Correggetemi se mi sbaglio.


Forexman77:

Ho iniziato a leggere e studiare. Ora so che le variabili globali e le variabili globali sono cose diverse.

A proposito, a proposito dell'errore 129 che mi è stato chiesto così spesso. Il fatto è che ho un DC a cinque cifre,

Il mio Expert Advisor è uno slipage 2, probabilmente è per questo che non è stato in grado di tenere il passo con il prezzo. Io lo imposterei a 15 pip.


Non credo che sia questo il motivo. Ho un 3 sulle mie cinque cifre. Tutto si apre normalmente. Per quanto mi ricordo, i mediatori hanno concordato che un punto è ancora un punto base, universalmente accettato (la quarta cifra dopo lo zero) e un punto frazionario è un punto frazionario. In modo che quando si inseriscono 6, 7 e 8 cifre, non è necessario cambiare il significato di "punto" ogni volta.
 
Pyro:

Qui è dove diventa interessante. Le variabili globali sono memorizzate in una cache e in alcune circostanze sono scritte in un file. È un po' come dopo un certo periodo di tempo. Ci sono stati casi in cui durante il funzionamento reale il gvariables.dat (file in cui erano memorizzati i valori delle variabili globali) è stato semplicemente perso durante un brusco riavvio del computer. Questo deve essere preso in considerazione. O semplicemente non hanno avuto il tempo di copiarlo su disco dalla cache. Significa che non abbiamo alcuna garanzia che siano già sul disco e non nella cache. Correggimi se sbaglio.
Forse potresti provare a scriverlo e poi spegnere il computer. E quando lo accendi, prova Alert per vedere se c'è. Anche se non mentirò, finora uso solo variabili statiche e bandiere e non posso dire nulla di sicuro sulle variabili globali.
 
Forexman77:
Forse potresti provare a registrarlo e poi spegnere il computer. E quando lo accendi, prova a chiamare Alert per vedere se c'è. Anche se non mentirò, finora uso solo variabili statiche e flag e non posso dire nulla di sicuro sulle variabili globali.


Puoi semplicemente guardare in menu -> Strumenti -> Variabili globali. C'è una lista lì. Oppure usate GlobalVariableCheck. La mia esperienza mostra che è meglio salvare tutto in un file fisico, però.
 
Ciao!
Per favore, trova degli errori nel mio ragionamento.

Questo è il secondo giorno che sto lottando con la creazione dell'indicatore, in particolare la visualizzazione della linea sulla finestra aggiuntiva che è attaccata alla finestra principale. Secondo me, è necessario fare dei calcoli sulle barre non calcolate e dare i valori dei risultati dei calcoli al buffer. Questa volta, uso un codice più complesso per l'esempio (mi piace lavorare con codici relativamente grandi). Ecco la "radura della creatività":

//+--------------------------------------------+
#property indicator_separate_window
#property indicator_minimum -10
#property indicator_maximum 10
#property indicator_buffers 1
#property  indicator_color1 Blue
extern double N = 1;
//+--------------------------------------------+
//Deklaration                                  |
//+--------------------------------------------+
double A; double C;       
double M; double D;
double L; double I;
double B; double F;
double K; double Buf_0[];
double G; 
//+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//+--------------------------------------------+
int start() {
//Level 1
A = iRSI(Symbol(),0,10,0,0);
M = iRSI(Symbol(),0,20,0,0);
L = iRSI(Symbol(),0,15,0,0);
B = iStochastic(Symbol(),0,10,6,6,0,0,0,0);
K = iStochastic(Symbol(),0,10,6,6,0,0,1,0);
C = iADX(Symbol(),0,10,0,0,0);
D = iADX(Symbol(),0,10,0,1,0);
I = iADX(Symbol(),0,10,0,2,0);
F = iRVI(Symbol(),0,10,0,0);
  //Level 2
  Buf_0[0] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
  return; } 
//+-------------------------------------------+ 

.

Potete vedere chiaramente che il valore del buffer "in questa compensazione" è "0", cioè questo indicatore disegnerà la linea solo dal momento dell'inizio della piattaforma commerciale. E ho bisogno di dati storici oltre ai dati reali.

Ho usato le informazioni descritte in questo codice (preso dal tutorial di MQ4):

//--------------------------------------------------------------------
// separatewindow.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
#property indicator_separate_window // Отображение в отдельном окне
#property indicator_buffers 1       // Количество буферов
#property  indicator_color1 Blue     // Цвет первой линии
#property  indicator_color2 Red      // Цвет второй линии
 
extern int History  =50;            // Колич.баров в расчётной истории
extern int Aver_Bars=5;             // Количество баров для расчёта
 
double Buf_0[];                     // Объявление индикаторного массива
//--------------------------------------------------------------------
int init()                          // Специальная функция init()
  {
   SetIndexBuffer(0,Buf_0);         // Назначение массива буферу
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линии
   return;                          // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
int start()                         // Специальная функция start()
  {
   int i,                           // Индекс бара
   n,                               // Формальный параметр
   Counted_bars;                    // Количество просчитанных баров 
   double
   Sum_H,                           // Сумма значений High за период
   Sum_L;                           // Сумма значений Low  за период
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1)                 // Если много баров то ..
      i=History-1;                  // ..рассчитывать заданное колич.
   while(i>=0)                      // Цикл по непосчитанным барам
     {
      Sum_H=0;                      // Обнуление в начале цикла
      Sum_L=0;                      // Обнуление в начале цикла
      for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений 
        {
         Sum_H=Sum_H + High[n];     // Накопление суммы макс.значений
         Sum_L=Sum_L + Low[n];      // Накопление суммы мин. значений
        }
      Buf_0[i]=(Sum_H-Sum_L)/Aver_Bars;// Знач. 0 буфера на i-ом баре
      i--;                          // Расчёт индекса следующего бара
     }
//--------------------------------------------------------------------
   return;                          // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------
Scelgo quello che mi serve e lo prendo...
extern int History  =50;            // Колич.баров в расчётной истории
extern int Aver_Bars=5;             // Количество баров для расчёта
double Buf_0[];                     // Объявление индикаторного массива
int start()                         // Специальная функция start()
  {
   int i,                           // Индекс бара
   n,                               // Формальный параметр
   Counted_bars;                    // Количество просчитанных баров 
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1)                 // Если много баров то ..
      i=History-1;                  // ..рассчитывать заданное колич.
      Buf_0[i]=(Sum_H-Sum_L)/Aver_Bars;// Знач. 0 буфера на i-ом баре
      i--;  

Poi, portandolo ad una "visione di parata" togliendo i commenti e dividendo logicamente, ottengo:

//|+--------------------------------------+
//|Inputs                                 |
//|+--------------------------------------+
extern int History  =50;
//|+--------------------------------------+
//|Declaration                            |
//|+--------------------------------------+
double Buf_0[];
int i;
int n;
int Counted_bars;
//|+--------------------------------------+
//| Start?                                |
//| Yes, babe!                            |
//|+--------------------------------------+
int start(){
//+-----------+
//Level 1 
//+-----------+
Counted_bars=IndicatorCounted();
i=Bars-Counted_bars-1;
  //+-----------+
  //Level 2
  //+-----------+
  if (i>History-1) i=History-1;
    //+------------+
    //Level 3 
    //+------------+
    Buf_0[i]= 
    i--;  
//+---------------------------------------+

Qui mi rimangono degli oggetti che devono essere sintetizzati con il codice "principale". Dopo aver eseguito la fusione, ottengo il seguente codice:

//+--------------------------------------------+
#property indicator_separate_window
#property indicator_minimum -10
#property indicator_maximum 10
#property indicator_buffers 1
#property  indicator_color1 Blue
//|+--------------------------------------------+
//|Inputs                                       |
//|+--------------------------------------------+
extern double N = 1;
extern int History  =50;
//|+--------------------------------------------+
//|Deklaration                                  |
//|+--------------------------------------------+
double A; double C;       int i;
double M; double D;
double L; double I;       int Counted_bars;
double B; double F;
double K; double Buf_0[];
double G; 
//|+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//|+--------------------------------------------+
int start() {
       //|+-----------+
       //|Level 1     |
       //|+-----------+
       A = iRSI(Symbol(),0,10,0,0);
       M = iRSI(Symbol(),0,20,0,0);
       L = iRSI(Symbol(),0,15,0,0);
B = iStochastic(Symbol(),0,10,6,6,0,0,0,0);
K = iStochastic(Symbol(),0,10,6,6,0,0,1,0);
       C = iADX(Symbol(),0,10,0,0,0);
       D = iADX(Symbol(),0,10,0,1,0);
       I = iADX(Symbol(),0,10,0,2,0);
       F = iRVI(Symbol(),0,10,0,0);
   Counted_bars=IndicatorCounted();
              i=Bars-Counted_bars-1;
         //+-----------+
         //Level 2     |
         //+-----------+
         if (i>History-1) i=History-1;
         Buf_0[i] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
         return; } 
//+-------------------------------------------+
Durante la programmazione, ho cambiato decorativamente il codice "principale" e ho rimosso alcuni valori dal codice "appendice". Avendo eseguito il codice, ho notato la linea orizzontale, che indicava un errore nel mio ragionamento, perché gli indicatori tecnici utilizzati nell'indicatore personalizzato non possono dare, su un lungo periodo di tempo, i valori che costruiscono il grafico della funzione "y = x".

Sinossi.
Mi chiamo John (Eugene, ma all'americana).

Ho 15 anni, faccio trading da 5 giorni e sento un enorme progresso nell'apprendimento dei campi del trading di valute, cioè l'analisi degli indicatori e l'analisi grafica (in breve, t.a. :) ).
Sento che il "trading manuale" sta diventando sempre meno promettente, così ho deciso di passare direttamente al "trading automatico".

"PRENDERSELA" CON TUTTI I GIUDIZI INADEGUATI! Voglio saperne di più e i vostri commenti mi aiuteranno.

 
Link_x:
Ciao!
Vi prego di trovare errori nel mio ragionamento.

Qui finisce il secondo giorno mentre lotto con la creazione dell'indicatore, cioè la visualizzazione della linea su una finestra aggiuntiva che è attaccata a quella principale. Secondo me, è necessario fare dei calcoli sulle barre non calcolate e dare i risultati dei calcoli al buffer. Questa volta, uso un codice più complesso per l'esempio (mi piace lavorare con codici relativamente grandi). Ecco la "radura della creatività":

.

Potete vedere chiaramente che "in questa radura" il valore del buffer è "0", cioè questo indicatore disegnerà una linea solo dal momento in cui la piattaforma di trading viene avviata. E ho bisogno di dati storici oltre ai dati reali.

Ho usato le informazioni descritte in questo codice (preso dal tutorial di MQ4):

Isolo ciò di cui ho bisogno e ottengo...

Poi, portandolo ad una "visione di parata" togliendo i commenti e dividendo logicamente, ottengo:

Qui mi rimangono degli oggetti che devono essere sintetizzati con il codice "principale". Avendo eseguito la fusione, ottengo questo codice:

Durante la programmazione, ho decorativamente cambiato il codice "principale" e rimosso alcuni valori dal codice "appendice". Avviato il codice, ho notato la linea orizzontale, che indicava un errore nel mio ragionamento, poiché gli indicatori tecnici utilizzati nell'indicatore personalizzato non possono dare, durante un lungo periodo, i valori che costruiscono il grafico della funzione "y = x".

Sinossi.
Mi chiamo John (Eugene, ma all'americana).

Ho 15 anni, mi occupo di trading da 5 giorni e sento che sto facendo un grande progresso nello studio dei campi del trading di valute, cioè l'analisi degli indicatori e l'analisi dei grafici (in breve, t.a. :) ).
Sento che il "trading manuale" diventa sempre meno promettente, quindi ho deciso di passare direttamente al "trading automatico".

"PRENDERSELA" CON TUTTI I GIUDIZI INADEGUATI! Voglio saperne di più e i vostri commenti mi aiuteranno.

L'inizio è buono.

Fate attenzione alla variabile History, provate a sostituire un valore diverso.

//                Джон(Евгений).mq4 

//+--------------------------------------------+
#property indicator_separate_window
//#property indicator_minimum -10
//#property indicator_maximum 10
#property indicator_buffers 1
#property  indicator_color1 Blue
//|+--------------------------------------------+
//|Inputs                                       |
//|+--------------------------------------------+
extern double N = 1;
extern int History  =50;
//|+--------------------------------------------+
//|Deklaration                                  |
//|+--------------------------------------------+
double A; double C;       int i;
double M; double D;
double L; double I;       int Counted_bars;
double B; double F;
double K; double Buf_0[];
double G; 
//|+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//|+--------------------------------------------+
int start()
{
       //|+-----------+
       //|Level 1     |
       //|+-----------+
 for( i=0; i<History; i++)
    {    
       A = iRSI(Symbol(),0,10,0,i);
       M = iRSI(Symbol(),0,20,0,i);
       L = iRSI(Symbol(),0,15,0,0);
       B = iStochastic(Symbol(),0,10,6,6,0,0,0,i);
       K = iStochastic(Symbol(),0,10,6,6,0,0,1,i);
       C = iADX(Symbol(),0,10,0,0,i);
       D = iADX(Symbol(),0,10,0,1,i);
       I = iADX(Symbol(),0,10,0,2,i);
       F = iRVI(Symbol(),0,10,0,i);
    Buf_0[i] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
   }
 return;
} 
//+-------------------------------------------+
 
Link_x:
Ciao!
Vi prego di trovare errori nel mio ragionamento.

Il secondo giorno di sviluppo dell'indicatore sta volgendo al termine, sto lottando con la visualizzazione della linea sulla finestra aggiuntiva collegata a quella principale. Secondo me, è necessario fare dei calcoli sulle barre non calcolate e dare dei valori ai risultati dei calcoli al buffer. Questa volta, uso un codice più complesso per l'esempio (mi piace lavorare con codici relativamente grandi). Ecco la "radura della creatività":

.

Potete vedere chiaramente che "in questa radura" il valore del buffer è "0", cioè questo indicatore disegnerà una linea solo dal momento in cui la piattaforma di trading viene avviata. E ho bisogno di dati storici oltre ai dati reali.

Ho usato le informazioni descritte in questo codice (preso dal tutorial di MQ4):

Isolo ciò di cui ho bisogno e ottengo...

Poi, portandolo ad una "vista di parata" togliendo i commenti e dividendo logicamente, ottengo:

Qui mi rimangono degli oggetti che devono essere sintetizzati con il codice "principale". Avendo eseguito la fusione, ottengo questo codice:

Durante la programmazione, ho decorativamente cambiato il codice "principale" e rimosso alcuni valori dal codice "appendice". Avviato il codice, ho notato la linea orizzontale, che indicava un errore nel mio ragionamento, poiché gli indicatori tecnici utilizzati nell'indicatore personalizzato non possono dare, durante un lungo periodo, i valori che costruiscono il grafico della funzione "y = x".

Sinossi.
Mi chiamo John (Eugene, ma all'americana).

Ho 15 anni, mi occupo di trading da 5 giorni e sento che sto facendo un grande progresso nello studio dei campi del trading di valute, cioè l'analisi degli indicatori e l'analisi dei grafici (in breve, t.a. :) ).
Sento che il "trading manuale" diventa sempre meno promettente, quindi ho deciso di passare direttamente al "trading automatico".

"PRENDERSELA" CON TUTTI I GIUDIZI INADEGUATI! Voglio saperne di più e i vostri commenti mi aiuteranno.


Iniziate a scavare verso i loop (for, wile, while do) per capire perché ne avete bisogno))


Se avete bisogno di valori su dati storici - non potete farlo senza enumerare questi stessi dati in un ciclo ;)

Sopra hai dato un esempio con la Storia, che imposta il numero di barre della storia, che saranno processate dall'indicatore, ed è così che dovresti procedere.

 


Nell'immagine, ho segnato con una freccia dove dovrebbe essere l'uscita. Non capisco quale sia il problema. Entriamo, ricordiamo l'ora,

Poi esci quando il tempo è più lungo dell'entrata con un offset di un periodo e il prezzo è sotto la MA min a 3 giorni.

Il codice è il seguente:

signal =   MA_6_t - iClose(Symbol(),Period(),0);
MA_2_t=iMA(NULL,0,3,0,MODE_EMA,PRICE_LOW,0); 
static datetime t;

if  (signal > 0.006) 
          {                                          
          Opn_S=true; 
          t=Time[0];                      
          }
if  (Bid <= MA_2_t)
      {
       if (Time[1]>t)
          {                                      
          Cls_S=true;         
          }
      }
Cosa ne pensate?