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

 
Alexey Viktorov:

Bene, cercherò di fare la mia parte per educarvi.

Mi rivolgerò a te come "tu" quando lo invierò. Ho un'istantanea del puntatore...

Per favore ditemi, non vi sembra sbagliato chiamare la stessa funzione 5 volte sullo stesso tick? Ma questo è metà del problema. Questa funzione passa attraverso tutti gli ordini. E tutto questo 5 volte in un tick... E ho contato 4 funzioni di questo tipo. Non possiamo pensare abbastanza a come inserire altre 3 funzioni con il ciclo per cercare tutti gli ordini in un ciclo.

Qui ce ne sono due.

Questo è

Non è nemmeno vicino al traino.

Per capire questo, dobbiamo capire chiaramente la definizione di trailing. Non ricordo alla lettera, ma è approssimativamente "Spostamento del livello di StopLoss seguendo il prezzo per diminuire le possibili perdite o aumentare il profitto "garantito".

E questo

come appare quando si esegue l'Expert Advisor? Probabilmente quattro linee... sono necessari?

E l'ultima cosa per oggi: non è necessario avere una biblioteca in testa. È sufficiente avere la documentazione e sapere come usarla. Non riesco ancora a ricordare tutti i parametri di iMA (_Symbol, _Period, ,,,,,) e non posso andare oltre senza studiare la documentazione. E così quasi tutte le funzioni. Per fortuna hanno fatto dei tooltip non molto tempo fa che non aiutano molto. Non sto cercando di memorizzare come scrivere questi o quegli enum. Quindi devi guardare la documentazione ogni volta.


Alexey, grazie per le informazioni. Sì, ammetto che il codice non è ottimale, semplicemente non sono un programmatore e non conosco le sottigliezze che hai descritto. Semplicemente non capisco queste sfumature, non capisco come ottimizzare il tutto, forse lo farò più tardi, se andrò avanti. Ora so esattamente che se comincio a ottimizzare, romperò solo tutto. Ho visto i codici di altri EA sul mio sito web - c'è così tanta roba lì! - Sicuramente se sei un codificatore professionista, forse il suo codice è meno impegnativo per il terminale del mio, ma per ora non posso prendere in considerazione i tuoi commenti perché non capisco davvero queste sfumature di ottimizzazione della programmazione. E se si rimuovono alcune chiamate a funzioni nel codice - di sicuro, l'Expert Advisor inizierebbe a fare il caos lì e aprirebbe gli ordini quando non è necessario. Ho codificato lì, testato - niente è andato storto o è andato male, ho corretto e come risultato il codice finale si è rivelato così, non ho avuto tempo per l'ottimizzazione, come si capisce con il mio bagaglio di conoscenze.

Per quanto riguarda il trailing - la cosa più importante è che segua il profitto, in questa fase di sviluppo ne sono soddisfatto)))) Di sicuro il vecchio e il nuovo codice di trailing scie ugualmente e la quantità di accordi è la stessa - naturalmente ho concluso che il trailing ha funzionato, ma come farlo correttamente in questo ambiente dove il trailing funziona nessuno mi ha detto, e non ho pensieri su di esso - tutto il mio codice è Lego costruttore - cioè, l'ho assemblato da materiali video tutorial. Naturalmente, c'è un po' di mio - è in realtà l'algoritmo dell'Expert Advisor stesso, mentre l'intero codice e le funzioni non sono di mia invenzione, ma provengono da video tutorial di TradeLikeaPro e ho "modificato" il codice esattamente per analogia e per le mie esigenze - per il mio algoritmo. Alla fine, ho ottenuto quello che avevo.

 
geratdc:   Tutto il mio codice è un costruttore Lego - cioè l'ho assemblato da materiali video tutorial di TradeLikeaPro, inoltre, ho "modificato" il codice esattamente per analogia e per le mie esigenze - per il mio algoritmo. Alla fine, ho quello che ho.

Ha guardato il grafico del deposito - si è interessato e ha scaricato la prima versione. Copiato in MetaEdit. Ho due avvertimenti. La prima, l'ho eliminata sostituendo int timeprev=0; con datetime timeprev=0; Perché questa variabile contiene la data. Il secondo indica su

tp=TakeProfit;             // В переменную tp заносится значение переменной TakeProfit
if(tp>TakeProfit)          // А тут они сравниваются. А с чего им быть разными, если только что уравняли?
{
   TakeProfit+=tp;
}

Ho rimosso le ultime tre corde. Si traduce in modo pulito. Sono andato oltre...

//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)  // После этой строки нужны фигурные скобки.
      TakeProfit     *= 10;        // иначе эта строка будет выполняться по условию

      // а следующие строки будут выполняться всегда
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }

è cambiato (per chiarezza, ho allegato lo script - eseguilo, ti spiegherà) quindi

//| Инициализация на пятизнак или иену                               |
//+------------------------------------------------------------------+
void OnInit()
{
   if(Digits == 3 || Digits == 5)
   {
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;
   }
}
//+-------------------------------------------------------+
//| Демонстрация назначения фигурных скобок      PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  // Без фигурных скобок
  if(2==5)
    Alert("Это сообщение будет пропущено");
    Alert("Без фигурных скобок это сообщается, хотя по логике зря");

  Alert("-------------------------------");
  Alert("А вот со скобками - полный молчок");
  if(2==5)
  {
    Alert("Это сообщение будет пропущено");
    Alert("Со скобками это тоже пропускается");
  }
}
Ecco il risultato


Questa funzione viene rimossa - non ci sono chiamate di essa e il suo corpo è vuoto.

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Ho provato ad eseguirlo e ho visto:

Era

L'ho cambiato solo quando ho eseguito l'EA su due grafici con lo stesso strumento e Slippage - perché cambiare questo parametro? Poi ci ho pensato e ho aumentato i parametri di 10 volte. E ho rimosso la funzione OnInit. Dopo tutto, uso solo il codice a cinque cifre. Perché lo spread a quattro cifre è di 3 punti, quindi è 30. E lo spread a cinque cifre è solo 12.

è diventato più chiaro.

extern double  Lots           = 0.01;  // Размер лота
extern int     TakeProfit     = 5 0;    // Ограничение прибыли Take Profit
extern int     Step           = 2 0;    // Шаг - чего, выясним позже

extern int     TrailingStep   = 3 0;    // Шаг трала
extern int     TrailingStop   = 10;    // Ограничение убытка

extern int     MaPeriod       = 200;   // Период МА (надо поменьше?)
extern int     MaShift        = 1;     // Сдвиг МА (взял бы 0)

       int     Magic          = 123;   // Магик - нужен ли он?
       int     Slippage       = 50;    // Проскальзывание

datetime timeprev=0;

double price,op,cn,tp;  // Убрал extern

Ho tagliato la parte superiore dell'intestazione. Questo è quello che ho lasciato:

//+------------------------------------------------------------------+
//|                                                      -Э-1111.mq4 |
//+------------------------------------------------------------------+
#property strict

questa linea qui.

   op=CalculateProfit();
   if (CalculateProfit()>=tp) CloseAll();

l'ha spostato nella rivendicazione. È così.

   op=CalculateProfit();
   if (op>=tp)
   {
         CloseAll();    
   }

Poi ho buttato via la descrizione della variabile op all'inizio e l'ho sostituita con questa

   if (CalculateProfit()>=tp) CloseAll();

All'inizio della funzione OnTick ci sono un paio di righe. Questo per assicurare che l'elaborazione venga eseguita solo una volta per barra invece che ogni tick

   if(timeprev == Time[0]) return;   // сравнить  время начала последнего бара с временем обработанного бара. Если равны, то выход
   timeprev = Time[0];               // Запомнить время начала следующего бара      На часовом и далее это будет слабо

Poi viene calcolato il MA. Questo deve essere studiato nei dettagli. Per questo scopo ho fatto uno script e ho visualizzato il risultato

   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
//+-------------------------------------------------------+
//| Проверка функции iMA                         PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  int MaPeriod=200;
  int MaShift=1;

  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));

  Alert("-------------------------");
  MaShift=0;
  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));
} 

Possiamo vedere che il quarto parametro MaShift e l'ultimo sono sommati, cioè il numero della barra = la loro somma. Prende il MA dalla battuta 2, terza dalla fine.

Lo guarderò ulteriormente. Sei interessato?

 
STARIJ:
...

Continuerò a cercare. Sei interessato?

Continui a parlarne?

Basta già - la gente segue l'argomento per chi è interessato ed è sprecato.

Se vuoi che una persona ti risponda, chiamala nel thread. Come questo: @STARIJ. Ma non c'è bisogno di continuare a tirare fuori l'argomento modificando il tuo ultimo post.


 
Victor Nikolaev:

Significa che qualcuno è sfortunato. Ancora una volta. Questo è uno script, non un Expert Advisor o un indicatore

L'ho capito - apparentemente il terminale non aveva abbastanza memoria - ho chiuso un paio di grafici e ha funzionato.

Grazie - in effetti, i calcoli hanno luogo.

E se le variabili non sono di tipo int, ma bool, cosa fare?

 

Ciao, potresti dirmi per favore:

1 - la registrazione è solo come persona fisica o può essere anche come persona giuridica e ci sono restrizioni e condizioni

2 - Esiste una sincronizzazione con le reti sociali, per avere un unico account (nome utente e password)

3 - Ho anche visto una funzione "metti un widget sulla tua pagina, condividi il segnale" - stiamo parlando del sito o di qualcos'altro


 
Ciao, ho iniziato da poco a imparare Mql4. Se vi ho fatto una domanda nel posto sbagliato, per favore indirizzatemi all'argomento giusto. La mia domanda è la seguente: come lavorare con indicatori che costruiscono varie zone, rettangoli, ecc. Posso programmare un incrocio di linee o prezzo superiore o inferiore, ad esempio MA.) Ho allegato un indicatore in basso, il buffer è quattro e ci sono otto tipi di zone. Quindi in realtà non riesco a capire come codificare una rottura o un breakout di queste zone.
 
STARIJ:

Ha guardato il grafico del deposito - si è interessato e ha scaricato la prima versione. Copiato in MetaEdit. Ho due avvertimenti. La prima, l'ho eliminata sostituendo int timeprev=0; con datetime timeprev=0; Perché questa variabile contiene la data. Il secondo punta a

*

Risposta

Forse, ha a che fare con il fatto che il TP era di tipo int nella lezione video, ma l'ho convertito in doppio e quindi int timeprev rimane come è. Ok, lo sistemerò, ma come influisce sul funzionamento dell'EA? In effetti, queste barre e il tempo erano rilevanti per la funzione TrailingStop del video tutorial, ma poiché ho sostituito questa funzione con la mia, rimane semplicemente come una reliquia del codice sorgente e il mio trailing stop non è effettivamente basato sul tempo della barra.


Ho rimosso le ultime tre righe. Si traduce in modo pulito. Sono andato oltre...

L'ho cambiato (per chiarezza ho allegato uno script - eseguilo, ti spiegherà) in questo modo

Ecco il risultato

*Risposta.

Dov'è finito questo pezzo di codice?

   return(INIT_SUCCEEDED);
  }

Forse dovrebbe essere così?


void OnInit()

{

if(Digits == 3 || Digits == 5)

{

Passo *= 10;

TrailingStep *= 10;

TrailingStop *= 10;

Scivolamento *= 10;

}

return(INIT_SUCCEED);

}

Ma perché hai fatto TakeProfit di tipo int? Significa che sarà il profitto in punti, mentre la funzione CalculateProfit() è di tipo doppio, quindi ho fatto TakeProfit dello stesso tipo per renderli coerenti.


Ho cancellato questa funzione - non ci sono chiamate di essa e il suo corpo è vuoto

*

Risposta

Nel codice, c'è la funzione void CloseAll(). Ho pensato che fosse in qualche modo collegato a questa funzione

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

*

Risposta

Ok, rimuoviamolo.


Ho provato ad eseguirlo e ho visto:

Era

a costo di apportare modifiche - beh, ho solo aggiunto commenti e rimosso extern da Magic

*

Risposta

Sì, forse extern è ridondante perché non l'ho mai cambiato e nemmeno Slippage - è tutto dal codice sorgente del video tutorial

- lo cambiamo solo quando eseguiamo l'EA su due grafici con lo stesso strumento e Slippage - perché cambiare questo parametro? Poi ci ho pensato e ho aumentato i parametri di 10 volte. E ho rimosso la funzione OnInit. Dopo tutto, uso solo il codice a cinque cifre. Perché lo spread a quattro cifre è di 3 punti, quindi è 30. Su uno spread a cinque cifre, sono solo 12.

*

La risposta è .

Questa è l'impostazione predefinita affinché l'EA lavori su tutte le valute. Terrò Oninit ().

è diventato più chiaro.

Ho tagliato l'intestazione in alto. Ecco cosa ho lasciato:

*

Rispondi

Questa intestazione è fatta dall'editor predefinito. Lo lascio così com'era, nel caso in cui qualcosa non passi al broker o nel terminale perché mancano queste linee.

Ho spostato questa linea

si è spostato verso la rivendicazione. È andata così

Poi ho rimosso la descrizione della variabile op all'inizio e l'ho sostituita con

*

Risposta

È abbastanza logico.



All'inizio della funzione OnTick, ci sono un paio di linee. Questo per assicurare che l'elaborazione venga eseguita solo una volta per barra invece che ogni tick

Poi viene calcolato il MA. Questo deve essere studiato nei dettagli. Per questo scopo ho fatto uno script e ho emesso il risultato.


Potete vedere che il quarto parametro MaShift e l'ultimo parametro sono sommati, cioè il numero della barra = la loro somma. Prendiamo il MA dalla battuta 2, la terza dalla fine.

*

Risposta

A causa del fatto che ho cambiato trailing - data-ora la media mobile non è rilevante credo. Questa è una reliquia del codice sorgente. Io cercavo di tracciare l'ultimo di 3 (tre) ordini aperti. Il fatto è che se il mercato va in una direzione sbagliata per il valore di STep, l'EA apre un contrordine e poi se il mercato continua ad andare nella direzione opposta, viene aggiunto un terzo ordine del tipo della seconda posizione, O viceversa, se il prezzo torna in direzione allora il terzo ordine sarà aperto con il primo tipo di ordine (acquisto o vendita). Lì, il trailing viene eseguito su tre ordini utilizzando la funzione CalculateProfit(); tuttavia, se il primo ordine si apre con successo e il prezzo si muove come dovrebbe, in questa situazione, il trailing sulla barra sarebbe fatto utilizzando datetime come nel video tutorial - ripeto, anche su 1 ordine trailing utilizzando la funzione calculateprofit()

Cercherò di più. Sei interessato?

*

Risposta

Sì, ho qualche problema con la pesca a strascico. Sembra che segua le tracce, ma non voglio che qualcuno capisca cosa ci ho fatto. Trailing() funziona senza barre e datetime - funziona con Trailing().

Il periodo MA è di circa 200, ma il punto è che è un valore regolabile. E il parametro chiave Value sembra mancare - ho spiegato il suo significato nella descrizione del file README.



Grazie per essersi preso il disturbo di tutto questo. In effetti, l'Expert Advisor non è davvero così buono, meccanico direi. Ma fondamentalmente, se lo si imposta e occasionalmente si controlla il suo lavoro, può essere abbastanza buono. Il tempo lo dirà. Probabilmente, possono guadagnare qualcosa, ma andranno in fallimento senza nemmeno battere ciglio e non invieranno un SMS. Non mi sono nemmeno preoccupato, anche se la mia idea era di inviare un SMS se il drawdown è più del 30% del deposito è successo - questo significa che 3 ordini sono già stati aperti e il mercato ha iniziato il contro-movimento, in questa situazione, puzza di paraffina. Tutti gli altri casi sono risolti dall'Expert Advisor, se è regolato per la storia comportamentale del grafico dello strumento commerciale.


Ho fatto delle modifiche consigliate (ma non tutte) al codice in Notepad per ora. Si prega di controllare se ho corretto il codice?

Sono per l'ottimizzazione, solo che non ho considerato i momenti in cui avete rimosso oninit - ne ho bisogno per essere in grado di testare e lavorare su tutte le valute)))

 
Aleksandr Verkhozin:
Ciao, ho iniziato da poco a imparare Mql4. Se vi ho fatto una domanda nel posto sbagliato, per favore indirizzatemi all'argomento giusto. La mia domanda è la seguente: come lavorare con indicatori che costruiscono varie zone, rettangoli, ecc. Posso programmare un incrocio di linee o prezzo superiore o inferiore, ad esempio MA.) Ho allegato un indicatore in basso, il buffer è quattro e ci sono otto tipi di zone. Quindi non riesco a capire come codificare una rottura o un breakout di queste zone.

Se volete sapere come farlo, dovreste guardare gli esempi di programmazione, ma non sapete come farlo. Potreste chiedere: come si fa a passare un sacco di tempo con il programmatore di mql4, ma non si sa come fare). Forse progredirà.
 

geratdc:

...
Sì, ho alcune domande sulla pesca a strascico. Sembra che trabocchi, ma nessuno vuole sapere cosa ci ho fatto.

...

Se lo sai, proprio in questo thread ho postato un template per il trawl che usa il valore dell'indicatore inviatogli nei suoi calcoli. Cercate, non siate pigri.
 
geratdc:

Potrebbe essere necessario scaricare i video tutorial di programmazione mql4 da TradeLikeApro su RuTracker. Hanno una buona idea di come ottenere subito gli indicatori mql4, ma se non sai come farlo, potresti ottenere un messaggio di errore). Forse progredirà.


Ho guardato il video sul lavoro con l'indicatore esterno, ho scritto un po' di codice per vedere i valori del buffer nel tester:

void OnTick()

{

double Buf1=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",0,1);

double Buf2=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",1,1);

double Buf3=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",2,1);

double Buf4=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",3,1);

Comment("Buf1=",Buf1,"\n", "Buf2=",Buf2,"\n","Buf3=",Buf3,"\n","Buf4=",Buf4);

}

Le zone appaiono e scompaiono in modalità di visualizzazione. Ma il valore dei buffer è comunque sempre zero. Non c'è modo di formalizzare queste zone nel codice?

Forse c'è una funzione, diversa da iCustom, che sarebbe adatta a tali indicatori? Forse qualcuno ha scritto gufi con tali indicatori?

Motivazione: