Как я собираю себе советника методом тыка - страница 19

 

script  для удаления Индикатора по 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());
     }
  }
//+------------------------------------------------------------------+

для правильного написания имени Индикатора - нужно скопировать как в терменале

Снимок 2 

Файлы:
 

Сляпал - помощника в ручной торговле.

проверил на реальном счёте - всё что от него зависит, работает.

//---
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
//---
Файлы:
 
Aleksandr Klapatyuk:

script  для удаления Индикатора по INDICATOR_SHORTNAME

для правильного написания имени Индикатора - нужно скопировать как в терменале

 

Индикатор удаляет по очереди со всех графиков, нужные можно пропустить нажав "отмену"

 
Vitaly Muzichenko:

Индикатор удаляет по очереди со всех графиков, нужные можно пропустить нажав "отмену"

с вашим скриптом я тоже пытался - он у вас работает как надо.

только мне для других целей нужно. я его в советник приделал.

есть индикаторы с горизонтальными линиями - и когда советник сработает от индикаторной горизонтальной линии- что бы индикатор удалился , тот который прописан в настройках.

и не удалял другие индикаторы . 

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:

Сляпал - помощника в ручной торговле.

проверил на реальном счёте - всё что от него зависит, работает.

Функцию которую добавил.

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

думал только с горизонтальной линией работает.

но она и с трендовой линией работает - не знаю может просто от названия объекта работает

Снимок 

график с тестера

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

так по-дуратски . до конца прогнал. он ещё и результат показал с 0.01

Снимок1 

 

 немного исправил тут.

- линия удалялась раньше - и через раз закрывала позицию . то закроет то не закроет.

//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+

а вот так - с исправлением, закрывается.

//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+

и да! - эта функция оказывается - срабатывает от имени. как от тренд линии так от горизонтальной или вообще от имени объекта  

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

ещё - что бы не путаться -


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

 чтобы вы не написали "open buy" она всегда должна быть внизу от текущей цены .

просто переключить реверс - тогда откроется sell  

Файлы:
 
Aleksandr Klapatyuk:

 немного исправил тут.

- линия удалялась раньше - и через раз закрывала позицию . то закроет то не закроет.

а вот так - с исправлением, закрывается.

и да! - эта функция оказывается - срабатывает от имени. как от тренд линии так от горизонтальной или вообще от имени объекта  

всё таки ошибка осталась.

Исправил на так, вроде как надо срабатывает.

//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
Файлы:
 

ещё немного изменил.

когда открыл десять позиций в одну сторону - сработала линия на close, закрылось 9 одна осталась

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

было так.

//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+

сделал так 

//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
Файлы:
 

с этой функцией 

блин - разобрался.

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
//+------------------------------------------------------------------+

чертил тренд линию на искоса - не срабатывает и всё тут

оказывается пока полностью всю линию от начала до конца - текущая цена не пересекает. - не сработает

короче - просто имя какого то объекта - что бы пересекала  текущая цена - будет срабатывать .

EURUSDM1