MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1607

 
Андрей # :

İyi geceler!

Sevgili forum kullanıcıları, yardıma ihtiyacım var. Sakallı bir yılda, MQL4'te bir çizelge üzerinde verilen üç noktayı temel alan bir formüle dayalı bir çizgi çizen bir senaryo yazdım . Girintiler ve boşluklar dahil 130 satır kaplar. Geçenlerde MQL5'e geçmek istedim ve zaten zayıf olan programlama bilgimin burada yardımcı olmayacağını fark ettim, tekrar öğrenmem gerekiyor.

Sıfır bölme kodunda hata, önce düzeltin

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

Burada x1 ve x2'nin her ikisi de "1" olduğundan "0" ile bölme işlemi "0" ile sonuçlanır.

Mat çalıştırmadan önce bir kontrol yapın

 
Manter84 # :

Ve sen bir jokersin. Ancak gerçekten bir sorun var ve Uzmanlar sekmesinde Yazdır komutunun iki kez yazdırılması ve Uyarının da iki kez gelmesi ile ilgili konular var, sadece bunun bir cevabı yok, ne yazık ki, nasıl düzeltileceği. Ve gelecek için, eğer bilmiyorsanız, sadece sessiz kalabilir ve geçebilirsiniz ve profesyonel olmayan cevaplarla kendinize bir puan kazandırmak aptalcadır. Evet, bu arada, cevaplarınız gerçekten çok zayıf.

Soru nedir, cevap nedir.
 
Андрей kişisel olarak yazacağız .

Bir komut dosyası yazdıysanız, neden kodun içinde?

 //+------------------------------------------------------------------+
 //| 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);
  }
Alexey Viktorov
Soru nedir, cevap nedir.

Daha fazla ayrıntıya ihtiyacın olduğunu yazabilirsin. Burada en basit hindinin kodunu yazdım (daha basit olacak hiçbir yer yok), bu yüzden Yazdır komutuyla iki mesaj da veriyor. Ve Handle makbuzunu kaldırırsanız, bir tane üretir.

***

Dosyalar:
111.png  15 kb
 
Alexey Viktorov # :

Bir komut dosyası yazdıysanız, neden kodun içinde?

Programlama becerileri bir okul çocuğu düzeyinde olduğu için, ondan bir tür çalışma kodu ve kuralı aldım. Ne müdahale etmedi, dokunmadı)
 
Manter84 # :

Daha fazla ayrıntıya ihtiyacın olduğunu yazabilirsin. Burada en basit hindinin kodunu yazdım (daha basit olacak hiçbir yer yok), bu yüzden Yazdır komutuyla iki mesaj da veriyor. Ve Handle makbuzunu kaldırırsanız, bir tane üretir.

Kalay ... Kelime dağarcığımda sadece müstehcen kelimeler kaldı. O yüzden sussam iyi olur.

 
Андрей # :
Programlama becerileri bir okul çocuğu seviyesinde olduğu için, ondan bir tür çalışma kodu ve kuralı aldım. Ne müdahale etmedi, dokunmadı)

Açık.

Andrew # :
Yardım edebilecek biri varsa, yine de viskiyle uğraşıyorum!))

Bence ………'dan gelen viski 30 dolardan az değil. Dolayısıyla freelance bir uygulama oluşturmak daha kolay ve bunu isteyen 20 kişi olacak... Ve bu mesajınızla insanları kuralları çiğnemeye kışkırtıyorsunuz. Ve kimin ihtiyacı var? Peki, bunu ücretsiz yapacaklar, peki ya sonra? Sonuçta, şişeyi özel olarak teslim etmeyeceksiniz, bu nedenle bu, serbest çalışmayı atlayarak para için iştir.

 
Андрей # :

 #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 ();

  }


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

Hata yok, ancak zaman algılama işlevi doğru şekilde değiştirilmedi, yeterli zaman yoktu)

Ve bölme işleminden önce 5ke'de sıfıra bölmeyi kontrol etmek daha iyidir.Bölen sıfır ise, o zaman ....

 
Manter84 # :

Evet, bu arada, cevaplarınız gerçekten çok zayıf.

Manter84 # :

En basit hindinin kodunu buraya yazdım (daha kolayı yok)

6 harfli bir kelimede 5 yanlış var...

ve ben seni düzeltmek için çok zayıfım.

 
Alexey Viktorov # :

Kalay ... Kelime hazinemde sadece müstehcen kelimeler kaldı. O yüzden sussam iyi olur.

Sana ne yanlış yaptım. Yoksa hepiniz burada çok agresif misiniz?