I would redo this block.
- Two lines need to be created once in OnInit
- You need to have two variables - High prices and Low prices and at each tick to calculate these two prices. Only if the price has changed - only then move the line.
Vladimir Karputov:
Can you illustrate?
I would redo this block.
- Two lines need to be created once in OnInit
- You need to have two variables - High prices and Low prices and at each tick to calculate these two prices. Only if the price has changed - only then move the line.
Nelson Wanyama :
Can you illustrate?
Can you illustrate?
Example:
//+------------------------------------------------------------------+ //| Test.mq5 | //| Copyright © 2019, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2019, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" //--- input parameters input string InpLineHigh = "High"; // Line High Name input string InpLineLow = "Low"; // Line Low Name input uchar InpSearchBoxWidth = 3; // Search box width (in bars) //--- double m_price_high; double m_price_low; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- m_price_high=0.0; m_price_low=0.0; if(!HLineCreate(0,InpLineHigh,0,m_price_high,clrBlue) ||!HLineCreate(0,InpLineLow,0,m_price_low,clrRed)) return(INIT_FAILED); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- HLineDelete(0,InpLineHigh); HLineDelete(0,InpLineLow); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- double highest=DBL_MIN; double lowest=DBL_MAX; MqlRates rates[]; ArraySetAsSeries(rates,true); int start_pos=0,count=InpSearchBoxWidth; if(CopyRates(Symbol(),Period(),start_pos,count,rates)!=count) return; for(int i=0; i<count; i++) { if(rates[i].high>highest) highest=rates[i].high; if(rates[i].low<lowest) lowest=rates[i].low; } if(highest==DBL_MIN || lowest==DBL_MAX) return; if(highest!=m_price_high) { m_price_high=highest; HLineMove(0,InpLineHigh,m_price_high); } if(lowest!=m_price_low) { m_price_low=lowest; HLineMove(0,InpLineLow,m_price_low); } } //+------------------------------------------------------------------+ //| Create the horizontal line | //+------------------------------------------------------------------+ bool HLineCreate(const long chart_ID=0, // chart's ID const string name="HLine", // line name const int sub_window=0, // subwindow index double price=0, // line price const color clr=clrRed, // line color const ENUM_LINE_STYLE style=STYLE_SOLID, // line style const int width=1, // line width const bool back=false, // in the background const bool selection=true, // highlight to move const bool hidden=true, // hidden in the object list const long z_order=0) // priority for mouse click { //--- if the price is not set, set it at the current Bid price level if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- reset the error value ResetLastError(); //--- create a horizontal line if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price)) { Print(__FUNCTION__, ": failed to create a horizontal line! Error code = ",GetLastError()); return(false); } //--- set line color ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- set line display style ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- set line width ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- display in the foreground (false) or background (true) ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- enable (true) or disable (false) the mode of moving the line by mouse //--- when creating a graphical object using ObjectCreate function, the object cannot be //--- highlighted and moved by default. Inside this method, selection parameter //--- is true by default making it possible to highlight and move the object ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); //--- hide (true) or display (false) graphical object name in the object list ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //--- set the priority for receiving the event of a mouse click in the chart ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- successful execution return(true); } //+------------------------------------------------------------------+ //| Move horizontal line | //+------------------------------------------------------------------+ bool HLineMove(const long chart_ID=0, // chart's ID const string name="HLine", // line name double price=0) // line price { //--- if the line price is not set, move it to the current Bid price level if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- reset the error value ResetLastError(); //--- move a horizontal line if(!ObjectMove(chart_ID,name,0,0,price)) { Print(__FUNCTION__, ": failed to move the horizontal line! Error code = ",GetLastError()); return(false); } //--- successful execution return(true); } //+------------------------------------------------------------------+ //| Delete a horizontal line | //+------------------------------------------------------------------+ bool HLineDelete(const long chart_ID=0, // chart's ID const string name="HLine") // line name { //--- reset the error value ResetLastError(); //--- delete a horizontal line if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": failed to delete a horizontal line! Error code = ",GetLastError()); return(false); } //--- successful execution return(true); } //+------------------------------------------------------------------+
Files:
Test.mq5
14 kb
Vladimir Karputov:
Thank you. Let me work on it and see how it goes. I will get back to you
Example:
Vladimir Karputov:
Okay
Yes, of course I will wait.
By the way, pay attention to the parameter "Search box width (in bars)"
Vladimir Karputov:
Yes, of course I will wait.
By the way, pay attention to the parameter "Search box width (in bars)"
void CheckTrailingStop2(double Bid) { MqlRates PriceInformation1[], PriceInformation2[]; ArraySetAsSeries(PriceInformation1,true); ArraySetAsSeries(PriceInformation2,true); int Data1= CopyRates(_Symbol,_Period,0,3,PriceInformation1); int Data2= CopyRates(_Symbol,_Period,0,3,PriceInformation2); //highest int HighestCandle; double High[]; ArraySetAsSeries(High,true); CopyHigh(_Symbol,_Period,0,3,High); HighestCandle= ArrayMaximum(High,0,3); //set ts to 150 points double SL1=(PriceInformation1[HighestCandle].high); //go through all positions for (int i=PositionsTotal()-1; i>=0; i--) { string symbol=PositionGetSymbol(i); //symbol of the positions if (_Symbol==symbol) //if currency pair is equal //if we have sell positions if (PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_SELL) { //get ticket number ulong PositionTicket=PositionGetInteger(POSITION_TICKET); //calculate current sl double CurrentStopLoss=PositionGetDouble(POSITION_SL); double OpenPrice2=PositionGetDouble(POSITION_PRICE_OPEN); double m_trail2= (OpenPrice2-(BreakEven*2)*_Point); if (CurrentStopLoss>SL1) if (Bid<=m_trail2) { trade.PositionModify(PositionTicket, SL1, 0); } } } }
I completed the task using my code above(just a section).
It is working just as I expected. I tried understanding your code in vain. Thank you still.
I hid the high and low lines. Don't fell bad as there is no object_create.
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
Hello esteemed experts! I have created an expert adviser but have a little problem here. I would like to use the 3rd candle low or high to trail my open positions. Attached is the code for the high and low. I also need the trailing to start when break even has occurred. The system is promising. Your help will be highly appreciated.