Come dovrebbe essere il prezzo del vetro? - pagina 12

 
Il ritardo nel rilascio di tumbler è sorto perché un nuovo tipo di motore deve essere realizzato. Beaker, come applicazione standalone che lavora come motore indipendente, ha bisogno di fornire un'API utente, altrimenti, come programma chiuso, il suo valore sarà molto inferiore. I motori che ho fatto in passato erano completamente dipendenti dai comandi dell'utente e non avevano funzionalità proprie. Il nuovo tipo di motore deve funzionare in modo indipendente e controllato dall'esterno. Ora sto risolvendo questo problema.
 

Oggi ha segnato un altro importante passo avanti. Il motore può ora funzionare come un'applicazione indipendente, sincronizzando i suoi valori di parametro con l'applicazione utente ad esso collegata. L'applicazione è collegata come prima, ma ora può richiedere valori che sono impostati dalla funzionalità del motore. Quindi, questo è un passaggio a un nuovo livello di interazione tra i programmi. Il motore come programma autonomo può accumulare le sue funzionalità ed estendere l'API fornita alle applicazioni.

Nel caso del price stack, - è diventato un'applicazione standalone (che finirò domani, dopodomani), e funziona come un indicatore. Usando la connessione, gli utenti possono recuperare i valori di questa tazza e sovrascriverli, restituendoli alla tazza in una forma modificata. Per esempio: Il prezzo in uno dei campi di vetro è stato analizzato dal codice utente e risulta essere il livello di qualche indicatore importante. L'utente invia il suo marcatore di stringa a quel campo ed esso apparirà accanto a quel prezzo. Questo apre nuove interessanti possibilità per lo sviluppo sia di motori che di programmi utente.

SZZ. Gli eventi del cursore della GUI, precedentemente inviati solo all'applicazione, sono ora ricevuti anche internamente dal motore e la gestione parallela degli eventi viene eseguita ad entrambe le estremità - nel motore (secondo il mio codice) e nell'applicazione utente (secondo il codice utente). Cliccando il pulsante si attiva sia la funzionalità del motore che quella dell'applicazione collegata.
 
Un'altra cosa che manca dalla tazza è il profitto se si chiude ora sul mercato, cioè la contabilizzazione del riempimento della tazza - rilevante per posizioni leggermente più grandi di quelle piccole (per esempio 100-150 lotti).
 
Ci saranno dei tasti di scelta rapida?
 
Andrey Gladyshev:
Ci saranno tasti di scelta rapida?
Assolutamente.
 
Aleksey Vyazmikin:
Un'altra cosa che manca dalla tazza è il profitto se si chiude ora sul mercato, cioè riempiendo la tazza - rilevante per posizioni leggermente più grandi che piccole (per esempio 100-150 lotti).
Conto del riempimento della tazza. Penserò dopo il rilascio della versione base, per non ritardare.
 
La tazza del prezzo sarà pronta. La documentazione della connessione API era molto in ritardo. È estremamente dispendioso in termini di tempo scrivere la documentazione nel proprio linguaggio di markup. E anche la documentazione del tumbler deve essere fatta. E il vetro stesso. E allo stesso tempo ottimizzare il codice, il costruttore, correggere i bug e aggiungere funzionalità. Ecco perché è così lungo. Ma allora tutto sarà più veloce e più rapido.
 
In che lingua è scritto il programma?
Qual è l'effettiva velocità di elaborazione dei dati in entrata?
Come vengono assegnati i dati ai livelli di prezzo?
È un ciclo for o c'è una variabile con dati per ogni livello?
Il fatto che tu abbia scelto il tipo di vista del vetro come nei terminali occidentali è corretto.
Suggerirei di aggiungere alla tazza la gestione degli ordini OCO collegati fino a tre livelli.
E in generale si può prendere qualsiasi funzionale Western Market Dock e vedere cosa è implementato in esso.
O vedere come è implementata l'unità QScalp scalper.
 
Roman:
In che lingua è scritto il programma?
Qual è l'effettiva velocità di elaborazione dei dati in entrata?
Come sono distribuiti i dati per livelli di prezzo?
In un ciclo for o for ogni livello ha la sua variabile con i dati?
Il fatto che tu abbia scelto il tipo di mappatura della tazza, come nei terminali occidentali, è corretto.
Suggerirei di aggiungere al vetro, la gestione delle offerte OCO collegate fino a tre livelli.

1. Il programma è scritto in due lingue. Il linguaggio di base è MQL5, e sopra questo, il mio linguaggio di markup.

2. Distribuito nello stesso modo in cui è stato inviato. Intendo nelle celle giuste. È difficile da spiegare a parole. Vi manderò il codice più tardi. Naturalmente, ho dovuto sudare per mettere i dati nelle celle giuste, ma questo problema è stato risolto.

