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 값을 인쇄하지만 문자열을 선택해야 합니다.


문자열 상수 배열을 통해 표시기의 이름을 선택합니다. 내 예는 사용자가 선택할 때 레코드 번호를 제공하며 이 번호는 표시기의 텍스트 이름을 저장할 문자열 배열의 요소 번호(인덱스)가 될 수 있습니다.

불행히도 터미널이 없으므로 코드에서 예제를 보여주지 않겠지만 아이디어를 설명했다고 생각합니다.

추신:

 #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 :

문자열 상수 배열을 통해 표시기의 이름을 선택합니다. 내 예는 사용자가 선택할 때 레코드 번호를 제공하며 이 번호는 표시기의 텍스트 이름을 저장할 문자열 배열의 요소 번호(인덱스)가 될 수 있습니다.

불행히도 터미널이 없으므로 코드에서 예제를 보여주지 않겠지만 아이디어를 설명했다고 생각합니다.

추신:

덕분에 해보니 꽤 편하네요.

하지만 최종 버전은 폭탄일 뿐입니다. 터미널에 최소 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 - 물론 필요하지만 한 가지 더 있습니다. "종료 후" 텍스트와 주문 오픈 시간 코드

막대로 전환하지 않고 시간 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 :

확인 해봐.

첫 번째 주문을 해결하는 방법은 무엇입니까?

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