Domande da un "manichino" - pagina 13

 
stringo:

In realtà, ci sono ben 8 byte di informazioni date al messaggio, che possono essere interpretate come si vuole. Può essere datetime, double, 4 short, 8 char, o 64 bit bit per bit.

Con i quattro, 4 byte di magia erano sufficienti per codificare qualsiasi cosa, ma ora ne abbiamo 8. Tutto ciò che serve è un desiderio.

Lo so, l'ho usato abbastanza bene nel 4, e ho letto l'articolo (l'idea mi è piaciuta molto).

Qui non è chiaro - Perché i diversi tipi sono specificati in posti diversi?

 

Si prega di consigliare come si può chiudere una posizione con TP e SL, se il prezzo è vicino al TP e si ha bisogno di uscire ora.

Mando un ordine per aprire una nuova posizione di pari volume. Nella maggior parte dei casi funziona. Ma a volte ho una situazione in cui una posizione ha il tempo di chiudersi per TP e invece di chiudersi, ottengo una nuova posizione nel mercato... :(

Come posso indicare che la posizione aperta si riferisce alla chiusura di una posizione esistente, e se la posizione principale è già stata chiusa, non per aprirne una nuova?

Posso pensare a opzioni come "rimuovere SL e TP prima della chiusura o aspettare che il TP si chiuda", ma non sono belle soluzioni. Non possiamo eseguire una semplice operazione come chiudere una posizione come abbiamo fatto in MT4?

 

Cercate PositionClose nella classe CTrade.
Sono sicuro che sarà lo stesso del tuo. Una conclusione è inevitabile: non c'è altro modo.

Ma appoggio la sua richiesta. Chiedo agli sviluppatori di considerare questa variante.

Aggiungere il tipo di operazione TRADE_ACTION_CLOSE - chiusura di una posizione per un simbolo specificato nel suo volume al prezzo corrente.

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

In realtà, ci sono ben 8 byte di informazioni date al messaggio, che possono essere interpretate come si vuole. Può essere datetime, double, 4 short, 8 char, o 64 bit bit per bit.

Con i quattro, 4 byte di magia erano sufficienti per codificare qualsiasi cosa, ma ora ne abbiamo 8. Sarebbe solo un pio desiderio.

Circa 8 byte in long e ulong era chiaro dal Riferimento. Ciò che è preoccupante è l'uso incoerente di questi tipi rispetto alla magia.

Un semplice esempio: è accettabile assegnare request.magic=ULONG_MAX-1 quando si invia una richiesta di scambio. Perché il Manuale di Riferimento dice che la funzione OrderGetInteger(ORDER_MAGIC) restituisce solo il tipo lungo? Inoltre, la magia restituisce anche il tipo lungo sia per le posizioni che per gli scambi.

Allora, come è stato progettato in origine? Forse, dovremmo specificare per lastruct MqlTradeRequest che la magia è di tipo lungo, perché le funzioni HistoryDealGetInteger(), PositionGetInteger(), OrderGetInteger() etc. non sono destinate a restituire valori interi maggiori di LONG_MAX?

 
Yedelkin:

Gli 8 byte di long e ulong erano chiari dal Manuale di riferimento. L'uso incoerente di questi tipi in relazione alla magia è preoccupante.

Un semplice esempio: quando si invia una richiesta di scambio, è accettabile assegnare request.magic=ULONG_MAX-1. Perché il Manuale di Riferimento dice che la funzione OrderGetInteger(ORDER_MAGIC) restituisce solo il tipo lungo? Inoltre, la magia restituisce anche il tipo lungo sia per le posizioni che per gli scambi.

Allora, come è stato progettato in origine? Forse, dovremmo specificare per lastruct MqlTradeRequest che la magia è di tipo lungo, perché le funzioni HistoryDealGetInteger(), PositionGetInteger(), OrderGetInteger() etc. non sono destinate a restituire valori interi maggiori di LONG_MAX?

In realtà il magik è di tipo lungo (questo può essere facilmente verificato formando un magik negativo e un magik con un valore al di fuori della gamma di valori di tipo lungo).

Per verificarlo, possiamo modificare leggermente il Night Expert Advisor (non usa classi della libreria standard).

Per rendere l'esperimento pulito, dovremmo cambiare il tipo di parametro EA_Magic in long e srotolare il mago dell'ultimo ordine nella storia (se l'ordine è stato impostato con successo).


 

Interesting:
В действительности магик имеет тип long (это легко проверяется формированием отрицательного магика и магика со значением выходящим за диапазон значений типа long).

Se è così, deve essere fatta una precisazione nella descrizione dell'elemento magico della strutturaMqlTradeRequest, togliendo la lettera "u" dal nome del tipo.
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
 
Yedelkin:
Se è così, è necessario chiarire la descrizione dell'elemento magico della strutturaMqlTradeRequest rimuovendo "u"dal nome del tipo.
È una buona idea fare dei cambiamenti anche nella classe CTrade (se gli sviluppatori non vogliono limitare il valore magico solo ai valori positivi).
 
stringo:

In realtà, ci sono ben 8 byte di informazioni date al messaggio, che possono essere interpretate come si vuole. Può essere datetime, double, 4 short, 8 char, o 64 bit bit per bit.

Con i quattro, 4 byte di magia erano sufficienti per codificare qualsiasi cosa, ma ora ne abbiamo 8. Sarebbe solo un pio desiderio.

In realtà, non sono 64 ma solo 63 bit (cioè 8 byte incompleti). Sarebbero 8 byte se usassimo l'intero intervallo lungo.

Ma purtroppo...

Da un lato, l 'ulong magico viene passato nella struttura MqlTradeRequest. Significa che si possono impostare solo valori positivi.

D'altra parte, le funzioni PositionGetInteger/OrderGetInteger restituiscono il tipo long. Significa che la metà della gamma ulong è tagliata fuori.

Ciò che abbiamo di fatto è 63 bit invece dei 64 bit descritti sopra. In realtà, non è tanto male quanto un grande inconveniente per i principi del controllo dell'ordine.

Sarebbe molto più conveniente usare lo stesso sistema di MT4 - consentire ai maghi con un segno. Poiché molti sistemi di trading si basano su un semplice principio che utilizza il simbolo stesso di un mago. Poiché è molto più facile dividere un sistema in due e filtrare gli ordini usando la solita funzione MathAbs( OrderMagicNumber() ).


 
sergeev:

In realtà non è 64 ma solo 63 bit (cioè un 8 byte incompleto). 8 byte sarebbe se si usasse l'intera gamma di longs.

Vi sbagliate.

Si usano 64 bit e sta a voi decidere come usarli. Lungo/lungo non fa differenza, tutto dipende da come si interpretano quei 64 bit. Se volete usare long come un long firmato - usatelo, se volete usarlo come un ulong senza segno - nessun problema. Se volete usare altri tipi di dati in questi 64 bit, fatelo.

Questo è esattamente ciò di cui ha scritto Slava.

 
sergeev:

In realtà non è 64 ma solo 63 bit (cioè un 8 byte incompleto). 8 byte sarebbero se si usasse l'intero intervallo lungo.

Ma purtroppo...

Da un lato, l 'ulong magico viene passato nella struttura MqlTradeRequest. Significa che si possono impostare solo valori positivi.

D'altra parte, le funzioni PositionGetInteger/OrderGetInteger restituiscono il tipo long. Significa che la metà della gamma ulong è tagliata fuori.

In tutto, abbiamo 63 bit invece dei 64 bit descritti sopra. In realtà, non è tanto male quanto un grande inconveniente per i principi del controllo dell'ordine.

Sarebbe molto più conveniente usare lo stesso sistema di MT4 - consentire ai maghi con un segno. Poiché molti sistemi di trading si basano su un semplice principio che utilizza il simbolo stesso di un mago. Poiché è molto più facile dividere un sistema in due e filtrare gli ordini usando la solita funzione MathAbs( OrderMagicNumber() ).

Onestamente sono perplesso, state esagerando su una cosa da niente. Assolutamente no. Questo problema non esiste, l'hai appena inventato. Risolvete le conversioni di tipo fino alla fine.

Spero che il pezzo qui sotto vi aiuti. Copiatelo in uno script, compilatelo, eseguitelo nel terminale e poi pensate molto attentamente. Buona fortuna.

void OnStart()
  {
    Print("//------ ");

    int i_A = -100;
    uint ui_B = uint(-100);
    
    Print(i_A," ",uint(i_A));
    Print(int(ui_B)," ",ui_B);

    i_A = int(4294967196);
    ui_B = 4294967196;

    Print(i_A," ",uint(i_A));
    Print(int(ui_B)," ",ui_B);
//--
    long l_A = -100;
    ulong ul_B = ulong(-100);
    
    Print(l_A," ",ulong(l_A));
    Print(long(ul_B)," ",ul_B);
   
    l_A = long(18446744073709551516);
    ul_B = 18446744073709551516;
    
    Print(l_A," ",ulong(l_A));
    Print(long(ul_B)," ",ul_B);
  }
Motivazione: