tag:blogger.com,1999:blog-2423902144429907371.post426405788081887417..comments2021-08-27T08:45:50.567+02:00Comments on Forex Trading con Metatrader: Gestire il Trailing Stop con MQLcarlo10http://www.blogger.com/profile/06267726563116255679noreply@blogger.comBlogger17125tag:blogger.com,1999:blog-2423902144429907371.post-12902047834481099392021-08-27T08:45:50.567+02:002021-08-27T08:45:50.567+02:00Buongiorno, ma se volessi creare un trailing stop ...Buongiorno, ma se volessi creare un trailing stop che mantenesse in stop profit per esempio di 10 pips ogni stop in profit tra di loro?. Mi spiego. Ho circa 50 ordini tutti in profitto e voglio che una volta raggiunti i 50 pips di profitto ad ordine, l'ea metta un trailing stop a distanza di 10 pips dal prezzo, ma tenendo anche conto che tra un trailing stop (in profitto) ed un'altro, ci siano sempre 10 o 15 pips di distanza tra di essi. Cioè non voglio che una volta che il prezzo inverta, l'ea chiuda tutti gli ordini in profitto che hanno lo stesso stop impostato dal trailing stop,. Voglio che il livello di stop impostato dal trailing stop, sia ad una certa distanza dal livello di stop impostato per un'altro ordine. Per intenderci meglio, voglio che i livelli di stop (in profitto) siano tra di loro equidistanti come se ci fosse una sorta di grigli tra i livelli stessi di stop in profitto. Grazie della risposta.Anonymoushttps://www.blogger.com/profile/00986451243620832907noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-50090272507516252162019-10-14T19:47:51.726+02:002019-10-14T19:47:51.726+02:00Grazie per il post: mi chiedo una cosa, il primo s...Grazie per il post: mi chiedo una cosa, il primo stop di partenza del trailing di un ordine deve essere superiore allo stoplevel del prodotto, altrimenti abbiamo errore. Mi confermi?Andrea Bertinihttps://www.blogger.com/profile/05799625916631786980noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-34196772118496028752019-10-14T19:47:27.145+02:002019-10-14T19:47:27.145+02:00Questo commento è stato eliminato dall'autore.Andrea Bertinihttps://www.blogger.com/profile/05799625916631786980noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-42471569377918073732018-02-09T08:51:51.791+01:002018-02-09T08:51:51.791+01:00Ciao Carlo ho modificato la funzione in questo mod...Ciao Carlo ho modificato la funzione in questo modo<br />void TrailingStop(double e_trailingstop,double e_trailingstep){<br /> Alert("Ts");<br /> if (OrderType() == OP_BUY)<br /> if ((Bid - OrderOpenPrice()) > (e_trailingstop * Point))<br /> if (OrderStopLoss() < Bid - (e_trailingstop + e_trailingstep - 1) * Point) {<br /> bool res=OrderModify(OrderTicket(), OrderOpenPrice(), Bid - e_trailingstop * Point, OrderTakeProfit(), 0, clrGreen);<br /> if(!res)<br /> Print("Error in OrderModify. Error code=",GetLastError());<br /> else<br /> Print("Order modified successfully.");<br /> return;<br /> }<br /> if (OrderType()==OP_SELL)<br /> if ((OrderOpenPrice() - Ask) > (e_trailingstop * Point))<br /> if (OrderStopLoss() > Ask + (e_trailingstop + e_trailingstep - 1) * Point || OrderStopLoss()==0) {<br /> bool res=OrderModify(OrderTicket(), OrderOpenPrice(), Ask - e_trailingstop * Point, OrderTakeProfit(), 0, clrRed);<br /> if(!res)<br /> Print("Error in OrderModify. Error code=",GetLastError());<br /> else<br /> Print("Order modified successfully.");<br /> return;<br /> }<br /> }<br />Pero mi da il primo alert "Ts" quindi entra nella funzione però non modifica l'ordine e non mi da nessun errore.. non capisco il motivoAnonymoushttps://www.blogger.com/profile/00699198420450475303noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-70829517362042058042011-06-27T23:02:46.767+02:002011-06-27T23:02:46.767+02:00Concordo, la soluzione non è elegante ma l'imp...Concordo, la soluzione non è elegante ma l'importante è che funzioni!<br /><br />Poi con il tempo se trovi un modo migliore per gestirla la modificherai.<br /><br />Piacere di averti aiutato!carlo10https://www.blogger.com/profile/06267726563116255679noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-30406912701083885402011-06-27T22:23:11.081+02:002011-06-27T22:23:11.081+02:00Carlo ecco cosa ho messo giù dopo il tuo consiglio...Carlo ecco cosa ho messo giù dopo il tuo consiglio:<br />__________________________________________<br />for (cnt=0; cnt<=total; cnt++)<br /> {<br /> OrderSelect(0,SELECT_BY_POS,MODE_TRADES);<br /> if (OrderMagicNumber() == e_MagicID)<br /> {<br /> if (OrderProfit() <= 0) return(0);<br /> if (OrderType() == OP_BUY){<br /> <br /> if (Var1 == 1 && (Bid - OrderOpenPrice()) > (e_BreakEvenStop * Point)){<br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Green);<br /> Var2 = 1;<br /> Var1 = 0;<br /> return(0);<br /> }<br /> <br /> if (Var2 == 1 && (Bid - OrderOpenPrice()) > (Level_1 * Point)){<br /> Stoploss = OrderOpenPrice()+(Profit_Level_1*Point);<br /> OrderModify(OrderTicket(), OrderOpenPrice(), Stoploss, OrderTakeProfit(), 0, Green);<br /> Var3 = 1;<br /> Var2 = 0;<br /> return(0);<br /> }<br /> <br /> if (Var3 == 1 && (Bid - OrderOpenPrice()) > (Level_2 * Point)){<br /> Stoploss = OrderOpenPrice()+(Profit_Level_2*Point);<br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+(Point*Profit_Level_2), OrderTakeProfit(), 0, Green);<br /> Var4 = 1;<br /> Var3 = 0;<br /> return(0);<br /> }<br /> <br /> if (Var4 == 1 && (Bid - OrderOpenPrice()) > (Level_3 * Point)){<br /> Stoploss = OrderOpenPrice()+(Profit_Level_3*Point);<br /> OrderModify(OrderTicket(), OrderOpenPrice(), Stoploss, OrderTakeProfit(), 0, Green);<br /> Var5 = 1;<br /> Var4 = 0;<br /> return(0);<br /> }<br /> <br /> if (Var5 == 1 && (Bid - OrderOpenPrice()) > (Level_4 * Point)){<br /> Stoploss = OrderOpenPrice()+(Profit_Level_4*Point);<br /> OrderModify(OrderTicket(), OrderOpenPrice(), Stoploss, OrderTakeProfit(), 0, Green);<br /> Var5 = 0;<br /> return(0);<br /> }}<br /> <br /> if (OrderType() == OP_SELL){<br /> <br /> ....<br />_____________________________<br />In pratica mi sono accorto che era necessario riazzerare le variabili dopo l'Ordermodify altrimenti eseguiva solo la condizione corrispondente alla variabile precedentemente memorizzata.<br />Comunque adesso scritto così funziona, ho provato nel backtest. Certo è un pò pesante come numero di righe di codice ma forse si può alleggerire...<br /><br />Come sempre sei di grande aiuto! Grazie CarloAle Lhttps://www.blogger.com/profile/04516216308402144949noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-16730688201347575522011-06-27T10:25:23.586+02:002011-06-27T10:25:23.586+02:00Quando la prima condizione di verifica (ovvero lo ...Quando la prima condizione di verifica (ovvero lo spostamento al BE) il programma esce con un return 0 e riparte dall'inizio spostando ogni volta il prezzo a BE.<br /><br />Oltre a spostare il prezzo a BE dovresti quindi aggiungere una variabile all'interno dell'if in modo che alla seconda esecuzione non entri più nell'if del BE ma in quello del livello 1.<br /><br />La stessa cosa vale per i livelli successivi.carlo10https://www.blogger.com/profile/06267726563116255679noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-61555007794661551032011-06-26T19:33:02.392+02:002011-06-26T19:33:02.392+02:00Ciao Carlo, eccomi di nuovo qui a chiederti aiuto....Ciao Carlo, eccomi di nuovo qui a chiederti aiuto. Volevo implementare una specie di trailing stop che si attivasse su dei livelli predefiniti. In pratica definisco 4 livelli tramite variabili esterne e nel momento in cui il prezzo li raggiunge il prgramma dovrebbe modificare lo stoploss. Ti allego il codice che ho provato a implementare (spero si capisca dopo il copia incolla):<br /><br />________________________________________________<br />for (cnt=0; cnt<=total; cnt++)<br /> {<br /> OrderSelect(0,SELECT_BY_POS,MODE_TRADES);<br /> if (OrderMagicNumber() == e_MagicID)<br /> {<br /> if (OrderType() == OP_BUY){<br /> if ((Bid - OrderOpenPrice()) >= (e_BreakEvenStop * Point)){<br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Green);<br /> return(0);<br /> }<br /> if ((Bid - OrderOpenPrice()) >= (Level_1 * Point)){<br /> <br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+Point*Profit_Level_1, OrderTakeProfit(), 0, Green);<br /> return(0);<br /> }<br /> if ((Bid - OrderOpenPrice()) >= (Level_2 * Point)){<br /> <br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+Point*Profit_Level_2, OrderTakeProfit(), 0, Green);<br /> return(0);<br /> }<br /> if ((Bid - OrderOpenPrice()) >= (Level_3 * Point)){<br /> <br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+Point*Profit_Level_3, OrderTakeProfit(), 0, Green);<br /> return(0);<br /> }<br /> if ((Bid - OrderOpenPrice()) >= (Level_4 * Point)){<br /> <br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+Point*Profit_Level_4, OrderTakeProfit(), 0, Green);<br /> return(0);<br /> }<br /> <br /> }<br /> <br /> if (OrderType() == OP_SELL){<br /> if ((OrderOpenPrice() - Ask) >= (e_BreakEvenStop * Point)){<br /> <br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Red);<br /> return(0);<br /> }<br /> if ((OrderOpenPrice() - Ask) >= (Level_1 * Point)){<br /> <br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-Point*Profit_Level_1, OrderTakeProfit(), 0, Red);<br /> return(0);<br /> }<br /> if ((OrderOpenPrice() - Ask) >= (Level_2 * Point)){<br /> <br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-Point*Profit_Level_2, OrderTakeProfit(), 0, Red);<br /> return(0);<br /> }<br /> if ((OrderOpenPrice() - Ask) >= (Level_3 * Point)){<br /> <br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-Point*Profit_Level_3, OrderTakeProfit(), 0, Red);<br /> return(0);<br /> }<br /> if ((OrderOpenPrice() - Ask) >= (Level_4 * Point)){<br /> <br /> OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-Point*Profit_Level_4, OrderTakeProfit(), 0, Red);<br /> return(0);<br /> }<br /> <br /> } <br /> }<br /> }<br />______________________________________________<br /><br />Il ciclo è all'interno della funzione Start. Provando il backtest, il primo livello viene eseguito, ma gli altri no (in pratica mi esegue solo lo spostamento al breakeven point).<br />Non capisco dov'è l'errore!?Ale Lhttps://www.blogger.com/profile/04516216308402144949noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-57126408559733042852011-04-05T21:14:06.121+02:002011-04-05T21:14:06.121+02:00Grazie, ti faccio sapere come va!Grazie, ti faccio sapere come va!Ale Lhttps://www.blogger.com/profile/04516216308402144949noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-80277204120105383052011-04-05T09:38:40.684+02:002011-04-05T09:38:40.684+02:00Si, probabilmente perchè non li hai selezionati ne...Si, probabilmente perchè non li hai selezionati nella maniera corretta.<br /><br />Una possibile gestione degli ordini aperti potrebbe essere la seguente:<br /><br /><br /><br /> //Gestioni ordini aperti<br /> int v_total=OrdersTotal();<br /> if(v_total<1) {<br /> // no opened orders identified<br /> if(AccountFreeMargin()<(1000*e_Lots)){<br /> Print("We have no money. Free Margin = ", AccountFreeMargin());<br /> return(0); <br /> }<br /> }<br /> else{<br /> int v_i = 0;<br /> while (v_i < v_total){<br /> //posizioni aperte? <br /> if((OrderSelect(v_i, SELECT_BY_POS, MODE_TRADES)==true)){<br /> if (isNewCandle()){<br /> //modifica ordine<br /> OrderModify(OrderTicket(), OrderOpenPrice(), Low[1], OrderTakeProfit(), 0, Blue);<br /> return(0);<br /> }<br /> } <br /> v_i++;<br /> }<br /> }<br /><br /><br /><br />In pratica devi effettuare un ciclo su tutti gli ordini aperti e verificare quindi se lanciare l'orderModify.<br /><br />Adattala al tuo expert.<br /><br />Ciaocarlo10https://www.blogger.com/profile/06267726563116255679noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-15094996708679782052011-04-04T20:58:05.480+02:002011-04-04T20:58:05.480+02:00Ciao Carlo, ho seguito il tuo consiglio: ho inseri...Ciao Carlo, ho seguito il tuo consiglio: ho inserito dei print e ho verificato che vengono stampati nel diario quindi suppongo che la parte del codice viene letta. Però nel diario compaiono anche diversi messaggi del tipo:<br /><br />"Unknown ticket 62 for OrderModify function"<br />"OrderModify error 4108"<br />"Unknown ticket 63 for OrderModify function"<br />"OrderModify error 4108"<br />.......<br />.......<br />.......<br /><br />Vuol dire che non riconosce l'ordine che deve modificare?Ale Lhttps://www.blogger.com/profile/04516216308402144949noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-78008741283349984292011-04-03T19:24:51.207+02:002011-04-03T19:24:51.207+02:00Solitamente la gestione degli ordini aperti e quin...Solitamente la gestione degli ordini aperti e quindi del trailing stop viene effettuata nel blocco che precede l'apertura di nuovi ordini. Questo potrebbe essere un motivo per cui non ti entra in quella parte del codice.<br /><br />Ovviamente hai postato giustamente solo una porzione del codice quindi non è detto che il problema sia quello.<br /><br />Quello che ti consiglio di fare per prima cosa è:<br /><br />1) Verificare che nei log del backtest (sotto la voce diario) vengono riporati errori o messaggi<br /><br />2) Inserire dei Print prima e dopo la modifica dell'ordine per vedere se effettivamente il programma entra in quella parte del codice<br /><br />Fammi saperecarlo10https://www.blogger.com/profile/06267726563116255679noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-38640548381030929392011-04-03T16:31:57.577+02:002011-04-03T16:31:57.577+02:00Ciao Carlo. Ho letto l'articolo su come indivi...Ciao Carlo. Ho letto l'articolo su come individuare una nuova candela e ho provato a implementare la strategia di trailing stop con OrderModify. Ti scrivo come ho strutturato il programma:<br /><br />_____________________________________________<br />extern double lots=0.1;<br />...<br />...<br />static datetime g_lastCandleOpenTime;<br /><br />int init()<br />{<br /> g_lastCandleOpenTime = Time[0];<br />}<br /><br /><br />int start()<br />{<br /><br />...<br /> <br /><br /> <br />// condizione di apertura ordine:<br /><br /> if (........) <br /> {<br /> ticket=OrderSend("EURUSD",OP_BUY,lots,Ask,3,Low[1],High[1]+takeprofit*Point,"Compro",e_MagicID,0,Green);<br /> }<br /><br />//gestione trailing stop<br /><br /> if (isNewCandle())<br /> {<br /> if (OrderType() == OP_BUY)<br /> {<br /> OrderModify(OrderTicket(), OrderOpenPrice(), Low[1], OrderTakeProfit(), 0, Blue); <br /> }<br /> }<br /> <br />return(0);<br />}<br /><br />// Funzione che verifica se siamo su una nuova candela<br /><br />bool isNewCandle()<br />{<br />//TRUE nuova candela<br />//FALSE vecchia candela<br /><br /> bool v_isNewCandle = false;<br /> //se la candela restituita è la 0 è quella già memorizzata<br /> int v_shift = iBarShift(NULL, 0, g_lastCandleOpenTime, true);<br /> <br /> if (v_shift == 0)<br /> v_isNewCandle = false;<br /> else{<br /> v_isNewCandle = true;<br /> //memorizzo l'orario della nuova candela<br /> g_lastCandleOpenTime = Time[0];<br /> }<br /> <br /> return (v_isNewCandle);<br />}<br />________________________________________________<br /><br />Ho provato a fare il backtest in metatrader ma non mi sembra che faccia quello che mi aspetto (aggiornare lo stoploss al minimo della candela precedente). Forse manca qualcosa?Ale Lhttps://www.blogger.com/profile/04516216308402144949noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-84563550563075328142011-04-01T11:48:35.489+02:002011-04-01T11:48:35.489+02:00Forse questo articolo ti può dare uno spunto su co...Forse questo articolo ti può dare uno spunto su come individuare una nuova candela:<br /><br />http://metatrader-forex-trading.blogspot.com/2010/11/individuare-una-nuova-candela-in.html<br /><br />Una volta che ti trovi in una nuova candela puoi spostare lo stop con la funzione OrderModify.<br /><br />E' importante però che effettui dei controlli sul prezzo a cui intendi spostarlo rispetto al prezzo attuale del cross.carlo10https://www.blogger.com/profile/06267726563116255679noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-58762195428772053692011-03-31T22:11:21.557+02:002011-03-31T22:11:21.557+02:00Ok allora ci provo! Se ho capito qualcosa da quel ...Ok allora ci provo! Se ho capito qualcosa da quel poco che ho studiato, non possiamo sfruttare la funzione OrderSend, inserendo nella voce relativa allo stoploss "Low[1]": in questo modo il programma imposta lo stoploss al minimo della candela precedente, ma non si aggiorna automaticamente al cambiare della candela. Invece servirebbe una funzione che riconosca la candela attuale. Immagino che esista, ora faccio una ricerca...appena metto giù qualcosa ti faccio sapere! Grazie per il supporto :)Ale Lhttps://www.blogger.com/profile/04516216308402144949noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-17678822740004344492011-03-31T09:20:38.153+02:002011-03-31T09:20:38.153+02:00Ciao,
è fattibile ma ovviamente bisogna effettuar...Ciao,<br /><br />è fattibile ma ovviamente bisogna effettuare delle operazioni e dei controlli diversi. <br /><br />Se provi a buttare giù il codice ti do una mano in caso ti blocchi.carlo10https://www.blogger.com/profile/06267726563116255679noreply@blogger.comtag:blogger.com,1999:blog-2423902144429907371.post-5862182022912598892011-03-30T21:37:26.467+02:002011-03-30T21:37:26.467+02:00Ciao Carlo! Eccomi di nuovo qui :)
Se invece vole...Ciao Carlo! Eccomi di nuovo qui :) <br />Se invece volessimo impostare un trailing stop che si aggiorna automaticamente ad ogni candela settando lo stoploss al minimo della candela precedente? E' fattibile?Ale Lhttps://www.blogger.com/profile/04516216308402144949noreply@blogger.com