Come ho assemblato il mio consulente per tentativi ed errori - pagina 19

 

script per cancellare un indicatore per 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());
     }
  }
//+------------------------------------------------------------------+

per scrivere correttamente il nome dell'indicatore - copia come nel termine

Immagine 2

File:
 

L'ho schiaffato su - un assistente di trading manuale.

L'ho testato su un account reale - tutto ciò che dipende da esso funziona.

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

script per cancellare un indicatore per INDICATOR_SHORTNAME

per scrivere correttamente il nome di un indicatore - copiatelo come nel termi


L'indicatore cancellauno per uno tutti i grafici, quelli desiderati possono essere saltati premendo "cancel".

 
Vitaly Muzichenko:

L'indicatore cancella uno per uno tutti i grafici, potete saltare quelli desiderati premendo "cancel".

Ho anche provato a usare il tuo script - funziona come dovrebbe.

Mi serve solo per altri scopi e l'ho attaccato al mio Expert Advisor.

Ho indicatori con linee orizzontali - quando l'EA viene attivato da una linea orizzontale - voglio che cancelli l'indicatore che è prescritto nelle impostazioni.

e non ha rimosso gli altri indicatori.

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:

L'ho schiaffato su - un assistente di trading manuale.

L'ho controllato su un account reale - tutto ciò che dipende da esso funziona.

La funzione che ho aggiunto.

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

Pensavo che funzionasse solo con la linea orizzontale.

Non so se dipende solo dal nome dell'oggetto.

Foto di

grafico del tester

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

Così stupido. ha mostrato un risultato con 0,01

Istantanea1

 

L'ho aggiustato un po' qui.

- La linea è stata cancellata prima - e ha chiuso la posizione ripetutamente. Si chiude poi non lo fa.

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

Ma ora - con questa correzione - si chiude.

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

E sì - questa funzione è attivata dal nome. sia da una linea di tendenza, da una linea orizzontale o dal nome di un oggetto in generale.

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

Inoltre - per evitare confusione -


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

qualunque cosa tu scriva"open buy" dovrebbe essere sempre in fondo al prezzo corrente.

basta cambiare la retromarcia - poi si aprirà vendere

 
Aleksandr Klapatyuk:

L'ho aggiustato un po' qui.

- La linea è stata cancellata prima - e ha chiuso la posizione ripetutamente. Si chiude poi non lo fa.

Ma ora - con questa correzione - si chiude.

E sì! - Questa funzione è attivata dal nome. sia da una linea di tendenza, da una linea orizzontale o dal nome dell'oggetto.

C'è ancora un errore.

L'ho corretto in questo modo e funziona come dovrebbe.

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

L'ho anche cambiato un po'.

quando ho aperto dieci posizioni in una direzione - è scattata la linea di chiusura, nove hanno chiuso, una è rimasta

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

era così.

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

Ora è così

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

con questa funzione.

Oh, amico - l'ho capito.

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

Ho disegnato una linea di tendenza sull'inclinazione - non funziona e questo è tutto

si scopre fino a quando l'intera linea dall'inizio alla fine - il prezzo corrente non è attraversato. - non funziona

il prezzo attuale lo attraverseràe non funzionerà.

EURUSDM1