Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 143

 
Лауреат:
Come fare una funzione che chiuda una posizione aperta con il proprio ponte dopo che un determinato numero di candele è passato nella storia del tempo.
int numBars = 5;
void OnTick()
{
     for(int i = OrdersTotal(); i >= 0; i--)
     {
          if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
          if( OrderSymbol() != _Symbol)                continue;
          if( OrderMagicNumber() != Magic)             continue;
          if( OrderOpenTime() > Time[numBars-1] )      continue; 
          
          /* work */
     }
}
 
sviter-pro:
Sto sperimentando!!! la logica è specifica!!! potete aiutarmi?

Cosa c'è di specifico?

Guarda l'ultima posizione e apri la posizione opposta.

 
Konstantin Nikitin:

Lo controllerò.

 
sviter-pro:

Controllo ok.

 

Salve. Per favore, aiutatemi con la funzione. Su un conto, ci sono diversi EA da scambiare. Ogni EA non può aprire più di un trade al giorno. Ho bisogno di una funzione che restituisca true se l'EA ha già avuto un trade, e false se non c'è stato alcun trade. Il controllo dovrebbe essere fatto per magia alla data attuale, come ho capito. Se potete aiutarmi, ho intenzione di costruire questa funzione in ogni mio EA, che avrà bisogno di un tale controllo. Se posso aiutare, ho intenzione di costruirlo in ciascuno dei miei EAs dove ho bisogno di un tale controllo.

 
Kolya32:

Salve. Per favore, aiutatemi con la funzione. Su un conto, si suppone che faccia trading con diversi EAs. Ogni EA non può aprire più di un trade al giorno. Abbiamo bisogno di una funzione che restituisca true se c'è stato uno scambio, e false se non c'è stato nessuno scambio. Il controllo dovrebbe essere fatto per magia alla data attuale, come ho capito. Se potete aiutarmi, ho intenzione di costruire questa funzione in ogni mio EA, che avrà bisogno di un tale controllo. Se posso aiutare, ho intenzione di costruirlo in ciascuno dei miei EAs dove ho bisogno di un tale controllo.

Tutto è già stato fatto prima di noi )) Vedere qui.

 

Sembra che io abbia bisogno della funzione isTradeToDay(). Beh, sperimenterò) Grazie.

Ho corretto la funzione per me stesso commentando int mn=-1 e sostituendo mn con Magic. Dopo aver eseguito l'EA con questa funzione nel tester, ho visto un grande svantaggio: il tempo di test dell'EA è aumentato PER ANNI! Ora ho deciso di testare l'Expert Advisor con questa funzione su un conto demo. Ho 5 Expert Advisors nel mio conto e sono preoccupato che i trade vengano aperti con un ritardo...

bool isTradeToDay(string sy="", int op=-1 /*,int mn=-1*/) {
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
per (i=0; i<k; i++) {
se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
se (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (op<0 || OrderType()==op) {
if (Magic<0 || OrderMagicNumber()==Magic) {
se (TimeDay(OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear(OrderOpenTime())==Year()) return(True);
}
}
}
}
}
}
k=OrdiniTotali();
per (i=0; i<k; i++) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
se (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (op<0 || OrderType()==op) {
if (Magic<0 || OrderMagicNumber()==Magic) {
se (TimeDay(OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear(OrderOpenTime())==Year()) return(True);
}
}
}
}
}
}
return(False);
}

 

Devi segnare il livello di pareggio della griglia sul grafico.

Profitto in pip:

double current_Prof_Pts = current_Prof_Bux/current_summ_lot/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point)

Posizione di pareggio per la griglia BUY

zero = Bid-current_Prof_Pts*_Point

(Per SELL, rispettivamente: Ask+current_Prof_Pts*_Point)

Risultato: sembra essere vero, ma salta sempre intorno al valore vero di circa 3 punti.

Puoi dirmi dov'è l'errore?

 
Kolya32:

Sembra che io abbia bisogno della funzione isTradeToDay(). Beh, sperimenterò) Grazie.

Ho trovato un grande svantaggio: il tempo per testare un EA è aumentato ESATTAMENTE DI CINQUE VOLTE!

Sì, certo. La funzione è scritta in modo universale. Se vi si accede ad ogni spunta, allora il ciclo passa attraverso tutta la storia dell'account. E la storia dell'account può essere abbastanza profonda (ho visto casi in cui c'erano più di 100 000 ordini). Per accelerare l'esecuzione, non è necessario eseguire il ciclo su tutta la storia ogni volta. È sufficiente farlo solo una volta all'inizio e ricordare l'indice dell'ultimo ordine elaborato. La volta successiva, è necessario passare attraverso il ciclo solo per gli ordini che hanno un indice maggiore dell'indice memorizzato. Dopo di che, ricordate di nuovo l'indice dell'ultimo ordine, e così via.

 
Igor Zakharov:

È necessario segnare il livello di pareggio della griglia sul grafico.

Profitto in pip:

Posizione di pareggio per la griglia BUY

(Per SELL, rispettivamente: Ask+current_Prof_Pts*_Point)

Risultato: sembra essere vero, ma salta sempre intorno al valore vero di circa 3 punti.

Per favore consigliatemi, dov'è l'errore?

La colpa è dello spread fluttuante.

Motivazione: