Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1523

 
AkaEdie #:
вот и я о томже, у меня индикатор аллигатор используется, как его в таком случае подключить к графику если я эту строку кода пропишу в коде индиктаора? через inlude? а конфликта не будет?

Меня вот только сейчас, когда я полистал документацию повнимательней, заинтересовал этот вопрос…

Получается кроме как с двойным циклом никак.

Получилось вот что…

Код

long chartID = ChartID();
//---
/*******************Script program start function********************/
void OnStart()
 {
  int totalWnd = (int)ChartGetInteger(chartID, CHART_WINDOWS_TOTAL);
  for(int w = 0; w < totalWnd; w++)
   {
    int totalInd = ChartIndicatorsTotal(chartID, w);
    for(int i = 0; i < totalInd; i++)
     {
      string indName = ChartIndicatorName(chartID, w, i);
      int handle = ChartIndicatorGet(chartID, w, indName);
      Print("INDICATOR_SHORTNAME ", indName, " handle ", handle);
     }
   }
 }/******************************************************************/

/********************************************************************\

Результат

2024.04.20 09:59:54.730 Test (EURUSD,H1)        INDICATOR_SHORTNAME MA(10) handle 10
2024.04.20 09:59:54.730 Test (EURUSD,H1)        INDICATOR_SHORTNAME SAR(0.02,0.20) handle 11
2024.04.20 09:59:54.730 Test (EURUSD,H1)        INDICATOR_SHORTNAME MACD(12,26,9) handle 12
2024.04.20 09:59:54.731 Test (EURUSD,H1)        INDICATOR_SHORTNAME Stoch(5,3,3) handle 13

Так вот получается, что если из всех имеющихся индикаторов надо в цикле дойти до нужного проверяя хендлы и когда обнаружил просто прервать цикл и по этому короткому имени индикатор удалить.


Другой вариант, попроще… Если вам известно, что индикатор в основном окне, то цикл перебора окон индикаторов можно убрать.


Вот сделал ещё добавление индикатора программно

long chartID = ChartID();
//---
/*******************Script program start function********************/
void OnStart()
 {
  int hAll = iAlligator(_Symbol, PERIOD_CURRENT, 13, 8, 8, 5, 5, 3, MODE_SMA, PRICE_MEDIAN);
  ChartIndicatorAdd(chartID, 0, hAll);
  Print("hAll ", hAll);
  int totalWnd = (int)ChartGetInteger(chartID, CHART_WINDOWS_TOTAL);
  for(int w = 0; w < totalWnd; w++)
   {
    int totalInd = ChartIndicatorsTotal(chartID, w);
    for(int i = 0; i < totalInd; i++)
     {
      string indName = ChartIndicatorName(chartID, w, i);
      int handle = ChartIndicatorGet(chartID, w, indName);
      Print("INDICATOR_SHORTNAME ", indName, " handle ", handle);
     }
   }
 }/******************************************************************/

Получился результат

2024.04.20 10:20:59.131 Test (EURUSD,H1)        hAll 10
2024.04.20 10:20:59.131 Test (EURUSD,H1)        INDICATOR_SHORTNAME MA(10) handle 11
2024.04.20 10:20:59.131 Test (EURUSD,H1)        INDICATOR_SHORTNAME SAR(0.02,0.20) handle 12
2024.04.20 10:20:59.131 Test (EURUSD,H1)        INDICATOR_SHORTNAME Alligator(13,8,5) handle 10
2024.04.20 10:20:59.131 Test (EURUSD,H1)        INDICATOR_SHORTNAME MACD(12,26,9) handle 13
2024.04.20 10:20:59.131 Test (EURUSD,H1)        INDICATOR_SHORTNAME Stoch(5,3,3) handle 14
 

все разобрался надо добавить этот код в то место где нужно удалить все индикаторы 

    long chartID = ChartID(); // Получаем идентификатор текущего графика
    int totalWnd = (int)ChartGetInteger(chartID, CHART_WINDOWS_TOTAL); // Получаем общее количество подокон на графике

    // Перебираем каждое подокно
    for (int w = 0; w < totalWnd; w++) {
        int totalInd = ChartIndicatorsTotal(chartID, w); // Получаем количество индикаторов в текущем подокне

        // Перебираем каждый индикатор в текущем подокне
        for (int i = totalInd - 1; i >= 0; i--) {
            string indName = ChartIndicatorName(chartID, w, i); // Получаем имя индикатора по индексу

            // Удаляем индикатор по имени
            if (!ChartIndicatorDelete(chartID, w, indName)) {
                Print("Ошибка удаления индикатора ", indName, " с графика: ", GetLastError());
            } else {
                Print("Удален индикатор: ", indName);
            }
        }
    }

спасибо огромное, можно как удалить все индикаторы перед добавлением советника на график из OnInit, так и при деинциализации в OnDeinit советника, хорошо было бы доабвить куда то статью по этому поводу. Завидую вашему опыту.

 
Alexey Viktorov #:

Это прописывается в индикаторе, а не в момент его постановки на график.

Привет, Алексей! Не знаю, но вроде бы всё чётко и понятно расписал в своем сообщении:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL5 MT5 MetaTrader 5

MrBrooklin, 2024.04.20 05:04

Не понимаю, а что мешает самому прописать (вставить) это короткое имя в коде используемого индикатора? Например так, как это сделано в коде индикатора у Артёма Тришкина, только при этом заменив имя "Net Volume" на какое-нибудь своё:

IndicatorSetString(INDICATOR_SHORTNAME,"Net Volume");

С уважением, Владимир.

С уважением, Владимир.
 

это прописывается в индикаторе и ваш ответ был не полезным. я просил код удаления а не функцию переименования индикатора.

с учетом того что индикаторов может быть много, код товарища Alexey Viktorov был полезнее.

Владимир.

Alexey Viktorov
Alexey Viktorov
  • 2024.01.15
  • www.mql5.com
Профиль трейдера
 
Я новичок в бэктестинге. Пытаюсь протестировать советник на основе Мартингейла на MT4. По какой-то причине мой график не работает. Когда советник мартингейлит, чтобы компенсировать убыточную позицию, вы должны видеть большие провалы на графике, но я этого не вижу. Я вижу большие горбы, когда должен видеть большие провалы. Есть какие-нибудь мысли?
Файлы:
IMG_1330.png  24 kb
 

Добрый день! Почему-то перестал работать тестер стратегий. Хотя еще ночью работал.

Как это починить?

С уважением, Александр

 
MrBrooklin #:

Привет, Алексей! Не знаю, но вроде бы всё чётко и понятно расписал в своем сообщении:

С уважением, Владимир.

Привет. НО штатному индикатору это никак не впишешь… Именно поэтому я уточнил проблему.

 
Alexey Viktorov #:

Привет. НО штатному индикатору это никак не впишешь… Именно поэтому я уточнил проблему.

Доброе утро, Алексей! Можешь пояснить почему нельзя вписать?

С уважением, Владимир.

 
MrBrooklin #:

Доброе утро, Алексей! Можешь пояснить почему нельзя вписать?

С уважением, Владимир.

Потому, что у штатного, точней сказать технического индикатора код недоступен. 

Документация по MQL5: Технические индикаторы
Документация по MQL5: Технические индикаторы
  • www.mql5.com
Все функции типа iMA, iAC, iMACD, iIchimoku и т.п., создают в глобальном кеше клиентского терминала копию соответствующего технического индикатора...
 
Alexey Viktorov #:

Потому, что у штатного, точней сказать технического индикатора код недоступен. 

Алексей, извини меня за тупизну и бестолковость, но тогда вот этот код, взятый мною из MetaEditor, что за код?

С уважением, Владимир.

//+------------------------------------------------------------------+
//|                                                    Alligator.mq5 |
//|                             Copyright 2000-2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
#property indicator_type1   DRAW_LINE
#property indicator_type2   DRAW_LINE
#property indicator_type3   DRAW_LINE
#property indicator_color1  Blue
#property indicator_color2  Red
#property indicator_color3  Lime
#property indicator_width1  1
#property indicator_width2  1
#property indicator_width3  1
#property indicator_label1  "Jaws"
#property indicator_label2  "Teeth"
#property indicator_label3  "Lips"
//--- input parameters
input int                InpJawsPeriod=13;               // Jaws period
input int                InpJawsShift=8;                 // Jaws shift
input int                InpTeethPeriod=8;               // Teeth period
input int                InpTeethShift=5;                // Teeth shift
input int                InpLipsPeriod=5;                // Lips period
input int                InpLipsShift=3;                 // Lips shift
input ENUM_MA_METHOD     InpMAMethod=MODE_SMMA;          // Moving average method
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_MEDIAN;   // Applied price
//--- indicator buffers
double ExtJaws[];
double ExtTeeth[];
double ExtLips[];
//--- handles for moving averages
int    ExtJawsHandle;
int    ExtTeethHandle;
int    ExtLipsHandle;
//--- bars minimum for calculation
int    ExtBarsMinimum;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtJaws,INDICATOR_DATA);
   SetIndexBuffer(1,ExtTeeth,INDICATOR_DATA);
   SetIndexBuffer(2,ExtLips,INDICATOR_DATA);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpJawsPeriod-1);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpTeethPeriod-1);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpLipsPeriod-1);
//--- line shifts when drawing
   PlotIndexSetInteger(0,PLOT_SHIFT,InpJawsShift);
   PlotIndexSetInteger(1,PLOT_SHIFT,InpTeethShift);
   PlotIndexSetInteger(2,PLOT_SHIFT,InpLipsShift);
//--- name for DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"Jaws("+string(InpJawsPeriod)+")");
   PlotIndexSetString(1,PLOT_LABEL,"Teeth("+string(InpTeethPeriod)+")");
   PlotIndexSetString(2,PLOT_LABEL,"Lips("+string(InpLipsPeriod)+")");
//--- get MA's handles
   ExtJawsHandle=iMA(NULL,0,InpJawsPeriod,0,InpMAMethod,InpAppliedPrice);
   ExtTeethHandle=iMA(NULL,0,InpTeethPeriod,0,InpMAMethod,InpAppliedPrice);
   ExtLipsHandle=iMA(NULL,0,InpLipsPeriod,0,InpMAMethod,InpAppliedPrice);
//--- bars minimum for calculation
   ExtBarsMinimum=InpJawsPeriod+InpJawsShift;
   if(ExtBarsMinimum<(InpTeethPeriod+InpTeethShift))
      ExtBarsMinimum=InpTeethPeriod+InpTeethShift;
   if(ExtBarsMinimum<(InpLipsPeriod+InpLipsPeriod))
      ExtBarsMinimum=InpLipsPeriod+InpLipsPeriod;
  }
//+------------------------------------------------------------------+
//|  Alligator OnCalculate function                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(rates_total<ExtBarsMinimum)
      return(0);
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtJawsHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtJawsHandle is calculated (",calculated," bars). Error ",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtTeethHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtTeethHandle is calculated (",calculated," bars). Error ",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtLipsHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtLipsHandle is calculated (",calculated," bars). Error ",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0)
      to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0)
         to_copy++;
     }
//--- get ma buffers
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(ExtJawsHandle,0,0,to_copy,ExtJaws)<=0)
     {
      Print("getting ExtJawsHandle is failed! Error ",GetLastError());
      return(0);
     }
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(ExtTeethHandle,0,0,to_copy,ExtTeeth)<=0)
     {
      Print("getting ExtTeethHandle is failed! Error ",GetLastError());
      return(0);
     }
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(ExtLipsHandle,0,0,to_copy,ExtLips)<=0)
     {
      Print("getting ExtLipsHandle is failed! Error ",GetLastError());
      return(0);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Причина обращения: