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

 
hamsteruser:

*non si distrugge neanche il returntick. Sono solo confuso dallo scarico del terminale di trading. È la scrittura della memoria non cancellata.


Dammi tutto il codice in cui usi il puntatore restituito dalla funzione e il momento in cui distruggi il puntatore. È così difficile aiutarvi.

 
Anatolij Povoroznyj:

Salve. Per favore aiutatemi a correggere il codice. Ho bisogno che l'EA non apra una serie di ordini, ma solo un ordine al primo evento.

Ora funziona in questo modo: quando il CCI incrocia la linea 200 verso il basso, questo apre una BAY, poi se il CCI incrocia di nuovo 200 verso il basso, questo apre un'altra BAY, ecc, ecc, finché il CCI incrocia la linea -200 verso l'alto, allora tutte le BAY vengono chiuse e viene aperta una Sell.

Quello che voglio chiedere: quando SSI attraversa la linea 200 dall'alto verso il basso - si apre la prima e unica BAI, le altre BAI non dovrebbero aprirsi fino a quando SSI attraversa la linea -200 dal basso verso l'alto, in questo caso la BAI viene chiusa e si apre una vendita. (Specchio della linea di vendita e della linea -200).


Aggiungere una funzione per controllare se ci sono ordini aperti del tipo corrispondente. Cioè, se ci sono ordini, la funzione restituirà true e l'ordine successivo non si aprirà.

 

Probabilmente non è questo il punto...

Un desiderio su MT4

Uso molti avvisi, e sono tutti impostati per certi parametri.

Imposto la durata dei miei avvisi per il tempo necessario e li faccio risorgere ad un nuovo prezzo obiettivo.

Poiché il registro degli avvisi del mio terminale non è ordinato per simbolo o evento, cercare l'avviso giusto ogni volta è una seccatura.

Sarebbe bello avere opzioni di ordinamento come nella scheda "trade".

 
hamsteruser:

C'è una funzione con un puntatore:


Lo chiamo ancora in un'altra funzione:


Come faccio a cancellare la memoria?

Su delete(TickReturn); ottengo un errore operando escluso.

TickReturn* rt = returntick( period, 1 );

int timeis = rt.curtime;

delete rt;
 
MMM1972:

Probabilmente fuori tema...

Un desiderio su MT4

Uso molti avvisi, e sono tutti impostati per certi parametri.

Imposto la durata dei miei avvisi per il tempo necessario e li faccio risorgere ad un nuovo prezzo obiettivo.

Poiché il registro degli avvisi del mio terminale non è ordinato per simbolo o evento, cercare l'avviso giusto ogni volta è una seccatura.

Sarebbe bello avere opzioni di ordinamento come nella scheda "trade".

Il terminale MT4 non viene più sviluppato. Solo i bug trovati sono stati corretti.

 
Алексей Барбашин:

Date tutto il codice in cui usate il puntatore restituito dalla funzione e il punto in cui distruggete il puntatore. È così difficile aiutarvi.

La memoria è davvero fluida.

  class TickReturn

   {

   public:

      int curtime;

      double open;

      double close;

      double high;

      double low;

      double priceask;

      double pricebid;

      

   };



  TickReturn *returntick(int period, int timeposition)

   {

      TickReturn *returntick = new TickReturn();

      MqlRates rates[];

      MqlTick last_tick;

      

      if(SymbolInfoTick(symbol,last_tick)){}

      else Print("SymbolInfoTick() failed, error = ",GetLastError());

      

      //int timeposition=0;

      ArraySetAsSeries(rates,true);

      ArrayResize(rates,1);

      int copied=CopyRates(symbol,period,timeposition,1,rates);

      

      returntick.curtime = rates[0].time;

      returntick.open = rates[0].open;

      returntick.close = rates[0].close;

      returntick.high = rates[0].high;

      returntick.low = rates[0].low;

      returntick.priceask = last_tick.ask;

      returntick.pricebid = last_tick.bid;

      

      return(returntick);

}

void OnTick() { int period = 15; int timeis = returntick(period, 1).curtime; Print("timeis= ", TimeToStr(timeis,TIME_SECONDS)); Вот здесь пытаюсь уничтожить указатель. }

 
hamsteruser:

La memoria è davvero fluida.


void OnTick() { int period = 15; int timeis = returntick(period, 1).curtime; Print("timeis= ", TimeToStr(timeis,TIME_SECONDS)); Qui è dove cerco di distruggere il puntatore }


Non è del tutto chiaro cosa esattamente possa essere distrutto qui. Non c'è da stupirsi che la memoria si disperda. Cos'è un puntatore? Un puntatore è un riferimento all'indirizzo di memoria dove è memorizzata la variabile dinamica creata. Essenzialmente, si chiama la procedura di ottenere un puntatore alla variabile di classe, in questa procedura l'oggetto di classe viene creato, messo in memoria, poi il puntatore viene restituito alla funzione di ottenere i tick e .... viene distrutto quando si esce dalla funzione. Notate che il puntatore viene distrutto, ma la memoria non viene cancellata! E ad ogni nuovo tick si consuma sempre più memoria! Per evitare questo punto nel vostro codice, dovreste prima di tutto rimuovere l'abbreviazione e mettere il puntatore in un'altra variabile:TickReturn* temptick =returntick(period, 1);// ottenere il puntatore e metterlo in una variabile int timeis = temptick.curtime; // Ottieni il valore richiesto dall'oggetto tramite il puntatore ...... delete temptick; // Distruggi il puntatore e libera la memoria

E prima di distruggere il puntatore, è meglio controllare se è corretto per evitare l'errore di cancellazione.

Nel complesso, non mi preoccuperei dei puntatori e della classe in particolare, poiché il compito è molto più facile in realtà e non c'è bisogno di usare la classe. Create una struttura con i campi necessari, dichiarate una variabile globale con il tipo di questa struttura, fate una funzione per aggiornare le informazioni in questa struttura ad ogni tick e raccogliete da essa ciò di cui avete bisogno, perché la variabile sarà globale, non avrete bisogno di farla passare attraverso le funzioni e non avrete bisogno di puntatori.

 

1. È possibile utilizzare mql4 per disabilitare altri EA?

2. Per controllare se c'è un Expert Advisor in esecuzione su un dato ChartId?

 
Sergey Likho:

1. È possibile utilizzare mql4 per disabilitare altri EA?

2. Controllare se c'è un Expert Advisor in esecuzione su un dato ChartId?


È possibile disabilitare il trading all'interno del codice EA, e fare uno switch in un file esterno, poi un altro EA sarà in grado di informare qualsiasi EA che il trading non è più necessario.

 
Aleksey Vyazmikin:

Puoi proibire il trading all'interno del codice EA, e fare il cambio nel file esterno, poi un altro EA sarà in grado di dire a qualsiasi EA che il trading non è più necessario.


L'idea è esattamente che l'EA A disabiliterà l'EA B per condizione.