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

 
Artyom Trishkin #:

Dobro. Lasciate che lo metta in semplici termini russi.

Stai andando a pescare.

  1. Apri la dispensa a casa, ti gratti la testa e la chiudi.
  2. Vai a pescare e hai bisogno di una canna da pesca.
  3. Vai a casa nel magazzino per prendere una canna da pesca.
  4. Sei andato a pescare, hai lanciato la tua canna e hai preso un pesce, e poi hai avuto bisogno di una rete
  5. È andato a casa nel magazzino per la rete
  6. Andavi a pescare, raccoglievi il pesce che avevi catturato e che galleggiava sull'amo con la rete, e avevi bisogno di un contenitore per conservare il pesce che avevi catturato
  7. Torna a casa per ..... Devo continuare?

Oppure puoi prendere subito tutto quello che ti serve dalla dispensa (OnInit), pescare senza correre e, quando arrivi a casa, mettere tutto nella dispensa e nel frigorifero (OnDeinit).

Forse lo sapevi qui sul forum. Bisogna solo ascoltare e sentire quello che ti viene detto a volte.

Altrimenti si fa una domanda, si ottiene una risposta, si dice "stronzate" e si fa come si crede.

Bisogna prima pensare alla domanda, fare domande, e poi iniziare l'editing.

Sapete che la cosa più semplice nella programmazione è stampare il codice? E la parte del leone nello sviluppo è il pensiero sulla logica.

Questa è un'analogia ridicola. In questo caso rendiamo tutte le variabili, gli oggetti di classe ecc. globali e non creiamoli su richiesta o forse un oggetto grafico è qualcos'altro (certamente non una canna da pesca o una rete :)) ? Quindi il mio approccio è abbastanza razionale e giustificato, è solo che mql o metatrader si sbaglia.

 
MakarFX #:
In questo modo il segnale sarà perso

O sono ottuso, o non c'è condizione se ci sono ordini aperti E c'è un segnale e la barra è già nuova.

Se i segnali sono lunghi, più di una barra multipla, funzionerà anche sul primo tick della barra.

L'unica questione è quando aprire un ordine, quando appare il segnale o al primo tick della barra successiva.
 
Valeriy Yastremskiy #:

O sono ottuso, o non c'è condizione se ci sono ordini aperti E c'è un segnale e la barra è già nuova.

Se i segnali sono lunghi, più di una barra multipla, funzionerà anche sul primo tick della barra.

L'unica questione è quando l'ordine dovrebbe essere aperto, al momento del segnale o al primo tick della barra successiva.
Vi chiedo di aprire un ordine per barra
 
законопослушный гражданин Sleep(), ma Makar ha detto che sarebbe stato meglio non fermare il processo.


Il codice ora assomiglia a questo:

Prima di aprire, controlla se c'è una posizione aperta su questa candela. In caso contrario, apritelo.

 
законопослушный гражданин #:

In linea di principio, un ordine aperto si chiuderebbe normalmente sui tick di una barra già aperta. MakarFX e Artem hanno notato correttamente. Pertanto, la cosa giusta da fare sarebbe questa:

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;
  int nOrders;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  nOrders = CountOrders();

  if (time != cTime && nOrders == 0)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(nOrders == 0) // теперь это условие можно убрать
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
 
Mihail Matkovskij #:

In linea di principio, un ordine aperto si chiuderebbe normalmente sui tick di una barra già aperta. MakarFX e Artem hanno notato correttamente. Pertanto, la cosa giusta da fare è questa:

Artem ha ragione, dovrebbe essere così

//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров и появился сигнал на покупку, то откроем ордер на покупку
   if(CountOrders()==0&&bSignalBuy())
     {
      vOrderOpenBuy();
     }
// Если нет открытых ордеров и появился сигнал на продажу, то откроем ордер на продажу
   if(CountOrders()==0&&bSignalSell())
     {
      vOrderOpenSell();
     }
   }
 
MakarFX #:

Hai ragione, Artem, dovrebbe essere così.

Il risultato sarà lo stesso qui. Solo il codice è più complicato. Stai scrivendo lo stesso codice in due funzioni diverse, e sarà meno leggibile. Anche se ognuno scrive come gli piace o si sente a suo agio...

 

C'è molto da fare qui.

Una posizione aperta ha un tempo di apertura. Il tempo di apertura può essere confrontato con il tempo di una candela - per scoprire se il tempo di apertura della posizione è dentro la candela (e questa è la candela corrente).

E perché si scopre sempre il numero di ordini in tutti gli esempi? E se ci sono zero ordini, allora li apri. Questo limita molto le possibilità.

In generale, dovremmo concentrarci solo sul numero di ordini/posizioni per una direzione strategica molto stretta.

 
Mihail Matkovskij #:

Qui, il risultato sarà lo stesso. Solo il codice è più confuso. Stai scrivendo lo stesso codice in due funzioni diverse, e sarà meno leggibile. Anche se ognuno scrive come gli piace o si sente a suo agio...

Il tuo codice

  if (time != cTime && nOrders == 0)
    time = cTime;

(Un bar si è aperto e nessun ordine è stato piazzato)

controllato per un segnale - nessun segnale

... aspettiamo la prossima barra.

Hai ripetuto lo stesso errore dell'ultima volta

P.S.

questo è

 time = cTime;
deve essere effettuato dopo l'apertura dell'ordine
 
MakarFX #:

Hai ragione, Artem, dovrebbe essere così

Nel vostro codice, se una posizione è aperta, un'altra non si aprirà con il segnale opposto. Cioè, prima di tutto, quando arriva il segnale, bisogna controllare se c'è una posizione opposta e chiuderla.

Ma di nuovo, tutto questo limita molto le possibilità di migliorare le strategie.

Dovremmo evitare di legarci alla presenza/assenza di ordini (specialmente in quattro - ordini pendenti (che è corretto) e posizioni (che è sbagliato)).

No, è corretto e necessario avere a portata di mano il numero di ordini e posizioni in base ai loro tipi. Ma è sbagliato basarsi sull'assenza di ordini solo per i segnali.

In generale, il modo corretto è avere funzioni per contare gli ordini e le posizioni (una funzione che riempie la struttura quando cambia il numero di ordini e posizioni), funzioni per aprire/chiudere posizioni, funzioni per impostare ordini e funzioni di allarme. Funzioni di varie reti a strascico e ottenimento di dati dagli indicatori. Plus - capacità di confrontare i dati di una posizione (aperta o chiusa) con alcuni valori.

Qualsiasi strategia può essere costruita a partire da questo set.

Motivazione: