Hello Sir,
Can it be modified by adding martingale lot size?
Example 1st order lot size 0.1
2nd order lot size 0.11
3rd order lot size 0.12
etc
Thank you
//+------------------------------------------------------------------+ //| 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 <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> 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 = 10; // Gap for pending orders DOWN from the current price (in pips) input ushort InpDownStep = 3; // Step between orders DOWN (in pips) input ENUM_PENDING_ORDERS_DOWN InpDownOrders = buy_limit; // Type of pending orders DOWN input uchar InpDownQuantity = 33; // DOWN quantity input double InpLots = 5; // Lots input ushort InpStopLoss = 100; // Stop Loss (in pips) input ushort InpTakeProfit = 100; // Take Profit (in pips) //--- ulong m_slippage=1; // 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;i<InpDownQuantity;i++) { double price_ask = start_price_ask-i*ExtDownStep; double price_bid = start_price_bid-i*ExtDownStep; if(InpDownOrders==buy_limit) { double sl = (ExtStopLoss==0.0) ? 0.0 : price_ask - ExtStopLoss; double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit; m_trade.BuyLimit(m_symbol.LotsMax(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(), m_symbol.NormalizePrice(sl), m_symbol.NormalizePrice(tp)); } else { double sl = (ExtStopLoss==0.0) ? 0.0 : price_bid + ExtStopLoss; double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit; m_trade.SellStop(m_symbol.LotsMax(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(), m_symbol.NormalizePrice(sl), m_symbol.NormalizePrice(tp)); } } } //+------------------------------------------------------------------+ //| Refreshes the symbol quotes data | //+------------------------------------------------------------------+ bool RefreshRates() { //--- refresh rates if(!m_symbol.RefreshRates()) return(false); //--- protection against the return value of "zero" if(m_symbol.Ask()==0 || m_symbol.Bid()==0) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Check the correctness of the order volume | //+------------------------------------------------------------------+ bool CheckVolumeValue(double volume,string &error_description) { //--- minimal allowed volume for trade operations double min_volume=m_symbol.LotsMin(); if(volume<min_volume) { error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume); return(false); } //--- maximal allowed volume of trade operations double max_volume=m_symbol.LotsMax(); if(volume>max_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); } //+------------------------------------------------------------------+
Hello Sir. Can you help me a little bit. How can i adjust the code to my desired lot Size. I have try several time by changing the inplots: 5 but still the lots value when i execute it become 0.01, I am newbie, hopefull there is a way for me to change it. Thank You
It is necessary instead of the minimum lot to put the input parameter Lots
//--- pending orders DOWN for(int i=0;i<InpDownQuantity;i++) { double price_ask = start_price_ask-i*ExtDownStep; double price_bid = start_price_bid-i*ExtDownStep; if(InpDownOrders==buy_limit) { double sl = (ExtStopLoss==0.0) ? 0.0 : price_ask - ExtStopLoss; double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit; m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(), m_symbol.NormalizePrice(sl), m_symbol.NormalizePrice(tp)); } else { double sl = (ExtStopLoss==0.0) ? 0.0 : price_bid + ExtStopLoss; double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit; m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(), m_symbol.NormalizePrice(sl), m_symbol.NormalizePrice(tp)); } } }
need to do this:
//--- pending orders DOWN for(int i=0;i<InpDownQuantity;i++) { double price_ask = start_price_ask-i*ExtDownStep; double price_bid = start_price_bid-i*ExtDownStep; if(InpDownOrders==buy_limit) { double sl = (ExtStopLoss==0.0) ? 0.0 : price_ask - ExtStopLoss; double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit; m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(), m_symbol.NormalizePrice(sl), m_symbol.NormalizePrice(tp)); } else { double sl = (ExtStopLoss==0.0) ? 0.0 : price_bid + ExtStopLoss; double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit; m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(), m_symbol.NormalizePrice(sl), m_symbol.NormalizePrice(tp)); } } }
It is necessary instead of the minimum lot to put the input parameter Lots
need to do this:
Suppose If I have to trade on a specific time(in seconds) every minute. Also Need to Close that trade in that minute only at specific time(in seconds to be exact). How I can do that, please somebody Help me in this.
Either I need to make a EA in MT5 to open trade at a specific time irrespective of any hour i.e. it should open at specific send of every minute and also close trade after specific seconds.
or
I should be adding the pending orders of Start trade and Close trade also.
How to do this I have made a lot of EA but none of that worked Out. Please help solving this query. Thanks
How I can Add Multiple Pending Orders based on time in seconds
Suppose If I have to trade on a specific time(in seconds) every minute. Also Need to Close that trade in that minute only at specific time(in seconds to be exact). How I can do that, please somebody Help me in this.
Either I need to make a EA in MT5 to open trade at a specific time irrespective of any hour i.e. it should open at specific send of every minute and also close trade after specific seconds.
or
I should be adding the pending orders of Start trade and Close trade also.
How to do this I have made a lot of EA but none of that worked Out. Please help solving this query. Thanks
Of course you need an advisor.
hello sir, can you help me a little bit to change the parameters "GAP" with the calculation of pips into a price, for example for xau / usd 1701 or 1702 as the point of my first pending order , so it will be more flexible in setting the target price of the pending order at the desired, thank you very much sir,
Use the 'Gap for pending orders DOWN from the current price' parameter
Dear Vladimir Karputo,
thank you very much for this script, this is exactly what I needed.
May I ask your help to modify something?
This script add a new TP and a new SL for each pendings. I would like the same TP and SP from actual price.
example: curent price is 1000
TP= +100 from actual price
SL= -300 from actual price
pending 1 = TP=1100 and SP=700
pending 2 = TP=1100 and SP=700
pending 3 = TP=1100 and SP=700
I am no dev but I believe it should be somewhere here:
if(InpDownOrders==buy_limit) { double sl = (ExtStopLoss==0.0) ? 0.0 : price_ask - ExtStopLoss; double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit; m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(), m_symbol.NormalizePrice(sl), m_symbol.NormalizePrice(tp)); } else { double sl = (ExtStopLoss==0.0) ? 0.0 : price_bid + ExtStopLoss; double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit; m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(), m_symbol.NormalizePrice(sl), m_symbol.NormalizePrice(tp));

- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Pending orders DOWN:
Author: Vladimir Karputov