Organisation des Auftragszyklus - Seite 14

 
Andrey Khatimlianskii:

Garantiert OrderClose, dass der Handel abgeschlossen wird?

Das ist nicht garantiert, aber der Code enthält eine entsprechende Prüfung. Jeder OnTick-Aufruf ist unabhängig vom vorhergehenden.

 
fxsaber:

Das ist nicht garantiert, aber der Code enthält eine Prüfung für diesen Fall. Jeder OnTick-Aufruf ist unabhängig vom vorhergehenden.

OK, das Schließen beim nächsten Ticken reicht.

 
@Artyom Trishkin,@Andrey Khatimlianskii, Vielen Dank für Ihre Teilnahme! Es ist schade, dass sich niemand sonst zum MT5-Code geäußert hat. Offenbar finden sie alles in Ordnung.
 
fxsaber:
@Artyom Trishkin,@Andrey Khatimlianskii, Danke für die Teilnahme! Es ist schade, dass sich niemand zum MT5-Code geäußert hat. Offenbar finden sie alles in Ordnung.

Natürlich wurde das Beispiel gegeben, um zu zeigen, dass im MT5 nicht alles in Ordnung ist. Beispiel für das Problem

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

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

Was denken Sie, wenn Sie dieses Skript auf ein Symbol ohne Positionen anwenden, was wird dann passieren?

Die richtige Antwort lautet, dass eine oder zwei Stellen geschaffen werden.

 
fxsaber:

Natürlich wurde das Beispiel gegeben, um zu zeigen, dass im MT5 nicht alles in Ordnung ist. Beispiel für das Problem

Was denken Sie, wenn Sie dieses Skript auf ein Symbol ohne Positionen anwenden, was wird dann passieren?

Die richtige Antwort lautet, dass eine oder zwei Stellen geschaffen werden.

Infolgedessen ist die große Mehrheit der MT5 Expert Advisors in Kodobase nicht korrekt geschrieben!

 
fxsaber:
Nur wenige werden 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?

Ich bin durch Zufall auf diesen Thread gestoßen und wollte eigentlich einen Thread starten, um über Strategievorlagen zu diskutieren. Ihre Vorlage ist nah genug an dem, was ich denke, ist richtig (lesbar für mich), aber immer noch mag ich nicht, wenn ein Aufruf einer Funktion in OnTick eingefügt wird, die eine ganze Bergbau-Mühle versteckt.

Einst schrieb ich sogar MetaEditor: Relying on the power of templates. Seitdem hat sich die Sprache geändert, kein Template-Editor. Es wäre interessant, diese Frage zu erörtern (vielleicht in einem separaten Thema) und auch einen Artikel zu diesem Thema zu verfassen. Ich bin der Meinung, dass man beim Schreiben von Code versuchen sollte, die Strategie auf einen Blick lesbar zu machen, ohne sich in Klassen- oder Makromethoden vertiefen zu müssen.

 
fxsaber:

Das hat zur Folge, dass die große Mehrheit der MT5 Expert Advisors in Kodobaz nicht korrekt geschrieben sind!

Wie immer - kategorisch. Das kann nicht sein, obwohl ich Ihren Code nicht gelesen habe.

 
Rashid Umarov:

Ich wollte schon seit langem einen Thread zur Diskussion von Strategievorlagen eröffnen. Ihre Vorlage ist nahe genug an dem, was ich denke, ist richtig (lesbar für mich), aber ich mag es immer noch nicht, wenn ein Aufruf einer Funktion in OnTick eingefügt wird, die die ganze Bergbau-Mühle versteckt.

Wenn Sie OnTick == Strategy setzen, wird die Vorlage auf eine obszöne Größe schrumpfen/schrumpfen.

Damals habe ich sogar einen Artikel MetaEditor: Building on the power of templates geschrieben . Seitdem hat sich die Sprache geändert, es gibt keinen Template-Editor mehr. Es wäre interessant, diese Frage zu erörtern (vielleicht in einem separaten Thema) und auch einen Artikel zu diesem Thema zu verfassen. Ich bin der Meinung, dass man beim Schreiben von Code versuchen sollte, die Strategie auf einen Blick lesbar zu machen, ohne sich in Klassen- oder Makromethoden vertiefen zu müssen.

So sieht die Vorlage für beide Plattformen aus. Es ist so einfach, dass es schwer ist, darüber zu diskutieren, obwohl es für MT5 grundlegend falsch ist. Aber Sie haben CExpert. Ich habe selbst noch nicht nachgeschaut - es ist beängstigend.

 
Rashid Umarov:

Wie immer - kategorisch. Das kann nicht sein, obwohl ich Ihren Code nicht gelesen habe.

Sie haben es gelesen, Ihre Meinung ist sehr interessant.

 
fxsaber:

Natürlich wurde das Beispiel gegeben, um zu zeigen, dass im MT5 nicht alles in Ordnung ist. Beispiel für das Problem

Was denken Sie, wenn Sie dieses Skript auf ein Symbol ohne Positionen anwenden, was wird dann passieren?

Die richtige Antwort lautet, dass eine oder zwei Stellen geschaffen werden.

Und wenn wir GetAmountPositions durch Standard OnTradeTransaction? ersetzen?

Ungefähr so:

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