Discussione sull'implementazione dei consiglieri. - pagina 2

 
Georgiy Merts:

Inoltre, questo stesso forumer quando gli è stata posta la domanda ha detto che non si ricorda più, solo che questo codice è già stato testato molte volte e può essere affidabile.

Beh, se avrò la possibilità di sostituire queste stupide "domande" con vere e proprie affermazioni if, capirò come fare... Per ora...

A proposito, oggi ho dato un'occhiata a questo orrore.

Ecco cosa significa:

ENUM_ORDER_TYPE_FILLING otfMyRes  = WRONG_VALUE;   

if(iFillingMode == 0 || (otfFilingType >= ORDER_FILLING_RETURN) || ((iFillingMode & (otfFilingType + 1)) != otfFilingType + 1))
	{
        if(steExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE || steExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)
                otfMyRes = ORDER_FILLING_RETURN;
        else   
                if(iFillingMode == SYMBOL_FILLING_IOC)
                        otfMyRes = ORDER_FILLING_IOC;
                else
                        otfMyRes = ORDER_FILLING_FOK;
        }
   else      
        otfMyRes = otfFilingType;

return(otfMyRes);  

Secondo me, è molto più chiaro senza queste "domande", attraverso i se e con i trattini. Anche se l'efficienza del codice è assolutamente la stessa.

A proposito, si vede subito che l'autore si è attaccato ai valori numerici di iFillingMode e otfFilingType, il che, secondo me, non è una buona pratica.

 
Georgiy Merts:

A proposito, oggi ho dato un'occhiata a questo orrore.

Ecco cosa significa:

Secondo me, è molto più chiaro senza queste "domande", attraverso i se e con i trattini. Anche se l'efficienza del codice è assolutamente la stessa.

A proposito, si vede subito che l'autore si è attaccato ai valori numerici di iFillingMode e otfFilingType, il che, secondo me, non è una buona pratica.

Nella mia lib è così:

#ifdef __MQL5__
   ENUM_ORDER_TYPE_FILLING COrder::GetFilling(ENUM_FILLING_MODE mFilling){
      if (!_fillingMode) return ORDER_FILLING_RETURN;
      else if (mFilling==FILLING_AUTO||mFilling==FILLING_FOK) return !(_fillingMode&SYMBOL_FILLING_FOK)?ORDER_FILLING_IOC:ORDER_FILLING_FOK;
      else return  !(_fillingMode&SYMBOL_FILLING_IOC)?ORDER_FILLING_FOK:ORDER_FILLING_IOC;}
#endif

_fillingMode è una macro che si espande nella dereferenziazione di questo campo

fillingMode=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
 
Georgiy Merts:

Questa è un'altra cosa.

A pensarci bene, a volte guardo il mio stesso codice e non capisco perché è scritto in quel determinato posto. È per questo che cerco di commentare questi posti in modo molto dettagliato, cercando di menzionare tutti i particolari. Ma ancora vedo regolarmente che non ho considerato alcune cose.

Inoltre, uso il seguente codice (per determinare il tipo di esecuzione), che è stato scritto da un utente molto autorevole del forum:

Inoltre, questo stesso forumer ha detto, quando gli è stato chiesto, che non si ricorda più, è solo che questo codice è già stato testato molte volte e ci si può fidare .

Beh, se avrò la possibilità di sostituire queste stupide "domande" con vere e proprie affermazioni if, capirò come fare... Per ora...

Giallo - molto strano che una persona non possa capire immediatamente il codice banale che ha scritto lui stesso.

Red - non sono stato troppo pigro e ho controllato di nuovo, quando eseguo sul mercato, non posso ORDER_FILLING_RETURN, è solo per lo stock (c'è un errore nei docks), e questo è quello che il rispettabile proprietario del forum ha riportato))

 
Vladimir Simakov:

Giallo - è molto strano che una persona non possa capire un codice banale, che ha scritto lui stesso.

Red - non mi sono sentito pigro e ho controllato di nuovo, quando si esegue sul mercato, non si può ORDER_FILLING_RETURN, è solo per lo scambio (c'è un errore nelle banchine), e questo è quello che restituisce il rispettato membro del forum))

Non so, non so quanto sia "banale" questo codice in una tale voce. Mi ci sono voluti almeno 15 minuti per capire la sua logica, e solo scrivendo i se ha avuto senso per me.

E riguardo al fatto che "c'è un errore nei documenti", puoi spiegarti meglio?

 
Georgiy Merts:

Non so, non so quanto sia "banale" questo codice in un post come questo. Mi ci sono voluti almeno 15 minuti per capire la logica del suo lavoro, ed è stato solo scrivendo i se che mi è diventato chiaro.

E riguardo all'"errore in banchina" - puoi dirmi di più?

All'esecuzione dello scambio

SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE)

restituisce 0, ma a mercato (ho controllato su Alpari)

SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK

Ho controllato con Alpari e restituisce 0x3. Se lo provi in questo modo

MqlTradeRequest::filling_mode=ORDER_FILLING_RETURN

Se ci provi, non si apre.

 
Vladimir Simakov:

allora non si aprirà.

Controllato la funzione originale.

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  if (!OrdersTotal())
  {
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_FOK, 0, 0);    
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_IOC, 0, 0);    
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_RETURN, 0, 0);    
  }  
}

Funziona.

 
fxsaber:

Controllato la funzione originale.

Funziona.

Provatelo sull'esecuzione di mercato piuttosto che sull'esecuzione in borsa)

UPD: correzione, su esecuzione immediata, quella che

SYMBOL_TRADE_EXECUTION_INSTANT

 
Vladimir Simakov:

Prova sull'esecuzione sul mercato piuttosto che sull'esecuzione in borsa)

UPD: correzione, su esecuzione immediata, quella che

SYMBOL_TRADE_EXECUTION_INSTANT

Test EA di cui sopra. Provalo.

 
Vladimir Simakov:

Prova sull'esecuzione sul mercato piuttosto che sull'esecuzione in borsa)

UPD: correzione, su esecuzione immediata, quella che

SYMBOL_TRADE_EXECUTION_INSTANT

Questi sono per esempio conti di tipo standard in A-ri, giusto?

E i broker che trattano hanno sempre questo tipo di esecuzione, giusto?

Solo per chiarire.

 

Perché preoccuparsi?

Usa classi standard e non ha bisogno di riempire nessuna struttura(MqlTradeRequest) e non ha bisogno di conoscere nessun riempimento e istanza:


#include<Trade\SymbolInfo.mqh>
#include<Trade\AccountInfo.mqh>
#include<Trade\Trade.mqh>

CTrade  
CAccountInfo 
CPositionInfo