Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 412

 
Imminence:

Ciao, ho un problema da principiante...

Non riesco a fare in modo che il sistema confronti il valore di chiusura dell'ultima barra con i massimi e i minimi di un certo periodo, per esempio

ultime 20 battute. Cosa sto facendo di sbagliato?


Ho controllato con Alert e per qualche motivo sconosciuto il tester visualizza il valore massimo dal calcolo dell'ultimo tick, ma dà questo valore

È lo stesso numero di volte dei tick, quindi l'ordine non si apre.


Il secondo problema è come fare in modo che il mio EA aspetti l'apertura della prossima barra (periodo di 30 m)? Nel test dei punti di controllo tutto va bene, ma se uso i tick,

poi l'EA si apre nella stessa barra subito dopo aver chiuso allo stop loss...


Inoltre, come posso chiudere un trade indipendentemente da un tick o meno? Per esempio, per un periodo di 30m voglio chiudere l'ordine 5 secondi prima della fine della barra (29.55, 59.55)

In base a tutti i dati di quel momento. A questo punto il problema è che se un tick non si verifica entro 5 secondi, quindi nessun

(In teoria questa è una stronzata, ma in realtà il prossimo tick potrebbe apparire in qualche candela per qualche motivo.

può essere in qualche candela per qualche motivo.


Grazie in anticipo!

1. Non ho visto nulla sulle ultime 20 barre nel codice.

2. Come determinare il primo tick di una nuova barra

3. Come posso chiudere un ordine senza controllare se era un tick o no?

Dobbiamo evitare di lavorare con OnTick e lavorare con OnTimer. Impostare il timer con un intervallo di 1 secondo e controllare il tempo in esso. Il timer non dipende dai tick.

/// Определяет начало нового бара
bool NewBar()
{
    static datetime lastbar = 0;
    datetime curbar = iTime(Symbol(), PERIOD_M30, 0);
    if(lastbar!=curbar)
    {
        lastbar=curbar;
        return (true);
    }
    return(false);
}
 
Leanid Aladzyeu:

o_oops non sapevo che il terminale punge anche dove è l'errore, la prima volta ho colpito un errore critico.

Ci sputa sopra.

Naturalmente sputerà, si accede al 3° elemento di un array con dimensione 2 - mas[2]++

void Oher(int Mag,string Symb, int &mas[2])
..............
...........

case 1:mas[1]++; mas [2]++;break;// 1 продажа
 

Alexey Volchanskiy:
Так у тебя в комменте стоит управляющий символ "\n " - это символ перевода строки. Если его убрать, многострочия не будет.

È uno scherzo. Ora aggiunge un commento alla fine della linea... e il testo scorre a destra. ;-)

 

Buona sera. Sto cercando di scrivere un semplice EA sull'incrocio di tenkan e kinjun. Ecco il codice:

void OnTick()

void OnTick()

{

Segnale commerciale_20();

}


int TradeSignal_20()

{

int sig=0;


se(h_ich==INVALID_HANDLE)

{

h_ich=iIchimoku(Simbolo(),Periodo(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb);

ritorno(0);

}

else

{

if (CopyBuffer(h_ich,0,0,3,ich1_buffer)<2) return(0); // TENKANSEN_LINE

se (CopyBuffer(h_ich,1,0,3,ich2_buffer)<2) return(0); // KIJUNSEN_LINE

if (!ArraySetAsSeries(ich1_buffer,true)) return(0);

if (!ArraySetAsSeries(ich2_buffer,true)) return(0);

}

//--- controlla la condizione e imposta il valore per il sig

if(ich1_buffer[1]>ich2_buffer[1]) sig=1;

else if(ich1_buffer[1]<ich2_buffer[1]) sig=-1;

altrimenti sig=0;

if (ich1_buffer[1]>ich2_buffer[1])

if (ich1_buffer[2]<ich2_buffer[2])

Alert(Symbol()+": purchase");

if (ich1_buffer[1]<ich2_buffer[1])

if (ich1_buffer[2]>ich2_buffer[2])

Alert(Symbol()+": sale");

//--- ritorno del segnale commerciale

ritorno (sig);

}

//+------------------------------------------------------------------+

Come posso fare in modo che l'allarme sia chiamato solo una volta e non costantemente?

 
Alexey Volchanskiy:

1. Non ho visto nulla sulle ultime 20 barre nel codice, dai dettagli.

2. Come determinare il primo tick di una nuova barra

3. Come si può chiudere un trade, indipendentemente dal fatto che sia stato spuntato o meno?

Dovete evitare di lavorare con OnTick e lavorare con OnTimer, impostare il timer con un intervallo di 1 secondo e controllare il tempo in esso. Il timer non dipende dall'arrivo delle zecche.

Qui, come faccio a confrontare il prezzo di chiusura con il massimo delle ultime 20 barre? E se l'ultimo prezzo è uguale o superiore al prezzo massimo delle ultime 20 barre, allora c'è un segnale di apertura.
  

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];


   
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
 
first_may:

Buona sera. Sto cercando di scrivere un semplice EA sull'incrocio di tenkan e kinjun. Ecco il codice:

void OnTick()

void OnTick()

{

Segnale commerciale_20();

Come posso fare in modo che l'allarme sia chiamato solo una volta e non tutte le volte?
Non puoi premere il pulsante SRC?
 
Imminence:
Qui, come faccio a confrontare il prezzo di chiusura con il massimo delle ultime 20 barre? E se l'ultimo prezzo è uguale o superiore al massimo delle ultime 20 barre allora c'è un segnale di apertura.
Guardiamo il codice
double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
***********

Penso che il problema sia il riferimento alla barra zero, cioè la barra attuale. Dovresti definire l'inizio di una nuova barra, l'ho dato nella risposta precedente ed eseguire tutti i confronti solo sul primo tick di una nuova barra. E cambiare l'indicizzazione. Dobbiamo assicurarci che l'ultima barra chiusa non sia in iHighest. E ora avete un riferimento alla barra corrente che si forma su ogni tick, i risultati saranno i più strani.

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,2)];

  if(Close[1] > SMMA && Close[1] > BB_UP && Close[1] >= HIGHEST)

  {
***********

 
Alexey Volchanskiy:
Guardiamo il codice di

Penso che il problema sia con il riferimento alla barra zero, cioè la barra corrente. Devi definire l'inizio di una nuova barra, l'ho citato nella risposta precedente e solo sul primo tick della nuova barra fai tutti i confronti. E cambiare l'indicizzazione. Dobbiamo assicurarci che l'ultima barra chiusa non sia in iHighest. E ora avete un riferimento alla barra corrente che si forma su ogni tick, i risultati saranno i più strani.

Grazie, sembra aver aiutato :) anche se avrei giurato di aver fatto esattamente la stessa cosa e non ha funzionato...

Avete consigliato OnTimer() ma per qualche motivo non collabora con me. Ho studiato tutto l'aiuto e non ho trovato spiegazioni o esempi chiari, quindi ero perplesso.

Cioè, questo codice banale non viene eseguito, anche se è tutto specificato nel riferimento... Googlando questo programma mi sono imbattuto che dicono che OnTimer() non funziona nel test

modo. Anche se questo momento sembra essere eliminato con il rilascio di mql5. Aiuta a capirlo :) Grazie!

int OnInit()
  {
//---
  bool  Timer = EventSetTimer(1);
  if(Timer != TRUE)
  Print(GetLastError()); 
//---
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  EventKillTimer();   
  }
  
void OnTimer()
{
Print("It works");
}  
  
 

Imminence:

Googlando questo programma ho incontrato che dicono che OnTimer() non funziona in modalità test. È stato risolto con mql5. Aiutami a capirlo). Grazie!

Giusto, in MT4 nel tester il timer non funziona e non è documentato! Ho scritto a servicedesk e mi hanno detto che non lo faranno mai. Ne sono uscito chiamando OnTimer in OnTick. Ho il timer impostato su un secondo.

// Возвращает true, если работает под тестером
bool IsRunOnTester()
{
    if(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_OPTIMIZATION))
        return true;
    return false;    
}

MqlDateTime     TimeCurrStruct;

void OnTick()
{
    if(IsRunOnTester())
    {
        static datetime dt1 = 0, dt2 = 0;
        static bool tfirst = true;
        if(tfirst)
        {
            tfirst = false;
            dt1 = dt2 = TimeCurrent();
            return;
        }
    
        dt2 = TimeCurrent();
        for(datetime TimeTesterCurrent = dt1+1; TimeTesterCurrent <= dt2; TimeTesterCurrent++)
        {
            TimeToStruct(TimeTesterCurrent, TimeCurrStruct);
            OnTimer();
        }    
        dt1 = dt2;
    }
}

Così, se nel tester i tick arrivano più di 1 volta/sec, quelli in eccesso vengono saltati; se meno spesso, viene generato il multiplo di tempo di 1sec. Questo tempo si trova nella struttura TimeCurrStruct, e la mia classe principale in qualsiasi modalità prende il tempo solo da questa struttura. Secondo me, questo è l'unico modo per affrontare questo bug. Ecco una funzione, ho rimosso le cose inutili, solo la carne ))

void OnTimer()
{
    string msg;
    if(!IsRunOnTester())
    {
        TimeToStruct(TimeCurrent(), TimeCurrStruct);
        SmartDsp.ReceiveTick(TimeCurrStruct);    // основной метод робота, в него передается структура со временем
    }
    else
    {
        SmartDsp.ReceiveTick(TimeCurrStruct);    
    }
}




 
Alexey Volchanskiy:
Non puoi premere il pulsante SRC?
Non è chiaro cosa intendi con questo?
Motivazione: