Cómo armo mi asesor por ensayo y error - página 19

 

script para eliminar un indicador por 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());
     }
  }
//+------------------------------------------------------------------+

deletrear correctamente el nombre del indicador - copiar como en la térmica

Imagen 2

Archivos adjuntos:
 

Lo he puesto: un asistente de comercio manual.

Lo he probado en una cuenta real: todo lo que depende de él funciona.

//---
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
//---
Archivos adjuntos:
 
Aleksandr Klapatyuk:

script para eliminar un indicador por INDICATOR_SHORTNAME

para deletrear correctamente el nombre de un indicador - cópielo como en la térmica


El indicador borrauno a uno todos los gráficos, los deseados se pueden saltar pulsando "cancelar"

 
Vitaly Muzichenko:

El indicador borra uno a uno todos los gráficos, puede omitir los deseados pulsando "cancelar".

También he probado a utilizar tu script - funciona como debería.

Sólo lo necesito para otros fines. Lo adjunté a mi Asesor Experto.

Tengo indicadores con líneas horizontales - cuando el EA es activado por una línea horizontal - quiero que borre el indicador que está prescrito en la configuración.

y no eliminó los otros indicadores .

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:

Lo he puesto: un asistente de comercio manual.

Lo he comprobado en una cuenta real: todo lo que depende de ella funciona.

La función que he añadido.

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

Pensaba que sólo funcionaba con la línea horizontal.

No sé si sólo depende del nombre del objeto.

Foto de

gráfico del probador

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

tan estúpido. mostró un resultado con 0,01

Instantánea1

 

Lo he arreglado un poco aquí.

- La línea se borró antes - y cerró la posición repetidamente. Se cierra y luego no.

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

Pero ahora -con esta corrección- se cierra.

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

Y sí! - esta función se activa por el nombre. ya sea por una línea de tendencia, por una línea horizontal o por el nombre de un objeto en general.

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

También - para evitar confusiones -


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

lo que escriba"compra abierta" debe estar siempre en la parte inferior del precio actual.

Sólo tiene que cambiar la marcha atrás - entonces se abrirá vender

Archivos adjuntos:
 
Aleksandr Klapatyuk:

Lo he arreglado un poco aquí.

- La línea se borró antes - y cerró la posición repetidamente. Se cierra y luego no se cierra.

Pero ahora, con esta corrección, se cierra.

Y sí - esta función se activa por el nombre. ya sea por una línea de tendencia, por una línea horizontal o por el nombre del objeto en general.

Todavía hay un error.

Lo corregí a esto, funciona como debería.

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

También lo he cambiado un poco.

cuando abrí diez posiciones en una dirección - la línea de cierre se activó, nueve se cerraron, una quedó

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

fue así.

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

Ahora es así

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

con esta función.

Oh, hombre - me lo imaginé.

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

Dibujé una línea de tendencia en el lateral - no funciona y eso es todo

resulta que hasta la línea completa de principio a fin - el precio actual no se cruza. - no funciona

el precio actual lo cruzaráy no funcionará.

EURUSDM1

Razón de la queja: