//+------------------------------------------------------------------+ //| Pending orders DOWN.mq5 | //| Copyright © 2017, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2017, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.002" #property description "The script sets the pending orders down from the price" #property script_show_inputs //--- #include #include CTrade m_trade; // trading object CSymbolInfo m_symbol; // symbol info object //+------------------------------------------------------------------+ //| Enum pending orders DOWN | //+------------------------------------------------------------------+ enum ENUM_PENDING_ORDERS_DOWN { buy_limit =0, // Buy Limit sell_stop =3 // Sell Stop }; //--- input parameters input ushort InpDownGep = 15; // Gap for pending orders DOWN from the current price (in pips) input ushort InpDownStep = 30; // Step between orders DOWN (in pips) input ENUM_PENDING_ORDERS_DOWN InpDownOrders = sell_stop; // Type of pending orders DOWN input uchar InpDownQuantity = 5; // DOWN quantity input double InpLots = 0.1; // Lots input ushort InpStopLoss = 20; // Stop Loss (in pips) input ushort InpTakeProfit = 20; // Take Profit (in pips) //--- ulong m_slippage=30; // slippage double m_adjusted_point; // point value adjusted for 3 or 5 points double ExtDownGep=0.0; double ExtDownStep=0.0; double ExtStopLoss=0.0; double ExtTakeProfit=0.0; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- if(InpLots<=0.0) { Print("The \"Lots\" can't be smaller or equal to zero"); return; } //--- if(!m_symbol.Name(Symbol())) // sets symbol name return; if(!RefreshRates()) return; string err_text=""; if(!CheckVolumeValue(InpLots,err_text)) { Print(err_text); return; } //--- if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK)) m_trade.SetTypeFilling(ORDER_FILLING_FOK); else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC)) m_trade.SetTypeFilling(ORDER_FILLING_IOC); else m_trade.SetTypeFilling(ORDER_FILLING_RETURN); //--- m_trade.SetDeviationInPoints(m_slippage); m_trade.SetAsyncMode(true); //--- tuning for 3 or 5 digits int digits_adjust=1; if(m_symbol.Digits()==3 || m_symbol.Digits()==5) digits_adjust=10; m_adjusted_point=m_symbol.Point()*digits_adjust; ExtDownGep = m_adjusted_point * InpDownGep; ExtDownStep = m_adjusted_point * InpDownStep; ExtStopLoss = m_adjusted_point * InpStopLoss; ExtTakeProfit = m_adjusted_point * InpTakeProfit; //--- start work double start_price_ask=m_symbol.Ask()-ExtDownGep; double start_price_bid=m_symbol.Bid()-ExtDownGep; //--- pending orders DOWN for(int i=0;imax_volume) { error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume); return(false); } //--- get minimal step of volume changing double volume_step=m_symbol.LotsStep(); int ratio=(int)MathRound(volume/volume_step); if(MathAbs(ratio*volume_step-volume)>0.0000001) { error_description=StringFormat("Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f", volume_step,ratio*volume_step); return(false); } error_description="Correct volume value"; return(true); } //+------------------------------------------------------------------+ //| Checks if the specified filling mode is allowed | //+------------------------------------------------------------------+ bool IsFillingTypeAllowed(int fill_type) { //--- Obtain the value of the property that describes allowed filling modes int filling=m_symbol.TradeFillFlags(); //--- Return true, if mode fill_type is allowed return((filling & fill_type)==fill_type); } //+------------------------------------------------------------------+