Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 190

 
Vladimir Pastushak:

Ist es möglich, ein manuell erstelltes grafisches Objekt von einem Objekt zu unterscheiden, das von einem Indikator oder EA erstellt wurde?

In der Funktion

OBJPROP_HIDDEN

Den Namen eines grafischen Objekts aus dem Terminal-Menü "Diagramme" - "Objekte" - "Liste der Objekte" ausblenden. Der Wert true ermöglicht es, ein nicht benötigtes Objekt aus der Liste auszublenden. Standardmäßig ist "true" für Objekte eingestellt, die Kalenderereignisse, die Handelshistorie sowie dievom MQL5-Programm erstellten Objekte anzeigen. Um solchegrafischen Objekte zu sehen und auf ihre Eigenschaften zuzugreifen, klicken Sie auf "Alle" im Fenster "Liste der Objekte".

bool

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
Wahrscheinlich ist das bekannt, aber ich war mir dieser Nuance nicht bewusst.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: Experte

fxsaber, 2020.10.09 04:55

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Поставили задание в очередь чарта.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Заставляем двигаться очередь.
}

Ich habe eine wichtige Stelle im Code hervorgehoben. Ohne sie findet das Muster bis zum Ende des Skripts keine Anwendung.

 
Über den ersten Eingabeparameter in EventChartCustom

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 und Geschwindigkeit in Aktion

Anton, 2020.10.08 11:00

Unterschiedliche Bedeutung und unterschiedlicher Ausführungsmechanismus. 0 - Ereignis in der Warteschlange der "eigenen" Karte. -1 - Ereignis in seiner eigenen Warteschlange.

 
Vladimir Pastushak:

Am Ende der Woche ist mein Kopf schon nicht mehr gut.

Ich habe ein Ticket für eine offene Position in einem Hedge in mt5 z.B. 123456

Ich möchte einen Gewinn berechnen, nachdem die Position geschlossen wurde, und kann dies nicht tun.

Ich tue das, aber ich bekomme nur eine Provision...

Wie kann ich den Gewinn einer geschlossenen Position mit einem Ticket ermitteln?

Versuchen Sie, Trades mit HistorySelectByPosition() besser auszuwählen.

Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 

Es war notwendig, innerhalb einer mqh herauszufinden, ob etwas zuvor von einer anderen mqh aufgerufen wurde. Die mqh ist sich der Anwesenheit des jeweils anderen nicht bewusst. Einer von ihnen kann dabei sein und einer nicht.

Alles in allem ist das Problem (für mich) ungewöhnlich. Er hat das Problem auf eine ziemlich krüppelhafte Weise gelöst.

void f1()
{
  SetUserError(0);
}

void f2()
{
  if (_LastError == ERR_USER_ERROR_FIRST)
    Print("f1() была вызвана.");
  else
    Print("f1() не была вызвана");
}

void OnStart()
{
  f1();
  f2();
}

Ich halte das für eine sehr schlechte Praxis, aber es funktioniert.

 
Falls jemand das Alarmfenster schließen möchte.
// Закрытие Alert-окна
bool CloseAlert()
{  
  const long Chart = ChartOpen(_Symbol, _Period);  
  const bool Res = Chart && !ChartSaveTemplate(Chart, NULL);
                            
  if (Chart)
    ChartClose(Chart);
    
  return(Res);  
}
 
fxsaber:

Es war notwendig, innerhalb einer mqh herauszufinden, ob etwas zuvor von einer anderen mqh aufgerufen wurde. Die mqh ist sich der Anwesenheit des jeweils anderen nicht bewusst. Einer von ihnen kann dabei sein und einer nicht.

Alles in allem ist das Problem (für mich) ungewöhnlich. Er hat das Problem auf eine ziemlich krüppelhafte Weise gelöst.

Ich halte das für eine sehr schlechte Praxis, aber es funktioniert.

Die Verwendung von _LastError birgt ein unlösbares Problem: Beim Verbinden von Bibliotheken von Drittanbietern besteht eine von Null abweichende Wahrscheinlichkeit einer Kollision von Benutzerfehlercodes. Als Alternative zur Pflege Ihrer eigenen lastError. Entweder eine globale Variable, die in allen mqh in includeguard verpackt ist, oder eine einzelne Variable.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 und Geschwindigkeit in Aktion

fxsaber, 2020.10.20 12:28

Zwischensumme für eine schnell entladene Maschine.

Die Relevanz von Kursdaten ist für diejenigen, die mit Balken und Indikatoren handeln, sehr zweideutig.

Zecken und Zuhälter sind schwer in Echtzeit zu finden.

 
Im MT5 ist Sleep(0) == Sleep(1). Aus diesem Grund kommt es bei der Verwendung von Sleep(0) nicht zu einer enormen CPU-Belastung wie in MT4.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

Slawa, 2018.09.20 15:40

PS. Die Funktion Sleep() in MQL5 ist keine Umleitung auf die Win-Api-Funktion ::Sleep(). Wenn der Wert unter 100 liegt, handelt es sich um eine Weiterleitung. Aber über 100 ist es eine Schleife mit win api slip darin, so dass sie durch IsStopped unterbrochen werden kann.

Es gibt noch einen weiteren subtilen Punkt. Wenn Millisekunden <=0, wird 1 vorangestellt. Das heißt, wir rufen niemals ::Sleep(0) auf.

Sie ist bereits vergessen. Gilt nur für MT5. In MT4 kann Sleep(0) das Terminal anhalten.

 
Ich hatte die Idee, Virtual in Zeiger umzuwandeln, damit ich nicht bei jedem Aufruf eine zusätzliche Bedingung prüfen muss.
  static double VirtualSymbolInfoDouble( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )
  {
    return(VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders.SymbolInfoDouble(Symb, Property) : ::SymbolInfoDouble(Symb, Property));
  }


Ich habe jedoch beschlossen, zunächst die Leistung anhand eines einfachen Beispiels zu vergleichen.

// Сравнение производительности функции с доп. условием и указателя на функцию.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

typedef double (*TFunc)( const int ); // Определяем нужный тип указателя на функцию.

double Prices[];

double GetPrices2( const int Pos )
{
  return(Prices[Pos]);
}

double GetPrices( const int Pos )
{
  return(Pos >= 0 ? GetPrices2(Pos) : 0); // Специально введено доп. условие, чтобы уменьшить производительность.
}

void OnStart()
{
  const int Size = ArrayResize(Prices, 1 e7);
  
  double Sum1 = 0;
  double Sum2 = 0;

  TFunc Func = GetPrices2;
    
  // Замер производительности через указатель функции.
  _BV(
  for (int i = 0; i < Size; i++)
    Sum2 += Func(i);
      , 1)


  // Замер производительности через функцию с доп. условием.
  _BV(
  for (int i = 0; i < Size; i++)
    Sum1 += GetPrices(i);
      , 1)  

  Print(Sum1);
  Print(Sum2);
}


Das Ergebnis.

2020.10.21 01:07:00.745 Test9 (AUDCAD,H1)       Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 29 in OnStart: for(inti=0;i<Size;i++)Sum2+=Func(i);] = 33906 mcs.
2020.10.21 01:07:00.756 Test9 (AUDCAD,H1)       Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 36 in OnStart: for(inti=0;i<Size;i++)Sum1+=GetPrices(i);] = 10923 mcs.


Die typedef-Variante verliert um den Faktor drei. Ich habe mich geweigert, sie dort zu verwenden, wo sie unbedingt notwendig ist. Zum Beispiel wird bei TC dieselbe Auftragssumme mindestens einmal bei jedem Tick des Optimiererdurchlaufs aufgerufen.


Im Debug-Modus ist die Situation umgekehrt. Es ist also sinnvoll, in MT4 typedef zur Beschleunigung zu verwenden.