FMIC: Un consiglio: non utilizzare "Ask" o "Bid" - utilizza invece "OrderClosePrice()". Si tratta di un valore in tempo reale, indipendentemente dal fatto che si tratti di un ordine di acquisto o di vendita.
Non in tempo reale.
Con Ask e Bid è necessario aggiornare RefreshRates() dopo ritardi, cioè tra più chiamate al server, dopo uno Sleep o un lungo calcolo.
Con OrderClosePrice, viene aggiornato solo con un OrderSelect. Quindi, dopo uno Sleep o un calcolo lungo (o mantenendo un ordine selezionato tra le chiamate OnTick ), è necessario riselezionare.
Con Ask e Bid è necessario RefreshRates() dopo ritardi, cioè tra più chiamate al server, dopo Sleep o un lungo calcolo.
Con OrderClosePrice, viene aggiornato solo con un OrderSelect. Quindi, dopo uno Sleep o un lungo calcolo (o mantenendo un ordine selezionato tra le chiamate OnTick ), è necessario riselezionare.
Grazie per le informazioni. Non sapevo che "OrderClosePrice()" fosse bufferizzato. Quindi immagino che né "OrderClosePrice()" né la "Ask"/"Bid" siano la soluzione ideale in tempo reale.
Tuttavia, sei d'accordo che "OrderClosePrice()" è una soluzione globalmente migliore dell'utilizzo di "Ask"/"Bid" dopo l'esecuzione di "OrderSelect()"?
E per una soluzione in tempo reale, se è davvero necessario, allora credo che possiamo ripiegare sulle alternative:
Riselezionando l'ordine con "OrderSelect()" (EDIT: ho dimenticato di elencare questo nel post iniziale, anche se l'hai sottolineato)
"RefreshRate()" con "Ask"/"Bid"
"MarketInfo()" con "MODE_ASK"/"MODE_BID" (vecchio stile MQL4)
"SymbolInfoDouble()" con "SYMBOL_ASK"/"SYMBOL_BID" (nuovo stile MQL4+ e MQL5)
"SymbolInfoTick()" (che comunque uso già nella maggior parte dei miei EA)
Grazie per l'aiuto di tutti finora. Penso di aver risolto il problema dell'errore 130, ma c'è qualcosa di seriamente sbagliato con la mia funzione OrderSelect, che è molto probabilmente il motivo per cui solo a volte modifica alcuni degli ordini. Di seguito è riportato un elenco di cose che ho stampato. L'OrderTicket # è completamente sbagliato. Quel numero di ticket appartiene a un trade che ho aperto per la coppia EURAUD. Anche se non ho incluso tutti i risultati, ci sono in realtà più coppie dove i numeri OrderTicket non corrispondono alla coppia nel terminale di trading.
Qualcuno può dare un'occhiata e farmi sapere cosa c'è di sbagliato in OrderSelect? Grazie
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 Penso che ticket dovrebbe stampare lo stesso valore di OrdersTotal, quindi sembra che il mio contatore non funzioni.
Ciao a tutti, grazie per l'aiuto, ho trovato l'errore e i problemi sono stati risolti. Siccome non uso uno Stoploss, il valore di OrderStopLoss() è sempre 0. Questo non è un problema quando si modifica l'ordine di acquisto perché 0 è sempre inferiore a Bid-Trailingstop*Pip. Questo non è un problema quando modifico l'ordine di acquisto perché 0 è sempre inferiore a Bid-TrailingStop*Pip. Ma con l'ordine di vendita 0 non può mai essere superiore a Ask+Trailingstop*Pip. Quindi ho dovuto aggiungere l'or(|| OrderStopLoss()) a questa linea:
Grazie mille per l'aiuto. Sì, c'è sicuramente un problema con OrderSelect perché funziona solo su alcuni grafici. L'altro problema è che non posso includere un MagicNumber perché i trade sono piazzati manualmente. Ho usato la parte di codice che penso sia rilevante, ma non riesco a farlo compilare. Mostra questo errore:
'MySelect' - function can be declared only in the global scope Trailing_v26.mq4 31 13
e la linea 31 è questa:
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
Ecco l'intero EA:
#property strict;
externint TrailingStart=10;
externint TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES);
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int init(){
if(TS<stoplevel){
MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
"\nbe less than the minimum levels required by your broker and the"+
"\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop)+" pips");
}
return(0);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int deinit(){
return(0);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start(){
double Pip=Point*10;
if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
if (!OrderSelect(iWhat, eSelect, ePool)) return (false);
if (OrderSymbol() != _Symbol) return (false);
if (ePool != MODE_HISTORY) return (true);
return(OrderType() <= OP_SELL);
}
for(int i = OrdersTotal()-1; i >= 0; i--)
if (MySelect(i, SELECT_BY_POS)){
for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--)
if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){
int nextTkt = OrderTicket();
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){
if(OrderStopLoss()<Bid-(TrailingStop*Pip)){
if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue))
Print("Buy = ",GetLastError());
return(0);
RefreshRates();
}
}
}
}
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){
if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
Print("Sell = ",GetLastError());
return(0);
RefreshRates();
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
Sì, c'è sicuramente un problema con OrderSelect perché funziona solo su alcuni grafici. L'altro problema è che non posso includere un MagicNumber perché i trade sono piazzati manualmente. Ho usato la parte di codice che penso sia rilevante, ma non riesco a farlo compilare.
Ti ho dato uno scheletro di codice perfettamente buono su cui costruire, che risolve i tuoi problemi e li ha anche elencati prima, ma tu scegli di ignorarlo e continui a lottare chiedendoti perché il tuo codice non fa quello che vuoi!
Perché? Volete che il vostro codice non funzioni? Usate l'esempio e testatelo voi stessi!
Pensa di poter semplicemente tagliare e incollare e di non dover imparare a scrivere codice. Non riesce nemmeno a risolvere questo semplice errore senza chiedere:
'MySelect' - la funzione può essere dichiarata solo nell'ambito globale Trailing_v26.mq4 31 13
Non in tempo reale.
Grazie per le informazioni. Non sapevo che "OrderClosePrice()" fosse bufferizzato. Quindi immagino che né "OrderClosePrice()" né la "Ask"/"Bid" siano la soluzione ideale in tempo reale.
Tuttavia, sei d'accordo che "OrderClosePrice()" è una soluzione globalmente migliore dell'utilizzo di "Ask"/"Bid" dopo l'esecuzione di "OrderSelect()"?
E per una soluzione in tempo reale, se è davvero necessario, allora credo che possiamo ripiegare sulle alternative:
Perché stai cercando di inventare di nuovo la ruota?
Guarda qui - troverai tutto ciò di cui hai bisogno.
Altrimenti inizia a modificare il suo codice sorgente.
Grazie per l'aiuto di tutti finora. Penso di aver risolto il problema dell'errore 130, ma c'è qualcosa di seriamente sbagliato con la mia funzione OrderSelect, che è molto probabilmente il motivo per cui solo a volte modifica alcuni degli ordini. Di seguito è riportato un elenco di cose che ho stampato. L'OrderTicket # è completamente sbagliato. Quel numero di ticket appartiene a un trade che ho aperto per la coppia EURAUD. Anche se non ho incluso tutti i risultati, ci sono in realtà più coppie dove i numeri OrderTicket non corrispondono alla coppia nel terminale di trading.
Qualcuno può dare un'occhiata e farmi sapere cosa c'è di sbagliato in OrderSelect? Grazie
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 Penso che ticket dovrebbe stampare lo stesso valore di OrdersTotal, quindi sembra che il mio contatore non funzioni.
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrderSelect = true
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrdersTotal = 11
2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 0
2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 1
2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: OrderTicket = 50213357
Ciao a tutti, grazie per l'aiuto, ho trovato l'errore e i problemi sono stati risolti. Siccome non uso uno Stoploss, il valore di OrderStopLoss() è sempre 0. Questo non è un problema quando si modifica l'ordine di acquisto perché 0 è sempre inferiore a Bid-Trailingstop*Pip. Questo non è un problema quando modifico l'ordine di acquisto perché 0 è sempre inferiore a Bid-TrailingStop*Pip. Ma con l'ordine di vendita 0 non può mai essere superiore a Ask+Trailingstop*Pip. Quindi ho dovuto aggiungere l'or(|| OrderStopLoss()) a questa linea:
Grazie mille per l'aiuto. Sì, c'è sicuramente un problema con OrderSelect perché funziona solo su alcuni grafici. L'altro problema è che non posso includere un MagicNumber perché i trade sono piazzati manualmente. Ho usato la parte di codice che penso sia rilevante, ma non riesco a farlo compilare. Mostra questo errore:
'MySelect' - function can be declared only in the global scope Trailing_v26.mq4 31 13
e la linea 31 è questa:
Ecco l'intero EA:
Sì, c'è sicuramente un problema con OrderSelect perché funziona solo su alcuni grafici. L'altro problema è che non posso includere un MagicNumber perché i trade sono piazzati manualmente. Ho usato la parte di codice che penso sia rilevante, ma non riesco a farlo compilare.
Ti ho dato uno scheletro di codice perfettamente buono su cui costruire, che risolve i tuoi problemi e li ha anche elencati prima, ma tu scegli di ignorarlo e continui a lottare chiedendoti perché il tuo codice non fa quello che vuoi!
Perché? Volete che il vostro codice non funzioni? Usate l'esempio e testatelo voi stessi!