Il mio approccio. Il nucleo è il motore. - pagina 128

 
Vasiliy Sokolov:

Merda, amico, davvero non capisci cosa sta succedendo o stai cercando di tagliare le curve in questo modo?

In qualsiasi pannello, la cosa fondamentale e più complicata è la visualizzazione della coerenza. Se un ordine è aperto - dovrebbe essere visualizzato, se non è nella scheda commerciale, non dovrebbe essere nemmeno nel pannello. Questo è elementare e "molto semplice" concettualmente. Ma per renderlo "molto semplice", il pannello deve essere basato su un modello di stato. Non avete una cosa del genere, ma un qualche database locale di curve non coerenti su stringhe infilate negli oggetti utente:

E ora stai cercando di dimostrarci che non c'è nessun problema, che è stato tutto succhiato dal nulla. Che gli ordini non visualizzabili nella tua tabella vanno bene. Che gli ordini che sono nella vostra tabella, ma che sono stati chiusi da tempo in realtà - questo è anche normale. E in generale, tutto è così normale e buono, tranne che il numero di posizioni è limitato a 20.

Capite che il problema è l'implementazione di fissare l'apertura/chiusura dell'ordine con mezzi interni. Questo non fa parte del meccanismo della tabella stessa. È un meccanismo UTENTE!

Invece di criticare il motore e l'implementazione della tabella, faresti meglio a scrivere un meccanismo adeguato per fissare l'apertura e la chiusura dell'ordine.

E tutto funzionerà correttamente!

 
Реter Konow:

  1. Per fare questo, l'utente deve scrivere da solo un ciclo sugli ordini in tick o timer, e controllare i loro tick contro i tick scritti nell'array. Se non c'è nessun ticket nell'array, significa che l'ordine è stato appena aperto, e allora dovrebbe essere chiamato E_Main_form_1__PnL(OrderTicket(),OrderProfit());

4. Se si scrivono correttamente questi cicli di ordine, allora la tabella funzionerà correttamente....

Ho appena dimenticato....

Ma questo non significa che la stessa tabella dinamica non funzioni.

Amico, l'utente deve conoscere la documentazione, sa cosa mettere in quale array e come aggiornare il tutto? Ti ho chiesto di scrivere una dimostrazione perfettamente funzionante, che sarebbe dal tuo codice per capire come e cosa si fa e dove e cosa si inserisce, ma tu hai cancellato il mio TOR e me lo hai restituito sotto forma di una tabella storta!

 
Vasiliy Sokolov:

Sento solo un gran mucchio di negligenza in te, nel tuo codice e in tutte le cose che fai, più o meno per le persone, ma quando si arriva allo specifico, iniziano le stronzate. Fate una cosa piccola ma buona e di alta qualità. Voi dite che tutto è semplice da risolvere, elementare. Ma per qualche motivo avete fatto una soluzione in cui non c'è niente. Cosa ti ha impedito di fare tutte queste semplici patatine in una quindicina di giorni?

Mi dispiace per la negatività. È solo che mi hai deluso. Speravo di vedere di più e meglio. Per favore, correggete il vostro demo. Farlo buono, di alta qualità, secondo la richiesta e senza parole del tipo: "Sì, è elementare, ha bisogno di un ritocco qui". Suggerire una soluzione fuori dagli schemi, che potrebbe essere contestata.

Vasiliy, non diventare emotivo. Non ho mai avuto nessuna mancanza di rispetto. Semplicemente non ho lavorato con gli ordini per molto tempo e ho dimenticato come si fa. Ma è un compito dell'utente.

Ma lo farò comunque. Visto che lo trovi così difficile...

 
Реter Konow:

Vasily, non c'è bisogno di emozioni. Non ho avuto nessun tipo di mancanza di rispetto. Semplicemente non ho lavorato con gli ordini per molto tempo e ho dimenticato come farlo. Ma è un compito dell'utente.

Ma lo farò comunque. Se pensi che sia così complicato...

Allora fallo. Non lo trovo così complicato, ma ripeto, non c'è documentazione per il tuo motore, e non so quale array aggiornare con quali parametri. Ciò di cui ho bisogno è una dimostrazione sotto forma di una soluzione completa. Questo è l'unico modo per capire cosa state facendo e come funziona. È esattamente quello che mi aspettavo da te. Quando lo creerete, discuteremo delle soluzioni tecniche. E in generale, prendete la critica esterna, anche quella esperta, come una critica positiva, perché il feedback negativo è di solito più prezioso di quello positivo.

 

Vi spiegherò come funziona una tabella dinamica:

1. Quando i pulsanti di acquisto/vendita vengono cliccati, il segnale va al file External Connection nel blocco di case del pulsante stesso.

case BUTTON3___BUY:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:  
                               
                              int ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-30*Point,Ask+50*Point,NULL,16384,0,Green);  
                              //--------------------------------------------------------------------------------------- 
                              if(ticket>0)
                                {
                                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                   {
                                    Alert("BUY order opened");
                                    //----------------------------------------------------
                                    E_Main_form_1__Order(ticket,ticket);
                                    E_Main_form_1__Opening_Time(ticket,TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));
                                    E_Main_form_1__Type(ticket, "BUY");
                                    E_Main_form_1__Volume(ticket,OrderLots());
                                    E_Main_form_1__Symbol(ticket, OrderSymbol());
                                    E_Main_form_1__Price(ticket, OrderOpenPrice());
                                    E_Main_form_1__Comission(ticket, OrderCommission());
                                    E_Main_form_1__Swap(ticket, OrderSwap());
                                    E_Main_form_1__PnL(ticket, OrderProfit()); 
                                    //----------------------------------------------------
                                   }
                                 //--------------------------------------  
                                 ArrayResize(Orders,OrdersTotal());
                                 Orders[OrdersTotal() - 1] = ticket;   
                                 //--------------------------------------                                    
                                }
                              else Print("Error opening BUY order : ",GetLastError());
                              //---------------------------------------------------------------------------------------
                break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;

Dovete sapere che una nuova riga viene aperta automaticamente se un nuovo biglietto viene inviato alla funzioneE_Main_form_1__Price(ticket, OrderOpenPrice());.

Se il biglietto esiste già, la riga desiderata viene selezionata AUTOMATICAMENTE e il nuovo valore viene impostato lì.

Per chiudere una riga della tabella chiama la funzione E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

Il biglietto significa il biglietto di fila.

 
Реter Konow:

Vi spiegherò come funziona una tabella dinamica:

1. Quando i pulsanti di acquisto/vendita vengono cliccati, il segnale va al file External Connection nel blocco di case del pulsante stesso.

Dovete sapere che una nuova riga viene aperta automaticamente se un nuovo biglietto viene inviato alla funzioneE_Main_form_1__Price(ticket, OrderOpenPrice());.

Se il biglietto esiste già, la riga desiderata viene selezionata AUTOMATICAMENTE e il nuovo valore viene impostato lì.

Per chiudere una riga della tabella chiamate la funzione E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

Biglietto significa biglietto di fila.

Peter, fai un ciclo for nel timer che passerebbe attraverso gli ordini aperti e invierebbe i cambiamenti nella lista degli ordini alla tua tabella. Inoltre, assicuratevi che anche il profitto dell'ordine nella vostra tabella cambi dinamicamente.

 
Реter Konow:

Vi spiegherò come funziona una tabella dinamica:

1. Quando i pulsanti di acquisto/vendita vengono cliccati, il segnale va al file External Connection nel blocco di case del pulsante stesso.

Dovete sapere che una nuova riga viene aperta automaticamente se un nuovo biglietto viene inviato alla funzioneE_Main_form_1__Price(ticket, OrderOpenPrice());.

Se il biglietto esiste già, la riga desiderata viene selezionata AUTOMATICAMENTE e il nuovo valore viene impostato lì.

Per chiudere una riga della tabella chiamate la funzione E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

Biglietto significa biglietto di fila.

Questa è un'implementazione storta, ed ecco la risposta:

Forum sul trading, sistemi di trading automatico e test di strategia

Il mio approccio. Nucleo - Motore.

Vasiliy Sokolov, 2019.01.09 13:33

Peter, mi dispiace, ma il tuo lavoro non è accettato, poiché quello che hai inviato è un raro lavoro di hacking. Mi dispiace ma sembra che io sia l'unico che ha eseguito ciò che hai inviato, e nessun altro farà la perizia a parte me.

Quindi, nell'ordine, l'incarico era il seguente:

Quello che vedo invece:

In primo luogo, le compravendite possono essere aperte solo nel tuo pannello cliccando il pulsante di acquisto/vendita. Se la posizione viene aperta attraverso la finestra standard, il trade non appare.

....

Finora, un grasso no-go. Aspettando i vostri perfezionamenti. E niente rendering 3D fino a quando non l'avrete capito!

 

Supponiamo di avere diverse tabelle dinamiche.

Il file Connection Properties stamperà automaticamente delle funzioni wrapper per lavorare con queste tabelle.

Ecco un esempio illustrativo. Abbiamo disegnato una tabellaOrders_table dinamica.

Queste sono le funzioni wrapper che abbiamo:

void E_Main_form_1__Order(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Opening_Time(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Type(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Volume(long Magic, string Value)
//---------------------------------------------------------------------------------------------------------
void E_Main_form_1__Symbol(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Price(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Comission(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Swap(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__PnL(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Close(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)
//----------------------------------------------------------------------------------------------------------------

Nota: ogni wrapper ha un nome di colonna dyn.table alla fine del suo nome.

L'elemento specifico non è specificato, solola riga Magic.

Cioè, per impostare un nuovo valore in una cella di una riga esistente, dovete inviare la sua magia e il suo valore.

Per impostare un nuovo valore in una cella di una riga inesistente, dovete inviare il suo magik e il suo valore. La riga verrà creata automaticamente.

Per distruggere una riga nella tabella, dovete chiamare il wrapper con le paroleCLOSE_ROW

Per esempio:

void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)

E passateci dentro il majik della fila che volete chiudere.

Questo è tutto.

 
Vasiliy Sokolov:

Peter, fai un ciclo for nel timer, che passerebbe attraverso gli ordini aperti e invierebbe i cambiamenti nella lista degli ordini alla tua tabella. Assicuratevi anche che il profitto dell'ordine nella vostra tabella cambi dinamicamente.

Ok, scriverò cicli e codice per lavorare con gli ordini, ma lo darò a te per metterlo da solo, perché ho già convertito il motore per collegare attraverso le risorse e lo sto testando. In questo momento non posso recuperare il vecchio link e non ho ancora finito quello nuovo.

 
Реter Konow:

OK, scriverò i cicli e il codice per lavorare con gli ordini, ma ti lascio il compito di impostarlo da solo, perché ho già riprogettato il motore per comunicare attraverso le risorse e lo sto testando. In questo momento non posso recuperare il vecchio link e non ho ancora finito quello nuovo.

Lavorate con la versione del motore che avete allegato come dimostrazione.

Tag Konow:

Cioè, per impostare un nuovo valore in una cella di una riga esistente, è necessario inviare la sua maiuscola e il suo valore.

Mi sembra semplice. Se il tuo approccio funziona come penso, allora non vedo alcun problema né con una tabella dinamica né con l'aggiornamento dei valori di posizione tramite un timer. Peter, perché hai dovuto fare una gobba all'inizio?)

Motivazione: