- Hai diversi blocchi di codice disallineati a causa di parentesi che mancano. Anche se bilanciate, mancano, come all'inizio del "for" e di alcuni blocchi "if"
- La linea"if(OrderSymbol()!=Symbol()) continue;{" è molto sospetta e rende difficile vedere come dovrebbe essere il flusso del codice. Basta fare"if(OrderSymbol()==_Symbol) {". Invece di"Symbol()", puoi anche usare"_Symbol"
- Usate"OrderClosePrice()" e non"Ask" o"Bid".
- Aggiungete delle parentesi quando fate dei confronti per facilitare la lettura e garantire l'ordine delle cose. Per esempio, invece di"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" usate"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) )"
- Provate a unire entrambi i blocchi di codice Buy e Sell in un unico blocco di codice che li gestisce entrambi. Questo renderà meno codice da debuggare e più facile da leggere e modificare in futuro.
PS! NB! Fai anche uso di un numero magico per gli ordini!
PS! Ricordatevi anche di tenere conto dello slittamento che può causare i 130 errori. Un minimo di StopLevel da solo non è sufficiente. Fatelo leggermente più grande per tenere conto di possibili slittamenti come l'aggiunta di un fattore dello spread corrente. Ci può essere anche un FreezeLevel in atto da parte del Broker!
- Hai diversi blocchi di codice non allineati a causa di parentesi che mancano. Anche se bilanciate, mancano, come all'inizio del "for" e di alcuni blocchi "if"
- La linea"if(OrderSymbol()!=Symbol()) continue;{" è molto sospetta e rende difficile vedere come dovrebbe essere il flusso del codice.
Basta fare"if(OrderSymbol()==_Symbol) {". Invece di"Symbol()", potete anche usare"_Symbol" - Usate"OrderClosePrice()" e non"Ask" o"Bid".
- Aggiungete le parentesi quando fate i confronti per rendere più facile la lettura e garantire l'ordine delle cose:
Per esempio, invece di"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" usa"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) )" - Cercate di unire entrambi i blocchi di codice Buy e Sell in un unico blocco di codice che li gestisca entrambi. Questo renderà meno codice da debuggare e più facile da leggere e modificare in futuro.
PS! NB! Fai anche uso di un numero magico per gli ordini!
PS! Ricordatevi anche di tenere conto dello slippage che può causare gli errori 130. Un minimo di StopLevel da solo non è sufficiente. Fatelo leggermente più grande per tenere conto di un possibile slippage come l'aggiunta di un fattore dello spread corrente. Ci può essere anche un FreezeLevel in atto da parte del Broker!
Grazie mille per la tua risposta e per aver cercato di aiutarmi. Ho alcune domande/commenti:
1. In #1 mi hai suggerito di aggiungere le parentesi (), cosa che ho fatto secondo il tuo suggerimento in #4. Ma non vedo come posso aggiungere le parentesi () all'inizio del "for". Potresti spiegarlo o intendevi le parentesi graffe {}?
2. L'ho cambiato in _Symbol, ma per migliorare la mia conoscenza mi chiedevo se puoi spiegare qual è il beneficio/vantaggio di usare _Symbol rispetto a Symbol()?
3. Ho cambiato tutte le Asks e Bids in OrderClosePrice(), tuttavia, potreste spiegarmi qual è il beneficio/svantaggio di questo?
4. Ho fatto questo
5. Proverò a vedere come posso semplificare ulteriormente la cosa.
6. Dato che inserisco i miei trade manualmente, mi sembra di capire che non posso usare MagicNumbers, non è vero?
7. Non vedo come o dove posso tenere conto dello slippage, mi dite per favore dove o come aggiungerlo? Per OrderModify permette solo i seguenti parametri:
bool OrderModify( int ticket, // ticket double price, // price double stoploss, // stop loss double takeprofit, // take profit datetime expiration, // expiration color arrow_color // color );
8. Nel mio codice ho già aggiunto 1 pip (10 punti) allo stoplevel minimo, che dovrebbe tenere conto dello spread nella maggior parte dei casi.
9. Ho stampato il Freezelevel per tutte le coppie e sono tutti 0.0, quindi non sembra essere un problema.
10. Anche se sto ancora ottenendo l'errore 130 e l'errore uno, quando l'EA funziona, modifica e chiude l'ordine. Quindi, secondo questi risultati, sto ottenendo l'errore in quanto l'ordine viene modificato allo stesso tempo. Come se fosse un problema parziale:
2016.04.15 13:11:06.183 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28598 tp: 0.00000 ok
2016.04.15 13:11:05.860 Trailing_v18 USDCAD,M15: Acquisto = 130
2016.04.15 13:10:58.939 Trailing_v18 USDCAD,M15: modificare #50202284 comprare 0,01 USDCAD a 1,28477 sl: 1,28597 tp: 0,00000 ok
2016.04.15 13:10:57.835 Trailing_v18 USDCAD,M15: modificare #50202284 comprare 0,01 USDCAD a 1,28477 sl: 1,28596 tp: 0,00000 ok
2016.04.15 13:10:56.974 Trailing_v18 USDCAD,M15: Acquisto = 130
2016.04.15 13:10:56.531 Trailing_v18 USDCAD,M15: Buy = 130
2016.04.15 13:10:56.263 Trailing_v18 USDCAD,M15: modificare #50202284 comprare 0,01 USDCAD a 1,28477 sl: 1,28590 tp: 0,00000 ok
2016.04.15 13:10:54.318 Trailing_v18 USDCAD,M15: modificare #50202284 comprare 0,01 USDCAD a 1,28477 sl: 1,28582 tp: 0,00000 ok
2016.04.15 13:10:53.175 Trailing_v18 USDCAD,M15: modificare #50202284 comprare 0,01 USDCAD a 1,28477 sl: 1,28581 tp: 0,00000 ok
2016.04.15 13:10:52.879 Trailing_v18 USDCAD,M15: modificare #50202284 comprare 0,01 USDCAD a 1,28477 sl: 1,28577 tp: 0,00000 ok
2016.04.15 13:10:51.810 Trailing_v18 USDCAD,M15: Acquisto = 130
2016.04.15 13:10:51.085 Trailing_v18 USDCAD,M15: modificare #50202284 comprare 0,01 USDCAD a 1,28477 sl: 1,28575 tp: 0,00000 ok
2016.04.15 13:10:50.744 Trailing_v18 USDCAD,M15: Acquisto = 130
2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: Acquisto = 1
2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28571 tp: 0.00000 ok
Ecco un altro esempio in cui il Trailingstop è chiaramente sopra lo stoplevel (di 10 pip/100 punti) e tuttavia produce ancora l'errore 130:
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: Acquisto errore = 130
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TS = 20
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStop = 5
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStart = 25
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: stoplevel = 10.0
Si prega di fornire il codice più recente con gli aggiornamenti che avete fatto. Altrimenti non posso commentare i recenti cambiamenti fatti da voi per vedere se sono corretti.
- Scusa, intendevo le parentesi graffe. Devi sistemare questo, altrimenti continuerà a fallire. Questo è il più importante di tutti i punti.
- a) Questo punto non riguarda principalmente il "_Symbol", ma piuttosto il "!=" e il "continue".
b) "_Symbol" viene eseguito più velocemente perché è una variabile, mentre "Symbol()" verrebbe eseguito come una chiamata di funzione che è più lenta. - OrderClosePrice() è l'attuale prezzo di chiusura dell'ordine. Se è ancora aperto, riporterà automaticamente il Bid o l'Ask a seconda del tipo di ordine. Si prega di leggere la documentazione di questa funzione.
- OK! Vediamo le modifiche al codice che hai fatto.
- OK! Vediamo le modifiche al codice che hai fatto.
- Sì, per i trade manuali, il numero magico è 0. Tuttavia, nel tuo codice definisci il numero magico come un "extern" o "input", assegnandogli uno "0" come default, e poi usa quella variabile nel tuo codice. In questo modo puoi facilmente usare l'EA per altre situazioni o riutilizzare il tuo codice per altri EA.
- Ho spiegato come tenere conto dello slippage. Assicurati che il "TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )" dove Factor è almeno "1.0" (idealmente "1.5" o "2.0"; maggiore se vedi che si verifica ancora l'errore 130 a causa dell'eccessivo slippage).
- Non c'è alcuna garanzia che 10 punti rappresentino lo spread, perché lo spread è diverso a seconda del Symbol e cambia sempre, specialmente durante le notizie e quando la liquidità è bassa, come nelle ore di chiusura.
- OK! Se "FreezeLevel" non viene utilizzato va bene, ma ti suggerisco di tenerne conto nel tuo codice, in modo che nel caso in cui lo utilizzi con un broker diverso (che potrebbe averlo), l'EA continuerà a funzionare.
- Fornire il nuovo codice con le modifiche in modo che possa essere analizzato.
Si prega di fornire il codice più recente con gli aggiornamenti che avete fatto. Altrimenti non posso commentare i recenti cambiamenti fatti da voi per vedere se sono corretti.
- Scusa, intendevo le parentesi graffe. Dovete sistemare questo, altrimenti continuerà a fallire. Questo è il più importante di tutti i punti.
- a) Questo punto non riguarda principalmente il "_Symbol", ma piuttosto il "!=" e il "continue".
b) "_Symbol" viene eseguito più velocemente perché è una variabile, mentre "Symbol()" verrebbe eseguito come una chiamata di funzione che è più lenta. - OrderClosePrice() è l'attuale prezzo di chiusura dell'ordine. Se è ancora aperto, riporterà automaticamente il Bid o l'Ask a seconda del tipo di ordine. Si prega di leggere la documentazione di questa funzione.
- OK! Vediamo le modifiche al codice che hai fatto.
- OK! Vediamo le modifiche al codice che hai fatto.
- Sì, per i trade manuali, il numero magico è 0. Tuttavia, nel tuo codice definisci il numero magico come un "extern" o "input", assegnandogli uno "0" come default, e poi usa quella variabile nel tuo codice. In questo modo puoi facilmente usare l'EA per altre situazioni o riutilizzare il tuo codice per altri EA.
- Ho spiegato come tenere conto dello slippage. Assicurati che il "TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )" dove Factor è almeno "1.0" (idealmente "1.5" o "2.0"; maggiore se vedi che si verifica ancora l'errore 130 a causa dell'eccessivo slippage).
- Non c'è alcuna garanzia che 10 punti rappresentino lo spread, perché lo spread è diverso a seconda del Symbol e cambia sempre, specialmente durante le notizie e quando la liquidità è bassa, come nelle ore di chiusura.
- OK! Se "FreezeLevel" non viene utilizzato, va bene, ma ti suggerisco di tenerne conto nel tuo codice, in modo che nel caso in cui tu lo utilizzi con un broker diverso (che potrebbe averlo), l'EA continuerà a funzionare.
- Fornire il nuovo codice con le modifiche in modo che possa essere analizzato.
Grazie mille, esaminerò tutti i consigli e i suggerimenti di cui sopra. Nel frattempo ecco l'ultimo codice. Inoltre, credo di aver trovato un errore in questa linea:
#property strict; extern string Label_TrailingStart="Pip threshold to activate TrailingStop"; extern int TrailingStart=12; extern int TrailingStop=5; double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10; int TS=TrailingStart-TrailingStop; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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+2)+" Pips"); } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit(){ return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start(){ double Pip=Point*10; int ticket=0; if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2; /*Print("stoplevel = ",stoplevel); Print("TrailingStart = ",TrailingStart); Print("TrailingStop = ",TrailingStop); Print("TS = ",TS); Print("Buy error = ",GetLastError()); Print("OrderOpenPrice = ",OrderOpenPrice()); Print("OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip = ", OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip); Print("OrderClosePrice-TrailingStop*Pip = ",OrderClosePrice()-TrailingStop*Pip); Print("TrailingStart*Pip = ",TrailingStart*Pip); Print("TrailingStop*Pip = ",TrailingStop*Pip); Print("OrderClosePrice = ",OrderClosePrice()); Print("OrderStopLoss = ",OrderStopLoss()); Print("OrderSymbol = ",OrderSymbol()); Print("OrdersTotal = ",OrdersTotal()); Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET)); Print("ticket = ",ticket); Print("OrderTicket = ",OrderTicket()); Print("Selectbyticket = ",SELECT_BY_TICKET); Print("Selectbypos = ",SELECT_BY_POS); Print("Ask = ",Ask); Print("OrderModify = ",OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip), OrderTakeProfit(),Blue));*/ for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)){ ticket++; if(OrderSymbol()==_Symbol){ if(OrderType()==OP_BUY){ if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((OrderClosePrice()-OrderOpenPrice())>(TrailingStart*Pip)){ if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){ RefreshRates(); if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),OrderTakeProfit(),Blue)) Print("Buy error = ",GetLastError()); } } } } if(OrderType()==OP_SELL){ if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((OrderOpenPrice()-OrderClosePrice())>(TrailingStart*Pip)){ if(TrailingStop>OrderClosePrice()+(TrailingStop*Pip)){ RefreshRates(); if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+(TrailingStop*Pip),OrderTakeProfit(),Red)) Print("Sell error = ",GetLastError()); /*Print("Ask = ",Ask); Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip); Print("TrailingStart*Pip = ",TrailingStart*Pip);*/ } } } } } } return(0); } //+------------------------------------------------------------------+
Un cambiamento piuttosto importante che ho fatto è stato cambiare la prima linea qui sotto con la seconda, perché penso che ci debba essere un valore superiore a zero per lo stoploss. è vero?
if(OrderStopLoss()<OrderClosePrice()-(TrailingStop*Pip)){
if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
Il seguente esempio di codice serve come possibile soluzione/alternativa al vostro codice. Notate però che il codice non è stato testato o debuggato (solo compilato), quindi usatelo solo come "pseudo" codice:
#property strict extern double dblTrailStartPips = 11.0, // Trailing Start (Pips) dblTrailStopPips = 5.0, // Trailing Stop (Pips) dblPipMultiplier = 10.0, // Pips to Points Multiplier dblSpreadFactor = 2.0; // Spread Factor for Slippage Compensation extern int intMagicNumber = 0; // Magic Number (0 for Manual Orders) double dblTickSizeDelta, // Size of a Tick (Delta) dblStopLevelDelta, // Market Stop Level (Delta) dblTrailStartDelta, // Trailing Start (Delta) dblTrailStopDelta; // Trailing Stop (Delta) // Initialisation int OnInit() { dblTickSizeDelta = MarketInfo( _Symbol, MODE_TICKSIZE ); dblStopLevelDelta = MarketInfo( _Symbol, MODE_STOPLEVEL ) * _Point; dblTrailStartDelta = dblTrailStartPips * dblPipMultiplier * _Point; dblTrailStopDelta = dblTrailStopPips * dblPipMultiplier * _Point; return( INIT_SUCCEEDED ); } // Process Tick Event void OnTick() { double dblSpreadDelta = Ask - Bid, dblMinStopDelta = dblStopLevelDelta + ( dblSpreadDelta * dblSpreadFactor ), dblTrailDelta = ( dblTrailStopDelta > dblMinStopDelta ) ? dblTrailStopDelta : dblMinStopDelta; for( int i = OrdersTotal() - 1; i >= 0; i-- ) { if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) { if( ( OrderSymbol() == _Symbol ) && ( OrderMagicNumber() == intMagicNumber ) ) { int intDirection = 0; switch( OrderType() ) { case OP_BUY: intDirection = +1; break; case OP_SELL: intDirection = -1; break; default: continue; } double dblOpenPrice = OrderOpenPrice(), dblCloseDelta = ( OrderClosePrice() - dblOpenPrice ) * intDirection; if( dblCloseDelta > dblTrailStartDelta ) { double dblStopLossPrice = OrderStopLoss(), dblStopLossDelta = ( dblStopLossPrice - dblOpenPrice ) * intDirection, dblTrailingDelta = dblCloseDelta - dblTrailDelta; if( ( dblTrailingDelta > dblStopLossDelta ) || ( dblStopLossPrice == 0 ) ) { double dblStopLoss = round( ( dblOpenPrice + ( dblTrailingDelta * intDirection ) ) / dblTickSizeDelta ) * dblTickSizeDelta; if( dblStopLoss != dblStopLossPrice ) { if( !OrderModify( OrderTicket(), dblOpenPrice, dblStopLoss, OrderTakeProfit(), OrderExpiration() ) ) { Print( "Order Modification Failed with Error: ", GetLastError() ); } } } } } } } }
Prova questo Trader3000
Confronta questo codice con quello che hai già... è molto simile e lo uso da anni e funziona come una bomba...
//+------------------------------+ //| TRAILING STOP Function | //+------------------------------+ void Trailing_Stop_Function() { bool Ticket_TS_Long; for(int iTS_Long = OrdersTotal() - 1; iTS_Long >= 0 ; iTS_Long --) { if(OrderSelect(iTS_Long,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumberLong && Trailing_Stop_In_Pips > 0 && Bid - OrderOpenPrice() > Trail_After_Pips_Profit*PipMultiplier && OrderStopLoss() < Bid - (Trailing_Stop_In_Pips*PipMultiplier)) { Ticket_TS_Long = (OrderModify(OrderTicket(),OrderOpenPrice(),Bid - (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green)); if (Ticket_TS_Long != true) { Print("TS-Order Modify Error ",GetLastError()); } } } bool Ticket_TS_Short; for(int iTS_Short = OrdersTotal() - 1; iTS_Short >= 0 ; iTS_Short --) { if(OrderSelect(iTS_Short,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumberShort && Trailing_Stop_In_Pips > 0 && OrderOpenPrice() - Ask > Trail_After_Pips_Profit*PipMultiplier && OrderStopLoss() > Ask + (Trailing_Stop_In_Pips*PipMultiplier)) { Ticket_TS_Short = (OrderModify(OrderTicket(),OrderOpenPrice(),Ask + (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green)); if (Ticket_TS_Short != true) { Print("TS-Order Modify Error ",GetLastError()); } } } }
Trail_After_Pips_Profit è una variabile doppia esterna che l'utente compila... e
PipMultiplier è una semplice funzione che calcola il valore decimale della valuta...
Se non usi MagicNumbers allora cancella questo criterio....
Questo...o meglio "dovrebbe" seguire qualsiasi ordine su qualsiasi grafico.....
Mi correggo, ma per me funziona....
//+------------------------------------------+ //| Check for 5 Digits - Pipmultiplier | //+------------------------------------------+ if(Digits==5||Digits==3) { PipMultiplier = 10*Point; } else if(Digits==2) { PipMultiplier = 100*Point; } else { PipMultiplier = Point; }
Sono impressionato dal tuo aiuto FMIC.... Bello
@Mike.T: Sembra che ci sia qualcosa che non va nel tuo codice PipMulytiplier:
else if(Digits==2) { PipMultiplier = 100*Point; }
Non sembra essere corretto! Perché moltiplicarlo per 100 per i simboli a 2 cifre? Non dovrebbe essere moltiplicato affatto! Dovrebbe essere la stessa condizione dei simboli a 4 cifre.
Ecco un esempio. Se il prezzo di USD/JPY passa da 108,65 a 108,77, si tratta di un aumento di 12 pip, non di 1200 pip!Grazie!
Un consiglio: non usare "Ask" o "Bid" - usa invece "OrderClosePrice()". È un valore in tempo reale, indipendentemente dal fatto che sia un ordine di acquisto o di vendita.
Grazie... non sapevo che.... così... (senza dirottare questo thread)... Dovrei piuttosto usare OrderClosePrice() invece di Bid o Ask...?
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Ciao a tutti, non riesco a far funzionare correttamente il mio EA, lo sto facendo funzionare su 10 coppie/carte diverse simultaneamente e sembrano esserci due problemi:
1. Non fa scattare il Trailingstop la maggior parte delle volte, ma a volte funziona. Penso che il problema sia nel mio OrderSelect, ma non riesco a risolverlo.
2. A volte mi dà l'errore 130, ma non riesco a capire come il mio SL/TP possa essere non valido. Tutti i valori che sto stampando sono al di sopra dello stoplevel per tutte le coppie. E anche se ottengo l'errore 130, in realtà a volte modifica l'ordine come se niente fosse.
Qui c'è l'intero EA, potete per favore dargli un'occhiata e farmi sapere quale potrebbe essere il problema?