Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1188

 
Ivan_Invanov:
In generale, a giudicare dalla tua risposta, non hai capito bene come funziona il programma. Quindi sembra una domanda stupida. Proprio come il commentatore precedente pensa che si fermi. Solo dall'esperienza di programmazione in altri linguaggi, penso che esegua il suo corpo in un ciclo, e quando arriva un evento, si immerge in esso. Se il programma esegue il suo corpo in un ciclo, questo spiega perché il programma è scritto in quel modo.

Quando si verifica un evento "nuovo tick", il programma viene avviato nel gestore OnTick(), eseguito fino al completamento e fermato. Con l'arrivo di una nuova zecca tutto si ripete dall'inizio. Se un nuovo tick è arrivato durante l'esecuzione del programma, e il programma non ha finito di elaborare il tick precedente (è ancora in esecuzione), allora questo tick viene saltato.

I programmi in MQL non sono in loop. Hanno tre punti di ingresso - OnInit(), OnDeinit() e OnTick().

All'avvio, viene eseguita OnInit(), poi quando viene ricevuto un tick - OnTick(), quando l'operazione è finita - OnDeinit().

Ci sono anche altri gestori. Ma è meglio che tu apra l'aiuto piuttosto che chiedere a qualcuno di duplicarlo qui.

Документация по MQL5: Программы MQL5
Документация по MQL5: Программы MQL5
  • www.mql5.com
Для того чтобы mql5-программа могла работать, она должна быть скомпилирована (кнопка "Компилировать" или клавиша F7). Компиляция должна пройти без ошибок (допускаются предупреждения, которые необходимо проанализировать). При этом в соответствующей директории Эксперты, пользовательские индикаторы и скрипты прикрепляются к одному из открытых...
 

Salve. Mentre lavoravo al mio indicatore ho trovato un bug al riavvio del terminale. Sulla base di questo bug ho fatto un piccolo codice sorgente per il suo test:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

class Loader {
private:
  string symbol;
  ENUM_TIMEFRAMES timeframe;

public:  
  Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); // Этот же вызов iBars() работает нормально
  }
};

Loader * loader;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  loader = new Loader();
//---
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  delete loader;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]
) {
  return(rates_total);
}

Se questo esempio è lanciato su un grafico (o è il primo avvio del terminale dopo l'avvio del sistema) tutto funziona bene. Nel registro c'è scritto quanto segue:

2020.06.24 21:05:50.773 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

2020.06.24 21:05:50.773 Loader::Loader bar: 140433

2020.06.24 21:05:50.773 Loader::Loader Error: 0

2020.06.24 21:05:50.773 Loader::Loader bars (2): 140433


Ma se riavvio il terminale con questo indicatore ottengo un errore:

2020.06.24 21:07:34.963 Loader::Loader simbolo: EURUSD timeframe: PERIOD_H1

2020.06.24 21:07:34.963 Loader::Loader bars: 0

2020.06.24 21:07:34.963 Loader::Loader Error: 4401

2020.06.24 21:07:34.964 Loader::Loader bars (2): 140433

Simbolo e timeframe inizializzati ok

2020.06.24 21:07:34.963 Loader::Loader simbolo: EURUSD timeframe: PERIOD_H1

Ma iBars(simbolo, timeframe) dà 0 per qualche motivo

2020.06.24 21:07:34.963 Loader::Loader bars: 0

In questo caso appare l'errore 4401.

Ma iBars(Symbol(), Period()) funziona bene.

2020.06.24 21:07:34.964 Loader::Loader bars (2): 140433

Almeno symbol = Symbol() e timeframe = Period() secondo i messaggi di log (anche durante il lag, quando il terminale si riavvia). Come può iBars(symbol, timeframe), con simbolo e timeframe assolutamente corretti, dare zero, mentre iBars(Symbol(), Period()) funziona bene, se i parametri nelle funzioni sono gli stessi, secondo il log?

Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
File:
Test.mq5  7 kb
 
Chi conosce il moderatore di questo thread?
 

Come posso aprire un conto demo MT4 su MetaQuotes Demo? Prima funzionava senza problemi, ora nell'ultima pagina del dialogo dice: Registration, Wait a little, please, e in questo stato rimane inattivo indefinitamente, i campi con login e password rimangono vuoti. Nessun messaggio nel registro. Provato sia "demo" che "reale" e diversi tipi di conti.

UPD Provato un broker demo - stessa cosa.

 
Artyom Trishkin:

Quando si verifica un evento "nuovo tick", il programma viene avviato nel gestore OnTick(), eseguito fino al completamento e fermato. Con l'arrivo di una nuova zecca tutto si ripete dall'inizio. Se un nuovo tick è arrivato durante l'esecuzione del programma, e il programma non ha finito di elaborare il tick precedente (è ancora in esecuzione), allora questo tick viene saltato.

I programmi in MQL non sono in loop. Hanno tre punti di ingresso - OnInit(), OnDeinit() e OnTick().

All'avvio, viene eseguita OnInit(), poi quando viene ricevuto un tick - OnTick(), quando l'operazione è finita - OnDeinit().

Ci sono anche altri gestori. Ma è meglio che tu apra l'aiuto piuttosto che chiedere a qualcuno di duplicarlo qui.

Grazie. Sì, lo capisco, è solo che la funzione è scritta nel corpo del programma. Forse non ho notato che si chiama da qualche parte.
 
Ivan_Invanov:
Grazie. Sì, lo capisco, è solo che la funzione è scritta nel corpo del programma. Forse non ho notato che si chiama da qualche parte.

Come possiamo vedere di cosa stai parlando? Ci faccia un esempio.

 
Artyom Trishkin:

Come possiamo vedere di cosa stai parlando? Ci faccia un esempio.

Grazie ancora, sì, non avevo notato la chiamata, l'ho cercata ora, ed è stata chiamata dalla funzione che apre le transazioni.
 
Ivan_Invanov:
Grazie. Sì, lo capisco, è solo che la funzione è scritta nel corpo del programma. Forse devo essermi perso una chiamata da qualche parte.

In mql4 le funzioni sono scritte in qualsiasi ordine, sopra sotto non importa, può sembrare che funzionino prima o dopo. Non esiste una cosa del genere in C++ dove tutte le funzioni possono lavorare solo in ordine di scrittura e se volete chiamarla, deve essere definita prima del luogo di chiamata altrimenti il programma va in crash. L'uomo mi ha mostrato come scrivere funzioni in ordine diverso, ma non ricordo come farlo in C++.

 
Ivan_Invanov:

Saluti. Per favore, aiutatemi. Ho questa domanda. Ho capito bene. Il programma viene eseguito dall'inizio alla fine, ma si ferma quando si verifica un evento, ad esempio un tick, la funzione ontick inizia ad essere eseguita, poi finisce la sua esecuzione e il programma viene eseguito di nuovo dall'inizio? Questa domanda è legata a quanto segue: dove scrivo per esempio la dimensione del lotto di trading, nel corpo del programma o nella funzione ontick?

Guardo il bot ufficiale, che è un esempio nel terminale, ci calcolo molto viene eseguito nel corpo del programma, e non capisco perché così.

Il mio lotto è calcolato in questo modo

#property link      "http://www.mql5.com"
input double CheckLots = 0.01;
input int    Persent   = 5;
   double Lots=NormalizeDouble(AccountBalance()*CheckLots/1000-0.005,2);  

è all'inizio dell'Expert Advisor... e l'ho messo alla fine del codice

Quando la funzione OnTick chiama la variabile Lots, allora EA la trova e la ricalcola.

 

@Artyom Trishkin

Sei un moderatore in questo thread?

Motivazione: