Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
La funzione IndexByTicket().
Restituisce l'indice (numero ordinale nella lista generale degli ordini impostati o delle posizioni aperte) dell'ordine o della posizione sul ticket. Se IndexByTicket() non trova un ordine o una posizione con il ticket richiesto, restituisce -1. Possiamo limitare la lista di ordini o posizioni da controllare usando i parametri della funzione:
Ho scritto la funzione IndexByTicket() in un EA personalizzato. Mi ricordo che non potevo farne a meno, altrimenti perché l'avrei scritto? Ma non ricordo come è stato usato lì o perché l'ho praticamente scritto :-) Cercare il codice sorgente del consulente è noioso. Ce ne sono centinaia.
Comunque, non vedo il senso di fare esempi come quelli che ho già dato. Se siamo intelligenti, possiamo capire dove "mettere" i parametri. E se qualcuno ha una buona idea per usare la funzione IndexByTicket(), la posti qui. Cercherò di realizzarlo.
Un breve annuncio.
Le funzioni SelectByTicket() e SelectByTicketFromHistory() sono state abolite. Non li userò io stesso, quindi non vedo il motivo di pubblicarli. Coloro che desiderano discutere su questo argomento sono sempre i benvenuti. Mostrerò tutti i miei deliri così come sono.
La funzione NumberOfOrders().
Questa funzione restituisce il numero di ordini e funzionalmente sovrascrive completamente ExistOrders(). Per sostituire la funzione ExistOrders() con la funzione NumberOfOrders(), è necessario e sufficiente controllare il valore di ritorno affinché sia maggiore di zero. Puoi limitare la lista degli ordini da controllare usando i parametri della funzione:
Esempi di come usare la funzione NumberOfOrders().
In allegato c'è di nuovo uno script funzionante con gli esempi di cui sopra.
La funzione NumberOfOrders().
Questa funzione restituisce il numero di ordini e funzionalmente sovrascrive completamente ExistOrders(). Per sostituire la funzione ExistOrders() con la funzione NumberOfOrders(), è necessario e sufficiente controllare il valore di ritorno affinché sia maggiore di zero. Puoi limitare la lista degli ordini da controllare usando i parametri della funzione:
Sono un po' confuso. Per qualche ragione, vedo qualche contraddizione. Proprio qui:
"...è necessario e sufficiente controllare che il valore di ritorno sia maggiore di zero".
Se spunti "questo e solo questo", allora la funzione sul numero di ordini non ha senso!
È per questo che ho iniziato a darci dentro. Ho inserito questa funzione nel mio Expert Advisor. Ho impostato m=1 nei parametri e condizione per aprire le posizioni.
Ma è come se l'Expert Advisor non vedesse questa limitazione! E apre gli ordini ad ogni segnale.
Quale può essere il problema qui?
Sono un po' confuso. Per qualche ragione, vedo una certa contraddizione. Proprio qui:
"...è necessario e sufficiente controllare che il valore di ritorno sia maggiore di zero".
Se controlliamo "questo e solo questo", allora la funzione per il numero di ordini non ha senso!
hmm... Sembra che tu non faccia attenzione alla quantità di informazioni restituite da ciascuna delle funzioni ExistOrders() e NumberOfOrders(). La funzione ExistOrders() restituisce solo informazioni sull'esistenza di ordini, e la funzione NumberOfOrders() restituisce informazioni sul numero di ordini. L'informazione sul numero di ordini contiene l'informazione sull'esistenza di ordini. Quando abbiamo bisogno di rispondere alla domanda se un ordine esiste o no, l'informazione sul numero di ordini è ridondante. Ecco perché ho detto che se vogliamo sostituire la funzione ExistOrders() con la funzione NumberOfOrders (), dobbiamo controllare il valore restituito dalla funzione NumberOfOrders() per assicurarci che sia maggiore di zero. Dopo tutto, è chiaro che se questo valore è uguale a zero, non ci sono ordini, e se questo valore è maggiore di zero, gli ordini sono presenti. La funzione ExistOrders() può essere usata quando non abbiamo bisogno di informazioni sulla quantità dell'ordine, mentre la funzione NumberOfOrders() può essere usata quando non abbiamo bisogno di informazioni sulla quantità dell'ordine e quando ne abbiamo bisogno. In questo senso, la funzione NumberOfOrders() sostituisce completamente la funzione ExistOrders().
Ecco perché ho iniziato a indagare. Ho inserito questa funzione nel mio Expert Advisor. Ho impostato m=1 nei parametri e condizione per aprire le posizioni.
Ma è come se l'Expert Advisor non vedesse questo vincolo! E apre gli ordini ad ogni segnale.
Quale può essere il problema qui?
Grazie. Ho tutto. Sia sulla prima domanda che sulla seconda.
In altre parole, la funzione "estesa" NumberOfOrders() essenzialmente include già la funzione IndexByTicket()
Sì, infatti. Ho aperto OP_BUY e OP_SELL!
Resta da dare un esempio della vostra prossima funzione che funziona esattamente con le posizioni. (non con ordini).
Mi ricordo che l'hai già postato da qualche parte su questo forum. Non riesco a trovarlo.
Resta da dare un esempio della vostra prossima funzione che funziona esattamente con le posizioni. (non con ordini)
Ho finito con le funzioni per gli ordini. Poi ci sono le funzioni per le posizioni. Ce ne sono circa 30.
Mi ricordo che da qualche parte nel forum l'hai già postato. Non riesco a trovarlo.
cerca
Caro Igor, chiedo il tuo aiuto! Ho bisogno di aggiungere un EA in modo che possa prendere posizioni su diversi strumenti. Ci sono 2 EAs in funzione, MACD standard e Ema, ognuno con 6 posizioni, ma solo una posizione si apre... Ho letto i vostri commenti su questo, ma siccome non sono bravo con la lingua, non riesco a capire dove aggiungere cosa... Se non ti dispiace, per favore aiuta... copiato Ema consigliere... Grazie!
//+------------------------------------------------------------------+//| Parabolic.mq4 |
//| Vitalik |
//| wwwita@mail.ru |
//+------------------------------------------------------------------+
extern double Lots=0.1;
extern double Pip=5;
extern double MoveBack=3;
extern int chk=0;
extern double SL=20;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double hi=High[1];
double lo=Low[1];
double EMA, EMA1, EMA2, EMA3;
int cnt=0, ticket, total;
EMA=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,1);
EMA1=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,1);
EMA2=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,0);
EMA3=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,0);
total=OrdersTotal();
if(total<1)
{
if(AccountFreeMargin()<(1000*Lots))
{
Print("Non hai soldi. Fondi liberi = ", AccountFreeMargin());
return(0);
}
if(((EMA>EMA1) && (EMA2<EMA3)) || ((EMA<EMA1) && (EMA2>EMA3))
{
chk=1;
Print("La posizione è possibile!");
}
if(chk==1)
{
if(EMA3-EMA2>2*Point && Bid>=(lo+MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,
"EMA position:",16385,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order open : ",OrderOpenPrice());
chk=0;
}
else
{
Print("Error opening SELL order : ",GetLastError());
return(0);
}
}
if(EMA2-EMA3>2*Point && Ask<=(hi-MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,
"EMA position:",16385,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order open : ",OrderOpenPrice());
chk=0;
}
else
{
Print("Order BUY open error : ",GetLastError());
return(0);
}
}
}
return(0);
}
for(cnt=0;cnt<totale;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // è una posizione aperta? OP_BUY o OP_SELL
OrderSymbol()==Symbol()) // lo strumento corrisponde?
{
if(OrderType()==OP_BUY) // posizione lunga aperta
{
// controlliamo se è già ora di chiudere?
if(Bid>=(OrderOpenPrice()+Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // chiude la posizione
return(0); // esce
}
if(Bid<=(OrderOpenPrice()-SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // chiudere la posizione
return(0); // uscire
}
}
else // altrimenti questa è una posizione corta
{
// controllare se è già tempo di chiudere?
if(Ask<=(OrderOpenPrice()-Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // chiudere la posizione
return(0); // uscire
}
if(Ask>=(OrderOpenPrice()+SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // chiude la posizione
return(0); // esce
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
Igor, ti ho fatto una domanda nella "Libreria di funzioni per lavorare con i file INI", ma non c'è stata risposta :(