新人对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)的变量中。没有必要添加一个数字。你可以在任何地方使用同一个名字,甚至是没有数字的同一个T。
templ并没有被调用,而是被自动替换成#define中预置的内容。这是一个简单的用一个文本替换另一个文本的过程,但你可以把输入参数写在括号里,就像函数一样。

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

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

在编译时,templ(T1)表达式将被替换为模板<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:

我知道你需要通过开关选择,并在那里输入名字。

你的代码打印的是一个int值,而你需要选择一个字符串


我会使用一个字符串常量 数组来选择指标名称,即我的例子在用户选择时给你记录的编号,这个编号可以是字符串数组的一个元素的编号(索引),你将在这里存储指标的文本名称

对不起,我没有终端,我不能在代码中显示这个例子,但我想我已经解释了这个想法。

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
Удаляет выбранные индикаторы со всех графиков
 
大家好。请给予帮助。我想让EA在关闭交易后等待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:
大家好。请给予帮助。我想让EA在关闭 交易 等待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);
  }
//+----------------------------------------------------------------------------+  
原因: