Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 190

 
Vladimir Pastushak:

È possibile distinguere un oggetto grafico creato manualmente da un oggetto creato da un indicatore o EA?

Nella funzione

OBJPROP_HIDDEN

Barrare il nome di un oggetto grafico dal menu del terminale "Charts" - "Objects" - "List of Objects". Il valore true permette di nascondere un oggetto non necessario dalla lista. Di default true è impostato per gli oggetti che visualizzano gli eventi del calendario, la storia del trading, così comequelli creati dal programma MQL5. Per vedere tali oggettigrafici e accedere alle loro proprietà, cliccate su "All" nella finestra "List of Objects".

bool

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
Probabilmente è una cosa nota, ma io stesso non ero a conoscenza di questa sfumatura.

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

Biblioteche: Esperto

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));                 // Заставляем двигаться очередь.
}

Ho evidenziato un posto importante nel codice. Senza di esso non c'è applicazione del modello fino alla fine dello script.

 
Riguardo al primo parametro di ingresso in EventChartCustom

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

MT5 e la velocità in azione

Anton, 2020.10.08 11:00

Diverso significato e diverso meccanismo di esecuzione. 0 - evento in coda del "proprio" grafico. -1 - evento nella propria coda.

 
Vladimir Pastushak:

Alla fine della settimana la mia testa non è già buona.

Ho un ticket di una posizione aperta su una copertura in mt5, per esempio 123456

Voglio calcolare un profitto dopo che la posizione è chiusa, e non posso farlo.

Lo faccio, ma ricevo solo commissioni...

Come posso ottenere il profitto di una posizione chiusa con un biglietto?

Prova a selezionare meglio i trade usando HistorySelectByPosition().

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

Era necessario scoprire all'interno di un mqh se qualcosa era stato chiamato prima da un altro mqh. Il mqh non è consapevole della presenza dell'altro. Uno di loro potrebbe essere dentro e uno no.

Tutto sommato, il problema è insolito (per me). Ha risolto il problema in un modo un po' grossolano.

void f1()
{
  SetUserError(0);
}

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

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

Penso che sia una pratica molto cattiva, ma funziona.

 
Se qualcuno ha bisogno di chiudere la finestra di allarme.
// Закрытие Alert-окна
bool CloseAlert()
{  
  const long Chart = ChartOpen(_Symbol, _Period);  
  const bool Res = Chart && !ChartSaveTemplate(Chart, NULL);
                            
  if (Chart)
    ChartClose(Chart);
    
  return(Res);  
}
 
fxsaber:

Era necessario scoprire all'interno di un mqh se qualcosa era stato chiamato prima da un altro mqh. Il mqh non è consapevole della presenza dell'altro. Uno di loro potrebbe essere dentro e uno no.

Tutto sommato, il problema è insolito (per me). Ha risolto il problema in un modo un po' grossolano.

Penso che sia una pratica molto cattiva, ma funziona.

L'uso di _LastError ha un problema irrisolvibile, quando si collegano librerie di terze parti, c'è una probabilità non nulla di collisione dei codici di errore utente. In alternativa a mantenere il proprio lastError. O una variabile globale, avvolta da includeguard in tutti gli mqh, o una singola variabile.
 

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

MT5 e la velocità in azione

fxsaber, 2020.10.20 12:28

Un totale intermedio per una macchina che si scarica velocemente.

La rilevanza dei dati di prezzo è molto ambigua per coloro che fanno trading utilizzando barre e indicatori.

Le zecche e i tumblr sono difficili da essere in tempo reale.

 
In MT5 Sleep(0) == Sleep(1). Per questo motivo non c'è un enorme carico di CPU quando si usa Sleep(0) come in MT4.

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

Peculiarità di mql5, consigli e trucchi

Slava, 2018.09.20 15:40

PS. La funzione Sleep() in MQL5 non è un reindirizzamento alla funzione win api ::Sleep(). Per essere più precisi, se il valore è inferiore a 100, è un reindirizzamento. Ma sopra i 100 è un ciclo con win api slip al suo interno in modo che possa essere interrotto da IsStopped.

C'è un punto più sottile. Se i millisecondi <=0, aggiungiamo 1. Cioè, non chiamiamo mai ::Sleep(0).

È già stato dimenticato. Vero solo per MT5. In MT4 Sleep(0) può sospendere il terminale.

 
Ho avuto un'idea per cambiare Virtual in puntatori in modo da non dover controllare condizioni aggiuntive ad ogni chiamata.
  static double VirtualSymbolInfoDouble( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )
  {
    return(VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders.SymbolInfoDouble(Symb, Property) : ::SymbolInfoDouble(Symb, Property));
  }


Ma ho deciso di confrontare prima le prestazioni, usando un semplice esempio.

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

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


Il risultato.

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.


La variante typedef perde di un fattore tre. Ho rifiutato di usarlo dove è fondamentale. Per esempio, per TC lo stesso OrdersTotal è chiamato almeno una volta ad ogni tick di passaggio dell'ottimizzatore.


In modalità debug la situazione è invertita. Quindi, ha senso usare typedef in MT4 per l'accelerazione.

Motivazione: