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

 
Ihor Herasko :

Yukarıdaki koddaki shift ve iy değişkenlerinin değerleri out-of- bounds dizisi için kontrol edilmez. Bu nedenle, her şey mantıklı. Kullanmadan önce değerlerini kontrol edin, hata kaybolacaktır.

Peki, detaylı konuşmak gerekirse CountBars ve TimeFrame değişkenlerinin değerlerinin nasıl oluştuğunu bilmeniz gerekiyor.

CountBars =400 ve TimeFrame =30, harici olanlarda statik olarak ayarlanır.

M30'da her şey yolunda, M15'te çöküyor.

Sınır dışı için shift ve iy nasıl kontrol edilir?

   if (TimeFrame> Period ()) 
     {
       ArrayCopySeries (santa1, 5 , Symbol (),TimeFrame);
      summ=CountBars+TimeFrame/ Period ();
      shift= 0 ;
       for ( int iy= 0 ; shift<summ; shift++) 
        {
         if (iy> ArraySize (santa1)) continue ;
         if (shift> ArraySize (santa1)) continue ;
         if ( Time [shift]<santa1[iy]) iy++; //вот эта santa1[iy] "array out of range"

         list[shift]=bufbuy[iy];
        }
     }
 

Belki birisi hatanın nerede olduğuna bakmak için zaman bulur.

 #property strict
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_color4 Yellow
#property indicator_color5 Aqua

extern bool Crash= FALSE ;
extern int TimeFrame= 30 ;
extern int Length = 7 ;
extern int Method = 3 ;
extern int Smoothing= 2 ;
extern int Filter= 2 ;
extern bool RealTime= TRUE ;
extern bool Steady= FALSE ;
extern bool Color = TRUE ;
extern bool Alerts= TRUE ;

extern int CountBars= 400 ;
double sik[];
double list[];
double bufbuy[];
double par6[];
double par1[];
double par2[];
double par3[];
double nugni[];
bool flag2 = TRUE ;
bool flag1 = TRUE ;
datetime time1 = 0 ;
datetime time2 = 0 ;
int stad= 0 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init() 
  {
   string lex;
   IndicatorBuffers ( 8 );
   SetIndexStyle ( 0 , DRAW_LINE , STYLE_SOLID );
   SetIndexBuffer ( 0 ,list);
   SetIndexStyle ( 1 , DRAW_LINE , STYLE_SOLID );
   SetIndexBuffer ( 1 ,par1);
   SetIndexStyle ( 2 , DRAW_LINE , STYLE_SOLID );
   SetIndexBuffer ( 2 ,par2);
   SetIndexStyle ( 3 , DRAW_ARROW );
   SetIndexArrow ( 3 , 233 );
   SetIndexBuffer ( 3 ,par3);
   SetIndexStyle ( 4 , DRAW_ARROW );
   SetIndexArrow ( 4 , 234 );
   SetIndexBuffer ( 4 ,nugni);
   SetIndexBuffer ( 5 ,sik);
   SetIndexBuffer ( 6 ,par6);
   SetIndexBuffer ( 7 ,bufbuy);
   if (Length< 2 ) Length= 2 ;
   if (Method < MODE_SMA ) Method = 0 ;
   if (Method> MODE_LWMA ) Method = 3 ;
   if (Smoothing< 0 ) Smoothing= 0 ;
   if (Filter< 0 ) Filter= 0 ;
   if (TimeFrame< Period () && TimeFrame!= 0 ) TimeFrame= Period ();
   switch (TimeFrame) 
     {
       case 1 :
         lex= "M1" ;
         break ;
       case 5 :
         lex= "M5" ;
         break ;
       case 15 :
         lex= "M15" ;
         break ;
       case 30 :
         lex= "M30" ;
         break ;
       case 60 :
         lex= "H1" ;
         break ;
       case 240 :
         lex= "H4" ;
         break ;
       case 1440 :
         lex= "D1" ;
         break ;
       case 10080 :
         lex= "W1" ;
         break ;
       case 43200 :
         lex= "MN1" ;
         break ;
       default :
         lex= "" ;
     }
   string str_lol= "trend " +lex+ " |  " +Length+ " , " +Method+ " , " +Smoothing+ " , " +Filter+ "  | " ;
   IndicatorShortName (str_lol);
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start() 
  {
   int santa1[];
   int summ;
   string str_lol;
   if ( Bars < 100 ) 
     {
       IndicatorShortName ( "Bars less than 100" );
       return ( 0 );
     }
   if (time1< iTime ( NULL ,TimeFrame, 0 )) 
     {
      flag1 = FALSE ;
      flag2 = FALSE ;
      time1= iTime ( NULL ,TimeFrame, 0 );
     }
   if (!RealTime) 
     {
       if (time2 == iTime ( NULL , TimeFrame, 0 )) return ( 0 );
      time2= iTime ( NULL ,TimeFrame, 0 );
      stad=TimeFrame/ Period ()+ 1 ;
       if (stad== 0 ) stad= 1 ;
     }
   double MA1 = 0 ;
   double MA2 = 0 ;
   double MA3 = 0 ;
   double MA4 = 0 ;
   double MA5 = 0 ;
   if (CountBars> iBars ( NULL ,TimeFrame) || CountBars> Bars -Length- 1 ) CountBars= MathMin ( Bars -Length- 1 , iBars ( NULL ,TimeFrame)-Length- 1 );
   if (Crash && CountBars> 0 ) 
     {
      CountBars-= 10 ;
       IndicatorShortName ( "Crash: " +CountBars+ "     " );
     }
   if (Crash && CountBars< 0 ) IndicatorShortName ( "Crash" );
   int shift=CountBars;
   list[shift+ 1 ]= Close [shift+ 1 ];
   bufbuy[shift+ 1 ]= Close [shift+ 1 ];
   while (shift>= 0 ) 
     {
      MA1 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_HIGH , shift);
      MA2 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_LOW , shift);
      MA3 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_OPEN , shift);
      MA4 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_CLOSE , shift);
      MA5 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_CLOSE , shift + Smoothing);
       if (Steady== TRUE ) 
        {
         MA4 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_MEDIAN , shift);
         MA5 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_MEDIAN , shift + Smoothing);
        }
      sik[shift]= MathAbs (((MA4-MA5)/ MathMax (MA1-MA2, MathMax (MA1-MA5,MA5-MA2))+(MA4-MA3)/(MA1-MA2))/ 2.0 ) *((MA4-MA5+
                         (MA4-MA3))/ 2.0 );
      list[shift]=list[shift+ 1 ]+sik[shift];
       if (Filter> 0 )
         if ( MathAbs (list[shift]-(list[shift+ 1 ]))<Filter* Point ) list[shift]=list[shift+ 1 ];
       if (TimeFrame> Period ()) bufbuy[shift]=list[shift];
      shift--;
     }
   if (TimeFrame> Period ()) 
     {
       ArrayCopySeries (santa1, 5 , Symbol (),TimeFrame);
      summ=CountBars+TimeFrame/ Period ();
      shift= 0 ;
       for ( int iy= 0 ; shift<summ; shift++) 
        {
         if (iy> ArraySize (santa1)) continue ;
         if (shift> ArraySize (santa1)) continue ;
         if ( Time [shift]<santa1[iy]) iy++; //вот эта 
         list[shift]=bufbuy[iy];
        }
     }
   for (shift=CountBars; shift>= 0 ; shift--) 
     {
      par6[shift]=par6[shift+ 1 ];
       if (list[shift] -(list[shift + 1 ])> 0.0 ) par6[shift] = 1 ;
       if (list[shift + 1 ] - list[shift] > 0.0 ) par6[shift] = - 1 ;
       if (Color== TRUE ) 
        {
         if (par6[shift]> 0.0 ) 
           {
            par1[shift]=list[shift];
             if (par6[shift+ 1 ]< 0.0 ) par1[shift+ 1 ]=list[shift+ 1 ];
            par2[shift]= EMPTY_VALUE ;
              } else {
             if (par6[shift]< 0.0 ) 
              {
               par2[shift]=list[shift];
               if (par6[shift+ 1 ]> 0.0 ) par2[shift+ 1 ]=list[shift+ 1 ];
               par1[shift]= EMPTY_VALUE ;
              }
           }
        }
       if (Alerts== TRUE ) 
        {
         par3[shift] = EMPTY_VALUE ;
         nugni[shift] = EMPTY_VALUE ;
         if (par6[shift] == 1.0 && par6[shift + 1 ] == - 1.0 ) par3[shift] = list[shift + 1 ] - ( Ask - Bid );
         if (par6[shift] == - 1.0 && par6[shift + 1 ] == 1.0 ) nugni[shift] = list[shift + 1 ] + ( Ask - Bid );
        }
     }

   return ( 0 );
  }
//+------------------------------------------------------------------+
 
PolarSeaman :

Belki birisi hatanın nerede olduğuna bakmak için zaman bulur.

 #property strict
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_color4 Yellow
#property indicator_color5 Aqua

extern bool Crash= FALSE ;
extern int TimeFrame= 30 ;
extern int Length = 7 ;
extern int Method = 3 ;
extern int Smoothing= 2 ;
extern int Filter= 2 ;
extern bool RealTime= TRUE ;
extern bool Steady= FALSE ;
extern bool Color = TRUE ;
extern bool Alerts= TRUE ;

extern int CountBars= 400 ;
double sik[];
double list[];
double bufbuy[];
double par6[];
double par1[];
double par2[];
double par3[];
double nugni[];
bool flag2 = TRUE ;
bool flag1 = TRUE ;
datetime time1 = 0 ;
datetime time2 = 0 ;
int stad= 0 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init() 
  {
   string lex;
   IndicatorBuffers ( 8 );
   SetIndexStyle ( 0 , DRAW_LINE , STYLE_SOLID );
   SetIndexBuffer ( 0 ,list);
   SetIndexStyle ( 1 , DRAW_LINE , STYLE_SOLID );
   SetIndexBuffer ( 1 ,par1);
   SetIndexStyle ( 2 , DRAW_LINE , STYLE_SOLID );
   SetIndexBuffer ( 2 ,par2);
   SetIndexStyle ( 3 , DRAW_ARROW );
   SetIndexArrow ( 3 , 233 );
   SetIndexBuffer ( 3 ,par3);
   SetIndexStyle ( 4 , DRAW_ARROW );
   SetIndexArrow ( 4 , 234 );
   SetIndexBuffer ( 4 ,nugni);
   SetIndexBuffer ( 5 ,sik);
   SetIndexBuffer ( 6 ,par6);
   SetIndexBuffer ( 7 ,bufbuy);
   if (Length< 2 ) Length= 2 ;
   if (Method < MODE_SMA ) Method = 0 ;
   if (Method> MODE_LWMA ) Method = 3 ;
   if (Smoothing< 0 ) Smoothing= 0 ;
   if (Filter< 0 ) Filter= 0 ;
   if (TimeFrame< Period () && TimeFrame!= 0 ) TimeFrame= Period ();
   switch (TimeFrame) 
     {
       case 1 :
         lex= "M1" ;
         break ;
       case 5 :
         lex= "M5" ;
         break ;
       case 15 :
         lex= "M15" ;
         break ;
       case 30 :
         lex= "M30" ;
         break ;
       case 60 :
         lex= "H1" ;
         break ;
       case 240 :
         lex= "H4" ;
         break ;
       case 1440 :
         lex= "D1" ;
         break ;
       case 10080 :
         lex= "W1" ;
         break ;
       case 43200 :
         lex= "MN1" ;
         break ;
       default :
         lex= "" ;
     }
   string str_lol= "trend " +lex+ " |  " + string (Length)+ " , " + string (Method)+ " , " + string (Smoothing)+ " , " + string (Filter)+ "  | " ;
   IndicatorShortName (str_lol);
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start() 
  {
   int santa1[];
   int summ;
   string str_lol;
   if ( Bars < 100 ) 
     {
       IndicatorShortName ( "Bars less than 100" );
       return ( 0 );
     }
   if (time1< iTime ( NULL ,TimeFrame, 0 )) 
     {
      flag1 = FALSE ;
      flag2 = FALSE ;
      time1= iTime ( NULL ,TimeFrame, 0 );
     }
   if (!RealTime) 
     {
       if (time2 == iTime ( NULL , TimeFrame, 0 )) return ( 0 );
      time2= iTime ( NULL ,TimeFrame, 0 );
      stad=TimeFrame/ Period ()+ 1 ;
       if (stad== 0 ) stad= 1 ;
     }
   double MA1 = 0 ;
   double MA2 = 0 ;
   double MA3 = 0 ;
   double MA4 = 0 ;
   double MA5 = 0 ;
   if (CountBars> iBars ( NULL ,TimeFrame) || CountBars> Bars -Length- 1 ) CountBars= MathMin ( Bars -Length- 1 , iBars ( NULL ,TimeFrame)-Length- 1 );
   if (Crash && CountBars> 0 ) 
     {
      CountBars-= 10 ;
       IndicatorShortName ( "Crash: " + string (CountBars)+ "     " );
     }
   if (Crash && CountBars< 0 ) IndicatorShortName ( "Crash" );
   int shift=CountBars;
   list[shift+ 1 ]= Close [shift+ 1 ];
   bufbuy[shift+ 1 ]= Close [shift+ 1 ];
   while (shift>= 0 ) 
     {
      MA1 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_HIGH , shift);
      MA2 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_LOW , shift);
      MA3 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_OPEN , shift);
      MA4 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_CLOSE , shift);
      MA5 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_CLOSE , shift + Smoothing);
       if (Steady== TRUE ) 
        {
         MA4 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_MEDIAN , shift);
         MA5 = iMA ( NULL , TimeFrame, Length, 0 , Method, PRICE_MEDIAN , shift + Smoothing);
        }
      sik[shift]= MathAbs (((MA4-MA5)/ MathMax (MA1-MA2, MathMax (MA1-MA5,MA5-MA2))+(MA4-MA3)/(MA1-MA2))/ 2.0 ) *((MA4-MA5+
                         (MA4-MA3))/ 2.0 );
      list[shift]=list[shift+ 1 ]+sik[shift];
       if (Filter> 0 )
         if ( MathAbs (list[shift]-(list[shift+ 1 ]))<Filter* Point ) list[shift]=list[shift+ 1 ];
       if (TimeFrame> Period ()) bufbuy[shift]=list[shift];
      shift--;
     }
   if (TimeFrame> Period ()) 
     {
       ArrayCopySeries (santa1, 5 , Symbol (),TimeFrame);
      summ=CountBars+TimeFrame/ Period ();
      shift= 0 ;
       for ( int iy= 0 ; shift<summ; shift++) 
        {
         if (iy> ArraySize (santa1)) continue ;
         if (shift> ArraySize (santa1)) continue ;
         if ( Time [shift]<santa1[iy]) iy++; //вот эта 
         list[shift]=bufbuy[iy];
        }
     }
   for (shift=CountBars; shift>= 0 ; shift--) 
     {
      par6[shift]=par6[shift+ 1 ];
       if (list[shift] -(list[shift + 1 ])> 0.0 ) par6[shift] = 1 ;
       if (list[shift + 1 ] - list[shift] > 0.0 ) par6[shift] = - 1 ;
       if (Color== TRUE ) 
        {
         if (par6[shift]> 0.0 ) 
           {
            par1[shift]=list[shift];
             if (par6[shift+ 1 ]< 0.0 ) par1[shift+ 1 ]=list[shift+ 1 ];
            par2[shift]= EMPTY_VALUE ;
              } else {
             if (par6[shift]< 0.0 ) 
              {
               par2[shift]=list[shift];
               if (par6[shift+ 1 ]> 0.0 ) par2[shift+ 1 ]=list[shift+ 1 ];
               par1[shift]= EMPTY_VALUE ;
              }
           }
        }
       if (Alerts== TRUE ) 
        {
         par3[shift] = EMPTY_VALUE ;
         nugni[shift] = EMPTY_VALUE ;
         if (par6[shift] == 1.0 && par6[shift + 1 ] == - 1.0 ) par3[shift] = list[shift + 1 ] - ( Ask - Bid );
         if (par6[shift] == - 1.0 && par6[shift + 1 ] == 1.0 ) nugni[shift] = list[shift + 1 ] + ( Ask - Bid );
        }
     }

   return ( 0 );
  }
//+
 

Beyler, yeni bir satırdan bir dosyaya nasıl veri ekleyeceğimi söyleyin

benim yazma işlevim:

 void Write( string file, string text, bool print)
  {
   filehandle= FileOpen (file, FILE_WRITE | FILE_CSV , '|' );
   FileWriteString (filehandle,text);
   FileClose (filehandle);
  }

İşte ona gönderdiğim şey:

Write(subfolder+ "\\" + string (TF)+ "\\TS" + string (ts)+ "\\" + string (st)+ "_" + string (st2)+ ".txt" ,
                                 string (mv)+ "|" +
                                 string (b)+ "|" +
                                 string (rs)+ "|" +
                                 string (m1)+ "|" +
                                 string (m2)+ "|"
                                 ,NoPrint);

satırın altına çok şey eklemeniz gerekiyor:

Write(subfolder+ "\\" + string (TF)+ "\\TS" + string (ts)+ "\\" + string (st)+ "_" + string (st2)+ ".txt" ,
                                 string (mv)+ "|" +
                                 string (b)+ "|" +
                                 string (rs)+ "|" +
                                 string (m1)+ "|" +
                                 string (m2)+ "|"
                                 ,NoPrint);
 
Nikolay Gaylis :

Beyler, yeni bir satırdan bir dosyaya nasıl veri ekleyeceğimi söyleyin

