I. Main function
1. Auto caculate lot size
2. Auto trailling ATR
3. Using volume indicator and moving average indicator
4. Condition buy or sell
2. Backtest.
II. Main function code
1. Volume indicator declaration
//+------------------------------------------------------------------+ //| Expert initialization function                                  | //+------------------------------------------------------------------+ int OnInit()   { if(!m_symbol.Name(_Symbol)) return  INIT_FAILED; // Set Trade parameter trade.SetTypeFillingBySymbol(m_symbol.Name()); trade.SetExpertMagicNumber(m_magicnumber); trade.SetDeviationInPoints(Slippage); // Turning 3 or 5 Digit int    adjustdigit=1; if(m_symbol.Digits()==3 || m_symbol.Digits()==5) adjustdigit=10; m_adjustpoint=adjustdigit*m_symbol.Point(); // Indicator RSI declaration Handle_MA= iMA(_Symbol,timeframe,MA_period,MA_shift,MODE_EMA,PRICE_CLOSE); if(Handle_MA==INVALID_HANDLE) return  INIT_FAILED; // Indicator RSI declaration hand_atr= iATR(_Symbol,timeframe,atr_period); if(hand_atr==INVALID_HANDLE) return  INIT_FAILED; // Indicator volume handle_volume= iVolumes(_Symbol,timeframe,VOLUME_TICK); if(handle_volume==INVALID_HANDLE) return  INIT_FAILED; // Indicator Moving average volume handle_MA_volume= iMA(_Symbol,timeframe,MA_volume_period,MA_volume_shift,MODE_EMA,handle_volume); if(handle_MA_volume==INVALID_HANDLE) return  INIT_FAILED; //---   return(INIT_SUCCEEDED);   }
2. Tick function
//+------------------------------------------------------------------+ //| Expert tick function                                            | //+------------------------------------------------------------------+ void OnTick()   {   if(OpenBar(Symbol()))   { // Candle declaration double High[],Low[],open[],close[]; ArraySetAsSeries(High,true);ArraySetAsSeries(Low,true);ArraySetAsSeries(close,true);ArraySetAsSeries(open,true); CopyHigh(Symbol(),timeframe,0,1000,High); CopyLow(Symbol(),timeframe,0,1000,Low); CopyOpen(_Symbol,timeframe,0,100,open); CopyClose(_Symbol,timeframe,0,100,close); // Highest high and lowest low declaration int highest= ArrayMaximum(High,HL_shift,HL_period); int lowest= ArrayMinimum(Low,HL_shift,HL_period); double  HH= High[highest]; Drawline(" Kháng Cự ", clrRed,HH); double  LL= Low[lowest]; Drawline(" hỗ trợ ", clrBlue,LL); // Moving average declaration CopyBuffer(Handle_MA,0,0,100,MA_Filter); ArraySetAsSeries(MA_Filter,true); // Atr declaration ArraySetAsSeries(atr,true); CopyBuffer(hand_atr,0,0,50,atr); // Volume and MA_volume array buffe ArraySetAsSeries(Volume,true); ArraySetAsSeries(MA_volume,true); CopyBuffer(handle_volume,0,0,50,Volume); CopyBuffer(handle_MA_volume,0,0,50,MA_volume); //+------------------------------------------------------------------+ //|  Broker parameter                                              | //+------------------------------------------------------------------+    double point = SymbolInfoDouble(_Symbol,SYMBOL_POINT); double ask= SymbolInfoDouble(_Symbol,SYMBOL_ASK); double bid= SymbolInfoDouble(_Symbol,SYMBOL_BID); double spread=ask-bid; double stoplevel= (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL); int freezerlevel= (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL); // Count bjuy and count sell int count_buy=0; int count_sell=0; count_position(count_buy,count_sell,atr); // Main condition for buy and sell     if(count_buy==0)     {       if(ask>(HH) && High[highest] > MA_Filter[highest] && Volume[1]>MA_volume[1]  )         {         double  entryprice= ask;         double  sl        = LL;         double  tp        = entryprice  +TP_factor*atr[1];         double lotsize    = calculate_lotsize(sl,entryprice);         if(  bid-sl>stoplevel && tp-bid>stoplevel&& CheckVolumeValue(lotsize) )         {         trade.Buy(lotsize,_Symbol,entryprice,sl,tp, " Buy Mr Tan ");                 }       }     }     if(count_sell==0)     {     if(bid<(LL) && Low[lowest] < MA_Filter[lowest]&& Volume[1]>MA_volume[1])         {         double  entryprice= bid;         double  sl        = HH;         double  tp        = entryprice  -TP_factor*atr[1];         double lotsize    = calculate_lotsize(sl,entryprice);         if(  sl-ask>stoplevel && ask-tp>stoplevel&& CheckVolumeValue(lotsize) )         {           trade.Sell(lotsize,_Symbol,entryprice,sl,tp, " Sell Mr Tan ");         }         }     }     }   }