Organisation des Auftragszyklus - Seite 12

 
Artyom Trishkin:

- Wozu braucht man eine Bratpfanne?

- Zum Beispiel, um Eier zu braten.

- es geht nicht um Rührei, es geht um die Pfanne...


Oh, das ist lustig... zwei Angreifer stoßen aufeinander... Mach weiter so. Es ist langweilig...

 
Artyom Trishkin:

- Wozu braucht man eine Bratpfanne?

- Wie zum Beispiel das Braten von Eiern.

- Wir reden hier also nicht von Rührei, sondern von einer Bratpfanne...

Haben Sie das gesehen? Ich glaube schon, dass wir beide in einer Nahtoderfahrung stecken.

Ich werde ein wenig faul, diese Diskussion fortzusetzen. Ich kann nicht verstehen, warum man jede Millisekunde die Aufträge durchgehen muss. Es sei denn, es geht darum, ein Ei zu braten...

 
Alexey Viktorov:

Haben Sie das gesehen? Ich glaube schon, dass wir beide in einer Nahtoderfahrung stecken.

Ich werde ein wenig faul bei dieser Diskussion. Ich kann nicht verstehen, warum wir die Aufträge im Millisekundentakt durchgehen müssen. Es sei denn, Sie wollen damit Eier braten...

Jepp... hat es genau in die Ferse getroffen... :)
Ich sage nicht, jedes Mal. Aber oft rechtzeitig, um eine Veränderung in der Umgebung zu erkennen.
 
Nun, ich spiele nicht so ... verwelkt ... enttäuscht...
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Organisieren einer Auftragsschleife

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)));
}

Version ohne Bezug zur Geschichte.

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);
}

Diese Version ist besonders für MT5 auf VPS relevant, da MT5 mit History sehr langsam arbeitet und rechenintensiv ist.

 
fxsaber:

Version ohne Historienbezug.

Diese Version ist besonders für MT5 auf VPS relevant, da MT5 sehr langsam und rechenintensiv ist.


In einem solchen Fall ist es besser, die reguläre Funktion OnTrade() zu verwenden.

OnTrade

Diese Funktion wird beim Auftreten des Ereignisses"Handel" aufgerufen, das beim Ändern der Liste dererteilten Aufträge undoffenen Positionen, derAuftragshistorie und derHistorie der Geschäfte auftritt. Bei jeder Handelsaktion (Eröffnung eines schwebenden Auftrags, Eröffnung/Schließung einer Position, Setzen von Stops, Auslösung eines schwebenden Auftrags usw.) wird die Historie der Aufträge und Geschäfte und/oder die Liste der Positionen und aktuellen Aufträge entsprechend geändert.

 
Sergey Chalyshev:

In diesem Fall ist es besser, die reguläre Funktion OnTrade() zu verwenden.

Das können Sie leider nicht. Genau darum geht es in der Branche.

 
Nur wenige werden dieser Aussage widersprechen

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2018.01.23 09:39

Nach fehlgeschlagenem OrderSend und erfolgreichem OrderSend muss die aktuelle Handelsumgebung komplett neu eingelesen werden. Diese Regel sollte immer gelten.

Dies ist eine universelle Faustregel. Aber nur wenige Menschen denken über die Umsetzung im MT5 nach. Deshalb habe ich eine Vorlage mit den unkompliziertesten TS geschrieben (in kodobase sind fast alle so)

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

#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);
}

Aus irgendeinem Grund schreiben manche Leute mehr Code für denselben TS. Aber dieser Code funktioniert genauso gut. Die meisten TCs erfordern nur das Schreiben von BuySignal und SellSignal. Mehr ist nicht nötig.

Die Vorlage wurde speziell mit SB geschrieben. Also Frage an MT5-Experten, ist der Code korrekt?

 
fxsaber:
Kaum jemand würde dieser Aussage widersprechen

Dies ist eine universelle Regel. Aber nicht viele Leute denken über die Implementierung in MT5 nach. Deshalb habe ich eine Vorlage mit den unkompliziertesten TS geschrieben (in kodobase sind fast alle so)

Aus irgendeinem Grund schreiben manche Leute mehr Code für denselben TS. Aber dieser Code funktioniert genauso gut. Die meisten TCs erfordern nur das Schreiben von BuySignal und SellSignal. Mehr ist nicht nötig.

Die Beispielvorlage ist speziell mit SB geschrieben. Also Frage an MT5-Experten, ist der Code korrekt?

Zu dieser Aussage:

Nach fehlgeschlagenem OrderSend und erfolgreichem OrderSend muss die aktuelle Handelsumgebung komplett neu eingelesen werden. Diese Regel muss immer gelten.

Warum sollten wir nach einem Fehlschlag überhaupt alles abziehen? Warum sollten wir die Auftrags- und Positionshistorie überprüfen? Auch die aktuellen Aufträge und Positionen? Reicht es nicht aus, die Preise und die erforderlichen Daten für den aktuellen Zeitpunkt zu aktualisieren?

 
Artyom Trishkin:

Warum sollte man nach einer schlechten Leistung alles zurückziehen? Warum sollte man sich mit der Geschichte der Aufträge und Positionen beschäftigen? Auch aktuelle Aufträge und Positionen? Reicht es nicht aus, die Preise und die Daten zu aktualisieren, die wir im Moment brauchen?

Wenn Sie es wörtlich nehmen, können Sie die vergangenen Tick-Historien für jedes Symbol von Market Watch lesen. Aber ich denke, Sie verstehen die Bedeutung dieser Aussage.

Der Code setzt diese Aussage in gewisser Weise um. Deshalb hatte ich eine Frage an alle, die sich mit MT5 auskennen: Ist der Code korrekt?