[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 656

 
artmedia70:
Cosa può causare lo stack overflow? Quando aprite una posizione con una grande presa (la presa è calcolata dalla volatilità e moltiplicata per 100, la dimensione è 41*100), allora uno stack overflow viene scritto nel log e... ...prendilo e basta. Non si aprono altre posizioni finché questa non si chiude, e questa, ovviamente, non si chiuderà a causa dell'enorme TP... E l'EA non funziona affatto correttamente, perché dovrebbe chiudere tutte le posizioni quando viene raggiunto il profitto totale predefinito delle posizioni aperte... Ma non succede, anche se questa posizione è stata in enorme profitto per molto tempo, circa duemila punti... Come posso combatterlo? Beh, non si può essere sicuri contro la situazione in cui tutte le posizioni aperte traboccheranno nello stack, e tutto andrà sottosopra...


lo stack non può traboccare solo con un numero che è fuori dall'intervallo del tipo - ci sarà un altro errore

i dati passati in una funzione o una chiamata ricorsiva a una funzione senza uscire possono far traboccare lo stack.

start() è anche una funzione - forse hai molte variabili lì.

lo stack è una regione di memoria dove sono memorizzati i valori intermedi (variabili locali) di una funzione; potreste rompere lo stack se state usando array dinamici e non avete controllato correttamente lo scopo dell'array, cioè, state scrivendo dati non in un array, ma in una regione di memoria che viene subito dopo l'array

provare a spostare alcuni degli array in variabili globali - metterli in cima alla scheda

ZS: almeno è lo stesso in tutti i linguaggi di programmazione - penso che sia lo stesso in mql

 
IgorM:


lo stack non può traboccare solo con un numero che è fuori dall'intervallo del tipo - ci sarà un altro errore

i dati passati in una funzione o una chiamata ricorsiva a una funzione senza uscire possono far traboccare lo stack.

start() è anche una funzione - forse hai molte variabili lì.

lo stack è una regione di memoria dove sono memorizzati i valori intermedi (variabili locali) di una funzione; potreste rompere lo stack se state usando array dinamici e non avete controllato correttamente lo scopo dell'array, cioè, state scrivendo dati non in un array, ma in una regione di memoria che viene subito dopo l'array

provare a spostare alcuni degli array in variabili globali - metterli in cima alla scheda

ZS: almeno è lo stesso in tutti i linguaggi di programmazione - penso che sia lo stesso in mql

Igor, sai che finora ho evitato di usare gli array... Ho solo un paio di array nel mio codice - un array di ordini prima del tick e un array di ordini dopo il tick. Li ho definiti nell'area delle variabili globali. La cosa divertente è che ho spostato il codice per aprire queste posizioni altrove nell'EA e l'errore è scomparso. Sembra che ci fosse una chiamata ricorsiva per aprire gli ordini, anche se non me ne sono preoccupato. Ho semplicemente deciso che non sarebbe stato opportuno mettere l'apertura immediatamente dopo la chiusura di tutte le posizioni nel codice per controllare se il profitto totale era stato raggiunto e tutte le posizioni erano chiuse... Ho fatto un casino... :)
 
artmedia70:
Igor, sai che finora ho evitato di usare gli array... Ho solo un paio di array nel mio codice - un array di ordini prima del tick e un array di ordini dopo il tick. Li ho definiti nell'area delle variabili globali. La cosa divertente è che ho spostato il codice per aprire queste posizioni altrove nell'EA e l'errore è scomparso. Sembra che ci fosse una chiamata ricorsiva per aprire gli ordini, anche se non me ne sono preoccupato. Ho semplicemente deciso che non sarebbe stato opportuno mettere l'apertura immediatamente dopo la chiusura di tutte le posizioni nel codice per controllare se il profitto totale era stato raggiunto e tutte le posizioni erano chiuse... Ho fatto un casino... :)

Ho fatto un modello per la creazione di un EA - quando viene piazzato un ordine, il flag di tale ordine è immediatamente impostato e dopo, prima di aprire un nuovo ordine di questo tipo, controllo sempre il flag - se l'ordine esiste, ma sto scrivendo EA con un solo ordine
 
IgorM:

Ho fatto da tempo un modello per creare un EA - quando piazzo un ordine, imposto immediatamente un segno (flag) che tale ordine esiste, e poi prima di aprire un nuovo ordine di questo tipo controllo sempre il flag - se tale ordine esiste, ma scrivo EA con un solo ordine
Beh, io, e penso che tutti gli altri, hanno i loro sviluppi, modelli e altre chicche. Non è questo il punto. Sto ancora lottando con i drawdown e provando diversi metodi, funzioni e simili. Se lavoro strettamente con il trend, non riesco a capire come prendere l'esaurimento del trend se su uno dei TF più vecchi il trend si è già trasformato in un flat, mentre su quello più giovane è ancora lì, ma sta per finire. Quando si apre una posizione in un ordine basso la probabilità del suo drawdown è alta che non venga chiusa in tempo. Ora sto cercando di lavorare con i grafici a 4 ore partendo dal grafico a 4 ore, dove si definisce la direzione e si lavora solo in questa direzione su tutti i minimi. Il momento di transizione dalla tendenza al piatto l'ho più o meno identificato, guarderemo i risultati.
 
Craft:


Sì, ho ottenuto "0", ma cosa dovrei fare? Non posso farlo in entrambi i modi (ho anche provato periodi uguali), ho provato sia Print("NormalizeDouble(c1b_1..."), ma ho ottenuto degli zeri (solo c1b[i] mostra il valore, tutti gli altri compresi c1s[i] sono zeri), può aiutarmi a portare uno di loro a una condizione di lavoro o condividere un suggerimento, se si nota qualche difetto?

Nuovo:

Vecchio:

Intero:


Yuri, in futuro, se il codice viene ripetuto almeno due volte, dovrebbe essere assegnato a un metodo, e non avrai bisogno di cumuli di array che ingombrano il codice.
Ecco un metodo per voi:

//+------------------------------------------------------------------+
double iCCIAverage(string cci_symbol, int cci_timeframe, int cci_period, int cci_applied_price, int ma_period, int ma_method, int ma_shift){
   double array[];
   int loop_array;
   ArrayResize(array,ma_period + ma_shift);
   for(int loop = ma_period + ma_shift - 1; loop >= 0; loop--, loop_array++)array[loop_array] = iCCI(cci_symbol, cci_timeframe, cci_period, cci_applied_price, loop);
   return(iMAOnArray(array, 0, ma_period, 0, ma_method, ma_shift));
}
//+------------------------------------------------------------------+

Penso che tutto sia chiaro con i parametri, inserite i dati e variando il parametro ma_shift ottenete lo spostamento di cui avete bisogno. Si noti che questo metodo può essere utilizzato come modello, basta cambiare i metodi di accesso per gli indicatori i...(...) o iCustom(...). Ora il tuo blocco di decisioni di trading appare come dovrebbe essere:

//--------------------------------------------------------------- 5 --
   // Торговые критерии
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 1),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 3),4))
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 1),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 3),4))
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --

Di conseguenza non c'è più bisogno di varianti "vecchie" e "nuove", i trade vengono aperti in base a determinati criteri (per quanto ho capito hai un modello a tre barre di top/troughs lisciato iCC). C'è una variante corretta nel file.

File:
21_2.mq4  14 kb
 

Salve.

Potete per favore darmi il codice per scrivere i prezzi da quando l'ordine è stato aperto nell'array.

Come fare in modo che ogni nuovo prezzo sia aggiunto all'array.

 
zelek:

Salve.

Potete per favore darmi il codice per scrivere i prezzi da quando l'ordine è stato aperto nell'array.

Come fare in modo che ogni nuovo prezzo sia aggiunto all'array.


Per favore, sii più specifico nella tua domanda

Se siete interessati al prezzo corrente al momento dell'ordine, potete aggiungere una chiamata al codice che sarà responsabile della memorizzazione del prezzo corrente nell'array globale con la modifica del contatore dell'indice dell'array, che potrete visualizzare in seguito da qualsiasi punto del codice.

 

come controllare le prestazioni di un EA - vorrei solo visualizzare il tempo di esecuzione del codice in millisecondi

quanto è migliore la performance di MT5 rispetto a MT4

 
IgorM:

come controllare le prestazioni di un EA - vorrei solo visualizzare il tempo di esecuzione del codice in millisecondi

quanto è migliore la performance di MT5 rispetto a MT4


GetTickCount aiuterebbe https://docs.mql4.com/ru/common/GetTickCount
 
DDFedor:

GetTickCount aiuterà https://docs.mql4.com/ru/common/GetTickCount


grazie sì, è quello che stavo cercando, qualcuno ha misurato la velocità dello stesso tipo di codice per mt4 e mt5?