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

 
Alexey Viktorov :

Yani mql5'te aynı. Hatta biraz genişledi. İhtiyacınız olan bu değil mi?

SYMBOL_TRADE_TICK_VALUE

SYMBOL_TRADE_TICK_VALUE_PROFIT değeri

çift

SYMBOL_TRADE_TICK_VALUE_PROFIT

Karlı bir pozisyon için hesaplanan onay değeri

çift

SYMBOL_TRADE_TICK_VALUE_LOSS

Kaybeden bir pozisyon için hesaplanan onay değeri

çift

SYMBOL_TRADE_TICK_SIZE

Asgari fiyat değişikliği

çift

Kahretsin, genellikle aptalım, TICK_VALUE TICK_SIZE yerine ittim ... Uyumalıyım
 
Arkadaşlar sorun ne yardım edin!?
 
Alexey Viktorov:

Gözüme ilk çarpan şey tamponların sırasıydı.

Derleme arabellekleri DAİMA ardışık olmalıdır. Yani, veri arabellekleri 2 ve 3 olarak numaralandırılmışsa, renk arabelleği 4 olarak numaralandırılmalıdır ZORUNLU.

Tek hata bu değilse, daha fazla bakacağız.

Tamam, aslında burada talimatlarda böyle bir özellik buldum:

MQL5 Referansı / Özel Göstergeler / SetIndexBuffer
".....

bool SetIndexBuffer (
    int                                          dizin , // arabellek dizini
    çift                                    arabellek[] , // dizi
    ENUM_INDEXBUFFER_TYPE    veri tipi        // ne saklanacak
);

Seçenekler

dizin

[içinde] Gösterge arabellek numarası. Numaralandırma 0'dan başlar. Sayı, #property gösterge_tamponlarında belirtilen değerden küçük olmalıdır.

tampon[]

[içinde] Özel gösterge programında bildirilen bir dizi.

veri tipi

[içinde] Gösterge dizisinde depolanan veri türü. Varsayılan, INDICATOR_DATA'dır (hesaplanan gösterge değerleri). INDICATOR_COLOR_INDEX değerini de alabilir, bu durumda bu tampon , önceki gösterge tamponu için renk indekslerini saklamayı amaçlar. #özellik göstergesi_renkN satırında 64 adede kadar renk ayarlayabilirsiniz. INDICATOR_CALCULATIONS değeri, bu arabelleğin göstergenin ara hesaplamalarına dahil olduğu ve işleme amaçlı olmadığı anlamına gelir.

 

Yeniden yapmaya çalıştım daha da saçmaladı. Histogram tamamen kayboldu ve lineer gösterge en hafif tabirle tuhaflaştı. Biri 50'nin üzerinde sinyal kesildi ve ana sinyal daha düşüktü. Kodda da böyle bir kesinti yok.

 
Artyom Trishkin :

Size bir histogramı değil, bir renk arabelleği ile çalışmanız için bir bağlantı verdim. Histogramı soyutlayın ve renkle nasıl çalışılacağına odaklanın.

Onu inceledim, yeni bir şey öğrenmedim, görünüşe göre (benim için yeni) elbette, tüm inisiyeler için aşikar. İndeksleme sırasında arabelleklerin karşılıklı düzenlenmesinin yukarıda açıklanan özelliği dışında bulamadım. Bu diziyi takip ettim, daha da sefil bir resim elde ettim.

Aşağıdaki resimler, dosya ektedir

 //+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots    3

#property indicator_type1    DRAW_COLOR_HISTOGRAM2
#property indicator_color1    clrGreen , clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1 

#property indicator_type1    DRAW_LINE        // основная
#property indicator_color1    clrLightSeaGreen
#property indicator_style1    STYLE_SOLID
#property indicator_width2    3 

#property indicator_type2    DRAW_LINE        // сигнальная
#property indicator_color2    clrYellow
#property indicator_style2    STYLE_SOLID
#property indicator_width3    2 

//--- input parameters
input int InpKPeriod= 5 ;   // K period
input int InpDPeriod= 3 ;   // D period
input int InpSlowing= 3 ;   // Slowing

//--- indicator buffers
double     ColorHistogram_2Buffer1[]; 
double     ColorHistogram_2Buffer2[]; 
double     ColorHistogram_2Colors[];
double     ExtMainBuffer[];
double     ExtSignalBuffer[];
double     ExtHighesBuffer[];
double     ExtLowesBuffer[];
color      colors[]={ clrRed , clrGreen };
int        cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//--- indicator buffers mapping

   SetIndexBuffer ( 0 ,ColorHistogram_2Buffer1, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,ColorHistogram_2Buffer2, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,ColorHistogram_2Colors, INDICATOR_COLOR_INDEX );
   SetIndexBuffer ( 3 ,ExtMainBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 4 ,ExtSignalBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 5 ,ExtHighesBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 6 ,ExtLowesBuffer, INDICATOR_CALCULATIONS );  
   
   //ArraySetAsSeries(ExtMainBuffer,true);
   //ArraySetAsSeries(ExtSignalBuffer,true);
   //ArraySetAsSeries(ExtHighesBuffer,true);
   //ArraySetAsSeries(ExtLowesBuffer,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer1,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer2,true);
   //ArraySetAsSeries(ColorHistogram_2Colors,true);
   
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 );
//--- set accuracy
   IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
//--- set levels
   IndicatorSetInteger ( INDICATOR_LEVELS , 3 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 0 , 20 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 1 , 50 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 2 , 80 );
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble ( INDICATOR_MINIMUM , 0 );
   IndicatorSetDouble ( INDICATOR_MAXIMUM , 100 );
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString ( INDICATOR_SHORTNAME , "Stoch_HISTOGRAM(" +( string )InpKPeriod+ "," +( string )InpDPeriod+ "," +( string )InpSlowing+ ")" );
   PlotIndexSetString ( 3 , PLOT_LABEL , "Main" );
   PlotIndexSetString ( 4 , PLOT_LABEL , "Signal" );
   //PlotIndexSetString(2,PLOT_LABEL,"UP");
   //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger ( 3 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
   PlotIndexSetInteger ( 4 , PLOT_DRAW_BEGIN ,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger ( 5 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
   PlotIndexSetInteger ( 6 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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 i,k,start;
//--- check for bars count
   if (rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
       return ( 0 );
//---
   start=InpKPeriod- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++)
        {
         ExtLowesBuffer[i]= 0.0 ;
         ExtHighesBuffer[i]= 0.0 ;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double dmin= 1000000.0 ;
       double dmax=- 1000000.0 ;
       for (k=i-InpKPeriod+ 1 ;k<=i;k++)
        {
         if (dmin>low[k])  dmin=low[k];
         if (dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod- 1 +InpSlowing- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++) ExtMainBuffer[i]= 0.0 ;
     }
//--- main cycle
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double sumlow= 0.0 ;
       double sumhigh= 0.0 ;
       for (k=(i-InpSlowing+ 1 );k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
       if (sumhigh== 0.0 ) ExtMainBuffer[i]= 100.0 ;
         else ExtMainBuffer[i]=sumlow/sumhigh* 100 ;
       if (ExtMainBuffer[i]> 50 ){
         cl= 1 ;
         ColorHistogram_2Buffer1[i]= 50 ; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " cl=" ,cl,
           " ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 
       if (ExtMainBuffer[i]< 50 ){
         cl= 0 ;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]= 50 ; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " cl=" ,cl,
           " ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++) ExtSignalBuffer[i]= 0.0 ;
     }
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double sum= 0.0 ;
       for (k= 0 ;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return (rates_total);
  }
//+------------------------------------------------------------------+ 
Dosyalar:
 

Merhaba.

Söyle bana, lütfen, siparişlerin "güvenilir" açılması için algoritmayı nerede görebilirim (şimdiye kadar sadece piyasadakilerle ilgileniyorum), çünkü çıkmazdayım.

Sorun şu ki, hesabın (Alpari) StopLevel ve FreezeLevel seviyelerinin sıfıra eşit olması ve sadece bu kısıtlamaları kullanırsanız https://book.mql4.com/en/appendix/limits , satın alırken zararı durdurmanın olduğu ortaya çıkıyor. Teklif düzeyinde ve Satış sırasında Satış düzeyinde ayarlanabilir, ancak durum böyle değildir. Bu durumda OrderSend, "Fiyat yok" hatası verir (ERR_OFF_QUOTES, kod 136).

Aynı zamanda stopsuz veya stoplu 50 ve üzeri noktalı işlemler sorunsuz bir şekilde açılmaktadır.

Deneyimle, minimum SlopLoss boyutunun 19 puan olduğunu öğrendim. Bu girintiyi programlı olarak nasıl belirleyeceğimi bilmiyorum.

 
Bu seviyeler , açılış fiyatından değil, emrin kapanış fiyatından ayarlanmalıdır. Ve bu seviyeleri belirlerken kapanış fiyatı, belirlenen değere eşit olmamalıdır.
 
klok79 :

Merhaba.

Söyle bana, lütfen, siparişlerin "güvenilir" açılması için algoritmayı nerede görebilirim (şimdiye kadar sadece piyasadakilerle ilgileniyorum), çünkü çıkmazdayım.

Sorun şu ki, hesabın (Alpari) StopLevel ve FreezeLevel seviyelerinin sıfıra eşit olması ve sadece bu kısıtlamaları kullanırsanız https://book.mql4.com/en/appendix/limits , satın alırken zararı durdurmanın olduğu ortaya çıkıyor. Teklif düzeyinde ve Satış düzeyinde satış yapılırken ayarlanabilir, ancak durum böyle değildir. Bu durumda OrderSend, "Fiyat yok" hatası verir (ERR_OFF_QUOTES, kod 136).

Aynı zamanda stopsuz veya stoplu 50 ve üzeri noktalı işlemler sorunsuz bir şekilde açılmaktadır.

Deneyimle, minimum SlopLoss boyutunun 19 puan olduğunu öğrendim. Bu girintiyi programlı olarak nasıl belirleyeceğimi bilmiyorum.

MinStopLoss'u deneyin = Mevcut Fiyat +/- (MaxValue(2*Spread, StopLevel));

 
Hata ayıklama durdurulduğunda nesneler neden yok edilmiyor? Anladığım kadarıyla OnDeinit() hiç çağrılmıyor. Hata ayıklama durduktan sonra, her seferinde terminali öldürmem gerekiyor.
 

İyi günler, sorun kodu aşağıdadır, adx_sig[9] dizisi sık sık güncellenir. Verileri zamanında güncelleme bağımlılığını elde etmek istedim. Ama bir şeyler ters gitti.

 //+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input int                   ADX_adx_period          = 14 ;                                                 // adx period ADX 
input int                   ADX_lower_level         = 20 ;                                                 // Lower level ADX 
int h_adx[ 9 ];
double adx1_buffer[ 3 ];
double adx2_buffer[ 3 ];
double adx3_buffer[ 3 ];
ENUM_TIMEFRAMES handle_period[ 9 ]={ PERIOD_CURRENT , PERIOD_M1 , PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 , PERIOD_W1 };
int adx_sig[ 9 ];
int OnInit ()
  {
//---
   for ( int i= 0 ; i< ArraySize (handle_period); i++)
     {
       //--- Установим хэндлы для индикаторов
      h_adx[i]= iADX ( _Symbol ,handle_period[i],ADX_adx_period);
         if (h_adx[i]< 0 ) 
        {
         Alert ( "Ошибка при создании индикаторов - : " , GetLastError (), "!!" );
        }
     }   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
     for ( int i= 0 ; i< ArraySize (handle_period); i++)
     {
       //--- Удаляем хэндлы для индикаторов
       IndicatorRelease (h_adx[i]);
     }
     //---
       
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   for ( int i_sig= 0 ; i_sig< ArraySize (handle_period); i_sig++)
     {
       if ( CopyBuffer (h_adx[i_sig], 0 , 0 , 3 ,adx1_buffer)< 3 ) Print ( "CopyBuffer adx1_buffer " , GetLastError ());
       if ( CopyBuffer (h_adx[i_sig], 1 , 0 , 3 ,adx2_buffer)< 3 ) Print ( "CopyBuffer adx2_buffer " , GetLastError ());
       if ( CopyBuffer (h_adx[i_sig], 2 , 0 , 3 ,adx3_buffer)< 3 ) Print ( "CopyBuffer adx3_buffer " , GetLastError ());
       if (adx3_buffer[ 1 ]<adx2_buffer[ 1 ] && adx3_buffer[ 1 ]>=ADX_lower_level && adx3_buffer[ 1 ]>adx3_buffer[ 2 ])adx_sig[i_sig]= 1 ;
       else if (adx3_buffer[ 1 ]>adx2_buffer[ 1 ] && adx3_buffer[ 1 ]>=ADX_lower_level && adx3_buffer[ 1 ]<adx3_buffer[ 2 ])adx_sig[i_sig]=- 1 ;
       else adx_sig[i_sig]= 0 ;
      }
       PrintFormat ( "ADX sig0=%i sig1=%i sig2=%i sig3=%i sig4=%i sig5=%i sig6=%i sig7=%i sig8=%i" ,adx_sig[ 0 ],adx_sig[ 1 ],adx_sig[ 2 ],adx_sig[ 3 ],adx_sig[ 4 ],adx_sig[ 5 ],adx_sig[ 6 ],adx_sig[ 7 ],adx_sig[ 8 ]); 
  }