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

 
Artyom Trishkin #:

La prima chiamata a CopyRates() ha avviato lo swapping dei dati storici (non eseguite per una settimana e otterrete di nuovo lo stesso, beh, forse non una settimana, ma un po' di tempo).
Devi solo controllare quanti dati ci sono sul server e confrontare la quantità disponibile per l'Expert Advisor. Se è inferiore a quello richiesto - lascia l'EA fino alla prossima spunta. Alla prossima spunta, controlla di nuovo. Se la quantità di storia richiesta non viene ottenuta in un certo numero di tentativi - allora questo errore dovrebbe essere processato come richiesto.

Grazie per le informazioni!

Se hai tempo, per favore consiglia come correggerlo:

Due obiettivi opposti sono impostati sulla storia N candele fa: Close[N]+50*Point e Close[N]-50*Point.
Poi c'è una condizione che il prezzo dovrebbe raggiungere uno dei target (se (High[i]> Close[N]+50*Point) o (se (Low[i]<Close[N]-50*Point)
Quando la condizione è soddisfatta la distanza da Close[N] a High[i] è scritta nell'array x[high]=High[i].
Poi viene lanciato a caso in qualsiasi grafico in qualsiasi momento.

E quando si controlla tramite Print(x[high]), 1-2 valori su dieci mostrano meno di 50! Uno ne ha 12, l'altro 49. Anche se è rigorosamente indicato+50*Point. 8-9 sono corretti (più di 50) e 1-2 sono anormali. Non è attraverso il tester, ma con un grafico reale piazzo un Expert Advisor (senza funzioni di trading), ma con i suddetti lavora con la storia e mostra risultati errati.

Più grande è il valore, meno si verificano questi errori. Ho pensato che potrebbe essere la diffusione che interferisce, ma... MT4 non sembra avere spread sulla storia

 
Artis98 #:

Ciao Cari utenti del forum e programmatori esperti! Ho bisogno di aiuto per completare l'EA)). Si prega di consigliare come aggiungere 2 cose al consulente del codice:

1. Ecco la situazione: apro un ordine (1°) con TP e SL e un certo lotto (probabilmente 0,01). Se questo ordine si chiude al take profit - bene, non cambia nulla. Ma se questo (1°) ordine viene chiuso a SL, l'ordine immediatamente successivo (2°) viene aperto con un lotto 2 volte maggiore (0,01*2=0,02). Se questo 2° ordine viene chiuso al Take Profit, allora l'ordine successivo (3° ordine) viene aperto con un lotto regolare, cioè, un lotto 2 volte più grande è necessario solo per l'ordine successivo (2° ordine) dopo che il precedente (1°) è stato chiuso allo SL. Se il 3° ordine sarà chiuso in SL per la seconda volta di seguito, il lotto rimarrà aumentato di 2x fino a quando non ci sarà una chiusura TP. Spero di aver descritto in dettaglio la logica di ciò che deve essere aggiunto;


2. e la seconda cosa che dobbiamo aggiungere è il movimento SL. ora lo spiego con un esempio: supponiamo di avere un ordine con parametri di base T.p. + 300, S.l. - 500. Il prezzo si muove nella direzione richiesta e passa +100 pip dal prezzo di apertura dell'ordine. Una volta che il prezzo raggiunge +100 dal prezzo di apertura dell'ordine, lo SL dovrebbe muoversi dalla base -500 a +90. Cioè quando il prezzo raggiunge +100 pip dal prezzo di apertura dell'ordine, trasferiamo l'ordine a Breakeven impostando S,L a +90 pip. Dopo di che, se il prezzo si muove ulteriormente nella direzione desiderata e passa di altri + 50 pip - S.L. è spostato di 50 pip => ora dovrebbe essere a + 140 pip dal prezzo di apertura dell'ordine. Cioè l'S.L. si muove prima dalla sua posizione base a + 90 pip dal prezzo di apertura dell'ordine e poi si muove se passa per + 50 pip ( - 500 => + 90 => + 140 => + 190 ecc.). E così via fino a quando il prezzo non raggiunge il T.P. o quando la tendenza si inverte e colpisce la S.L.


Spero di aver descritto tutto in dettaglio, e spero davvero nel vostro aiuto, perché aggiungendo questi elementi mancanti, l'Expert Advisor sarà pronto)) Se avete domande, chiedete pure))) Sto incollando una parte del codice dell'Expert Advisor qui sotto:

Sul primo punto: prima di aprire una posizione, guarda come è stata chiusa quella precedente. Se si prende lo SL, allora il lotto dovrebbe essere doppio. Il lotto non dovrebbe essere aumentato della metà del lotto della posizione precedente, ma impostato nelle impostazioni o da qualche parte nel codice. Poi, prima di aprire, controllerai la condizione: se la posizione precedente è stata chiusa dallo SL, allora apri una posizione con il doppio lotto.

Per quanto riguarda il secondo: Ho postato un esempio di trailing stop in questo thread molto tempo fa. Cercatelo. Meglio nel mio profilo nei messaggi - lo troverete lì più velocemente che sfogliare 100+ pagine qui. Poi, sulla base dell'esempio trovato, si cercherà di creare la propria rete a strascico.

 
Artyom Trishkin #:

La prima chiamata a CopyRates() ha avviato lo swapping dei dati storici (non eseguite per una settimana e otterrete di nuovo lo stesso, beh, forse non una settimana, ma un po' di tempo).
Devi solo controllare quanti dati ci sono sul server e confrontare la quantità disponibile per l'Expert Advisor. Se è inferiore a quanto richiesto - lascia l'EA fino alla prossima spunta. Alla prossima spunta, controlla di nuovo. Se non si ottiene la quantità richiesta di tentativi, l'errore viene gestito come richiesto.

Possiamo ottenere il numero di barre caricate programmaticamente?

Io stesso guardo solo la data nell'archivio delle quotazioni per ogni TF e cerco di non andare oltre nei calcoli.

Questo compito potrebbe essere inutile in questa forma. Sarebbe più corretto ottenere una bandiera quando viene caricata la giusta quantità di barre, ma potrebbe non essere mai caricata per un simbolo o un altro.

 
Artyom Trishkin #:

Sul primo punto: prima di aprire una posizione, guardate come ha chiuso la posizione precedente. Se per SL, allora il lotto dovrebbe essere doppio. Il lotto non dovrebbe essere raddoppiato dal lotto della posizione precedente, ma da quello impostato nelle impostazioni o da qualche parte nel codice. Poi, prima di aprire, controllerai la condizione: se la posizione precedente è stata chiusa dallo SL, allora apri una posizione con il doppio lotto.

Credo di averlo già cambiato nel codice:

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
 double Lots()  // Расчет объема лота
  {
   int n=0;
   double Lotscount;
   double OL=Lot;
   
   
   if(Lot>0) return(LOT());          // "если во внешней переменной "Lot" стоит число больше 0 => будет фиксированный лот без авт. расчёта" 
   Lotscount=AccountFreeMargin()/10000;  // раcчёт лота - свободная маржа/9000 => 100/9000=0.01 лота 
   Lotscount=MathMin(15,MathMax(0.01,Lotscount));
    if(Lotscount<0.1) Lotscount=NormalizeDouble(Lotscount,2);
    else 
     {
       if(Lotscount<1) Lotscount=NormalizeDouble(Lotscount,1);
      else       Lotscount=NormalizeDouble(Lotscount,0);
     }
     
     for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
          if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
             {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lotscount);
            }
            else
            {
               if (n==0) {Comment("2");return(Lotscount);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
      return(Lotscount);
 }
//------------------------------------------------------------------
double LOT()
{
   int n=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lot);}
            }
            else
            {
               if (n==0) {Comment("2");return(Lot);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}

O è sbagliato? Inoltre, non so come cambiare due cose relative al lotto. Il primo è che un ordine con un lotto raddoppiato dovrebbe essere aperto solo una volta e solo su un ordine (l'ordine successivo a quello con S.L.). E il secondo, che non so come aggiungere, è fare in modo che nel caso di due S.L. in fila (due ordini chiusi in fila da S.L.) il terzo ordine non si apra con un lotto aumentato di altri 2 (2*2*2), ma solo una volta (2*2) come il secondo ordine.

 
Artis98 #:

Credo di averlo già cambiato nel codice:

O è la cosa sbagliata? Inoltre, non so come cambiare due cose del lotto. Il primo è quello di fare un ordine con doppio lotto aperto solo una volta e solo su un ordine (l'ordine successivo a quello con S.L.). E il secondo, che non so come aggiungere, è fare in modo che nel caso di due S.L. di fila (due ordini chiusi con S.L. di fila) il terzo ordine non si apra con un lotto aumentato di altri 2 (2*2*2), ma solo una volta (2*2) come il secondo ordine.

Avete DUE tipi di ordine - ordine numero 1 - un ordine con un lotto regolare, e ordine numero 2 - un ordine con un lotto più grande. I lotti sono incrementati solo dal tipo SL #1.

Salvare il tipo di ordine in un "commento" per esempio. O, meglio ancora, memorizzatelo voi stessi. È una buona abitudine memorizzare tutto ciò che riguarda i vostri ordini.

 
Maxim Kuznetsov #:

avete DUE tipi di ordine - ordine numero 1 - un ordine con un lotto regolare, e ordine numero 2 - un ordine con un lotto maggiorato. I lotti sono incrementati solo dal tipo SL #1.

Salvare il tipo di ordine in un "commento" per esempio. O, meglio ancora, memorizzatelo voi stessi. È una buona abitudine ricordare tutto ciò che riguarda i vostri ordini.

Non abbiamo bisogno di memorizzare nulla (soprattutto perché memorizzare richiede un'ulteriore ricostruzione). È sufficiente che sappia come è stata chiusa la posizione precedente. Questo è tutto. Non c'è bisogno di conoscere né due, né tre, né cento di fila o cento non chiusi da stoploss, ma solo l'ultima posizione. Se è stato chiuso da Stop Loss, allora il prossimo dovrebbe essere chiuso con doppio lotto. Ma il lotto non dovrebbe essere raddoppiato dal lotto della posizione precedente, ma dal set nel programma lotto normale. Poi se la posizione è chiusa non allo Stop Loss, allora la posizione successiva dovrebbe essere aperta con lo stesso lotto. Se la posizione viene chiusa dallo Stop Loss, allora raddoppia il lotto per la posizione successiva. Questo è tutto. Non avete bisogno di sapere altro.

 
Artyom Trishkin #:

Non ha bisogno di memorizzare nulla (soprattutto perché la memorizzazione richiede un recupero successivo). Ha solo bisogno di sapere come si è chiusa la posizione passata. Questo è tutto. Non ha bisogno di sapere due, o tre, o cento di fila o non sequenzialmente chiusi da stoploss, ma solo la posizione passata. Se è stato chiuso da Stop Loss, allora il prossimo dovrebbe essere chiuso con doppio lotto. Ma il lotto non dovrebbe essere raddoppiato dal lotto della posizione precedente, ma dal set nel programma lotto normale. Poi se la posizione è chiusa non allo Stop Loss, allora la posizione successiva dovrebbe essere aperta con lo stesso lotto. Se la posizione viene chiusa dallo Stop Loss, allora raddoppia il lotto per la posizione successiva. Questo è tutto. Non avete bisogno di sapere altro.

Non dire alla gente cosa fare.

Devi ricordare i tuoi dati e lavorare con essi

 
Artyom Trishkin #:

Tutto quello che deve sapere è come si è chiusa la posizione passata. Questo è tutto. Non c'è bisogno di sapere due, tre, cento di fila o non di fila chiusi allo stoploss, solo la posizione passata. Se è stata chiusa allo stoploss, allora la prossima dovrebbe essere con doppio lotto. Se la posizione è stata chiusa allo stoploss, allora aprite la prossima con doppio lotto.

Questo è ciò di cui ho bisogno, questa è in realtà la domanda - come scriverlo nel codice?

 

Ciao!
Qualcuno può dirmi come forzare il compilatore a compilare per MT4 e non per MT5?

Se il file ha l'estensione *.mq4, sono a posto, se ha l'estensione *.mqh, allora il compilatore lo accetta come *.mq5 e si verificano errori.

 
Sergey Zhukov #:

Ciao!
Qualcuno può dirmi come forzare il compilatore a compilare per MT4 e non per MT5?

Se il file ha l'estensione *.mq4, sono a posto, se ha l'estensione *.mqh, allora il compilatore lo accetta come *.mq5 e si verificano errori.

Dacci il file. È qualcosa di nuovo, non l'ho mai sentito prima.
Motivazione: