Hatalar, hatalar, sorular - sayfa 2635

 

Bu platform (MT5) finansal piyasalarda işlem yapmak için mi yoksa bir tür sirk için mi oluşturuldu? Güncellemeleriniz için kodları her seferinde yeniden yapmak için neye ihtiyacınız var? Yeterlik.

 
Aleksandr Prishenko :

Bu platform (MT5) finansal piyasalarda işlem yapmak için mi yoksa bir tür sirk için mi yaratıldı? Güncellemeleriniz için kodları her seferinde yeniden yapmak için neye ihtiyacınız var? Yeterlik.

hm....

tam olarak ne değişti? belki benim de ihtiyacım var?

Hiçbir şey güncellenmemiş gibi görünüyor ....

 
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots    4
//--- plot Value
#property indicator_label1    "Volume;Volume1"
#property indicator_type1    DRAW_FILLING
#property indicator_color1    clrBlue , clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    2
//--- plot Middle
#property indicator_label2    "Middle line"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrMediumOrchid
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1
//--- plot OverBought
#property indicator_label3    "Bands upper"
#property indicator_type3    DRAW_LINE
#property indicator_color3    clrDeepPink
#property indicator_style3    STYLE_SOLID
#property indicator_width3    1
//--- plot OverSold
#property indicator_label4    "Bands lower" //нижняя линия
#property indicator_type4    DRAW_LINE
#property indicator_color4    clrDeepPink
#property indicator_style4    STYLE_SOLID
#property indicator_width4    1
//---
enum OSCILLATOR_NAME {
   MACD,             // MACD
   MOMENTUM,         // Momentum
   RSI,               // RSI
   MFI,               // MFI 
   AC                 // AC
};
//---
enum LEVEL_MODE {
   CONST_VALUE_MODE, // Constant level value mode
   MA_MODE,           // Moving Average mode
   BB_MODE           // Bollinger Bands Mode
};
//---
enum DRAW_MODE {
   LINE,             // Line
   FILLING,           // Filling
   HISTOGRAM         // Histogram
};
//--- input parameters
input ENUM_TIMEFRAMES       TF_Oscillator = PERIOD_CURRENT ;                         // TIMEFRAMES Oscillator
input OSCILLATOR_NAME      InpOscillator = MACD;                         // Oscillator
input int                   InpOscPeriod1 = 1 ;                           // MACD Fast EMA / Period for: RSI,MFI,Momentum 
input int                   InpOscPeriod2 = 34 ;                           //  MACD Slow EMA
input int                   InpOscPeriod3 = 1 ;                           //  MACD Signal
input ENUM_APPLIED_PRICE    InpAppliedPrice = PRICE_CLOSE ;               // Applied price
input    ENUM_APPLIED_VOLUME InpVOLUME = VOLUME_TICK ;                     //Applied Volume for MFI
input DRAW_MODE            InpDrawMode = LINE;                       // Draw Mode 
input int                   InpLevelsPeriod = 40 ;                         // Levels Period Upper
input int                   InpLevelsPeriod1 = 35 ;                         // Levels Period  Lower
input double                InpLevelsIndent = 3.0 ;                       // Deviation Upper
input double                InpLevelsIndent1 = 4.0 ;                       //  Deviation Lower

 LEVEL_MODE           InpLevelsMode = BB_MODE;                     // Levels Mode
bool                  InpIndentAutoCorrection = true ;               // Levels Auto Correction
//input string               InpDivider = "---For Stochastic or MACD---"; // Just Divider NOT Parameter 
//input ENUM_STO_PRICE       InpStochPrice = STO_LOWHIGH;                 // Stochastic Price

//--- indicator buffers
double          ExtBuffer1[]; //Line
double          ExtBuffer2[]; //Middle
double          ExtBuffer3[]; //Upper
double          ExtBuffer4[]; //Lowe
double          ExtBuffer5[];
double          ExtBuffer6[];
//--- global variables
int             oscPeriod1;
int             levelsPeriod;
int             levelsPeriod1;
int             minRequiredBars;
int             oscHandle;
int             oscPeriod2;
int             oscPeriod3;
double          midValue;
double          addValue;
double          levelsIndent,levelsIndent1 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit () {
//---
   if ( InpOscPeriod1 < 1 ) {
      oscPeriod1 = 14 ;
       printf ( "Incorrected input parameter InpOscPeriod1 = %d. Indicator will use value %d." , InpOscPeriod1, oscPeriod1);
   } else {
      oscPeriod1 = InpOscPeriod1;
   }
   
   if ( InpLevelsPeriod < 1 ) {
      levelsPeriod = 10 ;
       printf ( "Incorrected input parameter InpLevelsPeriod = %d. Indicator will use value %d." , InpLevelsPeriod, levelsPeriod);
   } else {
      levelsPeriod = InpLevelsPeriod;
   }
   if ( InpLevelsPeriod1 < 1 ) {
      levelsPeriod = 10 ;
       printf ( "Incorrected input parameter InpLevelsPeriod = %d. Indicator will use value %d." , InpLevelsPeriod, levelsPeriod);
   } else {
      levelsPeriod1 = InpLevelsPeriod1;
   }
   
   if ( InpOscPeriod2 < 1 ) {
      oscPeriod2 = 3 ;
       printf ( "Incorrected input parameter InpOscPeriod2 = %d. Indicator will use value %d." , InpOscPeriod2, oscPeriod2);
   } else {
      oscPeriod2 = InpOscPeriod2;
   }
   
   if ( InpOscPeriod3 < 1 ) {
      oscPeriod3 = 3 ;
       printf ( "Incorrected input parameter InpOscPeriod3 = %d. Indicator will use value %d." , InpOscPeriod3, oscPeriod3);
   } else {
      oscPeriod3 = InpOscPeriod3;
   }
   
   levelsIndent = MathAbs (InpLevelsIndent); // Levels Indent / Deviation
   levelsIndent1 = MathAbs (InpLevelsIndent1); // Levels Indent / Deviation
//---
   minRequiredBars = 20 ; // oscPeriod1 + oscPeriod2 + oscPeriod3 + levelsPeriod - 1;
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , ExtBuffer1, INDICATOR_DATA );
   SetIndexBuffer ( 1 , ExtBuffer2, INDICATOR_DATA );
   SetIndexBuffer ( 2 , ExtBuffer3, INDICATOR_DATA );
   SetIndexBuffer ( 3 , ExtBuffer4, INDICATOR_DATA );
   SetIndexBuffer ( 4 , ExtBuffer5, INDICATOR_DATA );
   SetIndexBuffer ( 5 , ExtBuffer6, INDICATOR_DATA );
//---
   string shortname = "Oscillator For BBS: " ;
//---
   switch ( InpOscillator ) {
 
       case MACD:
         oscHandle = iMACD ( _Symbol , TF_Oscillator, oscPeriod1, oscPeriod2, oscPeriod3, InpAppliedPrice);
         midValue = 0.0 ;
         shortname += "MACD (" + ( string )oscPeriod1 + ", " + ( string )oscPeriod2 + ", " + ( string )oscPeriod3 + ")" ;
         break ;
         
       case MOMENTUM:
         oscHandle = iMomentum ( _Symbol , TF_Oscillator, oscPeriod1, InpAppliedPrice);
         midValue = 100.0 ;
         levelsAutoCorrect( 0.03 , 5.0 , 0.5 );
         shortname += "Momentum (" + ( string )oscPeriod1 + ")" ;
         break ;
         
       case RSI:
         oscHandle = iRSI ( _Symbol , TF_Oscillator, oscPeriod1, InpAppliedPrice);
         midValue = 50.0 ;
         levelsAutoCorrect( 5.0 , 50.0 , 20.0 );
         shortname += "RSI (" + ( string )oscPeriod1 + ")" ;
         break ;
       case MFI:
         oscHandle = iMFI ( _Symbol , TF_Oscillator, oscPeriod1, InpVOLUME);
         midValue = 50.0 ;
         levelsAutoCorrect( 5.0 , 50.0 , 20.0 );
         shortname += "MFI (" + ( string )oscPeriod1 + ")" ;
         break ;
         
       case AC:
         oscHandle = iAC ( _Symbol , 0 );
         midValue = 0.0 ;
         levelsAutoCorrect( 5.0 , 50.0 , 20.0 );
         shortname += "AC" ;
         break ; 
               
       default :
         oscHandle = INVALID_HANDLE ;
         Print ( "Unknown Oscillator!" );
         return (- 1 );
   }
//---
   switch ( InpDrawMode ) {
       case FILLING:
         SetIndexBuffer ( 2 , ExtBuffer3, INDICATOR_DATA );
         PlotIndexSetInteger ( 0 , PLOT_DRAW_TYPE , DRAW_FILLING );
         break ;
         
       case HISTOGRAM:
         SetIndexBuffer ( 2 , ExtBuffer3, INDICATOR_COLOR_INDEX );
         PlotIndexSetInteger ( 0 , PLOT_DRAW_TYPE , DRAW_COLOR_HISTOGRAM2 );
         break ;
         
       case LINE:
       default :
         SetIndexBuffer ( 2 , ExtBuffer3, INDICATOR_DATA );
         PlotIndexSetInteger ( 0 , PLOT_DRAW_TYPE , DRAW_LINE );
         break ;
   }
//---
   IndicatorSetString ( INDICATOR_SHORTNAME , shortname); 
//---
   return ( 0 );
}
//+------------------------------------------------------------------+
//| Levels indent / deviation correction function                    |
//+------------------------------------------------------------------+
void levelsAutoCorrect( double minIndent, double maxIndent, double correctIndent)
 {
//---
   if ( InpLevelsMode == BB_MODE ) {
       if ( levelsIndent > 4.0    ) {
         levelsIndent = 2.0 ;
         printf ( "Incorrected deviation input parameter InpLevelsIndent = %f. Indicator will use value %f." , 
            InpLevelsIndent, levelsIndent);
      }
       if ( levelsIndent1 > 4.0   ) {
         levelsIndent1 = 2.0 ;
         printf ( "Incorrected deviation input parameter InpLevelsIndent = %f. Indicator will use value %f." , 
            InpLevelsIndent, levelsIndent1);
      }
   } else {
       if ( levelsIndent < minIndent || levelsIndent > maxIndent ) {
         levelsIndent = correctIndent;
         printf ( "Incorrected indent input parameter InpLevelsIndent = %f. Indicator will use value %f." , 
            InpLevelsIndent, levelsIndent);
      }
      
       if ( levelsIndent1 < minIndent || levelsIndent1 > maxIndent ) {
         levelsIndent1 = correctIndent;
         printf ( "Incorrected indent input parameter InpLevelsIndent = %f. Indicator will use value %f." , 
            InpLevelsIndent, levelsIndent1);
      } 
      
   }
//---
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
   int startBar, calculated, toCopy;
//---
   if ( rates_total < minRequiredBars ) {
       Print ( "Not enough bars for calculation." );
       return ( 0 );
   }
//---
   calculated = BarsCalculated (oscHandle);
   if ( calculated < rates_total ) {
       Print ( "Not all data of oscHandle is calculated (" , calculated, " bars. Error #" , GetLastError ());
       return ( 0 );
   }
//---
   if ( prev_calculated > rates_total || prev_calculated <= 0 ) {
      startBar = minRequiredBars;
      toCopy = rates_total;
   } else {
      startBar = prev_calculated - 1 ;
      toCopy = rates_total - prev_calculated;
       if ( prev_calculated > 0 ) {
         toCopy += 1 ;
      }
   }
//---
   if ( CopyBuffer (oscHandle, 0 , 0 , toCopy, ExtBuffer1) <= 0 ) {
       Print ( "Getting Oscillator is failed. Error #" , GetLastError ());
       return ( 0 );
   }
//---
   if ( InpLevelsMode != CONST_VALUE_MODE ) { //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      SimpleMAOnBuffer(rates_total, prev_calculated, oscPeriod1+levelsPeriod, levelsPeriod, ExtBuffer1, ExtBuffer2);
   }
//---   
   for ( int bar = startBar; bar < rates_total; bar++ ) {
       double value, sum = 0.0 , sum1 = 0.0 ;
       double middleLine, indent, indent1;
       //---
       switch ( InpLevelsMode ) {
         case MA_MODE:
            middleLine = ExtBuffer2[bar];
            indent = levelsIndent;
            indent1 = levelsIndent1;
             break ;
         case BB_MODE:           //просмотреть формулу
            middleLine = value = ExtBuffer2[bar];
             for ( int i = bar - levelsPeriod + 1 ; i <= bar; i++ ) {
               sum += MathPow (ExtBuffer1[i]-value, 2 );
            }
            indent = levelsIndent * MathSqrt (sum/levelsPeriod); 
             for ( int k = bar - levelsPeriod1 + 1 ; k <= bar; k++ ) {
               sum1 += MathPow (ExtBuffer1[k]-value, 2 );
            }
            indent1 = levelsIndent1 * MathSqrt (sum/levelsPeriod1);            
             break ;
         case CONST_VALUE_MODE:
         default :
            middleLine = ExtBuffer2[bar] = midValue;
            indent = levelsIndent;
            indent1 = levelsIndent1;
             break ;
      }
       //---
       switch ( InpDrawMode ) {
         case LINE:
            ExtBuffer3[bar] = middleLine + indent; //Upper
            ExtBuffer4[bar] = middleLine - indent1; //Lowe
             break ;
         case FILLING:
            ExtBuffer3[bar] = middleLine;
            ExtBuffer4[bar] = middleLine + indent;
            ExtBuffer5[bar] = middleLine - indent1;
             break ;
         case HISTOGRAM:
             if ( ExtBuffer1[bar] >= ExtBuffer2[bar] ) {
               ExtBuffer3[bar] = 0 ;
            } else {
               ExtBuffer3[bar] = 1 ;
            }
            ExtBuffer4[bar] = middleLine;
            ExtBuffer5[bar] = middleLine + indent;
            ExtBuffer6[bar] = middleLine - indent1;
             break ;
      }
   }
//--- return value of prev_calculated for next call
   return (rates_total);
}
//+------------------------------------------------------------------+

Burada sorun ne? Bu tür bir hatanın birkaç yapısı değildi.

         case BB_MODE:
            middleLine = value = ExtBuffer2[bar];
             for ( int i = bar - levelsPeriod + 1 ; i <= bar; i++ ) {
               sum += MathPow(ExtBuffer1[i]- value , 2 );
2020.02.05 10:56:13.220 çekirdek 1 2017.11.01 00:00:00 'BBS.mq5 İçin Osilatör'de dizi aralık dışında (308,41)

 
Aleksandr Prishenko :

Burada sorun ne? Bu tür bir hatanın birkaç yapısı değildi.

2020.02.05 10:56:13.220 çekirdek 1 2017.11.01 00:00:00 'BBS.mq5 İçin Osilatör'de dizi aralık dışında (308,41)

Temiz, açık, belirgin...

Muhtemelen güncellemelerle alakalı değildir. Nedenini bulmamız gerek...

 
Vladislav Andruschenko :

Temiz, açık, belirgin...

Muhtemelen güncellemelerle ilgili değildir. Nedenini bulmamız gerek...

Her şey 5 yıldan fazla çalıştı)) Kod değişmedi)

 
Aleksandr Prishenko :

Her şey 5 yıldan fazla çalıştı)) Kod değişmedi)

Bundan, hataların platform güncellemeleriyle ilgili olduğu sonucu çıkmaz. Dizinin dışındasın .

 
Evgeny Potapov :

Merhaba!

Bir toplu iş dosyasıyla birden çok MT4 çalıştırmak istiyorum.

Lütfen bana bunu nasıl yapacağımı ve kodumun neden çalışmadığını söyleyin:

En iyi ihtimalle, birkaç MT4 başlatılır ve ardından donar.

Tabii ki, RAM sıkıntısı yok.

Ayrıca farklı bilgisayarlarda denedim.

Herhangi bir şans eseri bir taşınabilir mod anahtarı gerekli değil mi?

Eller tüm terminaller başlatıldı mı?

 
Alexey Viktorov :

Roman, ikinci kez belgeleri okumak için temel isteksizliğe başlıyorsunuz.

Ve mql4 belgelerinde, eğer hafızam beni tamamen değiştirmediyse, bir dizinin boyutu olarak değişkenlerin kullanılmasının kabul edilemez olduğu açıkça belirtilmiştir.

Pek değil, ama yine de dokümanlardan alıntı yaptığınız için teşekkürler.

 
Koldun Zloy :

Ben bir geliştirici değilim, ama yorum yapacağım.

Statik bir dizi için, derleyici zaten derleme sırasında bellekte belirli sayıda bayt tahsis etmelidir.

Derleme zamanında satır ve sütun bilinmiyorsa, derleyici ne kadar bellek ayırmalıdır?

İlk değerler, yalnızca çağrıldığında parametreler atlanırsa kullanılır. Gerçek parametreler yalnızca çalışma zamanında bilinir.

Yani, şaka yok, dili öğrenin.

Burada doğru gibi görünüyor teşekkürler, hafıza için de bir düşünce vardı.
C dilinden örnekler, sadece rehberlik ediyorum.

 int N, M;
int i, j;
scanf( "%d" , &N);
scanf( "%d" , &M);

int A[N][M];
for (i = 0 ; i < N; i++) { 
   for (j = 0 ; j < M; j++) {
      A[i][j] = 10 + rand () % ( 20 - 10 + 1 );
       printf ( "%d " , A[i][j]);
   }
}

puts( "\n" );

Ancak görünüşe göre modern derleyiciler daha katı hale geldi.
Bu kodu VS'de kontrol ettim, ayrıca ayrılmamış dizi belleğine de yemin ediyor.
Görünüşe göre örnek diğer derleyiciler için mi, yoksa eski mi ve dil standardına mı bağlı?

 

Şimdi mql5.com sitesinin başlığında profil düğmesinin yanında üç simge var:

1. Favoriler

2. Şerit

3. Mesajlar

Lütfen başka bir simge ekleyin, şöyle bir şey:

4. Para

günlük alınan tüm fonların toplamının (piyasa, freelance vb.) görüntüleneceği yerde, bu çok uygun olacaktır, ancak şimdi mevcut bakiyeyi görmek için profile gitmeniz gerekiyor.