Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1534

 
Eugen8519:

Ecco come si chiude l'ordine

Fate come ho scritto sopra...

Oppure pubblicate il codice OnTick()

 
Eugen8519:

Ecco come si chiude l'ordine

Questa struttura dovrebbe essere

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeToStruct(TimeCurrent() , str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
   if(YesStop==false)
     {
      if(EMA0...)
        {
         .....
         OPENORDER("Sell");
        }
   
      if(EMA0...)
        {
         .....
         OPENORDER("Buy");
        }
     }
//---
   if(EMA0...)
     {
      .....
      CLOSEORDER("Sell");
     }

   if(EMA0...) 
     {
      .....
      CLOSEORDER("Buy");
     }
  }
//+------------------------------------------------------------------+
void CLOSEORDER(string ord)
  {
   .....
  }
//---
void OPENORDER(string ord)
  {
   .....
  }
 
Grazie per il suggerimento, lo controllerò stasera e riferirò più tardi.
 
MakarFX:

Questa struttura dovrebbe essere

Se non mi sbaglio, può essere scritto come segue

   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeCurrent(str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
 
Eugen8519:
Beh, grazie per il consiglio, lo controllerò stasera e riferirò più tardi.

se UseTimeLimit è impostato nelle impostazioni all'avvio del gufo, allora

questa funzione è meglio in OnInit() invece di OnTick()

 
Vitaly Muzichenko:

Se non mi sbaglio, si può scrivere così

In realtà lo scrivo così.

if(TimeHour(time[i])>=Time_Start&&TimeHour(time[i])<TimeFinish)

o ancora più semplice

if(Hour()>=Time_Start&&Hour()<TimeFinish)
 

Buon pomeriggio, potreste dirmi come calcolare correttamente la media della linea dell'indicatore? La curva di base con periodo Per_1 è disegnata normalmente (Buffer_1[]), finché non aggiungo un blocco di media semplice con Buffer_2[] con periodo di media Per_2.

int OnCalculate(parametri predefiniti)

{

int i, j, limite;

se(tassi_totale <= Per_1)

ritorno(0);

//L'ultima barra calcolata sarà ricalcolata

limite = tassi_totale - prev_calcolato - Per_1;

se(prev_calcolato > 0)

limitare++;

//calcolare e riempire i buffer degli indicatori

for(i=0; i < limite; i++)

{

//Calcolare la linea principale dell'indicatore

Buffer_1[i] = Formula della curva

doppio Somma = 0;

for(j = i; j < Per_2 + i; j++)

{

//Calcolare la linea della media

Sum += Buffer_1[j];

Buffer_2[i] = Somma / Per_2;

}

}

return(rates_total);

}

 
 
Eugen8519:
Questo è il problema, apre e chiude solo gli ordini starthour->stophour
E gli ordini aperti non vengono chiusi dopo lo stophour

Perché non si può fare trading dopo lo stophour

Ho scritto la logica dell'apertura prima della chiusura, della pesca a strascico e dell'altro mantenimento delle posizioni per molto tempo. Per la maggior parte è vero, prima di aprire qualcos'altro, bisogna controllare quello che è già aperto.

La tua logica è corretta, devi solo scambiare i blocchi:

MqlDateTime str;
void OnTick()
 {
 // Close Positions
 TrailingStop();

 if(условие_закрытия)
  {
   ClosePos();
  }

 // Open Positions
 if(UseTimeLimit)
  {
    TimeCurrent(str);
    if(str.hour > startHour && str.hour < stopHour)
     {
      OpesPos(...);
      ...
     }
  }
// end
}
Motivazione: