[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 385

 
granit77:
Victor, ti sbagli. Grazie a questa discussione un po' lunga, due programmatori stavano rispondendo alle domande dei nuovi arrivati allo stesso tempo, il che ha solo giovato al thread :))

Beh, mi è piaciuto leggerlo. Ed è stato molto rivelatore l'atteggiamento degli avanzati (non so come chiamarvi programmatori ora o no - ora sono confuso : )) ) - Mettiamola così: specialisti che risolvono problemi avanzati: ))) e le loro opinioni su compiti apparentemente semplici. Spero sinceramente che questa sia una discussione senza emozioni e amichevole, nonostante tutti i disaccordi. Anch'io, purtroppo, ho ancora dei disaccordi (irrisolti). Ma io sono qui solo per professare un approccio filosofico. Se la soluzione di un problema in quel modo non è ovvia, bisogna trovare un altro modo. Ma è molto utile per conoscere il problema.

Grazie mille per la discussione. È un peccato che non abbiamo raggiunto un consenso. (Ma, nessun consenso è ancora emerso... (mi viene in mente la canzone "There, far away, by the metro"))

Ed è un peccato, naturalmente, che non ci fossero risposte ovvie alle domande mie e di Arles. Penso che queste domande non siano solo per lui e per me, ma per molti professionisti meno esperti che trovano difficile costruire i propri thread e I.T., ed è per questo che si rivolgono a programmi e shell scritti da professionisti avanzati.

Beh, va bene così. Col tempo risolveremo anche questi problemi. : )) Grazie mille per i vostri sforzi. Tutte le parti hanno un atteggiamento positivo alla fine (anche se hanno modi diversi di risolverli). E fa piacere.

A proposito, nelle mie ricerche pedagogiche dico spesso: non tutte le domande possono essere risolte, spesso non conosciamo tutte le risposte; quindi, possono ancora... rimangono aperti. (Sto cercando di trovare una fine delicata alla discussione) Grazie ancora!
 
Bisogno di aiuto 1 come conoscere il prezzo del primo ordine di vendita aperto o in sospeso 2 come controllare se c'è un ordine di vendita aperto o in sospeso al prezzo che ho specificato
 

Sergei, quali questioni sono rimaste irrisolte? Se questo:

Chiripaha:

Cioè, rispondendo alla domanda di Arles, se un EA ha fatto la contabilità degli ordini e si è "appisolato" per un po', in quel momento un altro EA che non ha superato il limite dei fondi assegnati (supponiamo l'80% del deposito - entrambi gli EA avranno questa dimensione) piazzerà un ordine (entrare in un'operazione a mercato). E quando il 1° riprende il lavoro (e il terminale di gestione del denaro è già stato calcolato il giorno prima), sarà anche in grado di aprire una transazione superando i limiti stabiliti dall'Expert Advisor?

Se questo sistema (ipoteticamente) è moltiplicato per diversi EA, allora può essercene uno, dove il Risk-Management sarà in sistema critico?

Ho capito bene questo multi-threading? - Se è così, allora da un punto di vista finanziario, ovviamente, è un casino. Ma poiché la probabilità è piccola nei piccoli conti, è solo ipotetica. E su conti più grandi, probabilmente scriveranno qualcosa loro stessi. Ma comunque, si rivela essere il caso?

E ho una domanda - questa è la posizione ufficiale o sono solo speculazioni ed esperienze come la mia?

C'è un codice a pagina 378. Eccolo di nuovo:

#property show_inputs

extern int Pause = 1000;

int    hwndChart = NULL; // Уникальный идентификатор скрипта.
string sName = "Condition";

void init()
 {
  hwndChart = WindowHandle(Symbol(), 0);
  // Создаём глобальную переменную синхронизации скриптов.
  if (!GlobalVariableCheck(sName)) GlobalVariableSet(sName, 0);
 }
 
void deinit()
 {
  GlobalVariableDel(sName);
 }

void start()
 {
  while (!IsStopped())
   {// Начало блока синхронизации.
    GlobalVariableSetOnCondition(sName, hwndChart, 0);
    if (GlobalVariableGet(sName) == hwndChart)
     {
      Print("Start");
      Sleep(Pause); // Имитация работы.
      Print("End");
     }
    GlobalVariableSetOnCondition(sName, 0, hwndChart);
    // Завершение блока синхронизации.
    Sleep(200);
   }
 }
Dove il ritardo è "lavoro di imitazione" inserire un riferimento al deposito o ad un'altra risorsa.

Potete trasformare questo blocco di sincronizzazione in una funzione e metterlo nella libreria. Avrete una funzione sincrona di accesso al deposito da qualsiasi EA.

 
Sostituire l'indice con la maniglia della finestra del grafico
 
FAQ:
Invece dell'indice, sostituite la maniglia della finestra del grafico

Giusto! È difficile capire cosa sia cosa con gli indici.

L'ho rifatto.

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

Anche se l'indicizzazione permetterà di cancellare correttamente una variabile globale.

Dovremmo decrementare l'indice nel deinit. E cancella la variabile globale quando l'indice è uguale a zero.

Ma questo decremento non permetterà di ricaricare lo script dopo la cancellazione. Gli indici saranno confusi.

Dovremmo creare un array globale di indici di tutti i moduli che accedono alla risorsa. Bene, e lavoraci.

È anche possibile fare due variabili globali. Uno con l'ultimo indice, l'altro con il numero attuale di moduli. Gli indici non fanno che aumentare. Probabilmente, sarà più facile.

Oppure non preoccupatevi affatto della variabile globale. Cancellarlo manualmente prima della prima esecuzione.

 
questo funzionerà bene fino al primo fallimento deiniziale, quando l'esperto non decrementa il contatore totale
 
Ce l'ho! Anche noi dobbiamo uscire in sincronia. In deinit aspettate il vostro turno e uscite con il reset della variabile globale. Se la risorsa viene acceduta per un breve periodo, andrà bene nel deinit.
 

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

 
Zhunko:

Sergei, quali questioni sono rimaste irrisolte? Se è così:

C'è un codice a pagina 378. Eccolo di nuovo:

Dove c'è un ritardo "imitazione del lavoro" si inserisce un riferimento al deposito o a un'altra risorsa.

Potete trasformare questo blocco di sincronizzazione in una funzione e metterlo in una libreria. Otterrete una funzione sincrona di accesso al deposito da qualsiasi Expert Advisor.

Questo è un blocco di accesso atomico e non c'è sincronizzazione. Non ha senso applicare solo al deposito. La chiamata di una qualsiasi delle funzioni dei parametri di deposito sarà atomica da sola, senza alcun nudge. 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.

 
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


Non capirà, troppo male visto dall'alto)))) Ho risolto questo compito in circa questo stile. È bello avere qualcuno che capisce l'essenza del problema. Solo che ho ancora una coda, in quale ordine i compiti hanno cominciato ad essere eseguiti, e vengono eseguiti ulteriormente in un cerchio.