How I assemble my advisor by trial and error - page 19

 

script to delete an Indicator by INDICATOR_SHORTNAME

//+------------------------------------------------------------------+
//|                                               Indicators Del.mq5 |
//|                                                      Dina Paches |
//|                           https://login.mql5.com/ru/users/dipach |
//|                                  Copyright 2019, Klapatyuk Corp. |
//|                             https://www.mql5.com/ru/users/klaxse |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2019, Klapatyuk Corp."
#property link        "https://www.mql5.com/ru/users/klaxse"
#property description "2017, Dina Paches"
#property description "https://login.mql5.com/ru/users/dipach"
#property version     "1.00"
#property script_show_inputs
//---
input string short_name  = "FiboPivot_V2";   // INDICATOR_SHORTNAME
input string short_name0 = "MorningFlat_V3"; // INDICATOR_SHORTNAME
input bool   Inpres      = false;            // Delete All Indicators
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- сконструируем короткое имя индикатора на основе входных параметров
     {ActionsOnTheChart(0);}
//----
   ChartRedraw();
//---
  }
//+------------------------------------------------------------------+
bool ActionsOnTheChart(const long chart_id)
  {
   int sub_windows_total =-1;
   int indicators_total  =0;
//---
   if(!ChartWindowsTotal(chart_id,sub_windows_total))
     {
      return(false);
     }
//---
   for(int i=sub_windows_total-1; i>=0; i--)
     {
      indicators_total=ChartIndicatorsTotal(chart_id,i);
      //---
      if(indicators_total>0)
        {
         ChIndicatorsDelete(chart_id,i,indicators_total);
        }
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+
bool ChartWindowsTotal(const long chart_ID,int &sub_windows_total)
  {
   long value=-1;
//---
   if(!ChartGetInteger(chart_ID,CHART_WINDOWS_TOTAL,0,value))
     {Print(__FUNCTION__," Error = ",GetLastError()); return(false);}
//---
   sub_windows_total=(int)value;
//---
   return(true);
  }
//+------------------------------------------------------------------+
void ChIndicatorsDelete(const long  chart_id,
                        const int   sub_window,
                        const int   indicators_total)
  {
   for(int i=indicators_total-1; i>=0; i--)
     {
      string indicator_name=ChartIndicatorName(chart_id,sub_window,i);
      //---
      ChIndicatorDelete(indicator_name,chart_id,sub_window);
     }
//---
   return;
  }
//+------------------------------------------------------------------+
//| обработчик события Deinit                                        |
//+------------------------------------------------------------------+
void ChIndicatorDelete(const string shortname,
                       const long   chartid=0,
                       const int    subwindow=0)
  {
   bool res=ChartIndicatorDelete(chartid,subwindow,short_name);
   bool res2=ChartIndicatorDelete(chartid,subwindow,short_name0);
   if(Inpres)
      bool res0=ChartIndicatorDelete(chartid,subwindow,shortname);
//--- проанализируем результат вызова ChartIndicatorDelete()
   if(!res)
     {
      PrintFormat("%s",shortname,subwindow,GetLastError());
     }
  }
//+------------------------------------------------------------------+

to spell indicator name correctly - copy as in the term

Picture 2

Files:
 

I've slapped it on - a manual trading assistant.

I tested it on a real account - everything that depends on it works.

//---
input datetime HoursFrom            = D'1970.01.01';  // Время старта Эксперта
input datetime HoursTo              = D'2030.12.31';  // Время закрытия всех позиций
input double   TargetProfit         = 200000.00;      // Целевая прибыль
sinput string  t1="------ Как работать Эксперту---";  //
input double   InpLots              = 0.01;           // Lots
input bool     inpbuysell           = false;          // Реверс (buy/sell)
input bool     InpPanel             = true;           // Скрыть кнопки\\по времени Buy\Sell
input bool     InpOnlyLimit         = false;          // Выставить отложенный ордер
input bool     InpOnlystart         = true;           // Вкл. Buy\Sell
input bool     InpCloseOpposite     = false;          // Вкл.Trailing Stop по индикатору\Close opposite
input bool     InpReverse           = false;          // Reverse Indicators - переворот торгового сигнала
input string   t2="------ Trailing parameters ------";//
input double   InStopLoss           = 250.0;          // Stop Loss
input double   InTakeProfit         = 460.0;          // Take Profit
input ushort   InpTrailingStop      = 25;             // Trailing Stop (min distance from price to Stop Loss, in pips
input ushort   InpTrailingStep      = 5;              // Trailing Step, in pips (1.00045-1.00055=1 pips)
sinput string  t3="------ Варианты ордеров ------";   //
input uint     maxLimits            = 1;              // Кол-во отложенных.ордеров в сетке в одну сторону
input int      InpPenStep           = 25;             // Шаг сетки, пунктов
input string   t4="------ Trailing ордеров ------";   //
input bool     InpStopTrailing      = true;           // ВКЛ.Trailing отлож.ордеров(ВЫКЛ.если больше 1 в сетке)
input ushort   InpTrailingPenStop   = 25;             // Trailing Stop of a Orders. "0" --> off and Trailing Step is not important
input ushort   InpTrailingPenStep   = 5;              // Trailing Step of a Orders
input string   t5="------ в ту же сторону ------";    //
input bool     ReverseOne           = false;          // BUYLIMIT SELLLIMIT
input bool     ReverseOny           = true;           // BUYSTOP SELLSTOP
input string   t6="------ на оборот ------";          //
input bool     ReverseOne1          = false;          // SELLLIMIT BUYLIMIT
input bool     ReverseOny1          = false;          // SELLSTOP BUYSTOP
input string   t7="------ ТРЕНД ЛИНИЯ ------";        //
input bool     InpReverse0          = false;          // Reverse Open - переворот торгового сигнала
input string   BuyStop_TrendName    = "buy";          // Trend Line Name "buy";
input string   SellStop_TrendName   = "sell";         // Trend Line Name "sell";
input string   BuyClose_TrendName   = "closesell";    // Trend Line Name "closesell";
input string   SellClose_TrendName  = "closebuy";     // Trend Line Name "closebuy";
input bool     InpReverse1          = false;          // Reverse Close - переворот торгового сигнала
input string   t8="------ ЛИНИЯ Open ------";         //
input string   InpHLineBUY          = "S2_Line";      // HLine Name buy
input string   InpHLineSELL         = "R2_Line";      // HLine Name sell
input bool     InpReverse01         = false;          // Reverse Open - переворот торгового сигнала
input bool     UseDelete            = true;           // УДАЛЕНИЕ ИНДИКАТОРА Open
input string   short_name           = "FiboPivot_V2"; // INDICATOR_SHORTNAME
input string   t9="------ ЛИНИЯ Close ------";        //
input string   InpHLineCloseBUY     = "S3_Line";      // HLine Name Close buy
input string   InpHLineCloseSELL    = "R3_Line";      // HLine Name Close sell
input bool     InpReverse10         = false;          // Reverse Close - переворот торгового сигнала
input bool     UseDelete1           = false;          // УДАЛЕНИЕ ИНДИКАТОРА Close
input string   short_name0          = "FiboPivot_V2"; // INDICATOR_SHORTNAME
input bool     Inpres               = false;          // Delete All Indicators
//---
Files:
 
Aleksandr Klapatyuk:

script to delete an Indicator by INDICATOR_SHORTNAME

to spell an indicator's name correctly - copy it as in the thermal


The indicator deletesone by one from all charts, the desired ones can be skipped by pressing "cancel"

 
Vitaly Muzichenko:

The indicator deletes one by one from all the charts, you can skip the desired ones by pressing "cancel".

I also tried to use your script - it works as it should.

I only need it for other purposes. I attached it to my Expert Advisor.

i have indicators with horizontal lines - when the EA is triggered by a horizontal line - i want it to delete the indicator which is prescribed in the settings.

and did not remove the other indicators .

input string   t8="------ ЛИНИЯ Open ------";         //
input string   InpHLineBUY          = "S2_Line";      // HLine Name buy
input string   InpHLineSELL         = "R2_Line";      // HLine Name sell
input bool     InpReverse01         = false;          // Reverse Open - переворот торгового сигнала
input bool     UseDelete            = true;           // УДАЛЕНИЕ ИНДИКАТОРА Open
input string   short_name           = "FiboPivot_V2"; // INDICATOR_SHORTNAME
input string   t9="------ ЛИНИЯ Close ------";        //
input string   InpHLineCloseBUY     = "S3_Line";      // HLine Name Close buy
input string   InpHLineCloseSELL    = "R3_Line";      // HLine Name Close sell
input bool     InpReverse10         = false;          // Reverse Close - переворот торгового сигнала
input bool     UseDelete1           = false;          // УДАЛЕНИЕ ИНДИКАТОРА Close
input string   short_name0          = "FiboPivot_V2"; // INDICATOR_SHORTNAME
input bool     Inpres               = false;          // Delete All Indicators
//---
 
Aleksandr Klapatyuk:

I've slapped it on - a manual trading assistant.

Checked it on a real account - everything that depends on it works.

The function I added.

input string   t8="------ ЛИНИЯ Open ------";         //
input string   InpHLineBUY          = "S2_Line";      // HLine Name buy
input string   InpHLineSELL         = "R2_Line";      // HLine Name sell
input bool     InpReverse01         = false;          // Reverse Open - переворот торгового сигнала
input bool     UseDelete            = true;           // УДАЛЕНИЕ ИНДИКАТОРА Open
input string   short_name           = "FiboPivot_V2"; // INDICATOR_SHORTNAME
input string   t9="------ ЛИНИЯ Close ------";        //
input string   InpHLineCloseBUY     = "S3_Line";      // HLine Name Close buy
input string   InpHLineCloseSELL    = "R3_Line";      // HLine Name Close sell
input bool     InpReverse10         = false;          // Reverse Close - переворот торгового сигнала
input bool     UseDelete1           = false;          // УДАЛЕНИЕ ИНДИКАТОРА Close
input string   short_name0          = "FiboPivot_V2"; // INDICATOR_SHORTNAME
input bool     Inpres               = false;          // Delete All Indicators

I thought it only worked with the horizontal line.

I don't know if it just depends on the object name.

Photo by

chart from the tester

-----------------------------------------------------------------------

so stupid. it showed a result with 0.01

Snapshot1

 

I fixed it a little bit here.

- The line was deleted before - and closed the position repeatedly. It closes then it doesn't.

//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::LongClosedHLine(void)
  {
   bool res=false;
//--- should it be closed?
//--- check for long position (BUY) possibility
   double priceCloseAsk=ObjectGetDouble(0,InpHLineCloseBUY,OBJPROP_PRICE);
   if(priceCloseAsk==0.0)
      return(true);
   if(priceCloseAsk>m_symbol.Bid())
     {
      if(UseDelete1)
         IndicatorDelete();
      ObjectDelete(0,InpHLineCloseBUY);
      if(UseSound)
         PlaySound("ok.wav");
      if((!InpReverse10 && CheckForCloseSELL()) || (InpReverse10 && CheckForCloseBUY()))
        {
         ExtNeedDeleteAll=true;
         return(true);
        }
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+

But now - with this correction - it closes.

//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::LongClosedHLine(void)
  {
   bool res=false;
//--- should it be closed?
//--- check for long position (BUY) possibility
   double priceCloseAsk=ObjectGetDouble(0,InpHLineCloseBUY,OBJPROP_PRICE);
   if(priceCloseAsk==0.0)
      return(true);
   if(priceCloseAsk>m_symbol.Bid())
     {
      if((!InpReverse10 && CheckForCloseSELL()) || (InpReverse10 && CheckForCloseBUY()))
        {
         if(UseDelete1)
            IndicatorDelete();
         ObjectDelete(0,InpHLineCloseBUY);
         if(UseSound)
            PlaySound("ok.wav");
         ExtNeedDeleteAll=true;
         return(true);
        }
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+

And yes! - this function is triggered by the name. either by a trend line, by a horizontal line or by the name of an object in general.

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Files:
 

Also - to avoid confusion -


input string   InpHLineBUY          = "open buy";     // ВНИЗУ Name buy
input string   InpHLineSELL         = "open sell";    // ВВЕРХУ Name sell
input bool     InpReverse01         = false;          // Reverse Open - переворот торгового сигнала

whatever you write"open buy" it should always be at the bottom of the current price.

just switch reverse - then it will open sell

Files:
 
Aleksandr Klapatyuk:

I fixed it a little bit here.

- The line was deleted before - and closed the position repeatedly. It closes then it doesn't.

But now - with this correction - it closes.

And yes - this function is triggered by the name. either by a trend line, by a horizontal line or by the name of the object in general.

There's still an error.

I corrected it to this, it works as it should.

//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::LongClosedHLine(void)
  {
   bool res=false;
//--- should it be closed?
//--- check for long position (BUY) possibility
   double priceCloseAsk=ObjectGetDouble(0,InpHLineCloseBUY,OBJPROP_PRICE);
   if(priceCloseAsk==0.0)
      return(true);
   if(priceCloseAsk>m_symbol.Bid())
     {
      if(!InpReverse10)
         if(CheckForCloseSELL())
           {
            if(UseDelete1)
               IndicatorDelete();
            ObjectDelete(0,InpHLineCloseBUY);
            if(UseSound)
               PlaySound("ok.wav");
            ExtNeedDeleteAll=true;
            return(true);
           }
      if(InpReverse10)
         if(CheckForCloseBUY())
           {
            if(UseDelete1)
               IndicatorDelete();
            ObjectDelete(0,InpHLineCloseBUY);
            if(UseSound)
               PlaySound("ok.wav");
            ExtNeedDeleteAll=true;
            return(true);
           }
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
Files:
 

I also changed it a bit.

when I opened ten positions in one direction - the line to close was triggered, nine closed, one left

------------

it was like this.

//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::CheckForCloseBUY(void)
  {
   bool res=false;
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==MACD_MAGIC)
            if(m_position.PositionType()==(long)POSITION_TYPE_SELL) // gets the position type
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
//---
   res=true;
//--- result
   return(res);
  }
//+------------------------------------------------------------------+

Now it is like this

//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::CheckForCloseBUY(void)
  {
   bool res=false;
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==MACD_MAGIC)
            if(m_position.PositionType()==(long)POSITION_TYPE_SELL) // gets the position type
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
   Sleep(SLEEPTIME*1000);
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==MACD_MAGIC)
            if(m_position.PositionType()==(long)POSITION_TYPE_SELL) // gets the position type
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
//---
   res=true;
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
Files:
 

with this function.

Oh, man - I figured it out.

input string   t8="------ NAME Open ------";          //
input string   InpHLineBUY          = "(- ВНИЗУ -)";  // Name open buy (- ВНИЗУ -)
input string   InpHLineSELL         = "(- ВВЕРХУ -)"; // Name open sell (- ВВЕРХУ -)
input bool     InpReverse01         = false;          // Reverse Open - переворот торгового сигнала
input string   short_name           = "INDICATOR";    // INDICATOR_SHORTNAME Delete
input string   t9="------ NAME Close ------";         //
input string   InpHLineCloseBUY     = "(- ВНИЗУ -)";  // Name Close buy (- ВНИЗУ -)
input string   InpHLineCloseSELL    = "(- ВВЕРХУ -)"; // Name Close sell (- ВВЕРХУ -)
input bool     InpReverse10         = false;          // Reverse Close - переворот торгового сигнала
input string   short_name0          = "INDICATOR";    // INDICATOR_SHORTNAME Delete
input bool     Inpres               = false;          // Delete All Indicators
//+------------------------------------------------------------------+

I drew a trend line on the slant - it doesn't work and that's it

it turns out until the entire line from start to finish - the current price is not crossed. - does not work

the current price will cross itand it will not work.

EURUSDM1