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

 
Алексей КоКоКо :
mql5에 대해 알려주십시오. 예를 들어 12시간 촛불에 대한 평균 크기 통계를 수집하고 싶습니다. 예를 들어 오늘은 금요일이고 계산을 위해 목요일, 수요일, 화요일 및 월요일의 데이터를 가져오고 싶습니다.
나는 time[] 변환 TimeToString 다음 SplitString 및 AP를 취합니다. 하루 또는 그 이상 전에 같은 시간 촛불을 참조하는 더 빠르고 덜 번거로운 방법이 있습니까? 물론 현재 TF의 1일 캔들 갯수만큼 한 단계씩 달려갈 수는 있지만 따옴표 어딘가에 구멍이 있으면 이동이 생길까 두렵다.

사이클 없이는 할 수 없습니다. 그러나 다른 방법으로 주기를 만들 수 있습니다. CopyRates()에 주의

 int    CopyRates (
   string            symbol_name,       // имя символа
   ENUM_TIMEFRAMES   timeframe,         // период
   datetime          start_time,         // с какой даты
   int               count,             // сколько копируем
   MqlRates          rates_array[]       // массив, куда будут скопированы данные
   );

PERIOD_H1을 설정하고 start_time은 날짜를 12:00으로 설정하고 1을 계산합니다. 다음 반복에서 이 날짜를 더하거나 빼십시오(주기가 구성된 방향에 따라 다름) PeriodSeconds(PERIOD_D1)

 
MAKSIM KASHFYLGAIANOV :
iCustom에서 표시기 매개변수를 나열하는 방법을 알려주세요.
문자열 변수 대신 빈 문자열을 설정할 수 있지만 열거형은 ... 코드에 어떻게 쓰여지는지 확인해야 합니다.
 

경고와 함께 확률적 표시기가 있으며 이동 평균의 교차점에 신호를 제공합니다. 과매수 및 과매도 영역 위 또는 아래에 있을 때만 이동 평균의 교차점에서 신호를 보내도록 하는 방법을 알려주세요.

 #property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_level1 80
#property indicator_level2 20
#property indicator_maximum 100
#property indicator_minimum 0

//---- input parameters
/*************************************************************************
PERIOD_M1   1
PERIOD_M5   5
PERIOD_M15  15
PERIOD_M30  30 
PERIOD_H1   60
PERIOD_H4   240
PERIOD_D1   1440
PERIOD_W1   10080
PERIOD_MN1  43200
You must use the numeric value of the timeframe that you want to use
when you set the TimeFrame' value with the indicator inputs.
---------------------------------------
MODE_SMA    0 Simple moving average, 
MODE_EMA    1 Exponential moving average, 
MODE_SMMA   2 Smoothed moving average, 
MODE_LWMA   3 Linear weighted moving average. 
You must use the numeric value of the MA Method that you want to use
when you set the 'ma_method' value with the indicator inputs.

**************************************************************************/
extern int TimeFrame= 240 ;
extern int KPeriod= 5 ;
extern int DPeriod= 3 ;
extern int Slowing= 3 ;
extern int MAMethod= 0 ;
extern int PriceField= 0 ; // PriceField:  0=Hi/Low   1=Close/Close

extern string note_TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN" ;
extern string __MA_Method = "SMA0 EMA1 SMMA2 LWMA3" ;
extern string __PriceField = "0=Hi/Low   1=Close/Close" ;
//extern string __Price = "0O,1C 2H3L,4Md 5Tp 6WghC: Md(HL/2)4,Tp(HLC/3)5,Wgh(HLCC/4)6";


double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];

datetime last_t= 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicator line
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
   SetIndexStyle( 0 , DRAW_LINE );
   SetIndexBuffer ( 1 ,ExtMapBuffer2);
   SetIndexStyle( 1 , DRAW_LINE , STYLE_DOT );
   SetIndexLabel( 0 ,   "MTF_Stochastic(" +KPeriod+ "," +DPeriod+ "," +Slowing+ ")TF" +TimeFrame+ "" );
   SetIndexLabel( 1 , "MTF_Stochastic(" +KPeriod+ "," +DPeriod+ "," +Slowing+ ")TF" +TimeFrame+ "" );
   SetIndexBuffer ( 2 ,ExtMapBuffer3);
   SetIndexStyle( 2 , DRAW_ARROW );
   SetIndexArrow( 2 , 233 );
   SetIndexBuffer ( 3 ,ExtMapBuffer4);
   SetIndexStyle( 3 , DRAW_ARROW );
   SetIndexArrow( 3 , 234 );

//---- name for DataWindow and indicator subwindow label   
   switch (TimeFrame)
   {
       case 1 : string TimeFrameStr= "Period_M1" ; break ;
       case 5 : TimeFrameStr= "Period_M5" ; break ;
       case 15 : TimeFrameStr= "Period_M15" ; break ;
       case 30 : TimeFrameStr= "Period_M30" ; break ;
       case 60 : TimeFrameStr= "Period_H1" ; break ;
       case 240 : TimeFrameStr= "Period_H4" ; break ;
       case 1440 : TimeFrameStr= "Period_D1" ; break ;
       case 10080 : TimeFrameStr= "Period_W1" ; break ;
       case 43200 : TimeFrameStr= "Period_MN1" ; break ;
       default : TimeFrameStr= "Current Timeframe" ;
   } 
   IndicatorShortName( "MTF_Stochastic(" +KPeriod+ "," +DPeriod+ "," +Slowing+ ") " +TimeFrameStr);  
   start();
   return ( 0 );
  }
//----
   
 
//+------------------------------------------------------------------+
//| MTF Stochastic                                                   |
//+------------------------------------------------------------------+
 int deinit()
  {
   for ( int i= Bars ;i>= 0 ;i--){
       ObjectDelete ( "st" + Symbol ()+ Period ()+DoubleToStr(KPeriod+DPeriod+Slowing, 0 )+DoubleToStr(i, 0 ));
   }
   return ( 0 );
  }

