Bisogno di aiuto da sviluppatori e programmatori MT4 - pagina 3

 
Un esperto fissato è un mauvais ton.
 
Integer:

2. A metà della nuova scheda. In precedenza, la finestra delle proprietà dell'Expert Advisor in loop non si apriva. Ora lo fa, e sarebbe bene che ora ci fosse una reazione ai cambiamenti dei parametri. Oppure, la finestra delle proprietà potrebbe essere chiusa per evitare confusione all'utente.

Esattamente! È quello che sto cercando di dire, ma nessuno lo sente.

Il "service Desk" si è rifiutato, per quanto penso che non hanno capito affatto la situazione. Ecco un estratto del messaggio di richiesta:

Perché dovreste dire a un programmatore cosa può e non può fare? La trasmissione è andata avanti senza errori. L'esecuzione va senza errori. L'utente vede "A=5" nella scheda dei parametri di input, e il sistema dà "A=1" all'Expert Advisor. Se usare il ciclo start() o while() è una questione di gusti. Il ciclo non è infinito, come lei sostiene. Se avete osservato attentamente il testo dell'Expert Advisor, non è while(true), ma while(!IsStopped()&&IsConnected()&&IsExpertEnabled()). Nelle precedenti build di MT4 l'utente non poteva cambiare i valori dei parametri di input durante l'esecuzione della funzione Sleep(). Nella nuova costruzione non c'è più questa barriera. Quindi, o restituite il divieto di cambiare i parametri di input in questa situazione, o fate in modo di cambiarli non solo sulla scheda"INPUTS", ma anche sul contatore. Questo è tutto.


Intero:

1. Quando ho installato il terminale MetaTrader4, nella finestra di installazione c'è un invito al forum, questo forum e non un altro.

Le mie scuse. Ma ho notato che la linea tra MT4 e MT5 sta gradualmente scomparendo. Ed è stato dal mio profilo su "www.mql5.com" che ho fatto domanda a "servicedesk" (spero per la prima e ultima volta). Ho compilato un modulo che mostra chiaramente la possibilità di scegliere la versione del terminale - ho scelto "MT4".

Ecco un altro estratto da un ordine già chiuso (non so se leggono l'ordine dopo averlo frettolosamente chiuso da soli?) (certo, divertente, ma mi viene in mente solo un proverbio sul prendere le pulci).

In questo caso, perché l'utente vede chiaramente i suoi nuovi valori? Mentre l'EA può funzionare pienamente, questi nuovi valori sono una finzione, e non sono disponibili all'EA. La funzione RefreshRates() permette all'EA di ottenere le quotazioni attuali in QUALSIASI ciclo. Perché non fornire una funzione simile per ottenere valori aggiornati dei parametri di input o aggiungere questa caratteristica alla funzione esistente RefreshRates()?

Premendo il pulsante "AutoTrading" due volte (per spegnere e accendere gli EA) si interrompe il ciclo, dopo di che i nuovi valori diventano disponibili, ma solo dopo un tick (nuova quotazione) sul SIMBOLO GRAFICO. E non sappiamo quando arriverà, e all'Expert Advisor non è vietato elaborare anche altri simboli, e l'utente non ha bisogno di questa perdita di tempo. Così otteniamo qualcosa come "ritorno al futuro". È stato rilasciato un nuovo MT4. È più moderno, più veloce. Dicono che rallenta molto bene sullo schermo, aspettando le quotazioni di UN simbolo, mentre le quotazioni di altri simboli sono in pieno svolgimento. Cioè, ora dico ai miei clienti: cambiate i parametri, premete due volte il pulsante "Expert Advisors" per spegnerli e accenderli, e aspettate in riva al mare - un giorno "spunterà".

Non ho mai chiesto aiuto prima e spero che non lo farò in futuro. Prima o poi troverò comunque un modo per aggirare il "gancio". Questo è sempre stato il caso, da quando esiste MT4 e naturalmente il suo"tester di strategie", di cui preferirei non parlare ora. Ma naturalmente qualsiasi imprecisione in tempo reale è una cosa molto grave, soprattutto per un utente che sta mettendo in gioco i suoi soldi, a volte per somme abbastanza grandi. Dato che non ho visto nessun altro modo efficiente per aggirare questo bug, mi sono rivolto al 'service-desk' e, ad essere onesti, ero un po' dubbioso che si sarebbero rifiutati di risolverlo. Bene...

È già abbastanza brutto che tutto debba essere fatto "nonostante" piuttosto che "grazie a".

 
Integer:
Wex, usa un timer, puoi fare a meno del looping ora.

Hai ragione, naturalmente, i nuovi EA possono essere programmati in modo molto diverso. Ma ci sono molti EA già ben programmati. E i clienti non capiscono perché la cosa per la quale hanno pagato dei soldi improvvisamente smette di funzionare correttamente.

Cioè, c'è una tendenza molto spiacevole di incompatibilità di principio degli EAs già sviluppati (Expert Advisors o scripts, anche indicatori) con le nuove builds di MT4.

E non ho usato nulla di non standard nella programmazione per principio. Il mio EA è basato esclusivamente sulle caratteristiche e le funzioni di MQL4 BOMB. Ero già sommerso da un sacco di indicatori e EAs (per lo più complessi o cosiddetti "multicurrency ones"), che o non funzionano affatto sulle nuove build di MT4, o apparentemente funzionano bene, ma appaiono situazioni come nel mio esempio. (Per quanto riguarda gli errori di traduzione, ho notato, per esempio, variabili con nome "nuovo" - capisco - a causa dell'espansione della lista di parole riservate).

 

Si è troppo pigri per leggere la documentazione. Il resto dimostra di essere molto intelligente... Uff!

Prendi il codice :)

Non so ancora quale sia il suo problema.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright     "Grizzly_v :)"
#property link          "http://www.mql5.com"
//+------------------------------------------------------------------+
extern int      A1=      1;
extern int      A2=      2;
int      C1,C2;
//+------------------------------------------------------------------+
int OnInit(){
   C1=A1;
   C2=A2;
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   Comment("");
}
//+------------------------------------------------------------------+
void OnTick(){
   string   t;

   t=TimeToStr(TimeCurrent(),TIME_MINUTES|TIME_SECONDS);
   Comment(t+"\nA1="+A1+"   A2="+A2+"\nC1="+C1+"   C2="+C2);
}
//+------------------------------------------------------------------+
 
grizzly_v:

Si è troppo pigri per leggere la documentazione. Il resto dimostra di essere molto intelligente... Uff!

Prendi il codice :)

Non so ancora quale sia il suo problema.

Il problema è che l'Expert Advisor è in loop, quindi l'evento OnTick non si verifica in esso e non vede i parametri modificati.
 

Bene, questo è tutto allora. Lo stesso ciclo solo attraverso le nuove funzioni.

  extern int      A1=      1;
  extern int      A2=      2;
         int      C1,C2;
//+------------------------------------------------------------------+
int OnInit(){
   C1=A1;
   C2=A2;
   EventSetMillisecondTimer(100);
   return(0);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer(){
   string   t;
   RefreshRates();
   t=TimeToStr(TimeCurrent(),TIME_MINUTES|TIME_SECONDS);
   Comment(t+"\nA1="+A1+"   A2="+A2+"\nC1="+C1+"   C2="+C2);
}
//+------------------------------------------------------------------+
 
stringo:

1. Dai un'occhiata al profilo di Wex. Questo è uno sviluppatore professionale di MQL4. Fare il finto tonto. O trolling. Non so perché.

2. Dobbiamo pensare a questo. Non potete interrompere forzatamente il ciclo quando arrivano nuovi parametri. Qualcosa come la funzione IsNewParameter che dovrebbe essere chiamata dal programmatore stesso nel ciclo infinito

1. Ho anche notato la stranezza...

2. Sarebbe molto bello.

 
stringo:

1. Dai un'occhiata al profilo di Wex. Questo è uno sviluppatore professionale di MQL4. Fare il finto tonto. O trolling. Non è chiaro perché.

2. è qui che dobbiamo pensare. Non possiamo interrompere forzatamente il ciclo all'arrivo di nuovi parametri. Qualcosa come la funzione IsNewParameter che dovrebbe essere chiamata dal programmatore stesso nel ciclo infinito

Stringo.

La variabile non sembra entrare in un loop così eterno. Il metodo init non funziona quando si cambiano i valori. E le variabili esterne sono passate solo attraverso init. Le funzioni OnTick e OnTimer possono ora essere utilizzate negli Expert Advisor,

OnChartEvent. Per quanto mi ricordo, la funzione di avvio in Expert Advisor veniva attivata ad un nuovo tick.

Estratto dalla documentazione:

Il programma riceve eventi solo dal grafico su cui viene lanciato. Tutti gli eventi sono processati uno dopo l'altro nell'ordine in cui vengono ricevuti. Se c'è già un evento NewTick nella coda o se questo evento è in stato di elaborazione, un nuovo evento NewTick non viene messo nella coda del programma mql4. Allo stesso modo, se la coda del programma mql4 contiene già l'evento ChartEvent o un tale evento è in corso di elaborazione, un nuovo evento di questo tipo non sarà accodato. Gli eventi Timer sono processati secondo lo stesso schema - se c'è o c'è già un evento Timer nella coda, allora un nuovo evento di questo tipo non sarà messo in coda.

Quindi, dato che la funzione start gira all'infinito, quando si verifica un nuovo evento, la funzione non partirà e le variabili al suo interno non saranno aggiornate.

C'è solo una via d'uscita, usare le nuove funzioni del linguaggio e non preoccuparsi delle vecchie funzioni.

События клиентского терминала - Документация на MQL4
  • docs.mql4.com
События клиентского терминала - Документация на MQL4
 
artmedia70:

1. Anche io ho notato la stranezza...

E nell'occhio di qualcun altro si può sempre vedere anche una cannuccia. E più ceppi ci sono nell'occhio, più piccola è la pagliuzza che si può discernere.

In qualsiasi attività, è il risultato, non il processo, che conta. Il risultato è questo: il nero viene presentato come bianco - letteralmente - non figurativamente - il sistema esecutivo mostra all'utente un altro valore invece di uno. DOVE questo viene fatto - all'interno di una funzione o al di fuori di essa - non ha importanza. Un sistema multitasking in tempo reale è in grado di gestire diversi processi contemporaneamente. In questo processo, la funzione Sleep()"gira" per la maggior parte del tempo e non consuma affatto risorse di sistema. Questa è la classica cosa che si usa essenzialmente per sospendere il processo. Tutti gli altri processi possono funzionare senza ostacoli.

- Compagni, possiamo realizzare il piano al 102%?

- ... Sì, possiamo.

Motivazione: