Domande da un "manichino" - pagina 162

 
Karlson:
DBL_MAX ci sarà.
:-)
 

Perché il nandù handicappato non torna, anche se l'handicap è stato rimosso?

   int       indicator_handle=iCustom(
   NULL,
   PERIOD_CURRENT,
   "Examples\\ZigzagColor"
   );
   Print(indicator_handle);
   bool  a=IndicatorRelease(
   indicator_handle//,
   );
   Print(a);
   Print(indicator_handle);

La prima stampa è 10, la seconda stampa è vera, la terza stampa è di nuovo 10. Mettete uno slip al minuto - ancora 10.

Penso che dovrebbe essere -1(INVALID_HANDLE). Sto pensando male?

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы - Документация по MQL5
 
Silent:

Perché il nandù handicappato non torna, anche se l'handicap è stato rimosso?

La prima stampa è 10, la seconda stampa è vera, la terza stampa è di nuovo 10. Mettete uno slittamento al minuto - ancora 10.

Penso che dovrebbe essere -1(INVALID_HANDLE). Sto pensando in modo sbagliato?

Gli indicatori cancellati non vengono rimossi immediatamente fisicamente, ma dopo una pausa (forse qualche minuto), nel caso in cui lo stesso o un altro programma li riapra (opzione caching).

Nella maggior parte dei casi, questo è conveniente. Il problema si verifica solo se il ciclo legge i buffer di un grande insieme di indicatori (così grande che non tutti possono entrare nella memoria in una volta).

// Solo in questo caso ha senso rilasciare gli indicatori nel programma.

// Tutte le altre varianti di utilizzo della funzione IndicatorRelease() sono "razzialmente sbagliate", perché gli indicatori sono liberati al completamento del lavoro.

Da qui, il paradosso: la funzione è inutile perché il caching uccide completamente tutti i casi d'uso kosher.

In questo caso Renat una volta ha promesso di fare una variante di "rilascio istantaneo", ma a quanto pare è ancora molto occupato. ;)

--

Questa è più o meno la prima parte della risposta (senza la quale la seconda sarebbe incomprensibile).

Ora riguardo a INVALID_HANDLE. Come vedo, le funzioni di rilascio degli oggetti dinamici, così come l'operatore di cancellazione, non assegnano il valore INVALID_HANDLE al puntatore di per sé; rimuovono solo gli oggetti a cui punta l'handle. Solo le funzioni di allocazione della memoria (anche il nuovo operatore) assegnano forzatamente valori INVALID_HANDLE ai puntatori in caso di fallimento, quindi il modo corretto per controllare la validità del puntatore è la funzione CheckPointer() che letteralmente guarda attraverso la tabella di sistema degli handle cercando un oggetto e restituisce il tipo di handle se l'oggetto viene trovato o 0 se non lo è.

Speriamo che la logica del lavoro con i puntatori (handle) sia ora un po' più chiara. Così come i risultati del tuo esempio. Tutto è corretto lì: l'indicatore è un oggetto ad accesso di gruppo, non viene fisicamente rimosso al primo fischio (quindi anche CheckPointer() restituirà non zero), per non parlare dell'inconveniente di sperare di ottenere il valore INVALID_HANDLE nella variabile puntatore dopo averlo passato a IndicatorRelease() per valore.

 

L'articolo Ordini, posizioni e compravendite in MetaTrader 5 fornisce l'esempio che"Ogni compravendita è basata su un ordine particolare, maun ordine può generare più compravendite. Per esempio, un ordine di acquisto di 10 lotti può essere eseguito attraverso diversi scambi successivi con esecuzione parziale". La mia comprensione è che se voglio aprire una posizione per es. 10 lotti, allora diversi scambi possono apparire nella storia. Secondo la mia strategia, 1 e 2 posizioni nella stessa direzione, il mio Expert Advisor (MT4) apre con 1,0 lotto, e poi il terzo e poi 2,0 lotto. In MT5 può succedere che aprendo la prima posizione nella storia possano apparire ad esempio 2 o più operazioni. 2 o più compravendite possono apparire nella cronologia. Quando si desidera aprire una 2a posizione, l'Expert Advisor scorrerà la storia e troverà che sarà la 3a posizione. E aprirà il lotto sbagliato. Questo è piuttosto fastidioso.

Forse qualcuno sa come risolvere questo problema o darmi un link.

 
MetaDriver:

Grazie, proprio quello di cui hai bisogno.

// nelp by nelp for dummies - ecco cosa serve negli articoli.

 

Sto cercando di creare un indicatore che utilizza due diversi timeframe, ad esempio M5 (quello attuale sullo schermo) e H1. Come sincronizzare i prezzi tra questi diversi timeframe? Per esempio, quando calcolo l'ultimo valore dell'indicatore su M5, vorrei pompare automaticamente i prezzi da H1 dello stesso tempo (cioè la barra zero in entrambi i timeframe dopo ArraySetAsSeries corrisponde all'ultimo tempo corrente, come in OnTick, ma non all'ultima barra sullo schermo). Se non c'è questa possibilità e dobbiamo controllare i tempi delle barre manualmente, dovremmo aggiungere una funzione di sincronizzazione, come onTick, per gli indicatori.

Ho provato a testarlo nel tester - è una buona cosa. Perché l'ultimo valore calcolato non viene salvato sullo schermo?

 
gpwr:

Sto cercando di creare un indicatore che utilizza due diversi timeframe, ad esempio M5 (quello attuale sullo schermo) e H1. Come sincronizzare i prezzi tra questi diversi timeframe? Per esempio, quando calcolo l'ultimo valore dell'indicatore su M5, voglio pompare automaticamente i prezzi da H1 dello stesso tempo (cioè la barra zero in entrambi i timeframe dopo ArraySetAsSeries corrisponde all'ultimo tempo corrente, come in OnTick, ma non l'ultima barra sullo schermo). Se non c'è questa possibilità e dobbiamo controllare i tempi delle barre manualmente, dovremmo aggiungere una funzione di sincronizzazione, come onTick, per gli indicatori.

Ho provato a testarlo nel tester - è una buona cosa. Perché i valori precedentemente calcolati non vengono salvati nell'indicatore?

Utilizzare uno dei sovraccarichi della funzione CopyXXXX()

Durante il debug, fate un controllo in quale direzione vengono copiati i dati (se ne viene copiato più di 1).

Обращение по начальной дате и количеству требуемых элементов

int  CopyRates(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   datetime         start_time,        // с какой даты
   int              count,             // сколько копируем
   MqlRates         rates_array[]      // массив, куда будут скопированы данные
   );
 
 
Urain:

Usare uno degli overload di CopyXXXX()

Durante il debug, fate un controllo in quale direzione vengono copiati i dati (se ne viene copiato più di 1).

Capito. Grazie.
 

Ciao!

Potresti dirmi il codice dell'indicatore che disegna il massimo e il minimo sui grafici al minuto corrente del giorno precedente?

SPS!

 

Da quanto tempo non ci vediamo =).

Diciamo. C'è un punto nel tempo. Per esempio D'03.07.2005 13:48:12'.

Come posso trovare il tempo della barra (di un certo periodo) che include questo periodo?

Sarebbe bello se ci fosse una funzione come:

datetime УзнатьВремяБараПоВремениПользователя (datetime времяПользователя, ENUM_TIMEFRAMES периодБаров) 

... E che restituirebbe un valore negativo se non ci fosse uno scambio in quel momento.

Beh, sputa il rospo, esiste una tale funzione?