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

 
Vitaly Muzichenko:

Provate a commentare la linea, fate funzionare una funzione


interessante se sai come)
 
Rustam Bikbulatov:

è interessante se sai come)
non avete bisogno di sapere nulla, l'ho mostrato nel codice //
 
Rustam Bikbulatov:

Salve di nuovo. Potete dirmi come cambiare il codice di un noto programmatore. Al momento questo gufo chiude circa uno scambio al secondo. Vorrei cambiarlo in modo che chiuda i trade istantaneamente quando attraversa un certo profitto, indipendentemente dai trade positivi o negativi.

Ci sono messaggi di errore scritti nel log?

Potete ridurre il ritardo all'interno di ClosePosBySelect a valori più ragionevoli. Lì, vengono fatti diversi tentativi per chiudere ogni ordine e in caso di fallimento Sleep si presenta ogni volta.

A proposito, il recupero dagli errori può essere fatto in modo migliore (dal momento della creazione di queste funzioni, MT ha imparato a generare un codice diverso da ERR_CONTEXT_BUSY).

 
Rustam Bikbulatov:

È interessante se sai come)
Puoi sostituire quei due con questo, per me funziona bene, ma molto dipende da quanto velocemente il tuo DC esegue gli ordini.
 
Maxim Kuznetsov:

Sono stati registrati dei messaggi di errore?

Potete ridurre i ritardi all'interno di ClosePosBySelect a valori più ragionevoli. Ci sono diversi tentativi di chiudere ogni ordine e ogni volta, se non ha successo, viene mostrato Sleep.

A proposito, il recupero dagli errori può essere fatto in modo migliore (dal momento della creazione di queste funzioni, MT ha imparato a generare un codice diverso da ERR_CONTEXT_BUSY).

Ho provato a rimuovere del tutto Sleep, ma è diverso.
 
Vitaly Muzichenko:
Puoi sostituire questi due con questo, funziona bene per me, ma molto dipende da quanto velocemente la tua società di intermediazione esegue gli ordini.

È un gufo completo o parte del codice di qualcosa?
 

Signori esperti, aiuto!!! Ho lavorato su questo problema per tre giorni. Ho usato la funzione standard nel mio Expert Advisor (l'ho vista ovunque) per leggere un file da Internet usando wininet.dll per ulteriori analisi:


stringa ReadHTML()

{

se(!IsDllsAllowed())

{

Alert("È necessario consentire le DLL nelle impostazioni;)

return(");

}

int rv = InternetAttemptConnect(0);

se(rv != 0)

{

Alert("Errore durante la chiamata a InternetAttemptConnect()");

return(");

}

int hInternetSession = InternetOpenW("Microsoft Internet Explorer", 0, "", "", 0);

se(hInternetSession <= 0)

{

Alert("Error calling InternetOpenW()");

return(");

}

int hURL = InternetOpenUrlW(hInternetSession,URL, "", 0, 0, 0);

se(hURL <= 0)

{

Alert("Errore nel chiamare InternetOpenUrlW();

InternetCloseHandle(hInternetSession);

return("");

}

int cBuffer[256];

int dwBytesRead[1];

stringa TXT = "";

mentre(!IsStopped())

{

bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);

if(dwBytesRead[0] == 0)

pausa;

stringa testo = "";

stringa text0= "";

for(int i = 0; i < 256; i++)

{

text0= CharToStr((char)(cBuffer[i] & 0x000000FF));

if (text0!="\r") text = text + text0;

else dwBytesRead[0]--;

if(StringLen(text) == dwBytesRead[0]) break;

text0= CharToStr((char)(cBuffer[i] >> (8 & 0x000000FF));

if (text0!="\r") text = text + text0;

else dwBytesRead[0]--;

if(StringLen(text) == dwBytesRead[0]) break;

text0= CharToStr((char)(cBuffer[i] >> (16 & 0x000000FF));

if (text0!="\r") text = text + text0;

else dwBytesRead[0]--;

if(StringLen(text) == dwBytesRead[0]) break;


text0= CharToStr((char)(cBuffer[i] >> (24 & 0x000000FF));

if (text0!="\r") text = text + text0;

else dwBytesRead[0]--;

if(StringLen(text) == dwBytesRead[0]) break;

}

TXT = TXT + testo;

Dormire(1);

}

InternetCloseHandle(hURL);

InternetCloseHandle(hInternetSession);

return(TXT);

}


Tutto ok, solo una volta sito letto, che viene successivamente aggiornato, su successive chiamate a questa funzione (con un periodo di 1 minuto o meno, anche se il sito viene aggiornato più spesso) dà lo stesso sito invariato (come è stato letto la prima volta). Riavviare l'Expert Advisor non aiuta, poiché il file è stato letto la prima volta dopo aver avviato il terminale, così sembra. L'unico modo per aggiornare è aprire manualmente Internet Explorer con il sito richiesto (rispettivamente, con le informazioni aggiornate) e la funzione inizia a leggere le informazioni aggiornate e poi si blocca questa configurazione del sito, o quando si riavvia il terminale MT4 (e anche quando si legge per la prima volta dopo il riavvio del terminale, quindi continua a emettere). Sospetto che abbia qualcosa a che fare con i parametri InternetOpenW o InternetOpenUrlW, il valore predefinito è zero, ma non riesco a trovare alcuna descrizione chiara di esso e in qualche modo funziona con altri EAs (l'ho preso da Expert Advisors che ritrasmettono notizie da siti al terminale). Sì, nelle impostazioni del terminale "Allow WebRequest for..." per il sito richiesto.

 

Buon pomeriggio.

Già la mia RAM sta fumando: è sorto un problema nell'EA, dopo aver preso un TP o SL, apre di nuovo un ordine!

Non riesco a pensare a una condizione in cui l'EA sarebbe legato solo alla 2a barra dopo il segnale dell'indicatore

o se un TP o SL scattasse, aspetterebbe un nuovo segnale, ma solo quando il segnale dell'indicatore cambia.


void OnTick()

{

uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4);

dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4);

se(DN_Trend()==vero)

{

if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, 0, "Sloper", Magic, 0, Red);

se (biglietto > 0)

{

SL = NormalizeDouble(Bid + StopLoss*Point, Digits);

TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

se (OrderSelect(ticket, SELECT_BY_TICKET))

if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Stampa("Errore di vendita");

}

}

 
d1w4m3:

Buon pomeriggio.

Già la mia RAM sta fumando: è sorto un problema nell'EA, dopo aver preso un TP o SL, apre di nuovo un ordine!

Non riesco a pensare a una condizione in cui l'EA sarebbe legato solo alla 2a barra dopo il segnale dell'indicatore

Oppure, se scatta un TP o uno SL, l'Expert Advisor aspetterebbe un nuovo segnale, ma solo quando il segnale dell'indicatore cambia.

Se l'ultima posizione chiusa è dello stesso tipo del segnale e se questa posizione è stata chiusa su uno degli ordini di stop, allora non aprire una posizione.
 
Artyom Trishkin:
Se l'ultima posizione chiusa è dello stesso tipo di quella in cui è arrivato il segnale, e se questa posizione è stata chiusa su uno degli ordini di stop, allora non aprire la posizione.


Grazie per la risposta, ma ho appena iniziato a imparare da un paio di settimane, come implementare questo nel codice, o dimmi dove leggere per favore. O secondo Igor Kim?

Eppure aprirà una posizione, non secondo il sistema, quando appena inizia il suo lavoro, la vostra condizione non evita questo problema.

Motivazione: