Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 785

 
Seric29:

Ist es notwendig,templ(T1) vor jede Funktion zu schreiben, die eine Variable oder das erforderliche Argument annimmt? Warum wirdtempl(T) deklariertundtempl(T1) aufgerufen, sollte ich vor jeder Funktion eine Zahl hinzufügen(templ(T1)templ(T2)templ(T3)) oder sollte ich überalltempl(T1) schreiben?Und wenn mehrere Parameter intemplate<typename T>gewertet werden, wie würde es dann sein, wie diesestemplate<typename T,typename P,typename Q>-templ(T,P,Q).

Ja, die Aufzeichnung erfolgt immer noch vor jeder Funktion, bei der Sie eine normale Funktion in eine Funktionsvorlage umwandeln wollen. Es ist nur so, dass diese Platte jetzt merklich kürzer ist.
T1 ist ein Name, der eine Art von Daten bezeichnet, die in einer Variablen mit dem Namen (a) gespeichert werden. Es ist nicht notwendig, eine Zahl hinzuzufügen. Sie können überall den gleichen Namen verwenden, sogar das gleiche T ohne Nummer.
Die Vorlage wird nicht aufgerufen, sondern automatisch durch das ersetzt, was ihr in #define vorangestellt ist. Dies ist eine einfache Ersetzung eines Textes durch einen anderen, aber Sie können die Eingabeparameter in Klammern schreiben, genau wie bei Funktionen.

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

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

Zur Kompilierzeit wird der Ausdruck templ(T1) durch template<typename T1> ersetzt und man erhält folgendes

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

Für mehrere Parameter, ja, Sie haben richtig geraten, wie zu beschreiben.

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

Verstehe, danke für die Information, ich habe es bereits ausprobiert - es ist praktisch.

 
Vitaly Muzichenko:

Ich habe verstanden, dass Sie über einen Schalter auswählen und die Namen dort eingeben müssen.

Ihr Code gibt einen int-Wert aus, während Sie einen String auswählen müssen


Ich würde ein Array von String-Konstanten verwenden, um den Indikatornamen auszuwählen, d.h. mein Beispiel gibt Ihnen die Nummer des Datensatzes, wenn der Benutzer ihn auswählt, und diese Nummer kann die Nummer eines Elements (Index) des String-Arrays sein, in dem Sie die Textnamen der Indikatoren speichern würden

Sorry, ich habe kein Terminal, ich kann das Beispiel im Code nicht zeigen, aber ich denke, ich habe die Idee erklärt

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:

Ich würde ein Array von String-Konstanten verwenden, um den Namen des Indikators auszuwählen, d.h. mein Beispiel gibt Ihnen die Nummer des Datensatzes, wenn er vom Benutzer ausgewählt wird, und diese Nummer kann die Nummer des Elements (Index) des String-Arrays sein, in dem Sie die Textnamen der Indikatoren speichern werden

Sorry, ich habe kein Terminal, ich kann das Beispiel im Code nicht zeigen, aber ich denke, ich habe die Idee erklärt

PS:

Danke, das habe ich getan, es ist ziemlich praktisch.

Und die endgültige Version ist einfach der Hammer. Das habe ich schon lange vermisst, denn ich habe mindestens 20 Charts im Terminal geöffnet

Delete Indicators
Delete Indicators
  • www.mql5.com
Удаляет выбранные индикаторы со всех графиков
 
Hallo zusammen. Hilfe, bitte. Ich möchte, dass der EA nach dem Schließen eines Geschäfts n Stunden lang wartet. Ich kann diese Funktion auch optimieren. Wäre es richtig, Mode_Trades in Mode_History zu ändern? Dankeschön
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:
Hallo zusammen. Hilfe, bitte. Ich möchte, dass der EA nach dem Schließen eines Geschäfts n Stunden lang wartet. Ich kann diese Funktion auch optimieren. Wäre es richtig, Mode_Trades in Mode_History zu ändern? Dankeschön

MODE_HISTORY - natürlich wird er benötigt, aber es gibt noch einen weiteren Punkt: im Text "after closing" und im CodeOrderOpenTime

Und gehen Sie nicht in Bars, bringen Sie die Zeit t zurück und verwenden Sie sie dann irgendwie:

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

MODE_HISTORY - natürlich wird er benötigt, aber es gibt noch einen weiteren Punkt: im Text "after closing" und im CodeOrderOpenTime

Und gehen Sie nicht in Bars, bringen Sie die Zeit t zurück und verwenden Sie sie dann irgendwie:


Ich habe auf Mode_History korrigiert, so dass die Eule die erste Bestellung nicht öffnet. Können Sie die Lösung näher erläutern? Danke

 
Carcass77:

Ich habe auf Mode_History korrigiert, damit die Eule nicht die erste Bestellung öffnet. Können Sie die Lösung bitte näher erläutern? Danke

Schauen Sie sich das an.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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:

Schauen Sie sich das an.

Wie wird der erste Auftrag erledigt?

 
Carcass77:

Und wie lösen Sie den ersten Auftrag?

Bitte beachten Sie, dass sich die Funktion leicht geändert hat.

//+------------------------------------------------------------------+
//| 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);
  }
//+----------------------------------------------------------------------------+  
Grund der Beschwerde: