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

 
Бахром Балтабаев una notifica al mio telefono quando il prezzo raggiunge un certo livello, cioè per non guardare il terminale tutto il tempo.

Recentemente ho scritto un avviso:. Ma può essere migliorato aggiungendo SendNotification:

// использовать алерт
input bool alert = true;
// использовать push-уведомления
input bool notification = true;
// уровень срабатывания
input double trigLv = 0.0;
// отклонение от trigLv в пунктах
input int deviation = 30; 


// функция взята из https://www.mql5.com/ru/docs/basis/types/double
bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
  return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[]
) {
  static bool triggered = false;
  static datetime time_ = 0;
  if (!alert && !notification)
    return rates_total;
  if (EqualDoubles(trigLv, close[rates_total - 1], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) { // сравнение цены Close с trigLv
    if (time_ != time[rates_total - 1])
      time_ = time[rates_total - 1];
    else
      return rates_total;
    if (!triggered) {
      if (alert)
        Alert("Level ", NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " triggered!");
      if (notification)
        SendNotification("Level " + (string)NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " triggered!");
    }
    triggered = true;
  }
  else
    triggered = false;
  
  return rates_total;
}

Aggiungete le linee che ho evidenziato al codice sorgente, lasciatelo nella cartella Indicatori e compilatelo. Questo indicatore può essere aggiunto al grafico tutte le volte che vuoi e ricevere segnali quando diversi livelli vengono attraversati. Il codice è stato finalizzato online. Il risultato non è verificato.

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Forum sul trading, sistemi di trading automatico e test di strategia

Tutte le domande dei neofiti su MQL4 e MQL5, aiuto e discussione su algoritmi e codici

GlaVredFX, 2022.01.17 18:59

Sto cercando il codice per chiudere gli ordini e se non ne vedo, aprirò un nuovo ordine.

Ma per qualche motivo, chiude solo 1 ordine e si ferma prima del prossimo segnale.

2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Signal 1.1322 < clos 1.1304 ExistPosSell 0
2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Signal 1.1322 > clos 1.1304 ExistPosBuy 1
2022.01.17 16:22:08.366 2022.01.04 08:00:00 e: Signal 1.1325 < clos 1.1306 ExistPosSell 0
2022.01.17 16:22:08.366 2022.01.04 04:00:00 e: Signal 1.1325 > clos 1.1306 ExistPosBuy 1
2022.01.17 16:22:08.327 2022.01.04 2022.01.04 00:00:00 e: Signal 1.1326 < clos 1.1296 ExistPosSell 0
2022.01.17 16:22:08.327 2022.01.04 00:00:00 e: Signal 1.1326 > clos 1.1296 ExistPosBuy 1
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Signal 1.1328 < clos 1.1283 ExistPosSell 0
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: close #1 buy 0.01 EURUSD at 1.13598 at price 1.12831

2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Signal 1.1328 > close 1.1283 ExistPosBuy 1
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: open #4 buy 0.01 EURUSD at 1.13512 ok
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Segnale 1.134 < chiusura 1.135 ExistPosSell 0
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Segnale 1.134 > chiusura 1.135 ExistPosBuy 1

if(isNewBar()==true) {  
if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
     if(ExistPositions( NULL, OP_BUY, Magic) == true) //---------------- Если есть позиция BUY то
ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
         if(ExistPositions( NULL, OP_BUY, Magic) == False) //----------- если позиции BUY отсутствуют то
   ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию SELL

if(Signal < clos ) { //--------------------- МА ниже цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_SELL, Magic) == true) //---------------- Если есть позиция SELL то
 ClosePosWithMaxProfitInCurrency(); //---------------------закрытие одной позиции с максимальным профитом в валюте депозита.
        if(ExistPositions( NULL, OP_SELL, Magic) == False)  //----------- если позиции SELL отсутствуют то
  ticket=OpenPosition(NULL,OP_BUY, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию BUY

} return; 
Se presti un po' più di attenzione alla tua domanda e al tuo codice, vedrai da solo qual è il problema.
 
Mihail Matkovskij #:

Se presti un po' più di attenzione alla tua domanda e al tuo codice, lo vedrai da solo.

La questione è che il 1 ordine più redditizio dovrebbe chiudersi su 1 barra, poi aspettare una nuova barra e chiudere di nuovo il 1 ordine redditizio. Non dovremmo chiuderli tutti in una volta.

Questo significa che chiudiamo sulla prima barra, ma non succede nulla sulla barra successiva.

 
GlaVredFX #:

Il problema è che l'1 ordine più redditizio dovrebbe chiudersi su 1 barra, poi aspettare una nuova barra e chiudere di nuovo l'1 ordine redditizio. Non dovreste chiuderli tutti insieme.

Allora dovete formulare correttamente le vostre domande. Avete solo 1 segnale. Riceverai solo 1 segnale all'apertura di una nuova barra. Se c'è solo 1 segnale, quanti ordini saranno chiusi? E solo se il segnale appare su una nuova barra. E, se non c'è nessun segnale, gli ordini saranno chiusi sulle barre successive. Di nuovo, se c'è un segnale.

 
Mihail Matkovskij #:

Poi bisogna formulare le domande in modo corretto. Si ottiene solo 1 segnale. Ed è all'apertura di un nuovo bar. E se c'è solo 1 segnale, quanti ordini saranno chiusi? E solo se il segnale appare su una nuova barra. E, se non c'è nessun segnale, gli ordini saranno chiusi sulle barre successive. E ancora, se c'è un segnale.

In questi casi un diagramma di flusso di solito aiuta. Oppure abbiamo bisogno di descrivere l'algoritmo in dettaglio punto per punto su un pezzo di carta o in un file di testo. E solo allora capirete come scrivere il vostro codice.

 

Bisogno di funzione per chiudere 1 ordine aperto per primo tra tutti gli ordini disponibili. chi può condividere.

 
GlaVredFX #:

Quindi, se avete notato, l'algoritmo è scritto nel codice.

1) Appare una nuova barra

2) Se la MA è superiore al prezzo di chiusura della barra precedente, vai al punto 3, se la MA è inferiore al prezzo di chiusura, vai al punto 4.

3)Se abbiamo una posizione BUY, chiudiamo una posizione con il massimo profitto nella coppia di valute.

3.1)Se non ci sono ordini BUY aperti, apri una posizione SELL.

4) Se abbiamo una posizione BUY, chiudiamo una posizione con un profitto massimo nella coppia di valute.

4.1)Se non c'è un ordine SELL aperto, apriamo una posizione BUY.


Ora di nuovo ho una domanda, cosa c'è di sbagliato in questo codice dell'algoritmo sopra descritto:

Questo codice contiene una serie di comandi. Il terminale non sa di cosa avete bisogno, conosce solo ciò che è scritto nel codice!

...

if(isNewBar()) {  
  if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_BUY, Magic)) //---------------- Если есть позиция BUY то
      ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
    if(!ExistPositions( NULL, OP_BUY, Magic)) //----------- если позиции BUY отсутствуют то
      sellSignal = true;
  } 

 // и аналогично для п.4.

} 
return; 

...

void OnTimer() {
  if (sellSignal) {
    ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com); //------------ открываем позицию SELL
    sellSignal = false;
  }
  // и аналогично для buy
}
Scrivere globalmente le variabili buySignal esellSignal.
 
Mihail Matkovskij #:

Un insieme di comandi è scritto nel codice. Il terminale non sa di cosa avete bisogno, conosce solo ciò che è scritto nel codice!

Ho cancellato questo messaggio perché il problema è che gli ordini non dovrebbero essere chiusi per profitto ma per tempo.

Questo perché abbiamo il profitto non sempre e non sempre dove dovrebbe essere.

Pertanto, abbiamo bisogno della funzione"Chiudi una posizione aperta all'inizio di tutte le posizioni disponibili".

 
GlaVredFX #:

Ho cancellato questo messaggio, perché il problema è che gli ordini dovrebbero essere chiusi in base al tempo e non al profitto.

Perché il profitto non è sempre lì e non sempre dove dovrebbe essere.

Pertanto, abbiamo bisogno della funzione"Chiudi una posizione aperta all'inizio di tutte le posizioni disponibili".

Ho aggiunto un esempio di apertura della posizione nel timer nel post precedente. In modo da garantire l'apertura della posizione. Potete sostituirvi la vostra funzione.

 
Mihail Matkovskij #:

Aggiunto un esempio di apertura della posizione del timer nel post precedente. In modo che sia garantita l'apertura della posizione. Potete sostituirvi la vostra funzione.

Ma non così. È necessario monitorare il risultato di

ClosePosWithMaxProfitInCurrency

o una vostra nuova funzione in OnTradeTransaction. E se non ci sono posizioni, entrerà. Oppure scrivere il segnale in buySignal osellSignal e processarlo in OnTimer come ho mostrato nell'esempio.