3. Aggiungerò tutto ciò che mi verrà chiesto e che ha senso e importanza.
 

Ecco il codice per distribuire i dati alle celle della mia tazza:

void On_DOM_Event()
{
 int t = 0;
 //----------------------------
 MqlTick last_tick;
 SymbolInfoTick(Symbol(),last_tick);
 //----------------------------
 MarketBookGet(NULL,priceArray); 
 //----------------------------
 double p = 0;
 long   ask_size = 0, bid_size = 0;
 int    s = ArraySize(priceArray);
 //----------------------------
 if(s > 0)
   {
    //-------------------------   ---
    for(int i1 = 0; i1 < 100; i1++)prices[i1]  = NULL;
    for(int i1 = 0; i1 < 100; i1++)ask_vol[i1] = NULL;
    for(int i1 = 0; i1 < 100; i1++)bid_vol[i1] = NULL; 
    //----------------------------
    int Closest_to_ask = 0;
    //----------------------------
    for(int a1 = 0; a1 < s; a1++)
      {
       if(
              priceArray[a1].price == last_tick.ask
          || (priceArray[a1].price < last_tick.ask && (((a1 + 1 < s) && priceArray[a1 + 1].price >= last_tick.bid) || (a1 + 1 == s)))
         )
         {
          Closest_to_ask = a1;
          break;
         } 
      } 
    //----------------------------
    for(int a2 = Closest_to_ask; a2 >= 0; a2--)
      { //Alert("t ",t,"  a2  ",a2);
       prices[49-t]  =  Normalize_Double(priceArray[a2].price,_Digits,_Point);
       ask_size     +=  priceArray[a2].volume;
       ask_vol[49-t] =  (string)priceArray[a2].volume;
       t++;
      }
    //--------------------------------  
    t = 0;
    //Alert("_Digits   ",_Digits);
    //--------------------------------  
    for(int a3 = Closest_to_ask + 1; a3 < s; a3++)
      { 
       prices[50+t]  =   Normalize_Double(priceArray[a3].price,_Digits,_Point);
       bid_size      +=  priceArray[a3].volume;
       bid_vol[50+t] =   (string)priceArray[a3].volume;
       t++;
      }         
 //------------------------------------------------       
 //------------------------------------------------ 
 E_DOM_1_Price(prices[40]);    E_DOM_1_Ask_size(ask_vol[40]);
 E_DOM_2_Price(prices[41]);    E_DOM_2_Ask_size(ask_vol[41]); 
 E_DOM_3_Price(prices[42]);    E_DOM_3_Ask_size(ask_vol[42]); 
 E_DOM_4_Price(prices[43]);    E_DOM_4_Ask_size(ask_vol[43]); 
 E_DOM_5_Price(prices[44]);    E_DOM_5_Ask_size(ask_vol[44]);
 E_DOM_6_Price(prices[45]);    E_DOM_6_Ask_size(ask_vol[45]);
 E_DOM_7_Price(prices[46]);    E_DOM_7_Ask_size(ask_vol[46]);
 E_DOM_8_Price(prices[47]);    E_DOM_8_Ask_size(ask_vol[47]);  
 E_DOM_9_Price(prices[48]);    E_DOM_9_Ask_size(ask_vol[48]); 
 E_DOM_10_Price(prices[49]);   E_DOM_10_Ask_size(ask_vol[49]);
 //-------------------------------------------------
 E_DOM_11_Price(prices[50]);  E_DOM_11_Bid_size(bid_vol[50]);
 E_DOM_12_Price(prices[51]);  E_DOM_12_Bid_size(bid_vol[51]);
 E_DOM_13_Price(prices[52]);  E_DOM_13_Bid_size(bid_vol[52]); 
 E_DOM_14_Price(prices[53]);  E_DOM_14_Bid_size(bid_vol[53]); 
 E_DOM_15_Price(prices[54]);  E_DOM_15_Bid_size(bid_vol[54]); 
 E_DOM_16_Price(prices[55]);  E_DOM_16_Bid_size(bid_vol[55]); 
 E_DOM_17_Price(prices[56]);  E_DOM_17_Bid_size(bid_vol[56]); 
 E_DOM_18_Price(prices[57]);  E_DOM_18_Bid_size(bid_vol[57]);    
 E_DOM_19_Price(prices[58]);  E_DOM_19_Bid_size(bid_vol[58]); 
 E_DOM_20_Price(prices[59]);  E_DOM_20_Bid_size(bid_vol[59]);
 //------------------------------------------------- 
 }
 RMSG(1);
}


Per registrare i dati in arrivo, ho fatto un array di 100 celle. Distribuisco i dati in arrivo dal centro dell'array (cella 49) al lato asc e bid, calcolando prima il prezzo più vicino al lato asc e bid.