bool up_a= false ;
bool dn_a= false ;
int start()
  {
   datetime TimeArray[];
   ArrayResize (TimeArray, Bars );
   int     i,limit,y= 0 ,counted_bars=IndicatorCounted();
    
// Plot defined timeframe on to current timeframe   
   ArrayCopySeries(TimeArray,MODE_TIME, Symbol (),TimeFrame); 
   
 //  limit=Bars-counted_bars+TimeFrame/Period(); //igorad
limit= Bars - 1 ;
limit= MathMax (limit,TimeFrame/ Period ());
//limit=MathMin(limit,BarsToCount);
   for (i= 0 ,y= 0 ;i<limit;i++)
   {
   if (Time[i]<TimeArray[y]) y++; 
   
 /***********************************************************   
   Add your main indicator loop below.  You can reference an existing
      indicator with its iName  or iCustom.
   Rule 1:  Add extern inputs above for all neccesary values   
   Rule 2:  Use 'TimeFrame' for the indicator timeframe
   Rule 3:  Use 'y' for the indicator's shift value
 **********************************************************/   
   ExtMapBuffer3[i]= EMPTY_VALUE ;  
   ExtMapBuffer4[i]= EMPTY_VALUE ;
   ExtMapBuffer1[i]= EMPTY_VALUE ;  
   ExtMapBuffer2[i]= EMPTY_VALUE ;

   ExtMapBuffer1[i]= iStochastic ( NULL ,TimeFrame,KPeriod,DPeriod,Slowing,MAMethod,PriceField, 0 ,y);
   ExtMapBuffer2[i]= iStochastic ( NULL ,TimeFrame,KPeriod,DPeriod,Slowing,MAMethod,PriceField, 1 ,y);
   ObjectDelete ( "st" + Symbol ()+ Period ()+DoubleToStr(KPeriod+DPeriod+Slowing, 0 )+DoubleToStr(i, 0 ));   

   if ( NormalizeDouble (ExtMapBuffer1[i], Digits )> NormalizeDouble (ExtMapBuffer2[i], Digits ) && NormalizeDouble (ExtMapBuffer1[i+ 1 ], Digits )<= NormalizeDouble (ExtMapBuffer2[i+ 1 ], Digits )  && NormalizeDouble (ExtMapBuffer1[i+ 1 ], Digits )!= NormalizeDouble (ExtMapBuffer1[i], Digits ) ){
      ExtMapBuffer3[i]=ExtMapBuffer1[i];
       ObjectDelete ( "st" + Symbol ()+ Period ()+DoubleToStr(KPeriod+DPeriod+Slowing, 0 )+DoubleToStr(i, 0 ));
       ObjectCreate ( "st" + Symbol ()+ Period ()+DoubleToStr(KPeriod+DPeriod+Slowing, 0 )+DoubleToStr(i, 0 ), 22 , 0 ,Time[i],Low[i]- 5 * Point );
      ObjectSet( "st" + Symbol ()+ Period ()+DoubleToStr(KPeriod+DPeriod+Slowing, 0 )+DoubleToStr(i, 0 ), 6 ,Blue);
      ObjectSet( "st" + Symbol ()+ Period ()+DoubleToStr(KPeriod+DPeriod+Slowing, 0 )+DoubleToStr(i, 0 ), 14 , 233 );      
   }
   if ( NormalizeDouble (ExtMapBuffer1[i], Digits )< NormalizeDouble (ExtMapBuffer2[i], Digits ) && NormalizeDouble (ExtMapBuffer1[i+ 1 ], Digits )>= NormalizeDouble (ExtMapBuffer2[i+ 1 ], Digits )  && NormalizeDouble (ExtMapBuffer1[i+ 1 ], Digits )!= NormalizeDouble (ExtMapBuffer1[i], Digits )){
      ExtMapBuffer4[i]=ExtMapBuffer1[i];
       ObjectDelete ( "st" + Symbol ()+ Period ()+DoubleToStr(KPeriod+DPeriod+Slowing, 0 )+DoubleToStr(i, 0 ));
       ObjectCreate ( "st" + Symbol ()+ Period ()+DoubleToStr(KPeriod+DPeriod+Slowing, 0 )+DoubleToStr(i, 0 ), 22 , 0 ,Time[i],High[i]+ 5 * Point );
      ObjectSet( "st" + Symbol ()+ Period ()+DoubleToStr(KPeriod+DPeriod+Slowing, 0 )+DoubleToStr(i, 0 ), 6 ,Red);
      ObjectSet( "st" + Symbol ()+ Period ()+DoubleToStr(KPeriod+DPeriod+Slowing, 0 )+DoubleToStr(i, 0 ), 14 , 234 );      
   }
   }  
     
//
   //----  Refresh buffers ++++++++++++++ 
   if (TimeFrame < Period ()) TimeFrame = Period ();
   if (TimeFrame> Period ()) {
     int PerINT=TimeFrame/ Period ()+ 1 ;
     datetime TimeArr[]; ArrayResize (TimeArr,PerINT);
     ArrayCopySeries(TimeArr,MODE_TIME, Symbol (), Period ()); 
     for (i= 0 ;i<PerINT+ 1 ;i++) { if (TimeArr[i]>=TimeArray[ 0 ]) {
 /********************************************************     
    Refresh buffers:         buffer[i] = buffer[0];
 ************************************************************/   

   ExtMapBuffer1[i]=ExtMapBuffer1[ 0 ];
   ExtMapBuffer2[i]=ExtMapBuffer2[ 0 ];

   } } }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++   Raff 

   if (ExtMapBuffer3[ 0 ]!= EMPTY_VALUE && !up_a){
      up_a= true ;
      dn_a= false ;    
       Alert ( "MTF Stochastic Long cross Signal on " + Symbol ());
   }
   if (ExtMapBuffer4[ 0 ]!= EMPTY_VALUE && !dn_a){
      dn_a= true ;
      up_a= false ;    
       Alert ( "MTF Stochastic Short cross Signal on " + Symbol ());
   }

   return ( 0 );
  }
 

모두에게 좋은 하루.
다음 조건에서 어떤 수학 함수가 기억나지 않는지 도움을 받아 올바르게 인코딩하는 방법을 알려주십시오.

if (입찰가 - 낮음[1]>=0.0030 && 입찰가 - 낮음[1]<0.0035) { action;}
위의 조건에서 && 기호 없이 할 수 있는 수학 함수가 있다는 것을 알고 있으며 프로그램은 가격이 4포인트 범위에서 일치하는지 확인합니다. 하지만 이 수학 함수의 이름과 적용 방법이 기억나지 않습니다.
도와 주셔서 감사합니다.

 
질문은 분명히 MQL4의 기본 사항에서 비롯된 것입니다. 일부 변수 X, Y, Z가 전역 범위에 선언되어 있다고 가정하고 프로그램을 따라 더 나아가 F1() 함수를 호출하여 X 값을 가져옵니다. 그리고 이 함수는 X만 반환하지만 변수 Y와 Z도 연산 중에 계산됩니다. 나중에 변경되지 않는 일부 값이 할당됩니다. 코드 아래로 더 내려가면 Y와 Z가 일부 함수 F2()에서 다시 사용됩니다. 이러한 변수를 계산하기 위해 F1() 함수를 다시 사용해야 합니까? X뿐만 아니라 Y와 Z도 반환해야 합니까? 아니면 Y와 Z가 이미 전역 영역에서 덮어쓰여지고 수정된 형태로 F2() 함수로 자동으로 대체됩니까?
 
Oleksandr Nozemtsev :

함수에서 전역 변수 를 변경하면 변경됩니다. 그러나 이것은 코드가 성장함에 따라 프로그램의 다른 기능에서 명확하지 않은 할당이 발생하기 때문에 위험한 프로그래밍 방법입니다.

프로그램의 주요 기능이 있습니다. 여기 에서 전역 변수를 할당합니다. 그리고 다음과 같은 다른 기능에서:

 int X, Y, Z;

void OnTick ()
   {
   X=Sum(Y,Z);
   }

int Sum( int y, int z)
   {
   return (y+z);
   }

또는 다음과 같이:

 int X, Y, Z;

void OnTick ()
   {
   Replace(X,Y,Z);
   }

void Replace( int & x, int & y, int & z)
   {
   int a=x;
   x=y;
   y=z;
   z=a;
   }
 
ANDREY :

다음 조건을 사용하여 올바르게 인코딩하는 방법 어떤 수학 함수가 기억나지 않는지

조건을 설정하는 가장 좋은 방법을 모르겠습니다

 
ANDREY :

모두에게 좋은 하루.
다음 조건에서 어떤 수학 함수가 기억나지 않는지 도움을 받아 올바르게 인코딩하는 방법을 알려주십시오.

if (입찰가 - 낮음[1]>=0.0030 && 입찰가 - 낮음[1]<0.0035) { action;}
위의 조건에서 && 기호 없이 할 수 있는 수학 함수가 있다는 것을 알고 있으며 프로그램은 가격이 4포인트 범위에서 일치하는지 확인합니다. 하지만 이 수학 함수의 이름과 적용 방법이 기억나지 않습니다.
도와 주셔서 감사합니다.

 if (Bid - Low[ 1 ] >= 0.0030 ))
  {
   if (Bid - Low[ 1 ] < 0.0035 )
     {
      действие;
     }
  }
없이 그리고
 
Александр :
없이 그리고

팁 주셔서 대단히 감사합니다.

 
프로그램(mql 4, 분, 모든 틱)이 명시적으로 숫자를 읽고 함수에서 계산된 동일한 숫자를 다른 방식으로 읽는 이유를 알려주십시오.
다음은 코드입니다.
 double Pr,Lt1;
int Tick,H;
void OnTick ()
{
Tick++;
if (Tick> 15240 &&Tick< 15821 )
{
Pr= iLow ( NULL , PERIOD_H4 , 0 )+ 0.0030 ;
Print ( "--------- 0 ---------=     " , DoubleToString (Pr, 5 ) );
if ((H!=Hour()&&Bid - iLow ( NULL , PERIOD_H1 , 1 )>= 0.0030 && Lt1!=Pr )||Bid== 1.60854 )
{
OrderSend ( Symbol (),OP_SELL, 2 ,Bid, 3 ,Ask+ 300 * Point ,Ask- 100 * Point , "300" , 0 );
Lt1=Bid;
H=Hour();
}
}
}

Print() 가 Pr을 1.60854로 표시하지만 프로그램은 Pr을 1.60854로 읽지 않습니다. 결과적으로 프로그램은 두 번째 주문을 엽니다.


그리고 숫자 1.60854가 Pr 변수 대신 설정되면 프로그램은 그것을 읽고 두 번째 주문을 열지 않습니다.

 double Pr,Lt1;
int Tick,H;
void OnTick ()
{
Tick++;
if (Tick> 15240 &&Tick< 15821 )
{
Pr= iLow ( NULL , PERIOD_H4 , 0 )+ 0.0030 ;
Print ( "--------- 0 ---------=     " , DoubleToString (Pr, 5 ) );
if ((H!=Hour()&&Bid - iLow ( NULL , PERIOD_H1 , 1 )>= 0.0030 && Lt1!= 1.60854 )||Bid== 1.60854 )
{
OrderSend ( Symbol (),OP_SELL, 2 ,Bid, 3 ,Ask+ 300 * Point ,Ask- 100 * Point , "300" , 0 );
Lt1=Bid;
H=Hour();
}
}
}

질문 프로그램 이 Pr을 읽고 두 번째 주문을 열지 않도록 코드를 변경해야 합니다.
도와 주셔서 감사합니다