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

 
Андрей # :

잘 자!

친애하는 포럼 사용자 여러분, 도움이 필요합니다. 수염이 난 해에 차트에서 주어진 세 점을 기반으로 한 공식을 기반으로 선을 그리는 MQL4 스크립트를 작성 했습니다. 들여쓰기와 공백을 포함하여 130줄을 차지합니다. 최근에 저는 MQL5로 옮기고 싶었고 이미 부족한 프로그래밍 지식이 여기에 도움이 되지 않는다는 것을 깨달았습니다. 다시 배워야 합니다.

제로 분할 코드의 버그, 먼저 수정하십시오.

a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/( x2-x1 ))/(x3*(x3-x1-x2)+x1*x2);

x1과 x2가 모두 "1"이므로 "0"으로 나누면 "0"이 됩니다.

매트 작동 전에 확인하십시오.

 
Manter84 # :

그리고 당신은 조커입니다. 하지만 정말 문제가 있고, 전문가 탭에서 Print 명령이 두 번 인쇄되고 Allert도 두 번 온다는 사실에 대한 주제가 있습니다. 아아, 해결 방법에는 거기에 답이 없습니다. 그리고 미래를 위해, 당신이 알지 못한다면, 당신은 단순히 침묵하고 지나갈 수 있으며, 전문적이지 않은 답변으로 자신에 대한 평가를 얻는 것은 어리석은 일입니다. 네, 그건 그렇고, 귀하의 답변은 정말 매우 약합니다.

질문은 무엇이며, 답은 무엇입니까?
 
Андрей 입니다, 개인적인 .

스크립트를 작성한 경우 코드에 있는 이유는 무엇입니까?

 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 int init()
   { SetIndexBuffer ( 0 ,Buffer1);
   SetIndexStyle( 0 , DRAW_LINE );
 //---- indicators
 //----
     return ( 0 );
   }
 
#property indicator_chart_window
int             FR_handle;
int OnInit ()
  {

    FR_handle = iFractals ( NULL , PERIOD_CURRENT );
   return ( INIT_SUCCEEDED );

  }

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[])
  {
     Print ( "Проверка 111 " ); 
     return (rates_total);
  }
알렉세이 빅토로프
질문은 무엇이며, 답은 무엇입니까?

글쎄, 당신은 당신이 더 자세한 정보가 필요하다고 쓸 수 있습니다. 여기에 가장 간단한 칠면조 코드를 작성했으므로(단순히 더 간단한 곳이 없음) Print 명령으로 두 개의 메시지도 발행합니다. 그리고 핸들의 영수증을 제거하면 핸들이 생성됩니다.

***

파일:
111.png  15 kb
 
Alexey Viktorov # :

스크립트를 작성한 경우 코드에 있는 이유는 무엇입니까?

프로그래밍 기술은 남학생 수준이기 때문에 일종의 작동 코드와 규칙을 가져왔습니다. 방해하지 않은 것, 만지지 않은 것)
 
Manter84 # :

글쎄, 당신은 당신이 더 자세한 정보가 필요하다고 쓸 수 있습니다. 여기에 가장 간단한 칠면조 코드를 작성했으므로(단순히 더 간단한 곳이 없음) Print 명령으로 두 개의 메시지도 발행합니다. 그리고 핸들의 영수증을 제거하면 핸들이 생성됩니다.

틴 ... 내 사전에는 음란 단어 만 남았습니다. 그래서 조용히 하는 게 좋을 것 같아요.

 
Андрей # :
프로그래밍 기술은 남학생 수준이기 때문에 일종의 작동 코드와 규칙을 가져왔습니다. 방해하지 않은 것, 만지지 않은 것)

분명한.

앤드류 # :
누구든지 도울 수 있다면 어쨌든 운이 좋지 않습니다!))

내 생각에 .....의 위스키 가격은 30달러 이상입니다. 따라서 프리랜스 응용 프로그램을 만드는 것이 더 쉽고 그것을 원하는 20 명이있을 것입니다 ... 그리고이 메시지로 사람들이 규칙을 위반하도록 유도합니다. 그리고 누가 그것을 필요로합니까? 글쎄, 그들은 그것을 무료로 할 것이고, 그 다음은 무엇입니까? 결국, 병을 구체적으로 양도하지 않을 것이므로 프리랜서를 우회하여 돈을 벌 수 있습니다.

 
Андрей # :

 #property strict
//+------------------------------------------------------------------+
#property indicator_chart_window
 #property indicator_buffers 1
 #property   indicator_color1 clrBlue
 #property   indicator_width1 2
 #property   indicator_style1 0
 
#property indicator_label1    "3T" 
#property indicator_type1    DRAW_LINE 

#property indicator_style1    STYLE_SOLID 


#define Point _Point
#define Period ()   _Period
#define Symbol    _Symbol
#define TimeToStr TimeToStruct



// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.


#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
   class CLASS ##NAME                                                                                           \
  {                                                                                                           \
   public :                                                                                                     \
     static T Get( const string Symb, const int TimeFrame, const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
       return ((Copy ##FUNC((Symb == NULL ) ? _Symbol : Symb, _Period , iShift, 1 , tValue) > 0 ) ? tValue[ 0 ] : - 1 ); \
    }                                                                                                         \
    T operator []( const int iPos) const                                                                      \
    {                                                                                                         \
       return (CLASS ##NAME::Get(_Symbol, _Period , iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
  CLASS ##NAME NAME;                                                                                           \
  T i ##NAME(const string Symb, const int TimeFrame, const int iShift) \
  {                                                                                                           \
     return (CLASS ##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume, TickVolume, long )
DEFINE_TIMESERIE(Time, Time, datetime )
DEFINE_TIMESERIE(Open, Open, double )
DEFINE_TIMESERIE(High, High, double )
DEFINE_TIMESERIE(Low, Low, double )
DEFINE_TIMESERIE(Close, Close, double )
//+------------------------------------------------------------------+





 double      Buffer1[];
 //+------------------------------------------------------------------+
 //| Объявляем внешние переменные                                     |
 //+------------------------------------------------------------------+
 datetime point_1;
 datetime point_2;
 datetime point_3;
 datetime LastBarTime;
 string line_name[ 10 ];
 int gg= 1 ;
 int x1;
 int x2;
 int x3;
 int xx1; // В эту переменную сохраняется значение номера бара вершины перед прогоном при появлении нового бара.
 int xx2; // Если линии стоят, значит при поялвении нового бара номер бара вершины должен увеличиться на 1.
 int xx3; // Если этого не произошло и xx1=x1 после прогона, значит увеличиваем вручную.
 int max;
 int maxx;
 double y1;
 double y2;
 double y3;
 double y11;
 double y22;
 double y33;
 double x11;
 double x22;
 double x33;
 double y;
 double a1;
 double a2;
 double a3;

bool Deinit = true ;
 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 

MqlDateTime str;
//--------------------------------------------------------------------
int OnInit ()                             // Специальная функция init()
  {
   { SetIndexBuffer ( 0 ,Buffer1);
   
 //---- indicators
 //----
     return ( 0 );
   }
  
   return ( INIT_SUCCEEDED );                             // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
//int start()                            // Специальная функция start()
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[])

  {
   // Пересчитываем инликатор только при появлении нового бара
   if (LastBarTime == iTime ( Symbol , 0 , 0 ))
       return ( 0 );
    LastBarTime = iTime ( Symbol , 0 , 0 );
   
   
 // Присваиваем значения переменных времени


 int obj_total= ObjectsTotal ( 0 , 0 ,- 1 );

   for ( int ii= 0 ;ii< 100 ;ii++)
     { string name = ObjectName ( 0 , 0 ,ii, OBJ_VLINE );
       if ( ObjectGetInteger ( 0 , name, OBJPROP_TYPE )!= OBJ_VLINE )
       continue ;
       line_name[gg] = ObjectName ( 0 , 0 ,ii, OBJ_VLINE );
       gg=gg+ 1 ;
     
     }
    
   
    point_1= ObjectGetTimeByValue ( 0 ,line_name[ 1 ], 0 , OBJPROP_TIME );
    point_2= ObjectGetTimeByValue ( 0 ,line_name[ 2 ], 0 , OBJPROP_TIME );
    point_3= ObjectGetTimeByValue ( 0 ,line_name[ 3 ], 0 , OBJPROP_TIME );
   
 // Запоминаем текущий номер бара вершины

 xx1=x1; 
    
 //Определяем номера баров ключевых точек
   for ( int j= 0 ;j< 500 ; j++)
   { if (Time[j]==point_1) x1=j;}
  
  
   // Если после прогона сдвиг по вершине не произошел, значит линий нет, добавляем +1 вручную.
 if (x1==xx1) x1=x1+ 1 ;
  
  
 xx2=x2;
  
   for ( int k= 0 ;k< 500 ; k++)
   { if (Time[k]==point_2) x2=k;  }
  
 if (x2==xx2) x2=x2+ 1 ;
  
 xx3=x3;

   for ( int l= 0 ;l< 500 ; l++)
   { if (Time[l]==point_3) x3=l; }
  
 if (x3==xx3) x3=x3+ 1 ;

 // Comment ("n1=", j," n2=", k, " n3=", l);
 //Находим "высоту" вершин
   {
   y1=High[x1];
   y2=High[x2];
   y3=High[x3];
   //Comment ("y1=", y1," x1=", x1, " y2=", y2, "x2=", x2," y3=", y3, " x3=", x3);
   //Принимаем первую из них за начало координат
  
 a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);
 a2=((y2-y1)/(x2-x1))-a1*(x1+x2);
 a3=((x2*y1-x1*y2)/(x2-x1))+a1*x1*x2;

 max= MathMax (x1,x2);
 maxx= MathMax (max,x3);
  
  
   for ( int i=maxx; i>= 0 ; i--)
  
   { y=a1*i*i+a2*i+a3;
   Buffer1[i]=y;}
  

     return ( 0 );
   }


//--------------------------------------------------------------------
   return (rates_total);                           // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------
void OnDeinit ( const int reason)
  {

   if ( Deinit == true )                         // Стираем  с графика, если включена функция очистки графика
     {
       int obj_total= ObjectsTotal ( 0 , 0 ,- 1 );
       PrintFormat ( "Всего %d объектов" ,obj_total);
       for ( int i=obj_total- 1 ; i>= 0 ; i--)
        {
         string name= ObjectName ( 0 ,i,- 1 ,- 1 );
         //         PrintFormat("Объект %d: %s",i,name);
         ObjectDelete ( 0 ,name);
        }
     }
     Comment ( "" );
//--- destroy timer
   EventKillTimer ();

  }


//+------------------------------------------------------------------+
//+------------------------------------------------------------------+

오류는 없으나 시간검출기능이 제대로 대체되지 않아 시간이 부족함)

그리고 나눗셈을 하기 전에 5ke에서 0으로 나눗셈을 확인하는 것이 좋으며, 제수가 0이면 ....

 
Manter84 # :

네, 그건 그렇고, 귀하의 답변은 정말 매우 약합니다.

맨터84 # :

여기에 가장 간단한 칠면조 코드를 작성했습니다(더 쉬운 곳은 없습니다)

6글자 단어에 5개의 실수가 있습니다...

그리고 나는 당신을 바로잡기에 너무 약합니다.

 
Alexey Viktorov # :

틴 ... 내 사전에는 음란 단어 만 남았습니다. 그래서 조용히 하는 게 좋을 것 같아요.

내가 당신에게 무슨 잘못을 했습니까? 아니면 여기에서 모두 너무 공격적입니까?