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

 
rajak:

Ciao a tutti!

Potete consigliare, se qualcuno sa qual è il problema, dopo la compilazione del file ex4 non appare, anche attraverso metalang. Cosa posso fare, e un paio di giorni fa tutto funzionava bene.

La compilazione funziona senza errori, anche se li introducete di proposito.

Se hai windows7, prova a guardare nella cartella virtuale

c:\Users\La tua cartellaAppData\Local\VirtualStore\Program Files (x86)\MT4 folder\experts\

Al posto della vostra cartella e della cartella MT4, sostituite le vostre directory reali.

 
lottamer:

Qualche tempo fa, delle persone gentili mi hanno detto come fare la funzione "return ticket dell'ultima posizione chiusa" dalla funzione "return ticket delle ultime due posizioni chiuse".

E quando ho avuto bisogno della funzione "biglietti di tre posizioni chiuse", non ho potuto (per somiglianza e metodo di selezione) implementarla

aiuto per favore,

potete vedere che ci sono due copie, la seconda con alcuni cambiamenti. ma sono stato in grado di continuare...

Ho questa variante per il 3° biglietto... e restituisce di nuovo il biglietto della prima posizione per qualche motivo...


Sostituire

if(OrderTicket()==A && (OrderTicket()==B) )continue;

a

if(OrderTicket()==A || (OrderTicket()==B) )continue;

Non è chiaro cosa stai facendo per restituire tre valori da una funzione

 
Roger:


Sostituire

su

Non è chiaro cosa stai facendo per restituire tre valori da una sola funzione



Il punto è calcolare il risultato delle ultime N posizioni. per questo chiamo i loro biglietti, e poi è una questione di tecnica

fLastClosetPoz();
     OrderSelect( Ticket1,SELECT_BY_TICKET); X=OrderProfit(); SL1=OrderType(); TM1=OrderOpenTime();      Print (Ticket1); Print (SL1,"_",X); //ПОСЛЕДНИЙ 
     OrderSelect( Ticket2,SELECT_BY_TICKET); Y=OrderProfit(); SL2=OrderType(); TM2=OrderOpenTime();      Print (Ticket2); Print (SL2,"_",Y); //ПРЕДпоследний
     OrderSelect( Ticket3,SELECT_BY_TICKET); Z=OrderProfit(); SL3=OrderType(); TM3=OrderOpenTime();      Print (Ticket3); Print (SL3,"_",Z); //ПРЕД-ПРЕДпоследний
 
Roger:


Sostituire con

a


Ha funzionato! Onestamente, ho avuto questa idea di sostituire OR con AND.... ma ... :)))))))))))))))))))))

Grazie! Ora capisco la logica, anche se per contare 15 chiusi, dovrò gonfiare il codice alle dimensioni di un palloncino!

Si può comprimere il tutto in un solo ciclo e sostituire solo il parametro del numero di transazioni richieste N?

 
Zhunko:

1. Non dovresti farlo. Esprime persino la mia ammirazione per il suo algoritmo. Questo è l'HENRYFIX. Allora aveva un altro soprannome.

Il prefisso del nome dello script è costituito dalle prime lettere dei nostri soprannomi.

===============

2. Dmitry, non importa, sono sinceramente contento che tu abbia risolto qualche problema segreto con qualche algoritmo segreto, che non è soggetto a divulgazione.

3. Tutto sembrava molto misterioso. Grazie per esserti vantato. Sei senza dubbio il programmatore più figo di questo forum e forse anche dell'intero universo!

1. Oh sì, dopo aver scoperto che era il tuo codice, o quello del tuo amico. Abalde, era il più incasinato e imbarazzante, ora è diventato subito ammirevole.

2. Con quello che sono un programmatore, quello che so e come so e posso fare, con quello che non so e non conosco - lo affronterò in qualche modo.

3. Il compito non è assolutamente segreto, è assolutamente chiaro, è stato definito apertamente qui. Tutti coloro che sono in grado di capirlo, l'hanno capito subito senza problemi. È stato risolto non con qualche metodo segreto e magico, ma con i soliti metodi standard e ovvi (e conosciuti in tutto il mondo). Non mi sto vantando qui, e a te, miracolo, sto ridendo. Solo la vostra megalomania vi impedisce di capire e realizzare questo.

 
Integer:

1. Oh sì, dopo che si è rivelato essere il tuo codice, o quello del tuo compagno. Abaldez, era il più incasinato e imbarazzante, ora è subito ammirevole.

2. Con quello che sono un programmatore, quello che so e come so e posso fare, con quello che non so e non conosco - me ne occuperò in qualche modo.

3. Il compito non è affatto segreto, è assolutamente chiaro, è stato definito apertamente qui. Tutti coloro che sono in grado di capirlo, l'hanno capito subito senza problemi. È stato risolto non con qualche metodo segreto e magico, ma con i soliti metodi standard e ovvi (e conosciuti in tutto il mondo). Non mi sto vantando qui, e a te, miracolo, sto ridendo. Solo la vostra megalomania vi impedisce di capirlo e realizzarlo.




Ragazzi, andate a sfregare da un'altra parte! La gente sta risolvendo problemi PRATICI qui. e voi state disseminando il thread di emozioni...
 
lottamer:


Andate a sfregare da un'altra parte! La gente sta risolvendo problemi PRATICI qui. voi state disseminando il thread di emozioni...


Perché mi scrivi di questo? Prendete Junko e scrivetelo, è il suo quarto giorno qui non può capire di cosa stiamo parlando, tutti gli altri hanno capito il primo giorno.
 

Naturalmente, ci devono essere dei limiti a qualsiasi dibattito. Altrimenti, potrebbe già superare i limiti della ragionevolezza.

Dopo che entrambe le posizioni sono state esposte, le parti possono essere d'accordo o meno. - Questo è un loro diritto. Anche se la gente si sbaglia. Tutti hanno il diritto di sbagliare.

Se si tratta di un dibattito pubblico, come questo, allora chi guarda vede gli argomenti di ogni parte e, indipendentemente dal consenso raggiunto (o meno) sulla questione, ognuno ha la possibilità di scegliere la propria versione della soluzione (o entrambe).

Ma rivolgersi alle accuse e agli appelli all'individuo (piuttosto che al compito, alla questione, al caso) è già abbassare la propria credibilità. È inutile e condannabile (per aver insultato una persona).


Dato che gli argomenti e i modi di risolvere il problema sono stati esposti da tempo, suggerisco che entrambe le parti si fermino su questo argomento e si appellino l'una all'altra.

Apparentemente, se i litiganti sono professionisti nella risoluzione di questioni programmatiche, allora sono dei novellini nella conduzione delle discussioni. Il che non è in contrasto con l'argomento del thread, ma permette di dare consigli professionali. Spero che questo consiglio venga ascoltato.

 
Integer:

1. Oh sì, dopo che si è rivelato essere il tuo codice, o quello del tuo compagno. Abaldez, era il più incasinato e imbarazzante, ora è subito ammirevole.

2. Con quello che sono un programmatore, quello che so e come so e posso fare, con quello che non so e non conosco - me ne occuperò in qualche modo.

3. Il compito non è affatto segreto, è assolutamente chiaro, è stato definito apertamente qui. Tutti coloro che sono in grado di capirlo, l'hanno capito subito senza problemi. È stato risolto non con qualche metodo segreto e magico, ma con i soliti metodi standard e ovvi (e conosciuti in tutto il mondo). Non mi sto vantando, sto ridendo di te, miracolo. Solo la vostra megalomania vi impedisce di capire e realizzare questo.

1. Conosci la differenza tra un codice e un algoritmo? Inoltre, l'algoritmo non ha nulla a che fare con l'apertura della finestra del grafico. Ho corretto il codice, naturalmente. Il luogo in cui si apre il grafico non è praticamente cambiato. Non avevamo altra scelta in quel momento. L'ho fatto in un modo diverso nella DLL. È più affidabile.

2. È stato fantastico! Sei il migliore!

3:

FAQ:

1) Problema: ogni script (EA) deve essere consapevole della presenza di tutti gli altri.

2) Problema: se c'è un guasto, i globali di quello fallito si blocca non occupato e la coda si blocca.

3) Soluzione:

Ogni exp organizza 1 globalka con nome - prefisso comune + window handle + simbolo. il valore del globalka è il tempo dell'ultimo tick su quello strumento. 2 globale comune con il proprio manico (dopo aver lavorato vi scrive il proprio manico o lo cancella se è il più vecchio)

La coda è disposta in ordine crescente (maniglie), la più alta imposta il secondo globale a zero

in ogni exp, creiamo tre array (per mancanza di strutture) - simbolo/handle/tempo ultimo accesso/tempo ultimo tick.

tutte le EXP tengono traccia di (last access time/last tick time) per tutte e non appena sono diverse (una delle EXP fallisce) entrambi i globali della EXP fallita vengono cancellati ed è considerata inattiva. le sue celle negli array vengono cancellate (l'array viene ricostruito).

la coda viene ripristinata

questo sarà effettivamente fatto dall'EA che si trova sul grafico più attivo (tick frequenti).

quando viene deinizializzato normalmente, ogni expo si pulisce da solo.

max skip - un segno di spunta.

ZS. e in generale, è meglio fare una sola multicurrency

Quindi questo è grazie alle capacità telepatiche di Rustam. È un problema ipotetico e una soluzione ipotetica. Che cosa ha a che fare con il vostro problema? Non hai mai detto nulla al riguardo. Ho dovuto ficcanasare. La risposta non è altro che bestemmie al posto di parole costruttive, che voi continuate a suggerire, ma non mettete in pratica.

Ho avuto una sfida simile nel 2008. I segreti non vanno bene, come alcuni. Darò un esempio concreto di quale tipo di problema, come risolverlo, e perché penso che risolvere tali problemi in questo modo non abbia successo.

============================

I dati iniziali del problema:

1. Il compito ha diversi Expert Advisors in loop identici. Cioè fili completamente indipendenti.

2. Esiste un database di coefficienti diviso in 8 gruppi, a cui hanno accesso alcuni esperti. La dimensione del DB parte da 2 Gb.

3. DB è a volte rifornito. Riempito in periodi multipli di 2 ore. Il tempo di elaborazione dipende dai multipli dell'ora del giorno. La durata varia da 5 minuti a 45 minuti a seconda della molteplicità dell'ora del giorno e della capacità della CPU.

Compito:

Poiché l'integrazione del database richiede molto tempo, solo un esperto dovrebbe essere responsabile dell'integrazione del database. Altrimenti, potreste non essere in grado di aspettare che finisca.

2. È necessario proibire l'accesso al database mentre viene aggiornato. Fatelo in gruppo, per non rallentare significativamente l'aggiornamento dei coefficienti, con cui lavorano gli esperti.

Gli esperti che lavorano con i coefficienti, che sono in fase di aggiornamento, dovrebbero lavorare con i vecchi coefficienti.

Gli esperti che sono stati passati a un gruppo specifico di coefficienti durante il periodo di aggiornamento dovrebbero lavorare con un solo coefficiente e informare su di esso. Quando l'aggiornamento è finito, dovrebbero passare al nuovo coefficiente. Lo stesso vale per il punto 3.

Soluzione al momento:

1. Viene fatta una coda comune di identificatori di esperti composta dai loro indici.

2. Una coda di identificatori di esperti che accedono alla base di dati, composta dai loro indici, è fatta.

Entrambe le code sono una risorsa comune. L'accesso alle code è sincronizzato da un unico oggetto di sincronizzazione.

Il primo esperto della seconda coda è responsabile dell'aggiornamento del database. 4.

5. Inoltre, è quasi come descritto da Rustam. È un po' più facile grazie all'implementazione nella DLL.

Gli identificatori sono gli indici passanti. Quando cancelliamo un Expert Advisor, l'identificatore viene rimosso dalla coda. La reindicizzazione non viene effettuata. Gli esperti rimanenti lasceranno i loro indici.

Quando si aggiunge un nuovo esperto, se l'indice dell'ultimo esperto non corrisponde al suo numero, viene assegnato il primo indice vecchio libero. Altrimenti vengono assegnati nuovi indici.

Non è necessario legarsi al descrittore e allo strumento grafico. Inoltre, non c'è bisogno di tenere traccia di un errore di scarico. Non c'è mai stato un fallimento. Anche se accadesse, non sarebbe un disastro. Gli EA continuerebbero a lavorare con i vecchi rapporti. Per l'aggiornamento successivo, il controllore del contatore degli aggiornamenti avrebbe rilevato nessun aggiornamento e avrebbe eliminato l'ID dell'EA principale dalla seconda coda. Il prossimo esperto raccoglierà la missione del maestro. Lo stesso controllore farebbe la stessa cosa quando l'Expert Advisor va in modalità di connessione al database. Cioè, lo inserisce nella seconda coda. Cioè solo gli esperti che lavorano su M1, dove il valore del coefficiente non è critico, sarebbero interessati.

Una tale soluzione ha realizzato pienamente il compito, ma non mi è piaciuta molto a causa del legame degli Expert Advisor tra loro e del compito insolito per l'Expert Advisor, che alimentava il database, il che non aggiunge affidabilità. A quel tempo non sapevo e non sapevo fare molte cose. Un anno dopo l'ho rifatto.

Soluzione 2:

1. Il database è mantenuto in un thread separato, dove si rifornisce con un timer.

2. L'accesso al database al momento del suo rifornimento è protetto dall'oggetto di sincronizzazione.

Tutto è diventato molto più facile. Senza code. Ma anche a me non è piaciuto molto. Prima di un rifornimento, il database chiamava lo script di swapping delle citazioni che a volte portava all'overflow della memoria. Il che ha rallentato molto MT4. A quel tempo MT4 lavorava con 2 GB di memoria. Ora funziona con 4GB.

Soluzione 3:

1. DB è un'applicazione separata. Cioè un altro processo con la propria memoria dedicata, indipendente da MT4.

2. DB si sta rifornendo.

Lo scambio di dati avviene attraverso la mappatura. Ha aumentato la velocità di scambio di dati e di rifornimento del database. Prima tutto veniva letto dal disco. Era impossibile farlo altrimenti. La memoria di lavoro di МТ4 è molto limitata.

4. La storia viene pompata da MT4 in remoto dall'applicazione DB, dove la si calcia come richiesto. Qualsiasi guasto di MT4 - il suo scarico e il successivo caricamento.

5. Il punto 4 è fatto creando un link simbolico alla directory corrente di MT4. Cioè è una copia completa dell'attuale MT4. La storia viene aggiornata al volo direttamente nelle directory MT4, senza aspettare l'upload di MT4 funzionante.

6. Sincronizzazione dell'accesso al database al momento del suo aggiornamento tramite mutex, perché la sezione critica funziona solo per un processo.

========================

Quindi, Dmitry, non conoscendo il tuo compito, puoi supporre che possa essere risolto senza organizzare la coda e mantenendo i thread di Expert Advisor indipendenti. Aumenterà l'affidabilità e le prestazioni generali. Ne ho già parlato (indipendenza dei thread) per diverse pagine.

 

Mi dispiace. Nessuna risposta a questo:

Integer:

È un'unità di accesso atomica e nessuna sincronizzazione. Non ha senso affrontare solo il deposito in questo modo. La chiamata di una qualsiasi delle funzioni di parametro di deposito sarà atomica da sola, senza alcun ritocco. Se lo fai atomicamente, tutto il lavoro dell'Expert Advisor. È così che si risolvono i problemi: si pensa di aver fatto qualcosa, ma in realtà è un'illusione.

Dmitry, non dovresti pensare che ci siano solo sciocchi. Dalla domanda di Sergey, si può vedere che ha una buona comprensione del problema.

Naturalmente, un semplice riferimento ai parametri di deposito con sincronizzazione non ha senso. La sincronizzazione è necessaria per cambiare questi parametri. In modo che l'Expert Advisor parallelo riceva il parametro corretto che è già stato cambiato, piuttosto che ottenerlo nel processo di modifica.