Organizzazione del ciclo dell'ordine - pagina 14

 
Andrey Khatimlianskii:

OrderClose garantisce la chiusura della transazione?

Non garantito, ma c'è un controllo nel codice per questo. Ogni chiamata OnTick è indipendente dalla precedente.

 
fxsaber:

Non garantito, ma c'è un controllo nel codice per questo caso. Ogni chiamata OnTick è indipendente dalla precedente.

OK, la chiusura al prossimo tick andrà bene.

 
@Artyom Trishkin,@Andrey Khatimlianskii, Grazie per la vostra partecipazione! È un peccato che nessun altro abbia commentato il codice MT5. A quanto pare pensano che tutto vada bene.
 
fxsaber:
@Artyom Trishkin,@Andrey Khatimlianskii, Grazie per aver partecipato! È un peccato che nessuno abbia commentato il codice di MT5. A quanto pare pensano che tutto vada bene.

Naturalmente, l'esempio è stato dato per rispondere che non tutto va bene in MT5. Esempio che mostra il problema

// Пример неправильного считывания торгового окружения на каждом тике
// Скрипт эмулирует два тика ТС, которая должна открыть одну позицию, если ее нет.

#include <Trade/Trade.mqh>

// Возвращает количество позиций по символу
int GetAmountPositions( const string Symb )
{
  int Res = 0;
  
  // Этот MQL5-код с ошибкой
  for (int i = PositionsTotal() - 1; i >= 0; i--)
    if (PositionGetSymbol(i) == Symb)
      Res++;

/*
  // В MT4 такой код выполняется без ошибки
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Res++;
*/      
  return(Res);
}

// Пример OnTick
void ExampleOnTick()
{
  static CTrade Trade;
  
  // Если нет позиции, открываем
  if (!GetAmountPositions(_Symbol))
    Trade.Buy(1);    
}

// Эмуляция прихода двух Tick-событий
void OnStart()
{
  ExampleOnTick(); 
  
  Sleep(10); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}

Cosa pensate, se eseguite questo script su un simbolo senza posizioni, cosa succederà alla fine?

La risposta corretta è che una o due posizioni saranno aperte.

 
fxsaber:

Naturalmente, l'esempio è stato dato per rispondere che non tutto va bene in MT5. Esempio che mostra il problema

Cosa pensate, se eseguite questo script su un simbolo senza posizioni, cosa succederà alla fine?

La risposta corretta è che una o due posizioni saranno aperte.

Di conseguenza, la stragrande maggioranza degli Expert Advisors MT5 in Kodobase non sono scritti correttamente!

 
fxsaber:
Pochi si opporranno a questa affermazione

Questa è una regola universale. Ma non molte persone pensano alla sua implementazione in MT5. Ecco perché ho scritto un modello di TS più semplice (in kodobase quasi tutti sono così)

Per qualche motivo alcune persone scrivono più codice per lo stesso TS. Ma in realtà questo codice fa altrettanto bene. La maggior parte dei TC richiede solo la scrittura di BuySignal e SellSignal. Non è necessario nient'altro.

Il modello di esempio è scritto specificamente con SB. Quindi domanda agli esperti di MT5, il codice è corretto?

Sono arrivato a questo thread per caso, volevo iniziare un thread per discutere dei template di strategia molto tempo fa. Il tuo modello è abbastanza vicino a quello che penso sia corretto (leggibile per me), ma ancora non mi piace quando una chiamata di una funzione è inserita in OnTick, che nasconde un intero mulino minerario.

Una volta ho anche scritto MetaEditor: Relying on the power of templates. Da allora il linguaggio è cambiato, nessun editor di template. Sarebbe interessante discutere di questo problema (potrebbe essere in un thread separato), e anche ottenere un articolo sull'argomento. Credo che quando si scrive del codice si dovrebbe cercare di rendere la strategia leggibile a colpo d'occhio senza dover entrare nei metodi delle classi o delle macro.

 
fxsaber:

Di conseguenza - la stragrande maggioranza degli Expert Advisors MT5 in Kodobaz non sono scritti correttamente!

Come sempre - categoricamente. Non può essere, anche se non ho letto il tuo codice.

 
Rashid Umarov:

Era da molto tempo che volevo iniziare un thread per discutere dei modelli di strategia. Il tuo modello è abbastanza vicino a quello che penso sia corretto (leggibile per me), ma ancora non mi piace quando una chiamata di una funzione è inserita in OnTick, che nasconde l'intero mulino minerario.

Se fate OnTick == Strategy, il template si restringerà a una dimensione oscena.

Una volta ho anche scritto un articolo MetaEditor: Building on the power of templates. Da allora il linguaggio è cambiato, nessun editor di template. Sarebbe interessante discutere di questo problema (potrebbe essere in un thread separato), e anche ottenere un articolo sull'argomento. Credo che quando si scrive del codice si dovrebbe cercare di rendere la strategia leggibile a colpo d'occhio senza dover entrare nei metodi delle classi o delle macro.

Questo è il modo in cui il modello per entrambe le piattaforme ha mostrato. È così semplice che è difficile discuterne, anche se per MT5 è fondamentalmente sbagliato. Ma voi avete CExpert. Io stesso non ci ho guardato - fa paura.

 
Rashid Umarov:

Come sempre - categorico. Non può essere, anche se non ho letto il tuo codice.

Se lo leggi, la tua opinione è molto interessante.

 
fxsaber:

Naturalmente, l'esempio è stato dato per rispondere che non tutto va bene in MT5. Esempio che mostra il problema

Cosa pensate, se eseguite questo script su un simbolo senza posizioni, cosa succederà alla fine?

La risposta corretta è che una o due posizioni saranno aperte.

E se sostituiamo GetAmountPositions con OnTradeTransaction standard?

All'incirca così:

#include <Trade/Trade.mqh>
  int Res = 0;

// Возвращает количество позиций по символу
/*********************TradeTransaction function*********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol)
   {
    /******************** Если открылась позиция********************/
    if(PositionSelectByTicket(trans.position))
     Res++;
    /******************** Если закрылась позиция********************/
    if(!PositionSelectByTicket(trans.position))
     Res--;
   }
}/*******************************************************************/

// Пример OnTick
void ExampleOnTick()
{
  static CTrade Trade;
  
  // Если нет позиции, открываем
  if (Res == 0)
    Trade.Buy(1);    
}

// Эмуляция прихода двух Tick-событий
void OnStart()
{
  ExampleOnTick(); 
  
  Sleep(10); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}