MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1256

 
Vladimir Pastushak :

입력 매개변수의 유형을 어떻게 알 수 있습니까?

글쎄, 나는 컴파일러 자체가 템플릿 함수를 호출할 때 유형을 대체한다고 쓰고 있습니다. 그러한 호출이 아직 코드에 없는 경우 컴파일러는 함수의 다른 복사본을 만들고 유형 자체를 넣습니다. , 논리적으로 - 템플릿


그러한 함수에서 유형을 결정하는 방법에 대한 질문인 경우 다음을 사용하십시오.

 typename

UPD: 위의 예에 매개변수 유형의 인쇄를 추가했습니다.

 #define PRINT(VAL) Print ( #VAL, " = " ,VAL, ", typename = " , typename (VAL))
template < typename T1, typename T2>
int myfunc(T1 val1= 0 , T2 val2= 0 )
{
   Print ( __FUNCSIG__ );
   PRINT(val1);
   PRINT(val2);
   return (( int ) (val1 + val2));
}

//+------------------------------------------------------------------+
void OnStart ()
{
   int i1 = 2 , i2 = 3 ;
   Print (myfunc(i1, i2));
   double d1 = 10.0 , d2 = 30.0 ;
   Print (myfunc(d1, d2));
}
//+------------------------------------------------------------------+

2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)

2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, 유형 이름 = 정수

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, 유형 이름 = 정수

2020.09.16 18:58:21.681 tst (EURUSD,M5) 5

2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<더블,더블>(더블,더블)

2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, 유형 이름 = 이중

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, 유형 이름 = 이중

2020.09.16 18:58:21.681 tst (EURUSD,M5) 40


UPD: 이 예제에 __FUNCSI__를 추가했습니다.

 

안녕하세요.
MQL5(별도의 하위 창에 있는 표시기, 4줄)에서 표시기를 작성할 때 이상한 점이 발생했습니다.

초기 버퍼 설명은 다음과 같습니다.

 //------------------------------------------------------------------
#property indicator_buffers    6
#property indicator_plots      4
//-------------------------------------------------------------------
// == RSI ==
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrMagenta
#property indicator_style1    STYLE_SOLID
#property indicator_width1    2
//------------------------------------------------------------------
// == MA_fast ==
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrBlue
#property indicator_style2    STYLE_SOLID
#property indicator_width2    2
//------------------------------------------------------------------
// == MA_slow ==
#property indicator_type3    DRAW_COLOR_LINE
#property indicator_color3    clrWhite , clrBlack
#property indicator_style3    STYLE_SOLID
#property indicator_width3    3
//------------------------------------------------------------------
// == MA_slow_glob ==
#property indicator_type4    DRAW_COLOR_LINE
#property indicator_color4    clrYellow , clrRed
#property indicator_style4    STYLE_SOLID
#property indicator_width4    2
//------------------------------------------------------------------
 //--- buffers (массивы под буферы индикатора)
//--------------------------------------------------------------------
double       RSI[];                                                         // буфер под RSI
//--------------------------------------------------------------------
double       MAr1_fast[];                                                   // буфер под быструю МА
double       MAr2_slow[];                                                   // буфер под медленную МА
double       MAr2_slowColor[];                                               // буфер под цвета медленной МА
//--------------------------------------------------------------------
double       MAr3_slow_glob[];                                               // буфер под глобальную медленную МА
double       MAr3_slow_globColor[];                                         // буфер под цвета глобальной медленной МА
//--------------------------------------------------------------------

OnInit에서 다음:

   //--------------------------------------------------------------------
   SetIndexBuffer        ( 0 ,   RSI,                 INDICATOR_DATA );
   ArraySetAsSeries      (     RSI,                 true );
   PlotIndexSetString    ( 0 ,   PLOT_LABEL ,           "RSI(" + IntegerToString (RSI_per) + ")" );
   PlotIndexSetInteger   ( 0 ,   PLOT_SHOW_DATA ,       true );
   PlotIndexSetInteger   ( 0 ,   PLOT_DRAW_BEGIN ,     RSI_per);
   PlotIndexSetDouble    ( 0 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------
   SetIndexBuffer        ( 1 ,   MAr1_fast,           INDICATOR_DATA );
   ArraySetAsSeries      (     MAr1_fast,           true );
   PlotIndexSetString    ( 1 ,   PLOT_LABEL ,           "MA (" + IntegerToString (MA_fast_period) + "), EMA" );
   PlotIndexSetInteger   ( 1 ,   PLOT_SHOW_DATA ,       true );
   PlotIndexSetInteger   ( 1 ,   PLOT_DRAW_BEGIN ,     MA_fast_period);
   PlotIndexSetDouble    ( 1 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------
   SetIndexBuffer        ( 2 ,   MAr2_slow,           INDICATOR_DATA );
   ArraySetAsSeries      (     MAr2_slow,           true );
   PlotIndexSetString    ( 2 ,   PLOT_LABEL ,           "MA (" + IntegerToString (MA_slow_period) + "), SMA" );
   PlotIndexSetInteger   ( 2 ,   PLOT_SHOW_DATA ,       true );
   PlotIndexSetInteger   ( 2 ,   PLOT_DRAW_BEGIN ,     MA_slow_period);
   PlotIndexSetDouble    ( 2 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------
   SetIndexBuffer        ( 3 ,   MAr2_slowColor,       INDICATOR_COLOR_INDEX );
   ArraySetAsSeries      (     MAr2_slowColor,       true );
   PlotIndexSetDouble    ( 3 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------
   SetIndexBuffer        ( 4 ,   MAr3_slow_glob,       INDICATOR_DATA );
   ArraySetAsSeries      (     MAr3_slow_glob,       true );
   PlotIndexSetString    ( 4 ,   PLOT_LABEL ,           "MA (" + IntegerToString (MA_slow_glob_period) + "), SMA" );
   PlotIndexSetInteger   ( 4 ,   PLOT_SHOW_DATA ,       true );
   PlotIndexSetInteger   ( 4 ,   PLOT_DRAW_BEGIN ,     MA_slow_glob_period);
   PlotIndexSetDouble    ( 4 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------
   SetIndexBuffer        ( 5 ,   MAr3_slow_globColor, INDICATOR_COLOR_INDEX );
   ArraySetAsSeries      (     MAr3_slow_globColor, true );
   PlotIndexSetDouble    ( 5 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------

사실: 표시기는 4개의 선을 그립니다. 처음 두 개는 단색이고 다음 두 개는 2색입니다(꼬임에서 색상이 변경됨).

DRAW_COLOR_LINE 그리기 방식으로 인한 2색.

이제 질문은 다음과 같습니다. 첫 번째 줄(위 코드의 버퍼 2와 3)이 완벽하게 그려지고 OnInit에서 작성된 모든 코드가 작동합니다.
두 번째 줄은 어떤 이유로 과시하고 있습니다. 예를 들어, 다음 줄은 분명히 작동하지 않습니다.

 PlotIndexSetString    ( 4 ,   PLOT_LABEL ,           "MA (" + IntegerToString (MA_slow_glob_period) + "), SMA" );
즉, 버퍼 대신 데이터 창에서 지정한 텍스트 대신 표시기의 이름만 표시됩니다. 선 자체가 그려지지만 당연히 여러 가지 색상으로 표시됩니다.
번호 변경의 농담이라고 생각합니까? 예를 들어 코드 상단에서 #property 지시문을 통해 마지막 줄을 선언할 때 이전에 4개의 버퍼가 이미 사용되었기 때문에 인덱스가 5가 아니라 4여야 하는 이유가 명확하지 않습니다. #property 지시문을 통해 선언할 때 줄 번호 매기기와 OnInit에서 배열과 바인딩할 때 버퍼 번호 매기기 간에 연결이 있습니까?

위 코드에서 무엇이 잘못된 것인지 알려주세요. 아마도 누군가는 DRAW_COLOR_LINE... 그리기 방법을 사용하여 두 개 이상의 선이 그려지는 표시기의 예를 가지고 있을 것입니다.

그리고 또 다른 통과 질문: 멀티 컬러 라인 버퍼는 어떻게 연결되어 있습니까? 내 말은, 컴파일된 코드가 색상 버퍼에 값을 넣으면 다른 버퍼의 행을 이 색상으로 장식해야 한다는 것을 어떻게 알 수 있습니까?

 
satorifx :

안녕하세요.
MQL5(별도의 하위 창에 있는 표시기, 4줄)에서 표시기를 작성할 때 이상한 점이 발생했습니다.

초기 버퍼 설명은 다음과 같습니다.

OnInit에서 다음:

사실: 표시기는 4개의 선을 그립니다. 처음 두 개는 단색이고 다음 두 개는 2색입니다(꼬임에서 색상이 변경됨).

DRAW_COLOR_LINE 그리기 방식으로 인한 2색.

이제 질문은 다음과 같습니다. 첫 번째 줄(위 코드의 버퍼 2와 3)이 완벽하게 그려지고 OnInit에서 작성된 모든 코드가 작동합니다.
두 번째 줄은 어떤 이유로 과시하고 있습니다. 예를 들어, 다음 줄은 분명히 작동하지 않습니다.

즉, 버퍼 대신 데이터 창에서 지정한 텍스트 대신 표시기의 이름만 표시됩니다. 선 자체가 그려지지만 당연히 여러 가지 색상으로 표시됩니다.
번호 변경의 농담이라고 생각합니까? 예를 들어 코드 상단에서 #property 지시문을 통해 마지막 줄을 선언할 때 이전에 4개의 버퍼가 이미 사용되었기 때문에 인덱스가 5가 아니라 4여야 하는 이유가 명확하지 않습니다. #property 지시문을 통해 선언할 때 줄 번호 매기기와 OnInit에서 배열과 바인딩할 때 버퍼 번호 매기기 간에 연결이 있습니까?

위 코드에서 무엇이 잘못된 것인지 알려주세요. 아마도 누군가는 DRAW_COLOR_LINE... 그리기 방법을 사용하여 두 개 이상의 선이 그려지는 표시기의 예를 가지고 있을 것입니다.

그리고 또 다른 통과 질문: 멀티 컬러 라인 버퍼는 어떻게 연결되어 있습니까? 내 말은, 컴파일된 코드가 색상 버퍼에 값을 넣으면 다른 버퍼의 행을 이 색상으로 장식해야 한다는 것을 어떻게 알 수 있습니까?

매핑 번호 매기기는 버퍼 번호 매기기와 다릅니다.

 PlotIndexSetString    ( 3 ,   PLOT_LABEL ,           "MA (" + IntegerToString (MA_slow_glob_period) + "), SMA" );

그것이 작동하는 방식입니다.

 

좋은 오후에요 여러분!

손절매 수정 기능을 만들었습니다. 그러나 작업할 때 EURUSD,H1: OrderModify 오류 130이 표시됩니다.

게다가 가격은 손절매가 있어야 할 곳과 거리가 멀다.

다음은 함수 자체입니다.

void open_bu(string walpa, int op)
{
bool err;
int spred=(int)MarketInfo(walpa,MODE_SPREAD);
double point=MarketInfo(walpa,MODE_POINT);
int digits=(int)MarketInfo(walpa,MODE_DIGITS);
for(int is=OrdersTotal()-1; is>=0; is--)
 {
  if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa)
   {
    if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) )
     {
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
    if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0))
     {
      Print(walpa,"  ",spred,"   ",point,"   ",digits,"     ",NormalizeDouble(OrderOpenPrice()-spred*point, digits));
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
   }
 }
return;
}
 
안녕하세요. 가격 모멘텀이 강할 때 Expert Advisor가 경고를 표시하도록 이동 평균(또는 오히려 그 세트, 즉 Alligator)의 기울기 각도 측정을 기반으로 Expert Advisor를 작성하고 싶습니다. 지연. MA 각도를 측정하는 방법이나 충동이 발생했음을 "상담원에게 설명"하는 방법을 알려주십시오. 이 문제를 해결하기 위해 이미 알려진 방법이 있을 수 있습니다. 또는 예를 들어 날카로운 임펄스 계산을 기반으로 한 무료 표시기?
 

3개의 막대로 구성된 프랙탈의 막대 번호를 찾는 함수를 작성했습니다. 온라인 차트에서는 정확하게 판단되는 것 같습니다. 그리고 테스터의 시각적 테스트 와 함께 그는 거짓말을 합니다. 코드를 보고 있는 전문가 중 한 명이 결함을 발견할 수 있을까요?

나는 매우 감사할 것입니다.

 //+----------------------------------------------------------------------------+
//|  Описание : Возвращает номер бара трёхбарного фарактала по его номеру.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер экстремума                (    0       - последний)          |
//+----------------------------------------------------------------------------+
int BarLocExtr( string sy= "0" , int tf= 0 , int ne= 0 , int mode=MODE_UPPER)
{
 if (sy== "" || sy== "0" ) sy= Symbol ();
 int nlext= 0 ,k= iBars (sy,tf);
 nlext= 0 ;
 if (mode==MODE_UPPER)
   {
     for ( int i= 2 ; i<=k; i++)
     {
       if (High[i]>High[i+ 1 ] && High[i]>High[i- 1 ])
        {
         nlext++;
         
         if (nlext>ne) return (i);
        }
     }    
   }        
 if (mode==MODE_LOWER)
   {
     for (i= 2 ; i<=k; i++)
     {
       if (Low[i+ 1 ]>Low[i] && Low[i- 1 ]>Low[i])
        {
         nlext++;
         if (nlext>ne) 
           {
             //Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);
             return (i); 
           }
        }
     }    
   }       
     Print ( "Бар локального экстремума не найден" );
     return (- 1 );     
  }
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
  • www.mql5.com
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
 

안녕하세요. 한 달 후에 테스터에서 작동을 중지하려면 표시기에 어떤 코드를 추가해야 합니까? 내 말은, 나는 모든 것을 잘 썼습니다! 그러나 이미 백테스트를 수행하면 다시 작동합니다. (mgl4)

 //+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   datetime data= D'2020.09.16 20:07' ;   // Time Block
     if ( TimeCurrent ()>data)  
      {
       Print ( "Демонстрационный период закончился, покупайте индикатор :)" );
       Alert ( "Демонстрационный период закончился, покупайте индикатор :)" );
       return ( INIT_FAILED );
     } 
  
  
   if (IsTesting() && TimeCurrent () >= D'2020.09.16 20:07' ) // для тестировщиков, ограничение работы по времени
{
     Comment ( "Демонстрационный период закончился, покупайте индикатор :)  Демонстрационный период закончился, покупайте индикатор :)   Демонстрационный период закончился, покупайте индикатор :)" );
     return ( 0 );
}    
     
파일:
 

안녕하세요!

주문을 마감하는 주기 에서 주문이 열리는 날에 조건을 설정하여 금요일에 열린 주문이 닫히지 않도록 하고 싶었습니다. 하지만 어떤 이유로 사이클이 가지 않습니다 ..

 while ( OrdersTotal ()> 0 )
    { 
       if ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES))  
        {   
             if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())< 5 )) 
            {    
               if (OrderType()==OP_BUY)          result=OrderClose(OrderTicket(),OrderLots(), NormalizeDouble (MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)), 3 ,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(), NormalizeDouble (MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)), 3 ,CLR_NONE); 
            
                 if (result!=TRUE) { error= GetLastError ();
                     Print ( "LastError = " ,error, " " , Symbol ()); }
                 else error= 0 ; 
            }
             else    Print ( "NoMagic " , OrderMagicNumber());   // for Debug
         }
         else Print ( "Error when order select " , GetLastError ());
   
     } 
 
Tabazhan_Dajhiov :

안녕하세요. 한 달 후에 테스터에서 작동을 중지하려면 표시기에 어떤 코드를 추가해야 합니까? 내 말은, 나는 모든 것을 잘 썼습니다! 그러나 이미 백테스트를 수행하면 다시 작동합니다. (mgl4)

이 코드를 OnInit에 작성할 필요는 없지만 OnTick()에 작성해야 합니다.

 
Yerkin Sagandykov :

안녕하세요!

주문을 마감하는 주기 에서 주문이 열리는 날에 조건을 설정하여 금요일에 열린 주문이 닫히지 않도록 하고 싶었습니다. 하지만 어떤 이유로 사이클이 가지 않습니다 ..

다음과 같이 시도하십시오.

for(int is=OrdersTotal()-1; is>=0; is--)
    { 
      if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)   result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     }