Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 62

 
Vasiliy Pushkaryov:
Hai una foto di come sarebbe? Non è molto chiaro, non ho ancora usatoOBJ_CHART

Non c'è nessuna immagine. Ma si può costruire a mano. Selezionate Insert -> Objects -> Graphic Objects -> Chart e dopo aver inserito OBJ_CHART in questo modo, selezionate "Draw object as background" nelle proprietà dell'oggetto, disabilitando le scale.

 
fxsaber:

Non c'è nessuna immagine. Ma si può costruire a mano. Selezionate Insert -> Objects -> Graphic Objects -> Graphic e dopo aver inserito OBJ_CHART in questo modo, selezionate "Draw object as background" nelle proprietà dell'oggetto, disabilitando le scale.


Grazie, sembra bello

 

In modalità debug, non potete conoscere il valore restituito da una funzione o un'espressione.

Per esempio

void OnStart()
{
  double Angle = 1;
  double d = MathSin(Angle / 2) * MathSin(Angle * 2);
}

Per esempio, cosa hanno restituito le funzioni allocate.


Io uso (non solo in modalità debug) questo modo

template <typename T>
T MyPrint( const T Value, const string Str )
{
  static const bool IsDebug = MQLInfoInteger(MQL_DEBUG);

//  if (IsDebug)
  {
//    DebugBreak(); // если хочется посмотреть средствами дебага

    Print(Str + " = " + (string)Value);
  }
  
  return(Value);
}

#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)

void OnStart()
{
  double Angle = 1;
  double d = _P(MathSin(Angle / 2)) * _P(MathSin(Angle * 2));
}


Risultato

void OnStart(), Line = 21: MathSin(Angle/2) = 0.479425538604203
void OnStart(), Line = 21: MathSin(Angle*2) = 0.9092974268256817
 

Struttura del risultato del controllo della richiesta di compravendita (MqlTradeCheckResult)

Descrizione del campo

Campo

Descrizione

equilibrio

Valore del saldo che sarà dopo l'esecuzione dell'operazione di compravendita

equity

Valore del patrimonio netto, che sarà dopo l'esecuzione della negoziazione

margine

Margine richiesto per l'operazione commerciale richiesta

margine_libero

La quantità di capitale che rimarrà dopo l'esecuzione dell'operazione richiesta

livello del margine

Il livello di margine che sarà impostato dopo l'esecuzione dell'operazione commerciale richiesta

Questi campi corrispondono alla riga nella scheda Commercio


Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
  • www.mql5.com
Прежде чем отправить торговому серверу запрос на торговую операцию, рекомендуется провести его проверку. Проверка осуществляется функцией OrderCheck(), которой передается сам проверяемый запрос и переменная типа структуры MqlTradeCheckResult. В эту переменную и будет записан результат проверки.
 
fxsaber:

Questi campi corrispondono alla riga nella scheda Commercio


Gli stessi valori mostrano lo stato attuale, ma la struttura non sta restituendo i valori calcolati che ci saranno dopo l' esecuzione del trade?

 
Artyom Trishkin:

Gli stessi valori mostrano lo stato attuale, ma la struttura non sta restituendo i valori calcolati che ci saranno dopo l' esecuzione del trade?

Mostra i valori calcolati che sarebbero in questa riga se l'ordine di compravendita fosse eseguito.

 

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

Libreria di classi generiche - errori, descrizione, domande, peculiarità d'uso e suggerimenti

Renat Fatkhullin, 2017.12.08 23:34

Non abbiamo una struttura MqlDeal poiché i formati dei record commerciali sono fluttuanti e periodicamente in espansione. Senza questo, è impossibile estendere la funzionalità della piattaforma.

Pertanto, l'unica opzione è quella di accedervi attraverso la funzione Get. E l'accesso ad altri campi del record precedentemente interessato è molto più veloce del primo accesso, perché il record è nella cache.

Nel test di cui sopra, i numeri di trade sono nuovi ogni volta, il che butta fuori continuamente la cache del trade precedentemente selezionato.

 

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

MT5 contro MT4. Tasso di riempimento della matrice.

Renat Fatkhullin, 2017.12.12 12:19

1) L'idea è sbagliata, gli array locali non si riempiono più velocemente (approssimativamente, senza scendere a livello micro)

2) Gli array devono essere riempiti rapidamente tramite funzioni di inizializzazione regolari

3) Per massimizzare la velocità, è meglio mantenere l'array come un vettore (monodimensionale), così si hanno più possibilità di ottimizzare l'accesso. Perché la multidimensionalità vi limita severamente ai frame obbligatori e costringe il compilatore a fare un calcolo extra costante degli indici multidimensionali.

4) Gli array per l'accesso rapido dovrebbero essere tenuti statici, il che riduce drasticamente la quantità di controlli per gli outlier

 

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

Apertura posizione di vendita in mql5

fxsaber, 2017.12.12 21:56

// true - not for trade by market-orders
bool IsBadFilling( const string Symb )
{
  return(!(SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE) & (SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK)));
}

void OnTick()
{
  if (IsBadFilling(_Symbol))
  {
    Print("Change symbol " + _Symbol + " or server " + AccountInfoString(ACCOUNT_SERVER) + " for trade by market!");
    
    ExpertRemove();    
  }
}


Risultato

2017.12.05 00:00:00   Change symbol EURUSD or server AMPGlobalClearing-Demo-CQG for trade by market!

Permette di capire rapidamente perché i mercati non si aprono nel tester. Forse è il comportamento scorretto del tester ad avere gli ordini di mercato vietati in questo modo e gli ordini pendenti no.


Suggerisco che quando SYMBOL_FILLING_MODE è zero, il tester dovrebbe sostituire questo valore con(SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK). Cioè ha permesso il trading completo quando il broker non ha specificato il campo simbolo appropriato.

 
// Опознает кривые COPY_TICKS_INFO-тики
// Отсутствие цены (высохшая сторона стакана - нулевая цена) не признается валидной ситуацией
bool IsTickInfoBad( const MqlTick &Tick )
{
  return(!Tick.ask || !Tick.bid || Tick.last || Tick.volume || ((Tick.flags & (0x7F ^ (TICK_FLAG_ASK | TICK_FLAG_BID))) != 0));
}

#define  DEFINE_FIELD(A)             \
  if (!Ticks[i].##A)                \
    Ticks[i].##A = Ticks[i - 1].##A

// Корректирует ошибочные COPY_TICKS_INFO-тики
void CorrectTicksInfo( MqlTick &Ticks[] )
{
  const int Size = ArraySize(Ticks);
  
  for (int i = 1; i < Size; i++)
    if (IsTickInfoBad(Ticks[i]))
    {
      DEFINE_FIELD(bid);
      DEFINE_FIELD(ask);      
      
      Ticks[i].last = 0;
      Ticks[i].volume = 0;
      Ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
    }
}
Raccomando di fare qualcosa del genere ogni volta dopo CopyTicks(COPY_TICKS_INFO), in modo che il TS non prosciughi accidentalmente il conto.
Motivazione: