Organizzazione del ciclo dell'ordine - pagina 12

 
Artyom Trishkin:

- A cosa ti serve una padella?

- Per esempio, per friggere le uova.

- non si tratta di uova strapazzate, ma della padella...


Ooh - divertente - due attaccanti che si scontrano... Continuate così, è noioso...

 
Artyom Trishkin:

- A cosa ti serve una padella?

- Come friggere le uova, per esempio.

- Quindi non stiamo parlando di uova strapazzate, ma di una padella...

Hai visto? Già penso che io e te siamo bloccati in un'esperienza di quasi morte.

Sto diventando un po' pigro nel continuare questa discussione. Non riesco a capire perché ogni millisecondo si debba passare attraverso gli ordini. A meno che non sia per friggere un uovo...

 
Alexey Viktorov:

Hai visto? Già penso che io e te siamo bloccati in un'esperienza di quasi morte.

Sto diventando un po' pigro con questa discussione. Non riesco a capire perché dobbiamo passare gli ordini ogni millisecondo. A meno che tu non voglia friggerci delle uova...

Sì... l'ha preso proprio nel tallone... :)
Non dico ogni volta. Ma spesso, in tempo per rilevare un cambiamento nell'ambiente.
 
Beh, io non gioco così ... appassito ... deluso...
 

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

Organizzare un ciclo di ordini

fxsaber, 2017.10.06 02:00

bool IsChange( const bool InitFlag = false )
{
  static int PrevTotal = 0;
  static int PrevHistoryTotal = 0;
  
  const int Total = OrdersTotal();
  const int HistoryTotal = OrdersHistoryTotal();    
  
  if (InitFlag)
  {
    PrevTotal = Total;
    PrevHistoryTotal = HistoryTotal;    
  }
  
  return(!InitFlag && ((Total != PrevTotal) || (HistoryTotal != PrevHistoryTotal)));
}

Versione senza riferimento alla storia.

struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}

Questa versione è particolarmente rilevante per MT5 su VPS, poiché MT5 lavora con la Storia molto lentamente ed è computazionalmente costosa.

 
fxsaber:

Versione senza riferimento alla storia.

Questa versione è particolarmente importante per MT5 su VPS, poiché MT5 è molto lento e richiede molta CPU.


In questo caso è meglio usare il normale OnTrade().

OnTrade

Questa funzione viene chiamata quando si verifica un eventoTrade, che cambia la lista degliordini piazzati e delleposizioni aperte, lastoria degli ordini e lastoria delle operazioni. Quando una qualsiasi azione di trading (apertura di un ordine pendente, apertura/chiusura di una posizione, impostazione di stop, attivazione di un ordine pendente, ecc.) la storia degli ordini e delle operazioni e/o la lista delle posizioni e degli ordini correnti viene modificata di conseguenza.

 
Sergey Chalyshev:

In questo caso, è meglio usare il normale OnTrade().

Non si può, purtroppo. Questo è ciò che riguarda il ramo.

 
Pochi si opporranno a questa affermazione

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

Bug, bug, domande

fxsaber, 2018.01.23 09:39

Dopo che OrderSend ha fallito e OrderSend ha avuto successo, l'ambiente di trading corrente deve essere letto di nuovo completamente. Questa regola dovrebbe essere sempre applicata.

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

// Шаблон большинства ТС

#include <Trade/Trade.mqh>

// Сигнал на покупку
bool BuySignal( const string Symb ) { return(true); }

// Сигнал на продажу
bool SellSignal( const string Symb ) { return(false); }

// Находит позицию соответствующего типа
bool PositionsScan( const string Symb, const ENUM_POSITION_TYPE Type )
{
  for (int i = PositionsTotal() - 1; i >= 0; i--)
    if ((PositionGetSymbol(i) == Symb) && (PositionGetInteger(POSITION_TYPE) == Type))
      return(true);    
    
  return(false);  
}

// Торговое действие на сигнал
bool Action( const string Symb, const ENUM_POSITION_TYPE Type, const double Lots = 1 )
{
  static CTrade Trade;    
  bool Res = true;    
  
  // Закрыли противоположные сигналу позиции
  while ((PositionsScan(Symb, (ENUM_POSITION_TYPE)(1 - Type))) && (Res = Trade.PositionClose(PositionGetInteger(POSITION_TICKET))));

  // Открыли позицию по сигналу
  return(Res && !PositionsScan(Symb, Type) && (Type ? Trade.Sell(Lots, Symb) : Trade.Buy(Lots, Symb)));
}

// Шаблон торговой стратегии
void Strategy( const string Symb )
{
  if (BuySignal(Symb))
    Action(Symb, POSITION_TYPE_BUY);
  else if (SellSignal(Symb))
    Action(Symb, POSITION_TYPE_SELL);
}

void OnTick()
{
  Strategy(_Symbol);
}

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 c'è bisogno di altro.

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

 
fxsaber:
Quasi nessuno avrebbe da ridire su 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 c'è bisogno di altro.

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

Su questa dichiarazione:

Dopo un fallimento di OrderSend e un OrderSend riuscito, l'ambiente di trading corrente deve essere letto di nuovo completamente. Questa regola deve essere sempre applicata.

Perché dovremmo tirare tutto dopo un fallimento? Perché dovremmo controllare la cronologia degli ordini e delle posizioni? Anche gli ordini e le posizioni attuali? Non è sufficiente aggiornare i prezzi e i dati necessari per il momento attuale?

 
Artyom Trishkin:

Perché tirare tutto dopo un brutto colpo? Perché preoccuparsi della storia degli ordini e delle posizioni? Anche gli ordini e le posizioni attuali? Non è sufficiente aggiornare i prezzi e i dati di cui abbiamo bisogno al momento?

Se lo prendi alla lettera, allora puoi leggere la storia dei tick passati per ogni simbolo da Market Watch. Ma credo che lei comprenda davvero il significato dell'affermazione.

Il codice implementa più o meno questa affermazione. Ecco perché avevo una domanda per tutti coloro che capiscono MT5: il codice è corretto?