Breakeven- and trailing stop problem
Forums › ProRealTime English forum › ProOrder support › Breakeven- and trailing stop problem
- This topic has 16 replies, 5 voices, and was last updated 5 years ago by Vonasi.
-
-
01/30/2019 at 8:55 PM #90086
If a strategy uses a long and short criteria and a breakeven- or trailing stop there’s a problem.
The case is that they both need a scenario where there’s no market position, and that “not on market” is used to enter a new position.
If there’s no market position, the breakeven and trailing stop are correctly calculated when a position is entered.
If there’s i.e. a long position and there’s short signal, the position should go the opposite.
Problem is that the breakevenstop and trailingstop are not correctly calculated for the short position, there was never a “not on market” moment.
As a result to have good strategy calculations, you need to enter “not on market” when the position enters the market, but then it ignores the short (opposite) signal and stays long.
Not an obvious flaw, but one which can impact a strategy in a good or bad way.
So my goal is:
use correct values for breakeven and trailing stop, regardless if the position goes the opposite direction, so replace the “not on market” check for the breakeven- and trailingstop with something else.
That “not on market” is not used as criteria to enter a new position, since it skips an valid opposite signal
Any solutions?
123456789101112131415161718192021// mfe trailing stopif mfewtrailingstop thentrailingstop = (tradeprice/100)*mwtsif not onmarket thenmaxprice = 0minprice = closepriceexit = 0endifif longonmarket thenmaxprice = max(maxprice,close)if maxprice-tradeprice(1)>=trailingstop*pipsize thenpriceexit = maxprice-trailingstop*pipsizeendifendifif shortonmarket thenminprice = min(minprice,close)if tradeprice(1)-minprice>=trailingstop*pipsize thenpriceexit = minprice+trailingstop*pipsizeendifendifendif123456789101112131415if breakevenstop thenif not onmarket thennewsl=0endifif longonmarket and close-tradeprice(1)>=((tradeprice/100)*besg)*pipsize thennewsl = tradeprice(1)+((tradeprice/100)*besl)*pipsizeendifif shortonmarket and tradeprice(1)-close>=((tradeprice/100)*besg)*pipsize thennewsl = tradeprice(1)-((tradeprice/100)*besl)*pipsizeendifif newsl>0 thensell at newsl stopexitshort at newsl stopendifendif123456789101112if tradetime and not onmarket thenif pclong and mclong and eclong and iclong and trendup thenbuy positionsize contract at marketlongtradecounter=longtradecounter + 1tradecounter=tradecounter+1endifif pcshort and mcshort and ecshort and icshort and trenddown thensellshort positionsize contract at marketshorttradecounter=shorttradecounter + 1tradecounter=tradecounter+1endifendif01/31/2019 at 1:04 AM #90108When On Market is true you should save your TRADEPRICE in a variable each bar, so that as soon as you detect that the current value is different from that of the previous bar and On Market is still true it’s because there’s been a change and you can reset your Trailing Stop/Breakeven settings to the default ones for the new trade.
Not tested but sounds logically correct.
1 user thanked author for this post.
01/31/2019 at 9:16 AM #90116Or something like: (not tested).
1changed = onmarket[1] and ( (longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket) )2 users thanked author for this post.
01/31/2019 at 7:01 PM #90183Thank you both. The easiest try was Nicolas suggestion so I tried that to start with.
Focussed on the trailing stop.
- if I use “not on market’ as a criteria to enter a new position, a new position is not entered with a valid opposite signal. So removed “not on market’ to start with
- If the trailing stop is not used, a long signal goes short with a valid opposite signal
- But a trailing stop (0.35) is used but not reached, the long signal goes short, but short is immediately closed. So there’s the problem and it’s in the trailing stop I believe.
12345678910111213141516171819202122232425// mfe trailing stopif mfewtrailingstop thentrailingstop = (tradeprice/100)*mwtsif not onmarket thenmaxprice = 0minprice = closepriceexit = 0elsif onmarket[1] and ( (longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket) ) thenmaxprice = 0minprice = closepriceexit = 0endifif longonmarket thenmaxprice = max(maxprice,close)if maxprice-tradeprice(1)>=trailingstop*pipsize thenpriceexit = maxprice-trailingstop*pipsizeendifendifif shortonmarket thenminprice = min(minprice,close)if tradeprice(1)-minprice>=trailingstop*pipsize thenpriceexit = minprice+trailingstop*pipsizeendifendifendifIn de added suggestion, I tried with onmarket[1] or onmarket[0], or without onmarket but that made no difference
tried with elsif, and with new if command no difference
01/31/2019 at 7:06 PM #9018901/31/2019 at 8:44 PM #90201Here’s a clean code.
To test the differences optimize tss and bes with 0 and 1 and see the differences with the added suggestion from Nicolas.
It has no effect on breakeven.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121DEFPARAM CumulateOrders = falseONCE enabletrailingstop=1ONCE enablebreakevenstop=1ONCE TSsuggestion=tssONCE BEsuggestion=besSL = 1.50 //stoplossTS = 0.75 //trailing stopbesg = 0.50 //breakeven minimum gainbesl = 0 //breakeven stoploss// reset at startif intradaybarindex = 0 thenlongtradecounter = 0shorttradecounter = 0endifpclong = longtradecounter < 1pcshort = shorttradecounter < 1SMA5 = Average[5](close)SMA10 = Average[10](close)STOCH = Stochastic[14,3](close)indicator4 = Average[5](STOCH)RSIind = RSI[14](close)// Conditions to enter long positionsl1 = (SMA5 CROSSES OVER SMA10)l2 = (STOCH - indicator4 >10)//Stochastic upward momentuml3 = (RSIind > 45)//RSI upward momentuml5 = (average[10](STOCH)<45)// Stochastic not yet overbought//Conditions to enter shorts1 = (SMA5 CROSSES UNDER SMA10)s2 = (STOCH - indicator4 <-10)//Stochastic downward momentums3 = (RSIind < 55)//RSI downward momentums5 = (average[10](STOCH)>55)//Stochastic not yet oversoldIF pclong and l1 AND l2 AND l3 AND l5 tHENbuy 1 CONTRACT AT MARKETlongtradecounter=longtradecounter + 1ENDIFIF pcshort and s1 AND s2 AND s3 AND s5 THENsellshort 1 CONTRACT AT MARKETshorttradecounter=shorttradecounter + 1ENDIF// break even stopif enablebreakevenstop thenif not onmarket thennewsl=0endifif BEsuggestion thenif ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thennewsl=0endifendifif longonmarket and close-tradeprice(1)>=((tradeprice/100)*besg)*pipsize thennewsl = tradeprice(1)+((tradeprice/100)*besl)*pipsizeendifif shortonmarket and tradeprice(1)-close>=((tradeprice/100)*besg)*pipsize thennewsl = tradeprice(1)-((tradeprice/100)*besl)*pipsizeendifif newsl>0 thensell at newsl stopexitshort at newsl stopendifendif//trailing stopif enabletrailingstop thents=0.35trailingstop = (tradeprice/100)*ts//resetting variables when no trades are on marketif not onmarket thenMAXPRICE = 0MINPRICE = closepriceexit = 0endifif TSsuggestion=1 thenif ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thenMAXPRICE = 0MINPRICE = closepriceexit = 0endifendif//case SHORT orderif shortonmarket thenMINPRICE = MIN(MINPRICE,close) //saving the MFE of the current tradeif tradeprice(1)-MINPRICE>=trailingstop*pointsize then //if the MFE is higher than the trailingstop thenpriceexit = MINPRICE+trailingstop*pointsize //set the exit price at the MFE + trailing stop price levelendifendif//case LONG orderif longonmarket thenMAXPRICE = MAX(MAXPRICE,close) //saving the MFE of the current tradeif MAXPRICE-tradeprice(1)>=trailingstop*pointsize then //if the MFE is higher than the trailingstop thenpriceexit = MAXPRICE-trailingstop*pointsize //set the exit price at the MFE - trailing stop price levelendifendif//exit on trailing stop price levelsif onmarket and priceexit>0 thenEXITSHORT AT priceexit STOPSELL AT priceexit STOPendifendifSET STOP %LOSS SLgraphonprice priceexitgraph 0 coloured(300,0,0) as "zeroline"graph (positionperf*100)coloured(0,0,0,255) as "positionperformance"02/01/2019 at 9:17 AM #90226Since you use market orders, you already know that you are on market, so why not flagging a variable when you enter an order. In this case, if new conditions are met to put a contrarian order on market, you can reset the breakeven variables at that point of the code.
Bear in mind that code is read from top to bottom, conditions testing in the right order is crucial to solve your problem.
02/01/2019 at 6:54 PM #90263I made everything visual. Didn’t work on the flag yet. Maybe I’am missing something obvious.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188//tested on dax// The goal is use notonmarket=0 with correct TS and BE values// If useNOTonmarket=1 then everything is correct//i.e. dax 10 min//everything 1, exept ONCE useNOTonmarket = 0//problem example 23 january 2019 16:20DEFPARAM CumulateOrders = falseONCE enableSL = 1 // stop lossONCE enablePT = 1 // profit targetONCE enableBE = 1 // breakeven stopONCE enableTS = 1 // trailing stopONCE displaySL = 1 // stop lossONCE displayPT = 1 // profit targetONCE displayBE = 1 // breakeven stopONCE displayTS = 1 // trailing stopONCE TSsuggestion=1 //optimize 0 and 1 to see differenceONCE BEsuggestion=1 //optimize 0 and 1 to see difference//test what's it is all about.ONCE useNOTonmarket = 0 //with entry criteriasl = 2.00 // % stop losspt = 1.50 // % profit targetts = 0.50 // % trailing stopbesg = 0.25 // % break even stop gainbesl = 0.00 // % break even stop level// reset at startif intradaybarindex = 0 thenlongtradecounter = 0shorttradecounter = 0endifpclong = longtradecounter < 1pcshort = shorttradecounter < 1SMA5 = Average[5](close)SMA10 = Average[10](close)STOCH = Stochastic[14,3](close)indicator4 = Average[5](STOCH)RSIind = RSI[14](close)// Conditions to enter long positionsl1 = (SMA5 CROSSES OVER SMA10)l2 = (STOCH - indicator4 >10)//Stochastic upward momentuml3 = (RSIind > 45)//RSI upward momentuml5 = (average[10](STOCH)<45)// Stochastic not yet overbought//Conditions to enter shorts1 = (SMA5 CROSSES UNDER SMA10)s2 = (STOCH - indicator4 <-10)//Stochastic downward momentums3 = (RSIind < 55)//RSI downward momentums5 = (average[10](STOCH)>55)//Stochastic not yet oversoldif useNOTonmarket=1 thenif not onmarket thenIF pclong and l1 AND l2 AND l3 AND l5 tHENbuy 1 CONTRACT AT MARKETlongtradecounter=longtradecounter + 1ENDIFIF pcshort and s1 AND s2 AND s3 AND s5 THENsellshort 1 CONTRACT AT MARKETshorttradecounter=shorttradecounter + 1ENDIFendifendifif useNOTonmarket=0 thenIF pclong and l1 AND l2 AND l3 AND l5 tHENbuy 1 CONTRACT AT MARKETlongtradecounter=longtradecounter + 1ENDIFIF pcshort and s1 AND s2 AND s3 AND s5 THENsellshort 1 CONTRACT AT MARKETshorttradecounter=shorttradecounter + 1ENDIFendif// trailing stopif enableTS thentrailingstop = (tradeprice/100)*tsif not onmarket thenMAXPRICE = 0MINPRICE = closepriceexit = 0endifif TSsuggestion thenif onmarket[1] and ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thenMAXPRICE = 0MINPRICE = closepriceexit = 0endifendifif shortonmarket thenMINPRICE = MIN(MINPRICE,close)if tradeprice(1)-MINPRICE>=trailingstop*pointsize thenpriceexit = MINPRICE+trailingstop*pointsizeendifendifif longonmarket thenMAXPRICE = MAX(MAXPRICE,close)if MAXPRICE-tradeprice(1)>=trailingstop*pointsize thenpriceexit = MAXPRICE-trailingstop*pointsizeendifendifif onmarket and priceexit>0 thenEXITSHORT AT priceexit STOPSELL AT priceexit STOPendifif displayTS thengraphonprice priceexit COLOURED(0,0,255,255) as "trailingstop"endifendif// break even stopif enableBE thenif not onmarket thennewsl=0endifif BEsuggestion thenif onmarket[1] and ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thennewsl=0endifendifif longonmarket and close-tradeprice(1)>=((tradeprice/100)*besg)*pipsize thennewsl = tradeprice(1)+((tradeprice/100)*besl)*pipsizeendifif shortonmarket and tradeprice(1)-close>=((tradeprice/100)*besg)*pipsize thennewsl = tradeprice(1)-((tradeprice/100)*besl)*pipsizeendifif newsl>0 thensell at newsl stopexitshort at newsl stopendifif displayBE thengraphonprice newsl COLOURED(244,102,27,255) as "breakevenstop"endifendif// to set & display stop lossif enableSL thenset stop %loss slif displaySL thenif not onmarket thensloss=0elsif onmarket[1] and ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thensloss=0endifif onmarket thenif longonmarket thensloss=tradeprice(1)-((tradeprice(1)*sl)/100)*pointsizeendifif shortonmarket thensloss=tradeprice(1)+((tradeprice(1)*sl)/100)*pointsizeendifendifgraphonprice sloss COLOURED(255,0,0,255) as "stoploss"endifendif// to set & display profittargetif enablePT thenset target %profit ptif displayPT thenif not onmarket thenptarget=0elsif onmarket[1] and ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thenptarget=0endifif onmarket thenif longonmarket thenptarget=tradeprice(1)+((tradeprice(1)*pt)/100)*pointsizeendifif shortonmarket thenptarget=tradeprice(1)-((tradeprice(1)*pt)/100)*pointsizeendifendifgraphonprice ptarget COLOURED(121,141,35,255) as "profittarget"endifendif//graph 0 coloured(300,0,0) as "zeroline"graph (positionperf*100)coloured(0,0,0,255) as "positionperformance"02/03/2019 at 1:50 AM #9033802/04/2019 at 11:08 AM #9039102/04/2019 at 5:44 PM #90441Here’s my final test code on the dax with working breakeven- and trailing stops in every scenario.
It does matter that a trailing stop code is above the breakeven code.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155// test trailingstop and breakeven on the daxdefparam cumulateorders = falseonce enableSL = 1 // stop lossonce enablePT = 1 // profit targetonce enableTS = 1 // trailing stoponce enableBE = 1 // breakeven stoponce displaySL = 1 // stop lossonce displayPT = 1 // profit targetonce displayTS = 1 // trailing stoponce displayBE = 1 // breakeven stopSL = 0.75 // % stop lossPT = 1.00 // % profit targetTS = 0.35 // % trailing stopBESG = 0.25 // % break even stop gainBESL = 0.00 // % break even stop level// reset at startif intradaybarindex=0 thenlongtradecounter=0shorttradecounter=0endifpclong= longtradecounter<1pcshort = shorttradecounter<1shortma = average[25](close)longma = average[50](close)// conditions to enter long positionsl1 = (shortma crosses over longma)// conditions to enter shorts1 = (shortma crosses under longma)if pclong and l1 thenbuy 1 contract at marketlongtradecounter=longtradecounter+1endifif pcshort and s1 thensellshort 1 contract at marketshorttradecounter=shorttradecounter+1endif// trailing stopif enableTS thentrailingstop = (tradeprice/100)*TSif not onmarket thenmaxprice=0minprice=closepriceexit=0endifif ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thenmaxprice=0minprice=closepriceexit=0endifif longonmarket thenmaxprice=max(maxprice,close)if maxprice-tradeprice(1)>=trailingstop*pointsize thenpriceexit=maxprice-trailingstop*pointsizeendifendifif shortonmarket thenminprice=min(minprice,close)if tradeprice(1)-minprice>=trailingstop*pointsize thenpriceexit=minprice+trailingstop*pointsizeendifendifif longonmarket and priceexit>0 thensell at priceexit stopendifif shortonmarket and priceexit>0 thenexitshort at priceexit stopendifif displayTS thengraphonprice priceexit coloured(0,0,255,255) as "trailingstop"endifendif// break even stopif enableBE thenif not onmarket thennewsl=0endifif ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thennewsl=0endifif longonmarket thenif close-tradeprice(1)>=((tradeprice/100)*BESG)*pipsize thennewsl=tradeprice(1)+((tradeprice/100)*BESL)*pipsizeendifendifif shortonmarket thenif tradeprice(1)-close>=((tradeprice/100)*BESG)*pipsize thennewsl=tradeprice(1)-((tradeprice/100)*BESL)*pipsizeendifendifif longonmarket and newsl>0 thensell at newsl stopendifif shortonmarket and newsl>0 thenexitshort at newsl stopendifif displayBE thengraphonprice newsl coloured(244,102,27,255) as "breakevenstop"endifendif// to set & display profittargetif enablePT thenset target %profit PTif displaypt thenif not onmarket thenptarget=0elsif ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thenptarget=0endifif onmarket thenif longonmarket thenptarget=tradeprice(1)+((tradeprice(1)*PT)/100)*pointsizeendifif shortonmarket thenptarget=tradeprice(1)-((tradeprice(1)*PT)/100)*pointsizeendifendifgraphonprice ptarget coloured(121,141,35,255) as "profittarget"endifendif// to set & display stoplossif enableSL thenset stop %loss SLif displaysl thenif not onmarket thensloss=0elsif ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thensloss=0endifif onmarket thenif longonmarket thensloss=tradeprice(1)-((tradeprice(1)*SL)/100)*pointsizeendifif shortonmarket thensloss=tradeprice(1)+((tradeprice(1)*SL)/100)*pointsizeendifendifgraphonprice sloss coloured(255,0,0,255) as "stoploss"endifendifgraph (positionperf*100)coloured(0,0,0,255) as "positionperformance"02/04/2019 at 11:08 PM #90462How can I Forward Test the code immediately above.
I get the results attached so it’s well worth a Fwd Test, but I can’t // Rem out all the GRAPH entries without screwing the code up.
Am I reading this all wrong and it’s not meant to run as an Auto-System??
02/04/2019 at 11:58 PM #90466Try this:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155// test trailingstop and breakeven on the daxdefparam cumulateorders = falseonce enableSL = 1 // stop lossonce enablePT = 1 // profit targetonce enableTS = 1 // trailing stoponce enableBE = 1 // breakeven stop//once displaySL = 1 // stop loss//once displayPT = 1 // profit target//once displayTS = 1 // trailing stop//once displayBE = 1 // breakeven stopSL = 0.75 // % stop lossPT = 1.00 // % profit targetTS = 0.35 // % trailing stopBESG = 0.25 // % break even stop gainBESL = 0.00 // % break even stop level// reset at startif intradaybarindex=0 thenlongtradecounter=0shorttradecounter=0endifpclong= longtradecounter<1pcshort = shorttradecounter<1shortma = average[25](close)longma = average[50](close)// conditions to enter long positionsl1 = (shortma crosses over longma)// conditions to enter shorts1 = (shortma crosses under longma)if pclong and l1 thenbuy 1 contract at marketlongtradecounter=longtradecounter+1endifif pcshort and s1 thensellshort 1 contract at marketshorttradecounter=shorttradecounter+1endif// trailing stopif enableTS thentrailingstop = (tradeprice/100)*TSif not onmarket thenmaxprice=0minprice=closepriceexit=0endifif ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thenmaxprice=0minprice=closepriceexit=0endifif longonmarket thenmaxprice=max(maxprice,close)if maxprice-tradeprice(1)>=trailingstop*pointsize thenpriceexit=maxprice-trailingstop*pointsizeendifendifif shortonmarket thenminprice=min(minprice,close)if tradeprice(1)-minprice>=trailingstop*pointsize thenpriceexit=minprice+trailingstop*pointsizeendifendifif longonmarket and priceexit>0 thensell at priceexit stopendifif shortonmarket and priceexit>0 thenexitshort at priceexit stopendif//if displayTS then//graphonprice priceexit coloured(0,0,255,255) as "trailingstop"//endifendif// break even stopif enableBE thenif not onmarket thennewsl=0endifif ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thennewsl=0endifif longonmarket thenif close-tradeprice(1)>=((tradeprice/100)*BESG)*pipsize thennewsl=tradeprice(1)+((tradeprice/100)*BESL)*pipsizeendifendifif shortonmarket thenif tradeprice(1)-close>=((tradeprice/100)*BESG)*pipsize thennewsl=tradeprice(1)-((tradeprice/100)*BESL)*pipsizeendifendifif longonmarket and newsl>0 thensell at newsl stopendifif shortonmarket and newsl>0 thenexitshort at newsl stopendif//if displayBE then//graphonprice newsl coloured(244,102,27,255) as "breakevenstop"//endifendif// to set & display profittargetif enablePT thenset target %profit PT//if displaypt then//if not onmarket then//ptarget=0//elsif ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) then//ptarget=0//endif//if onmarket then//if longonmarket then//ptarget=tradeprice(1)+((tradeprice(1)*PT)/100)*pointsize//endif//if shortonmarket then//ptarget=tradeprice(1)-((tradeprice(1)*PT)/100)*pointsize//endif//endif//graphonprice ptarget coloured(121,141,35,255) as "profittarget"//endifendif// to set & display stoplossif enableSL thenset stop %loss SL//if displaysl then//if not onmarket then//sloss=0//elsif ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) then//sloss=0//endif//if onmarket then//if longonmarket then//sloss=tradeprice(1)-((tradeprice(1)*SL)/100)*pointsize//endif//if shortonmarket then//sloss=tradeprice(1)+((tradeprice(1)*SL)/100)*pointsize//endif//endif//graphonprice sloss coloured(255,0,0,255) as "stoploss"//endifendif//graph (positionperf*100)coloured(0,0,0,255) as "positionperformance"1 user thanked author for this post.
02/05/2019 at 3:42 AM #90467You can’t exclude graph by //. But you can set display to 0 for each one to disable lines or try Vonasi suggestion.
The lines are a bit annoying since they start at the bottom as vertical lines. As alternative you can set them to points.
1 user thanked author for this post.
02/05/2019 at 9:56 AM #90475haha spot on Vonasi, works now, thank you!
I had tried same / similar. but I can see now I was // out 3 lines too many in each code section with a GRAPH function.
Also I’ve now noticed that I was optimising over 10k bars only!
I was watching a good film at same time, but maybe I need to get my glasses from Australia! 🙂
Actually below are what I wear on the computer when my eyes are tired! Pinhole glasses (£4 or £1 from china!) ,,, think physics in school and pinhole cameras and that’s how they work! Well worth checking out for anybody who’s eyesight is not what it used to be!
-
AuthorPosts
Find exclusive trading pro-tools on