Domande su MQL4 - pagina 7

 
Da qualche parte nel forum gli sviluppatori hanno scritto in dettaglio come funziona init/deinit. Forse qualcuno potrebbe fornire un link?
 
Ciao a tutti, ecco una domanda:
ho fatto una DLL in Delphi, la chiamo da MT4. Tutto funziona tranne i semplici parametri passati per riferimento. In Delphi, dichiarato come segue:

procedura Test2(var i: integer); stdcall;
begin
if addr(i) = nil then ShowMessage('What the hell?');
end;

stop per chiamarlo come

#import "DLL1.dll"
void Test2(int& i);

chiamo
int init() {
int x = 5;
Test2(x);
return(x);
}

quando chiamato, un riferimento alla variabile integer dovrebbe essere nello stack, ma null è lì
quindi come passare un parametro int per riferimento?
Quando si passano gli array, il valore dell'array viene passato per riferimento

usando
MetaEditor 4.00 build 183
MetaTrader 4.00 build 186

un'altra domanda: se passo una stringa come riferimento, qual è la dimensione del buffer della stringa?

un'altra domanda:
Se passo una stringa come risultato della funzione, dove dovrebbe essere allocata l'area di memoria per la stringa? Devo passare un puntatore a una variabile globale nella DLL? In questo caso, posso essere sicuro che la DLL non sarà chiamata da diversi thread simultaneamente in qualsiasi modalità di metatrader?

Grazie in anticipo
 
l'implementazione attuale è tale che puoi solo passare parametri per riferimento all'interno di un singolo codice sorgente. l'eccezione sono gli array. se passi un array alla dll, puoi cambiare i valori dei suoi elementi e questi cambiamenti saranno disponibili nella funzione chiamante. cioè puoi passare un array molto piccolo.
 
Come implementare questo in MQL4
all'inizio della giornata impostare due ordini pendenti
Una volta uno (qualsiasi) innescato - il secondo viene rimosso
Cinque minuti prima della chiusura della barra (diciamo un giornaliero) per chiudere il trigger (se non è stato chiuso da SL o TP)
Se nessun ordine pendente attivato, cinque minuti prima della chiusura della barra cancellarli entrambi
Grazie mille
 
1) Se passo la stringa come riferimento, qual è la dimensione del buffer di ricezione della stringa?

2) Se passo la stringa come risultato della funzione, dove dovrebbe essere allocata l'area di memoria per la stringa? Devo passare un puntatore a una variabile globale nella DLL? In questo caso, posso essere sicuro che la DLL non sarà chiamata da diversi thread simultaneamente in qualsiasi modalità del metatrader?

Grazie in anticipo
 
Come implementare questo in MQL4 <br/ translate="no"> All'inizio della giornata impostare due ordini pendenti
Quando uno (qualsiasi) attivato - il secondo viene eliminato
Cinque minuti prima della chiusura della barra (diciamo un quotidiano) per chiudere il trigger (se non è stato chiuso da SL o TP)
Se nessun ordine pendente attivato, cinque minuti prima della chiusura della barra eliminarli entrambi
Grazie in anticipo

Hai impostato gli ordini pendenti al momento giusto (è facile). E si comincia a controllare gli ordini. Non appena appare un ordine di acquisto o di vendita, si lavora per rimuovere l'ordine pendente (ancora più facile). E poi, al momento giusto, lavorare per chiudere tutti gli ordini (questo è facile).
 
Как в MQL4 реализовать такое
в начале дня устанавливаем два отложенных ордера
После того как один(любой) сработал - второй удаляется
За пять минут до закрытия бара(допустим дневного) закрыть сработавший (если он не был закрыт по SL или TP)
Если ни один отложенный ордер не соработал то за пять минут до закрытия бара удаляем их обоих
Заранее спасибо

Questo è il modo in cui lo si implementa, si mettono ordini pendenti al momento giusto (è facile). E poi si comincia a controllare gli ordini. Non appena appare un ordine di acquisto o di vendita, si lavora per rimuovere l'ordine pendente (questo è ancora più facile). E poi, al momento giusto, lavorare per chiudere tutti gli ordini (è molto facile).


Ho chiesto un codice funzionante (forse qualcuno l'ha implementato).
Tutto quello che ho fatto non funziona... Il processo di odrerdelete è in qualche modo confuso.
Un'altra domanda: a volte il prezzo si blocca (nessun tick) per alcuni minuti, cioè non possiamo chiudere un ordine perché il corpo int start() non viene eseguito, anche se i tick vengono ricevuti per altri simboli, è possibile passare il valore Curetime da qualsiasi simbolo con tick?
Per dirla semplicemente, il valore di Curetime non dovrebbe praticamente congelare
 
Quello che volete fare è l'ABC. Senza capire come funzionano gli operatori di base, non si può entrare in profondità. E puoi chiudere tutti gli ordini da qualsiasi grafico. Si può fare in questo modo:
 cnt=0; while(cnt<1) { if(OrdersTotal()<1)break; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if(cmd==2||cmd==3|cmd==4|cmd==5)result=OrderDelete(OrderTicket()); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); if(result) break;Sleep(1000); } Sleep(10000); }
 
Quello che volete fare è l'ABC. Senza capire come funzionano gli operatori di base, non si può entrare in profondità. E puoi chiudere tutti gli ordini da qualsiasi grafico. Puoi farlo in questo modo:<br/ translate="no">
 cnt=0; while(cnt<1) { if(OrdersTotal()<1)break; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); 
    cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if(cmd==2||cmd==3||cmd==4||cmd==5)result=OrderDelete(OrderTicket()); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); if(result) break;Sleep(1000); } Sleep(10000); }



E cosa fa questo frammento di codice?
Cancella entrambi gli ordini pendenti che non si sono ancora attivati
 
Gli hai chiesto di distruggere tutti gli ordini cinque minuti prima della chiusura del bar, quindi li prenderà tutti. Basta impostare correttamente l'ora. E usa altri pezzi di codice per chiudere gli ordini non necessari. O volete che l'intero programma sia scritto per voi?