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) 式は 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:

スイッチ経由で選択し、そこで名前を入力する必要があると理解しています。

文字列を選択する必要があるのに、コードが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
Удаляет выбранные индикаторы со всех графиков
 
皆さん、こんにちは。助けてください。取引終了後、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 - もちろん必要なのですが、もう一つポイントがあります。

そして、バーに行って時間Tを返し、それをなんとなく使ってしまうのはやめましょう。

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

MODE_HISTORY - もちろん必要なのですが、もう一つポイントがあります。

そして、バーに行って時間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:

これを見てください。

1順目はどのように解決するのでしょうか?

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