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

 
다시 한 번 번거롭게 해서 죄송합니다만 질문이 있습니다. MT4에 대한 표시기 색상 수준이 있습니다. 집합에 선 세그먼트가 있습니다. 이 선분은 TrendCreate 추세선에서 생성되며 4개의 기준점(날짜 및 가격)이 있으며 수준으로 더 드래그하면 다음을 수행해야 합니다. Shift 키를 누르고 있습니다. HLineCreate에서와 같이 TrendCreate 속성을 변경할 수 있습니까? 세그먼트가 레벨과 같도록 하거나 HLineCreate 자체의 세그먼트를 만들 기회가 있습니까? 세그먼트 가 추세선이 아닌 수준처럼 작동한다는 의미입니다.
 
DYM :
다시 한 번 번거롭게 해서 죄송합니다만 질문이 있습니다. MT4에 대한 표시기 색상 수준이 있습니다. 집합에 선 세그먼트가 있습니다. 이 선분은 TrendCreate 추세선에서 생성되며 4개의 기준점(날짜 및 가격)이 있으며 수준으로 더 드래그하면 다음을 수행해야 합니다. Shift 키를 누르고 있습니다. HLineCreate에서와 같이 TrendCreate 속성을 변경할 수 있습니까? 세그먼트가 레벨과 같도록 또는 HLineCreate 자체의 세그먼트를 만들 기회가 있습니까? 세그먼트 가 추세선이 아닌 수준처럼 작동한다는 의미입니다.

질문이 명확하지 않습니다...

Shift 키를 누르고 있는 이유는 무엇입니까? 선은 원하는 대로 움직입니다. 중심점을 넘어 이동해도 기울기는 변경되지 않습니다.

표시기의 줄 길이를 변경하려면 노란색으로 강조 표시된 코드를 코드에 추가하십시오.

 extern    int                x_coor         =   10 ;                   // Coordinate X
extern    int                y_coor         =   20 ;                   // Coordinate Y

extern    int                x_size         =   155 ;                 // длина объектов
 
와아아아아아아아. 문제를 해결하는 데 도움이 됩니다. 무엇이 잘못되었는지 알 수 없습니다. 테스터에서도 테스트되지 않습니다. 거기에 무엇이 빠져 있습니까? 왜 화살표가 아닌 각 양초에서 수행됩니까? 난 이미 미쳐가고 있어
파일:
123.mq4  10 kb
 
MakarFX :

질문이 명확하지 않습니다...

Shift 키를 누르고 있는 이유는 무엇입니까? 선은 원하는 대로 움직입니다. 중심점을 넘어 이동해도 기울기는 변경되지 않습니다.

표시기의 줄 길이를 변경하려면 노란색으로 강조 표시된 코드를 코드에 추가하십시오.

gif를 만들었습니다. 첫 번째 줄에는 추세선의 속성이 있고, 두 번째 줄에는 수준의 속성이 있습니다. 두 번째 선의 속성인 선분을 만드는 방법을 알고 싶습니다.

파일:
line.gif  2022 kb
 
DYM :

gif를 만들었습니다. 첫 번째 줄에는 추세선의 속성이 있고, 두 번째 줄에는 수준의 속성이 있습니다. 두 번째 선의 속성인 선분을 만드는 방법을 알고 싶습니다.

 double a= ObjectGetDouble ( ChartID ,name,OBJPROP_PRICE1);
double b= ObjectGetDouble ( ChartID ,name,OBJPROP_PRICE2);
if (b!=a) ObjectSetDouble ( ChartID ,name,OBJPROP_PRICE2,a);
 
MakarFX :

Igor는 감사하지만 MT4가 제대로 작동하지 않습니다.


고쳐야 할 점을 알려주세요

다음과 같은 코드가 작동해야 합니다.

 #property copyright "IgorM"
#property link        " https://www.mql5.com/ru/users/igorm "
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1

// plot ZigZagZZ
#property indicator_label1    "ZigZagZZ"
#property indicator_type1    DRAW_SECTION
#property indicator_color1    clrDarkBlue
#property indicator_style1    STYLE_SOLID
#property indicator_width1    3
// input parameters
input int    Deviation= 10 ;
// indicator buffers
double          ZZBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
// indicator buffers mapping
   SetIndexBuffer ( 0 ,ZZBuffer, INDICATOR_DATA );
   IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );
   SetIndexEmptyValue( 0 , 0.0 );
   //PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int         rates_total,
                 const int         prev_calculated,
                 const datetime    &time[],
                 const double      &open[],
                 const double      &high[],
                 const double      &low[],
                 const double      &close[],
                 const long        &tick_volume[],
                 const long        &volume[],
                 const int         &spread[])
  {
   static bool UP;
   static double max,min;
   static int LastExt=rates_total - 1 ;
   static const double dev= NormalizeDouble (Deviation* _Point , _Digits );
   int limit=LastExt;
   if (prev_calculated== 0 )
     {
       ArrayInitialize (ZZBuffer, 0.0 );
      limit = LastExt = rates_total - 1 ;
       if (low[ 0 ]<high[ 1 ]) { min=low[limit];  max=high[limit - 1 ];   UP= true ;  }
       else                { max=high[limit]; min  = low[limit - 1 ]; UP= false ; }
     }
   for ( int i=limit; i>= 0 ; i--)
     {
      ZZBuffer[i]= 0.0 ;
       if (UP)
        {
         if (low[i]-min<= 0.0 ) { min=low[i]; ZZBuffer[LastExt]= 0.0 ; LastExt=i; ZZBuffer[i]=min; }
         else
           {
             if (high[i]-min-dev> 0.0 ) { max=high[i]; LastExt=i; ZZBuffer[i]=max; UP= false ; }
           }
        }
       else
        {
         if (high[i]-max>= 0.0 ) { max=high[i]; ZZBuffer[LastExt]= 0.0 ; LastExt=i; ZZBuffer[i]=max; }
         else
           {
             if (low[i]-max+dev< 0.0 ) { min=low[i]; LastExt=i; ZZBuffer[i]=min; UP= true ; }
           }
        }
     }
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu :

다음과 같은 코드가 작동해야 합니다.

정말 감사합니다! 모든 것이 작동합니다 ... 이제 논리를 이해하려고 노력할 것입니다 (지그재그로 만드는 것은 이해하기 어렵습니다).
 
MakarFX :
정말 감사합니다! 모든 것이 작동합니다 ... 이제 논리를 이해하려고 노력할 것입니다 (지그재그로 만드는 것은 이해하기 어렵습니다).

확인하지 않음, 시작됨 - 무승부

논리는 간단합니다. 조건 중 하나가 충족되는 막대 번호를 찾고 기억하십시오. 코드에서

 static int LastExt

그런 다음 이 막대를 다음 막대와 비교하고 3Z에 중단이 있으면 이 막대를 static int LastExt에 저장합니다.

 
Igor Makanu :

확인하지 않음, 시작됨 - 무승부

논리는 간단합니다. 조건 중 하나가 충족되는 막대 번호를 찾고 기억하십시오. 코드에서

그런 다음 이 막대를 다음 막대와 비교하고 3Z에 중단이 있으면 이 막대를 static int LastExt에 저장합니다.

이제 모든 것이 내 머리에 줄 지어 있습니다) Igor 감사합니다.

 
MakarFX :

뭔가 안맞아요, 기준점이 price1인건 알지만 조건을 만들 마음이 부족합니다. 내 버전이 작동하지 않습니다.

 extern ENUM_LINE_STYLE   line_st   =   STYLE_SOLID ;         // 9. Стиль линий
extern int               line_wd   =   2 ;                   // 10. Толщина линий
// Координаты
extern int x_coor = 7 ;     // Сдвиг по оси X
extern int y_coor = 10 ;     // Сдвиг по оси Y
//-- глобальные переменные
string line[ 6 ] = { "line_1" , "line_2" , "line_3" , "line_4" , "line_5" , "line_6" };

void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
  
   datetime dt1     = 0 ;
   double    price1  = 0 ;
   datetime dt2     = 0 ;
   double    price2  = 0 ;
   int       window   = 0 ;
   int       x        = 0 ;
   int       y        = 0 ;

//+------------------------------------------------------------------+
   //--- Клик по 1 линии
   if (id== CHARTEVENT_OBJECT_CLICK )
     {
       string clickObject=sparam;
       if (clickObject==line[ 0 ])
        {
         string name= "line_" + IntegerToString ( MathRand ()+ 100 , 0 , ' ' );

         y= 210 ;
         ChartXYToTimePrice ( 0 ,x_coor+ 25 ,y,window,dt1,price1);
         ChartXYToTimePrice ( 0 ,x_coor+ 157 ,y,window,dt2,price2);

         TrendCreate( 0 ,name, 0 ,dt1,price1,dt2,price2,color2,line_st,line_wd, false , true , false , false , false , 0 );
         
           price1= ObjectGetDouble (id,name,OBJPROP_PRICE1);
           price2= ObjectGetDouble (id,name,OBJPROP_PRICE2);
             if (price2!=price1) 
           {
             ObjectSetDouble (id,name,OBJPROP_PRICE2,price1);
           }

        }
     }
}
//+------------------------------------------------------------------+