Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 785

 
Seric29:

Значит перед каждой функцией делать запись templ(T1)и она буде принимать переменную или нужный аргумент? А почему объявляется templ(T)а вызывается templ(T1),нужно добавлять цифру перед каждой функцией(templ(T1)templ(T2)templ(T3)) или везде писать templ(T1)? А если несколько параметров забито в template<typename T>то как будет, вот так template<typename T,typename P,typename Q> - templ(T,P,Q).

Да, запись всё равно делается перед каждой функцией, где нужно обычную функцию превратить шаблон функции. Просто эта запись теперь заметно короче.
T1 - имя, обозначающее какой-то тип данных, который хранится в переменной обозначенной своим именем (a). Цифру добавлять не обязательно. Можно одно и то же имя везде использовать, даже ту же самую Т без цифры.
templ не вызывается, а автоматом заменяется тем, что прописано к нему в #define. Это простая замена одного текста другим, но можно так же как и функций прописывать входные параметры в скобках.

#define templ(T) template<typename T> // один входной параметр именуемый буквой "T" т. е. "T" это просто имя.

templ(T1) T1 Funct(T1 a) { return a;} // функция вернёт тот же тип, что и будет передан при вызове это функции

в момент компиляции выражение templ(T1) будет заменено на template<typename T1> и получится это

template<typename T1>
T1 Funct(T1 a) { return a;}

Для нескольких параметров, да, вы верно догадались, как описать.

Макроподстановка (#define) - Препроцессор - Основы языка - Справочник MQL4
Макроподстановка (#define) - Препроцессор - Основы языка - Справочник MQL4
  • docs.mql4.com
Директива #define подставляет expression вместо всех последующих найденных вхождений identifier в исходном тексте. identifier заменяется только в том случае, если он представляет собой отдельный токен. identifier не заменяется, если он является частью комментария, частью строки, или частью другого более длинного идентификатора. expression...
 
Ilya Prozumentov:

Понятно, спасибо за информацию, уже поэксперемнтировал- удобно.

 
Vitaly Muzichenko:

Я так понимаю, что нужно делать выбор через switch, и там вносить названия

Ваш код печатает int значение, а нужно выбирать string


я бы через массив строковых констант выбирал бы имя индикатора, т.е. мой пример выдает Вам номер записи при выборе пользователем, а этот номер может быть номером элемента (индекс) массива строк, где Вы сохраните текстовые имена индикаторов

к сожалению нет терминала, в коде не покажу пример, но думаю я объяснил идею

PS:

#property strict
#property show_inputs
enum Eind {
 ind_1, // Indicator 1
 ind_2, // Indicator 2
 ind_3, // Indicator 3
 ind_4  // Indicator 4
};

input Eind param = ind_1;
const string IndicatorName[] = {"Moving Average","ADX","ZigZag","Fractals"};
//+------------------------------------------------------------------+
void OnStart()
  {
   Alert("Выбран :",param, " . Удаляю индикатор : ",IndicatorName[param]);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

я бы через массив строковых констант выбирал бы имя индикатора, т.е. мой пример выдает Вам номер записи при выборе пользователем, а этот номер может быть номером элемента (индекс) массива строк, где Вы сохраните текстовые имена индикаторов

к сожалению нет терминала, в коде не покажу пример, но думаю я объяснил идею

PS:

Спасибо, так и сделал, это довольно таки удобно.

А вот итоговый вариант, это просто бомба. Мне этого давно не хватало, так как открыто в терминале не менее 20 графиков

Delete Indicators
Delete Indicators
  • www.mql5.com
Удаляет выбранные индикаторы со всех графиков
 
Привет всем. Помогите, пожалуйста. Хочу, чтоб после закрытия сделки советник ждал n часов. Можно также подправить эту функцию. Правильно ли будет исправить Mode_Trades на Mode_History? Спасибо
int BarsAfterOrderBuy()
{
datetime t=0;int i;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{if(t<OrderOpenTime())t=OrderOpenTime();}
return(iBarShift(Symbol(),0,t,true));
}
 
Carcass77:
Привет всем. Помогите, пожалуйста. Хочу, чтоб после закрытия сделки советник ждал n часов. Можно также подправить эту функцию. Правильно ли будет исправить Mode_Trades на Mode_History? Спасибо

MODE_HISTORY - конечно нужно, но есть ещё один момент: в тексте "после закрытия", а в коде OrderOpenTime

И не стоит переходить к барам, возвращайте время t, а потом как-то так используйте:

if(TimeCurrent()>t+n*3600) {можно открывать}


 

 
Igor Zakharov:

MODE_HISTORY - конечно нужно, но есть ещё один момент: в тексте "после закрытия", а в коде OrderOpenTime

И не стоит переходить к барам, возвращайте время t, а потом как-то так используйте:


 

Я исправлял на Mode_History, так сова не откравает первый ордер. Можно поподробней решение? Спасибо

 
Carcass77:

Я исправлял на Mode_History, так сова не откравает первый ордер. Можно поподробней решение? Спасибо

Посмотрите это.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после закрытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterCloseLastPos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(t<OrderCloseTime()) t=OrderCloseTime();
                    }
                 }
              }
           }
        }
     }
   return(TimeCurrent()-t);
  }
 
Alekseu Fedotov:

Посмотрите это.

А как первый ордер разрешить?

 
Carcass77:

А как первый ордер разрешить?

Обратите внимание, функцию немного изменил.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// здесь пофиг какой символ и какая позиция ... последняя позиция и все
  int ClosePos = SecondsAfterCloseLastPos();
  
  
// здесь по тек. символу и пофиг какая позиция 
//  int ClosePos = SecondsAfterCloseLastPos(Symbol());  

// здесь по тек. символу и OP_BUY позиция 
//  int ClosePos = SecondsAfterCloseLastPos(Symbol(),OP_BUY); 

// здесь по тек. символу , OP_BUY позиция , и магик  5 
//  int ClosePos = SecondsAfterCloseLastPos(Symbol(),OP_BUY,5);

// продажи,  вместо OP_BUY прописываем  OP_SELL.

   if(ClosePos > 3600 || ClosePos == 0 )  {/*можно открывать*/}
   
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после закрытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int SecondsAfterCloseLastPos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(t<OrderCloseTime()) t=OrderCloseTime();
                    }
                 }
              }
           }
        }
     }
  int CloseTime; 
     if(t==0)
        CloseTime=0;
     else 
        CloseTime = int(TimeCurrent()-t);
      
   return(CloseTime);
  }
//+----------------------------------------------------------------------------+  
Причина обращения: