Errori, bug, domande - pagina 2101

 
damirqa:

Ciao, ho iniziato a studiare MQL5 dahttps://www.mql5.com/ru/articles/100. Ho lanciato il codice e ho ottenuto l'errore 4756. Ho guardato la documentazione e non è andata meglio. Ho pensato di iniziare con qualcosa di semplice (Allarme/Stampa...). Una delle funzioni più importanti è OrderSend. Ho iniziato a cercare nel forum/documentazione su come usare OrderSend. Ho trovato questo articolohttps://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions e ho trovato il codice per aprire una posizione Buy. Ho ottenuto l'errore 4756 e il retcode 10030. Ho capito che 10030 - è la proprietà OrderSend, ma non ho capito come dovrebbe essere usata questa proprietà (ho guardato il codice di qualcun altro) e a cosa serve principalmente. Poi ho apertohttps://www.mql5.com/ru/docs/trading/ordersend, ho copiato il codice, l'ho eseguito e ha funzionato bene.
Ma non ho ancora capito perché appare l'errore 4756 e come liberarmene, così come il 10030.

Guardato il codice tra

e questo.

Mi sembrano quasi identici, non vedo dove appaiono questi errori (4756 e 10030). Punta il dito e spiega per favore

Un campo della struttura non è compilato. E non è sufficiente, ma non è un errore.

Esecuzione istantanea

Un ordine di trading per aprire una posizione nella modalità di esecuzione istantanea (la modalità di trading a prezzi in streaming). 9 campi sono obbligatori:

  • azione
  • simbolo
  • volume
  • prezzo
  • sl
  • tp
  • deviazione
  • tipo
  • tipo_riempimento

Puoi anche specificare campi magici e di commento.

Esecuzione del mercato

Un ordine di compravendita per aprire una posizione nella modalità di esecuzione a mercato. Richiede 5 campi da specificare:

  • azione
  • simbolo
  • volume
  • tipo
  • tipo_riempimento

Puoi anche specificare campi magici e di commento.


 

quale aggiornamento è arrivato, 1736, cosa c'è dentro, dove posso leggerlo?

 

Propongo di dare la possibilità di determinare programmaticamente quale buffer di indicatori sta disegnando sul grafico.

Supponiamo che un trader inizi i suoi propri indicatori, non sappiamo quanti buffer sono usati per il calcolo e quanti sono usati per disegnare l'indicatore sul grafico.

Affrontare gli indicatori personalizzati attraverso

intChartIndicatorGet(
longchart_id,// identificatore del grafico
intsub_window// numero della sottofinestra
const string indicator_shortname // nome breve dell'indicatore
);


Possiamo anche richiedere l'array di buffer di disegno