benim yazma işlevim:

İşte ona gönderdiğim şey:

satırın altına çok şey eklemeniz gerekiyor:

SEEK_END işaretli FileSeek() size yardımcı olacaktır.

<
 
Nikolay Gaylis :

kodunuzda değiştirmişsiniz

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

üzerinde

 //+

ama yardımcı olmadı)

 

Çocuklar, bana Alpari cent danışmanının neden sık sık başarısız olduğunu söylediğini söyleyin [Geçersiz hacim], lot büyüklüğü maksimumu geçmese de 23-45'ten 1-00'e kadar işlem görüyor.

Logu ekledim diğer bokerlerde böyle bir hata yok

Dosyalar:
Alpari_Logs.txt  35 kb
 

Kodu buradan örnekten aldım ve onunla ilgilendim

bir yöntem tanımladım

 bool CControlsDialog::OnEvent( const int id, const long &lparam, const double &dparam, const string &sparam){

         //....

}

zaten tanımlanmış olduğuna ve bir vücuda sahip olduğuna yemin eder.

Soru: nerede tanımlanır?

Документация по MQL5: Стандартная библиотека / Панели и диалоги / CButton
Документация по MQL5: Стандартная библиотека / Панели и диалоги / CButton
  • www.mql5.com
//|                                               ControlsButton.mq5 | //|                        Copyright 2017, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| defines                                                          |  INDENT_LEFT                         (11)      ...
 
Roman Sharanov :

Kodu buradan örnekten aldım ve onunla ilgilendim

bir yöntem tanımladım

zaten tanımlanmış olduğuna ve bir vücuda sahip olduğuna yemin eder.

Soru: nerede tanımlanır?

Terminal klasöründe aramayı deneyin. ControlsDialog.mqh dosyasını buldum ve OnEvent() içeriyor
 

İyi akşamlar!

Depozito yüzdesine dayalı bir anlaşma için lotu hesaplamak için evrensel (farklı enstrümanlar için) bir kodun nasıl ekleneceği konusunda beynimi zorluyorum.

Böyle mi yaptı:

 input double MaximumRisk= 0.02 ;                   //Риск в сделке от депозита

{Lots = NormalizeDouble ((( AccountBalance ()*MaximumRisk)/(( MathAbs (Price-SL))/ Point )/(( MarketInfo ( Symbol (), MODE_LOTSIZE )*( MarketInfo ( Symbol (), MODE_ASK )+ Point ))
-( MarketInfo ( Symbol (), MODE_LOTSIZE )* MarketInfo ( Symbol (), MODE_ASK )))), Digits );}

Fiyat ( pozisyon açılış fiyatı) ve SL (zarar durdur) ayrı ayrı hesaplanır, buraya eklemedim.

Karşıt para biriminin dolar cinsinden olduğu çiftler için (örneğin EURUSD), SPX500 endeksi için ve altın için - her şey doğru hesaplanır, ancak teklifte doların ilk olduğu çiftler için (örneğin USDJPY) çalışmaz.

Lütfen bana neyi özlediğini söyle?