Convert EA code from Metatrader MT4 to ProOrder
Forums › ProRealTime forum Italiano › Supporto ProOrder › Convert EA code from Metatrader MT4 to ProOrder
- This topic has 7 replies, 3 voices, and was last updated 5 years ago by coscar.
-
-
01/08/2019 at 11:20 AM #88158MT4 EXPERT ADVISOR CODE123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585//------------------------------------------------------------------#property link ""extern doubleLots = 0.1; // Assign Fixed Lot Size to be traded,AutoLotSize must be falseextern intMaxUnits = 1, //Maximum units to trade per Currency PairMagicNumber = 11282,EntryLookBack = 55, //Bars to lookback in calculating breakout pricesExitLookBack = 20, //Bars to lookback in calculating exit pointsATRPeriod = 20;extern doubleSLMultiple = 2.5, //Multiply ATR by this to calculate StopLossReEntryMultiple = 0.5; //Multiple ATR by this to calculate Re Entry Pointextern boolATRBreakEven = false; //if set to true SL will be moved to break even levelextern doubleBreakEvenMultiple = 2.5;extern boolLockProfit = true;extern doublePipLockinStart = 50, //$ amount to start lock inLockinPercent = 30;//-------------------GLOBAL VARSboolRevenge = false;doubleRevengeSL = 3;static intTimeFrame;double LastEMAX,LastEMIN,LastXMAX,LastXMIN,LastOpen,PTLocked,PTPercent,spread,tickvalue,LastSL;doubleEMAX,EMIN,trueEMAX,trueEMIN,XMAX,N,XMIN;//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init(){//----------------------- GENERATE MAGIC NUMBER AND TICKET COMMENTMagicNumber = subGenerateMagicNumber(MagicNumber, Symbol(), Period());tickvalue = MarketInfo(Symbol(),MODE_TICKVALUE);subPrintDetails();//----return(0);}//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit(){//----------------------- PREVENT RE-COUNTING WHILE USER CHANGING TIME FRAMETimeFrame=Period();return(0);return(0);}//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start(){//-----------------SET VARIABLE VALUESint Ehighest_bar=Highest(NULL, 0, MODE_HIGH, EntryLookBack, 1);EMAX=NormalizeDouble (iHigh(NULL, 0, Ehighest_bar),Digits);int Elowest_bar=Lowest(NULL, 0, MODE_LOW, EntryLookBack, 1);EMIN=NormalizeDouble (iLow(NULL, 0, Elowest_bar),Digits);int Xhighest_bar=Highest(NULL, 0, MODE_HIGH, ExitLookBack, 1);XMAX=NormalizeDouble (iHigh(NULL, 0, Xhighest_bar),Digits);int Xlowest_bar=Lowest(NULL, 0, MODE_LOW, ExitLookBack, 1);XMIN=NormalizeDouble (iLow(NULL, 0, Xlowest_bar),Digits);N = NormalizeDouble ((iATR(NULL,0,20,1)),Digits);LastOpen = subLastOpenPrice();LastSL = subLastSLPrice();tickvalue = MarketInfo(Symbol(),MODE_TICKVALUE);subPrintDetails();spread = MarketInfo(Symbol(),MODE_SPREAD);// Unit=(AccountBalance()/100/N/Point*MarketInfo(Symbol(),MODE_TICKVALUE));double BStopLossLevel, SStopLossLevel;int BuyStopOrder = 0, SellStopOrder = 0, BuyOrder = 0, SellOrder = 0;int _GetLastError = 0, _OrdersTotal = OrdersTotal();double NSL = NormalizeDouble( N*RevengeSL, Digits );//-----------------TRAILING TOTAL PROFITS WITH REVENGEif(LockProfit){PTPercent = NormalizeDouble(subPipProfitTotal()*(LockinPercent/100),0);if(subPipProfitTotal()>PipLockinStart){if(PTPercent>PTLocked){PTLocked = PTPercent;}}if(!Revenge){if(PTLocked>0){if(PTLocked>=subPipProfitTotal()){subCloseOrder();PTLocked = 0;}}}if(Revenge){if(subOrderType()==OP_SELL){if(PTLocked>0){if(PTLocked>=subPipProfitTotal()){subCloseOrder();PTLocked = 0;if(OrderSend(Symbol(),OP_BUY,Lots,Ask,3,OrderOpenPrice()-NSL,0,"DocSniper EA",MagicNumber,0,Green)<0) { Print( "OrderOpen Error #", GetLastError() ); return(-1); } } } } if(subOrderType()==OP_BUY){ if(PTLocked>0){if(PTLocked>=subPipProfitTotal()){subCloseOrder();PTLocked = 0;if(OrderSend(Symbol(),OP_SELL,Lots,Bid,3,OrderOpenPrice()+NSL,0,"DocSniper EA",MagicNumber,0,Green)<0) { Print( "OrderOpen Error #", GetLastError() ); return(-1); } } } } } } double Unit = Lots; for ( int z = _OrdersTotal - 1; z >= 0; z -- ){if ( !OrderSelect( z, SELECT_BY_POS ) ){_GetLastError = GetLastError();Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );continue;}if ( OrderSymbol() != Symbol() ) continue;if ( OrderMagicNumber() != MagicNumber ) continue;switch ( OrderType() ){case OP_BUY: BuyOrder = OrderTicket(); break;case OP_SELL: SellOrder = OrderTicket(); break;case OP_BUYSTOP: BuyStopOrder = OrderTicket(); break;case OP_SELLSTOP: SellStopOrder = OrderTicket(); break;}}//-----------------------PENDING ORDERS PROCESS-----------------+if(subTotalOpenTrade()<1){ PTLocked = 0;LastXMIN = 0;LastXMAX = 9999999;BStopLossLevel = NormalizeDouble( EMAX - N*SLMultiple, Digits );SStopLossLevel = NormalizeDouble( EMIN + N*SLMultiple, Digits );double Spread = NormalizeDouble(spread*Point,Digits);string Modify1 = "none";string Modify2 = "none";trueEMAX = EMAX + Spread;trueEMIN = EMIN - Spread;if((LastEMAX != trueEMAX)||(BuyStopOrder<1)) { if (BuyStopOrder>0){int cnt;int total = subTotalBuyStopTrade();for(cnt=0;cnt<total;cnt++){OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber){BuyStopOrder = OrderTicket();}OrderDelete(BuyStopOrder);}BuyStopOrder = 0;}if(subTotalBuyStopTrade()<1){if (OrderSend(Symbol(),OP_BUYSTOP,Unit,trueEMAX,6,BStopLossLevel,0,"TURTLE POWER",MagicNumber,0,Green)<0){Print( "OrderSend Error #", GetLastError() );return(-1);}LastEMAX = trueEMAX;double BuyPrice = LastEMAX;}}if((LastEMIN != trueEMIN)||(SellStopOrder<1)) { if (SellStopOrder>0){total = subTotalSellStopTrade();for(cnt=0;cnt<total;cnt++){OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber){SellStopOrder = OrderTicket();}OrderDelete(SellStopOrder);}SellStopOrder = 0;}if(subTotalSellStopTrade()<1){if (OrderSend(Symbol(),OP_SELLSTOP,Unit,trueEMIN,6,SStopLossLevel,0,"TURTLE POWER",MagicNumber,0,Green)<0) { Alert( "OrderSend Error #", GetLastError() ); return(-1); } LastEMIN = trueEMIN; double SellPrice = LastEMIN; } } } //-----------------------------------------------------+ //$$$$$$$$$$$$$$$$(OPEN BUY PROCESS)$$$$$$$$$$$$$$$$$$$+ //-----------------------------------------------------+ if(BuyOrder>0){if (SellStopOrder>0){if ( !OrderDelete( SellStopOrder ) ){Alert( "OrderDelete Error #", GetLastError() );return(-1);}}LastOpen = subLastOpenPrice();//-------------PENDING REENTRY PROCESStotal = subTotalOpenTrade();if(total<MaxUnits){double PendingTotal = subTotalBuyStopTrade();if(PendingTotal<1) { BuyPrice = NormalizeDouble((LastOpen+N*ReEntryMultiple),Digits); double SL = NormalizeDouble(BuyPrice - N*SLMultiple, Digits ); if(BuyPrice>Bid){if (OrderSend(Symbol(),OP_BUYSTOP,Unit,BuyPrice,6,SL,0,"TURTLE POWER",MagicNumber,0,Green)<0) { Print( BuyPrice+"OrderSend Error #", GetLastError() ); return(-1); } LastOpen = subLastOpenPrice(); } } } //-----------MODIFY STOPS AFTER REENTRY LastOpen = subLastOpenPrice(); if((total>1)&&(XMIN<LastOpen)){ LastOpen = subLastOpenPrice();BStopLossLevel = NormalizeDouble(LastOpen - N*SLMultiple, Digits );total = OrdersTotal();for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if ( BStopLossLevel > OrderStopLoss()|| OrderStopLoss() <= 0.0 ){if ( !OrderModify( OrderTicket(), OrderOpenPrice(), BStopLossLevel,OrderTakeProfit(), OrderExpiration() ) ){Print( "OrderModify Error #", GetLastError() );return(-1);}return(0);}}}}LastOpen = subLastOpenPrice();//-----------BREAK EVEN AFTER PIPS PROCESSif((ATRBreakEven)&&(XMIN<LastOpen)) { double BreakEvenPrice = NormalizeDouble(LastOpen + N*BreakEvenMultiple,Digits); if(Bid > BreakEvenPrice){for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if ( LastOpen > OrderStopLoss()|| OrderStopLoss() <= 0.0 ) { if ( !OrderModify( OrderTicket(), OrderOpenPrice(), LastOpen,OrderTakeProfit(), OrderExpiration() ) ) { Print( "OrderModify Error #", GetLastError() ); return(-1); } } } } Modify2="done"; } } //-----------TRAILING STOP PROCESS LastSL = subLastSLPrice(); total = subTotalOpenTrade(); if(total>1){if(LastSL < XMIN){total = OrdersTotal();for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if ( !OrderModify( OrderTicket(), OrderOpenPrice(), XMIN,OrderTakeProfit(), OrderExpiration() ) ) { Print( "OrderModify Error #", GetLastError() ); return(-1); } } } LastSL = subLastSLPrice(); } } //+----------END OF TRAILING STOP PROCESS } //-----------------------------------------------------+ //$$$$$$$$$$$$$$$(OPEN SELL PROCESS)$$$$$$$$$$$$$$$$$$$+ //-----------------------------------------------------+ if(SellOrder>0){if (BuyStopOrder>0){if ( !OrderDelete( BuyStopOrder ) ){Alert( "OrderDelete Error #", GetLastError() );return(-1);}}LastOpen = subLastOpenPrice();//-------------PENDING REENTRY PROCESStotal = subTotalOpenTrade();if(total<MaxUnits){PendingTotal = subTotalSellStopTrade();if(PendingTotal<1){SellPrice = NormalizeDouble((LastOpen-N*ReEntryMultiple),Digits);SL = NormalizeDouble(SellPrice + N*SLMultiple, Digits );if(SellPrice<Bid){if (OrderSend(Symbol(),OP_SELLSTOP,Unit,SellPrice,6,SL,0,"TURTLE POWER",MagicNumber,0,Green)<0) { Print( BuyPrice+"OrderSend Error #", GetLastError() ); return(-1); } LastOpen = subLastOpenPrice(); } } } //-----------MODIFY STOPS AFTER REENTRY LastOpen = subLastOpenPrice(); if((total>1)&&(XMAX>LastOpen)){SStopLossLevel = NormalizeDouble(LastOpen + N*SLMultiple, Digits );total = OrdersTotal();for(cnt=0;cnt<total;cnt++){OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber){if ( SStopLossLevel < OrderStopLoss()|| OrderStopLoss() <= 0.0 ) { if ( !OrderModify( OrderTicket(), OrderOpenPrice(), SStopLossLevel,OrderTakeProfit(), OrderExpiration() ) ) { Print( "OrderModify Error #", GetLastError() ); return(-1); } return(0); } } } } //-----------BREAK EVEN AFTER PIPS PROCESS LastOpen = subLastOpenPrice(); if((ATRBreakEven)&&(XMAX>LastOpen)&&(total==MaxUnits)){ total = OrdersTotal();BreakEvenPrice = NormalizeDouble(LastOpen - N*BreakEvenMultiple,Digits);if(Bid < BreakEvenPrice){for(cnt=0;cnt<total;cnt++){OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber){if ( LastOpen < OrderStopLoss()|| OrderStopLoss() <= 0.0 ){if ( !OrderModify( OrderTicket(), OrderOpenPrice(), LastOpen,OrderTakeProfit(), OrderExpiration() ) ){Print( "OrderModify Error #", GetLastError() );return(-1);}}}}}}//-----------TRAILING STOP PROCESSLastSL = subLastSLPrice();if(XMAX<=LastOpen) { if(LastSL > XMAX){total = OrdersTotal();for(cnt=0;cnt<total;cnt++){OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber){if ( !OrderModify( OrderTicket(), OrderOpenPrice(), XMAX,OrderTakeProfit(), OrderExpiration() ) ){Print( "OrderModify Error #", GetLastError() );return(-1);}}}LastSL = subLastSLPrice();}}//+----------END OF TRAILING STOP PROCESS}//----return(0);}//+--------------------------END OF PROGRAM--------------------------+//----------------------- GENERATE MAGIC NUMBER BASE ON SYMBOL AND TIME FRAME FUNCTIONint subGenerateMagicNumber(int MagicNumber, string symbol, int timeFrame){int isymbol = 0;if (symbol == "EURUSD") isymbol = 1;else if (symbol == "GBPUSD") isymbol = 2;else if (symbol == "USDJPY") isymbol = 3;else if (symbol == "USDCHF") isymbol = 4;else if (symbol == "AUDUSD") isymbol = 5;else if (symbol == "USDCAD") isymbol = 6;else if (symbol == "EURGBP") isymbol = 7;else if (symbol == "EURJPY") isymbol = 8;else if (symbol == "EURCHF") isymbol = 9;else if (symbol == "EURAUD") isymbol = 10;else if (symbol == "EURCAD") isymbol = 11;else if (symbol == "GBPUSD") isymbol = 12;else if (symbol == "GBPJPY") isymbol = 13;else if (symbol == "GBPCHF") isymbol = 14;else if (symbol == "GBPAUD") isymbol = 15;else if (symbol == "GBPCAD") isymbol = 16;else isymbol = 17;if(isymbol<10) MagicNumber = MagicNumber * 10;return (StrToInteger(StringConcatenate(MagicNumber, isymbol, timeFrame)));}//----------------------- PRINT COMMENT FUNCTIONvoid subPrintDetails(){string sComment = "";string sp = "-------------------------------------------------------------\n";string NL = "\n";sComment = sp;sComment = sComment + sp;sComment = sComment + "BULL ENTRY= " + DoubleToStr(EMAX,4) + " | ";sComment = sComment + "BULL EXIT= " + DoubleToStr(XMIN,4) + " | ";sComment = sComment + NL;sComment = sComment + sp;sComment = sComment + "BEAR ENTRY= " + DoubleToStr(EMIN,4) + " | ";sComment = sComment + "BEAR EXIT= " + DoubleToStr(XMAX,4) + " | ";sComment = sComment + NL;sComment = sComment + sp;sComment = sComment + "ATR =" + DoubleToStr(N,4) + " | ";sComment = sComment + "Spread =" + DoubleToStr(spread,4) + " | ";sComment = sComment + "tickvalue =" + DoubleToStr(tickvalue,4) + " | ";sComment = sComment + NL;sComment = sComment + sp;sComment = sComment + "Total Pips= " +DoubleToStr(subPipProfitTotal(),0) + " | ";sComment = sComment + "Pips Locked in= " + DoubleToStr(PTLocked,0) + " | ";sComment = sComment + "T.P.Percent =" + DoubleToStr(PTPercent,4) + " | ";sComment = sComment + NL;sComment = sComment + sp;Comment(sComment);}//----------COUNT OPEN TRADES------------------+int subTotalOpenTrade(){intcnt,total = 0;for(cnt=0;cnt<OrdersTotal();cnt++){OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);if((OrderType()==OP_SELL||OrderType()==OP_BUY) &&OrderSymbol()==Symbol() &&OrderMagicNumber()==MagicNumber) total++;}return(total);}//----------GET LASt OPENED PRICE------------------+double subLastOpenPrice(){intcnt,total = 0;double OpenPrice;for(cnt=0;cnt<OrdersTotal();cnt++){OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);if((OrderType()==OP_SELL||OrderType()==OP_BUY) &&OrderSymbol()==Symbol() &&OrderMagicNumber()==MagicNumber)OpenPrice = OrderOpenPrice();}return(OpenPrice);}//----------GET LASt SL PRICE------------------+double subLastSLPrice(){intcnt,total = 0;double SLPrice;for(cnt=0;cnt<OrdersTotal();cnt++){OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);if((OrderType()==OP_SELL||OrderType()==OP_BUY) &&OrderSymbol()==Symbol() &&OrderMagicNumber()==MagicNumber)SLPrice = OrderStopLoss();}return(SLPrice);}//----------COUNT BUYSTOP ORDERS---------------+int subTotalBuyStopTrade(){intcnt,total = 0;for(cnt=0;cnt<OrdersTotal();cnt++){OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);if(OrderType()==OP_BUYSTOP&&OrderSymbol()==Symbol() &&OrderMagicNumber()==MagicNumber) total++;}return(total);}//-----------COUNT SELLSTOP ORDERS-------------+int subTotalSellStopTrade(){intcnt,total = 0;for(cnt=0;cnt<OrdersTotal();cnt++){OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);if(OrderType()==OP_SELLSTOP&&OrderSymbol()==Symbol() &&OrderMagicNumber()==MagicNumber) total++;}return(total);}//----------COUNT OPEN TRADES------------------+double subPipProfitTotal(){intcnt,total = 0;tickvalue = MarketInfo(Symbol(),MODE_TICKVALUE);double TotalProfit = 0;for(cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if((OrderType()==OP_SELL||OrderType()==OP_BUY) && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { double PipProfit = (OrderProfit()/OrderLots()/tickvalue); TotalProfit = TotalProfit+PipProfit; } } return(TotalProfit); } //----------------------- CLOSE ORDER FUNCTION void subCloseOrder() { int cnt, total = 0, ticket = 0, err = 0, c = 0; total = OrdersTotal(); for(cnt=total-1;cnt>=0;cnt--){OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderSymbol()==Symbol() &&OrderMagicNumber()==MagicNumber){switch(OrderType()){case OP_BUY :for(c=0;c<10;c++) { ticket=OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); err=GetLastError(); if(err==0) { if(ticket>0) break;}else{if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors{Sleep(5000);continue;}else //normal error{if(ticket>0) break;}}}break;case OP_SELL :for(c=0;c<10;c++) { ticket=OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); err=GetLastError(); if(err==0) { if(ticket>0) break;}else{if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors{Sleep(5000);continue;}else //normal error{if(ticket>0) break;}}}break;case OP_BUYLIMIT :case OP_BUYSTOP :case OP_SELLLIMIT:case OP_SELLSTOP :OrderDelete(OrderTicket());}}}}//----------GET ORDER TYPEint subOrderType(){intcnt,total = 0;for(cnt=0;cnt<OrdersTotal();cnt++){OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);total = OrderType();}return(total);}01/08/2019 at 12:13 PM #88161
Ciao, pensi che sia un modo corretto per parlare con qualcuno? Ci sono dei veri umani dietro il messaggio, non lo sai?
Per favore, la prossima volta usa un linguaggio comprensibile per gli utenti quando chiedi una conversione del codice.
E segui le semplici regole in questa pagina: https://www.prorealcode.com/free-code-conversion/01/08/2019 at 12:42 PM #88166Good morning Nicolas thanks for your intervention, it was not my intention to lack compared to anyone indeed I really appreciate your work I do a lot of the various interventions in this forum. I followed the procedure indicated on the page https://www.prorealcode.com/free-code-conversion/
but it was published this way.
Maybe I was wrong with something?
Thank you01/08/2019 at 1:13 PM #88168Per favore usa l’italiano nel forum italiano. Grazie.
01/08/2019 at 1:51 PM #8816901/08/2019 at 3:32 PM #88177Ad ogni modo, appena rivisto il codice, preferirei ottenere il file .mq4 perché il copia / incolla ha incasinato tutto il codice ed è molto difficile leggerlo ora ..
Quindi per favore condividi il file .mq4 nel tuo prossimo post, così sarò in grado di valutare se la conversione è possibile. Grazie.01/08/2019 at 4:11 PM #8817901/08/2019 at 4:18 PM #88180 -
AuthorPosts
Find exclusive trading pro-tools on