intChartIndicatorGet(
longchart_id,// identificatore del grafico
intsub_window//numero della finestra
const string indicator_shortname // nome breve dell'indicatore

int & IndicatorVisualBuffer[] // numeri del buffer di disegno... );


Questo estenderà la possibilità di lavorare con indicatori sconosciuti installati sul grafico...

 
Vladimir Pastushak:

Propongo di dare la possibilità di determinare programmaticamente quale buffer di indicatori sta disegnando sul grafico.

Supponiamo che un trader inizi i suoi indicatori, non sappiamo quanti buffer vengono utilizzati per calcolare e quanti per disegnare l'indicatore sul grafico.

Indirizzamento all'indicatore tramite

intChartIndicatorGet(
longchart_id,// ID del grafico
intsub_window// numero della sottofinestra
const string indicator_shortname // nome breve dell'indicatore
);


Possiamo anche richiedere l'array di buffer di disegno

intChartIndicatorGet(
longchart_id,// identificatore del grafico
intsub_window//numero della finestra
const string indicator_shortname // nome breve dell'indicatore

int & IndicatorVisualBuffer[] // numeri del buffer di disegno... );


Questo aumenterà la possibilità di lavorare con indicatori sconosciuti installati nel grafico...

Che cosa restituisce?

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора
   );

e quale sarà l'utilità di aggiungerlo? Volete aggiungere un parametro di input e ricevere in risposta lo stesso manico di indicatore...

E se non le dispiace, a quale scopo è necessario? Non sono ironico. Dopo tutto, se si suggerisce qualcosa, si dovrebbe, secondo me, dare un argomento convincente della necessità del suggerito.

 
Alexey Viktorov:

Cosa restituisce

e a cosa servirebbe aggiungerlo? Tu proponi di aggiungere un parametro di input e di ottenere in risposta lo stesso indicatore...

E se non è difficile, per quali scopi è apparsa una tale necessità? La domanda è senza ironia. Dopotutto, se si offre qualcosa, è necessario, secondo me, dare argomenti convincenti per la necessità dell'offerta.


L'utente mette qualsiasi indicatore.

L'Expert Advisor lo trova automaticamente e usa i dati del buffer per ricevere il segnale.


Ora dobbiamo usare iCustom e se possiamo scrivere la lista dei parametri, ecco il problema con i buffer....

È possibile contare la quantità di buffer attraverso Copy, ma capire quale di essi sta disegnando programmaticamente non è possibile...

 
Vladimir Pastushak:

L'utente piazza un qualsiasi indicatore.

L'Expert Advisor lo trova automaticamente e usa i dati del buffer per ottenere il segnale.


Ora dobbiamo usare iCustom e se possiamo scrivere la lista dei parametri, ecco il problema con i buffer....

È possibile contare la quantità dei buffer usando Copy programmaticamente, ma è impossibile capire quale di essi sta disegnando...

Perché è impossibile? Si può togliere il buffer INDICATOR_CALCULATIONS attraverso iCustom()?

La domanda è interessante, ma non in questo thread per discuterne. Personalmente dubito che possa in qualche modo migliorare o semplificare il lavoro del programmatore. Gli indicatori sono troppo diversi e le condizioni della loro applicazione sono troppo diverse. Poi dovremo chiedere di essere in grado di determinare il tipo di tracciatura grafica e alcune altre cose, e le nostre richieste interne diventeranno una valanga.

 
Alexey Viktorov:

Perché non è possibile? Il buffer INDICATOR_CALCULATIONS può essere raggiunto attraverso iCustom()?

La domanda è interessante, ma non in questo thread per discuterne. Personalmente dubito che possa in qualche modo migliorare o facilitare il lavoro del programmatore. Ci sono indicatori troppo diversi e condizioni troppo diverse per la loro applicazione. Poi dovremo chiedere di essere in grado di determinare il tipo di tracciatura grafica e poi altre cose, e le richieste si moltiplicheranno a valanga.


Teoricamente, ciò che è scritto nell'indicatore di default, non sto parlando del codice del programmatore, dovrebbe essere disponibile dall'esterno... I buffer hanno il loro numero, il tipo di tracciato, il colore, e altri standard ...

 

Questo è il problema che ho incontrato:

Ho deciso di usare come magia il resto della divisione di ChartID per 1000 o 10000, non ha molta importanza.

Ma per qualche ragione con ChartID() diversi il resto della divisione risulta improvvisamente uguale. Domanda: perché?

Controllo dello script

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d = 100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
}/*******************************************************************/

Risultato

2018.01.15 13:01:45.881 Script 00 EURUSD,M15: removed
2018.01.15 13:01:45.881 00 EURUSD,M15: uninit reason 0
2018.01.15 13:01:45.881 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:45.881 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 13:01:45.881 00 EURUSD,M15: initialized
2018.01.15 13:01:45.871 Script Test\00 EURUSD,M15: loaded successfully
2018.01.15 13:01:40.361 Script 00 EURUSD,H1: removed
2018.01.15 13:01:40.361 00 EURUSD,H1: uninit reason 0
2018.01.15 13:01:40.361 00 EURUSD,H1: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:40.361 00 EURUSD,H1: ChartID - 131472503841474908
2018.01.15 13:01:40.361 00 EURUSD,H1: initialized
2018.01.15 13:01:40.351 Script Test\00 EURUSD,H1: loaded successfully

Mi aspettavo di vedere rispettivamente 74907 e 74908, perché il resto della divisione dovrebbe essere lo stesso.


Sto anche aspettando una risposta a questa domanda.

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

Bug, bug, domande

Alexey Viktorov, 2018.01.09 14:21

Nel tester di MT5 l'oggetto OBJ_EDIT "Campo di input" non permette di modificare il valore in esso. È il modo in cui è progettato o è un bug?

Nei terminali e nel tester MT4 è modificabile, ma nel tester MT5 non vuole, il valore inserito programmaticamente quando si crea l'oggetto scompare del tutto.


 
Alexey Viktorov:

Ma per qualche ragione una diversa ChartID() produce improvvisamente lo stesso residuo della divisione. Domanda: perché?

Perché l'input fmod è doppio. Double non può memorizzare un numero enorme di numeri interi. Per esempio, questo è il tuo caso:

Print(DoubleToString((double)131472503841474907, 0)); // 131472503841474912

Fate così.

long fmod( const long Value, const long Value2 )
{
  return(Value % Value2);
}


Usando float come esempio, si può capire rapidamente la peculiarità del doppio

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  for (int i = 0; i < INT_MAX; i++)
    if ((int)(float)i != i)
    {
      PRINT(i);
      PRINT((float)i);
      PRINT((double)i);
      
      break;
    }
}


Risultato

i = 16777217
(float)i = 16777216.0
(double)i = 16777217.0


SZY double non perde l'informazione di tutto l'int-range, non così con long.

 
fxsaber:

Perché l'input fmod è doppio. Double non può memorizzare un numero enorme di numeri interi. Per esempio, il tuo caso:

Fate così.

Naturalmente, controllerò questo campione ora, ma ho anche avuto un codice di controllo come questo

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
  printf("LONG_MAX = %I64d",LONG_MAX);
  printf("DBL_MAX = %.16e",DBL_MAX);
  Print("DBL_MAX-LONG_MAX = ", DBL_MAX-LONG_MAX);
}/*******************************************************************/

il risultato è

2018.01.15 14:07:20.440 Script 00 EURUSD,M15: removed
2018.01.15 14:07:20.440 00 EURUSD,M15: uninit reason 0
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX-LONG_MAX = 17976931348623157081452742373170435679807 0567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX = 1.7976931348623157 e+308
2018.01.15 14:07:20.440 00 EURUSD,M15: LONG_MAX = 9223372036854775807
2018.01.15 14:07:20.440 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:07:20.440 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:07:20.440 00 EURUSD,M15: initialized
2018.01.15 14:07:20.430 Script Test\00 EURUSD,M15: loaded successfully

Indica che non ci dovrebbe essere un troncamento del valore.


Ma qui ho controllato questa variante e ho cambiato leggermente la proposta

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", (long)fmod(ChartID(), d));
  Print("ChartID() % ", d, " = ", ChartID() % d);
}/*******************************************************************/

e ha ottenuto la variante prevista.

2018.01.15 14:17:51.301 Script 00 EURUSD,M15: removed
2018.01.15 14:17:51.301 00 EURUSD,M15: uninit reason 0
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID() % 100000 = 74907
2018.01.15 14:17:51.301 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:17:51.301 00 EURUSD,M15: initialized
2018.01.15 14:17:51.291 Script Test\00 EURUSD,M15: loaded successfully

Appare un'altra domanda,

Se MathMod così come fmodrestituisce il resto reale dopo la divisione di due numeri. E % secondo la documentazione

Il resto dei minuti = tempo % 60;


perché c'è una differenza?