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

 
Vitaly Muzichenko :

İşlevi deneyin:

İşlevi hem para birimlerinde hem de vadeli işlemlerde kullanırsanız o kadar basit değil. Burada marj yüzdesini hesaba katmak gerekir.


 
Alexey Viktorov :

İşlevi hem para birimlerinde hem de vadeli işlemlerde kullanırsanız o kadar basit değil. Burada marj yüzdesini hesaba katmak gerekir.

Yüzde bir kayıptan bahsediyorsak, marj bizi ilgilendirmiyor , pozisyon kapatıldığında geri dönecek

 
Vitaly Muzichenko :

Yüzde bir kayıptan bahsediyorsak, marj bizi ilgilendirmiyor , pozisyon kapatıldığında geri dönecek

Muhtemelen yeterince uyuyamadım... ya da hiç uyanmadım...
 
Alekseu Fedotov :

Belki

Nasıl? Lütfen bana söyle!
 
Nikolay Gaylis :

Bunu sadece fark ettiğin için üzgünüm.

Ve sadece ben değil, Terminal de özünde farkı görmüyor. Dizinin sınırları dışında kaldı.

 
Vitaly Muzichenko :

İşlevi deneyin:

Yardım için teşekkürler! Ne yazık ki evrensel bir çözüm uygulamak mümkün olmadı, bunu yapmak zorunda kaldım:

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

{
 double TickValue   = MarketInfo ( Symbol (), MODE_TICKVALUE ),
        TickSize    = MarketInfo ( Symbol (), MODE_TICKSIZE ),
        ContractSize= MarketInfo ( Symbol (), MODE_LOTSIZE ),
        Min_Lot     = MarketInfo ( Symbol (), MODE_MINLOT ),
        Max_Lot     = MarketInfo ( Symbol (), MODE_MAXLOT ),
        Step        = MarketInfo ( Symbol (), MODE_LOTSTEP );

 {
//Для пар XXXUSD, USDXXX, XAUUSD, XAGUSD, CRYPTO, для кроссов
Lots = NormalizeDouble (((( AccountBalance ()*MaximumRisk)/( MathAbs (Price-SL)/ Point ))/TickValue), int ( MathAbs ( log (Step))));
//Для перечисленного в if
if ( Symbol () == "BRN" || Symbol () == "WTI" || Symbol () == "NG" || Symbol () == "NIKK225" || Symbol () == "SPX500" )
{Lots = NormalizeDouble ((((( AccountBalance ()*MaximumRisk))/ MathAbs (Price-SL)))/(ContractSize/TickValue), 1 );}
//Для перечисленного в if
if ( Symbol () == "ASX200" || Symbol () == "CAC40" || Symbol () == "NQ100" || Symbol () == "STOXX50" || Symbol () == "DAX30"
 || Symbol () == "FTSE100"   || Symbol () == "IBEX35" )
{Lots = NormalizeDouble ((((( AccountBalance ()*MaximumRisk))/ MathAbs (Price-SL)))/(TickValue/TickSize/ Point ), 1 );}
 }
}

Lütfen bana daha fazla bilgi verin, eğer komisyoncunun değişken bir kaldıracı varsa, lot hesaplamasında bu nasıl dikkate alınır? Yoksa yukarıdaki seçeneği girerseniz etkilemez mi?

 

Başka bir gösterge, ayrıca dizi aralık dışında.

Grafiğe sorunsuz bir şekilde yerleştirilir, ancak EA'dan çağrıldığında 'HiLo.mq4' (121,15) içinde ...array out of ranged diyor.

Sorun nedir?

 #property copyright "Copyright ©  november 2015"
#property strict 

#property indicator_chart_window
#property indicator_buffers 6

#property indicator_color1 RoyalBlue       //DodgerBlue
#property indicator_color2 Crimson         //OrangeRed
#property indicator_color3 Black   //White
#property indicator_color4 Black   //White
#property indicator_color5 Black             //White
#property indicator_color6 Black         //Red

#property indicator_width1 2
#property indicator_width2 2

#property indicator_style3 STYLE_DOT
#property indicator_style4 STYLE_DOT

input int     p        = 10 ;     // Период
input int     s        = 5 ;     // Угол наклона
input double distance = 2.0 ;   // Ширина канала
input bool    showBb   = false ;   // Границы канала
input bool    showCl   = true ;   // Центральная линия
input int     barsig   = 1 ;     // Сигнальная свеча (номер)
input int     arrots   = 0 ;     // Стрелка (отступ)
input int     arrsz    = 0 ;     // Стрелка (размер)
input int     ATR      = 1000 ;   // Период ATR
input int     cb       = 1000 ;   // Сколько свечей в истории

double fx1[],fx2[],hp[];
double z1,z2,ki;
int fs;

double upper[],lower[];
double upar[],dnar[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ( void )
  {
//--- indicator buffers mapping
IndicatorBuffers ( 7 );
SetIndexBuffer ( 0 ,fx1);
SetIndexBuffer ( 1 ,fx2);
SetIndexBuffer ( 2 ,lower);
SetIndexBuffer ( 3 ,upper);
SetIndexBuffer ( 4 ,upar);
SetIndexBuffer ( 5 ,dnar);
SetIndexBuffer ( 6 ,hp);

SetIndexStyle ( 4 , DRAW_ARROW , 0 ,arrsz);
SetIndexArrow ( 4 , 233 );
SetIndexStyle ( 5 , DRAW_ARROW , 0 ,arrsz);
SetIndexArrow ( 5 , 234 );

   if (showBb)
   { SetIndexStyle ( 2 , DRAW_LINE );
     SetIndexStyle ( 3 , DRAW_LINE );
   }
   else
   { SetIndexStyle ( 2 , DRAW_NONE );
     SetIndexStyle ( 3 , DRAW_NONE );
   }
   
     if (showCl)
   { SetIndexStyle ( 0 , DRAW_LINE );
     SetIndexStyle ( 1 , DRAW_LINE );
   }
   else
   { SetIndexStyle ( 0 , DRAW_NONE );
     SetIndexStyle ( 1 , DRAW_NONE );
   }

SetIndexEmptyValue ( 0 , 0.0 );
SetIndexEmptyValue ( 1 , 0.0 );

//---
   return ( INIT_SUCCEEDED );
  }
  
//+------------------------------------------------------------------+
//| 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 i;
   
   SetIndexDrawBegin ( 0 , Bars -cb);
   SetIndexDrawBegin ( 1 , Bars -cb);

double avg;

ki= 2.0 /(p+ 1 );

for (i=cb; i>= 0 ; i--) {fx1[i]= Close [i];}

for ( int m= 0 ; m<=s; m++)
{
z1=fx1[ 0 ];
for (i= 0 ; i<=cb; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

z2=fx1[cb];
for (i=cb; i>= 0 ; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/ 2 ;}
}

fs= 0 ;
for (i=cb; i>= 0 ; i--)
{
if (fx1[i]>fx1[i+ 1 ]) fs= 1 ;
if (fx1[i]<fx1[i+ 1 ]) { if (fs== 1 ) fx2[i+ 1 ]=fx1[i+ 1 ]; fs= 2 ;}
if (fs== 2 ) fx2[i]=fx1[i]; else fx2[i]= 0.0 ;

avg = iATR ( NULL , 0 ,ATR, i+ 10 );
upper[i] = hp[i] + distance*avg;
lower[i] = hp[i] - distance*avg;

if ( Close [i+ 1 +barsig]<upper[i+ 1 +barsig] && Close [i+barsig]>upper[i+barsig])
 dnar[i] = High [i]+arrots* Point ; else dnar[i] = EMPTY_VALUE ;
 
if ( Close [i+ 1 +barsig]>lower[i+ 1 +barsig] && Close [i+barsig]<lower[i+barsig])
 upar[i] = Low [i]-arrots* Point ; else upar[i] = EMPTY_VALUE ; 
}

//--- return value of prev_calculated for next call
   return (rates_total);
  }

 
PolarSeaman :

Başka bir gösterge, ayrıca dizi aralık dışında.

Grafiğe sorunsuz bir şekilde yerleştirilir, ancak EA'dan çağrıldığında 'HiLo.mq4' (121,15) içinde ...array out of ranged diyor.

Sorun nedir?


Grafikte 1000 çubuk olup olmadığına dair bir kontrol yoktur. Örneğin, terminali açma anında, tüm çizelgelerde 0 çubuk bulunur, ancak terminal zaten göstergeleri başlattı (bunu neden yaptığı açık değil, ancak gerçek şu ki). Bu nedenle, gösterge arabelleklerine herhangi bir erişim, zaman serisi dizilerinin sınırlarının ötesine geçilmesine neden olur.

 
Ihor Herasko :

Grafikte 1000 çubuk olup olmadığına dair bir kontrol yoktur. Örneğin, terminalin açıldığı anda, tüm çizelgelerde 0 çubuk vardır, ancak terminal zaten göstergeleri başlatmıştır (bunu neden yaptığı açık değildir, ancak gerçek şu ki). Bu nedenle, gösterge arabelleklerine herhangi bir erişim, zaman serisi dizilerinin sınırlarının ötesine geçilmesine neden olur.

 if ( Bars <cb) return ( 0 );

Hala uçuyor.

 
PolarSeaman :

Hala uçuyor.

Çünkü çek temelde yanlıştır. Diyelim ki Barlar 1000 ve cb de 1000 döndürdü. Sonra döngüde, ilk yinelemede 1000 değerini alıyorum. Döngü gövdesinin ilk koşulunda:

 if (fx1[i]>fx1[i+ 1 ]) fs= 1 ;

diziden aynı anda iki çıkış: 1000 indeksli ve 1001 indeksli çubuğa erişim. Sonuçta, grafikte 1000 çubuk varsa, o zaman ilk çubuk 0 indeksine ve sonuncusu - 999'a sahiptir.

Döngünün gövdesi boyunca, tarihte daha da uzak çubuklara bir itiraz vardır:

 if ( Close [i+ 1 +barsig]<upper[i+ 1 +barsig] && Close [i+barsig]>upper[i+barsig])

Tüm bunlar ilk kontrol sırasında dikkate alınmalıdır.

Doğru nasıl kontrol edilir? MQL4 yardımındaki IndicatorCounted() işlevi örneğine bakın. Yalnızca şimdi IndicatorCounted()'ı Rate_total (bu Barlar) ve prev_calculated (bu IndicatorCounted()) değişkenlerini paylaşmakla değiştirmek daha iyidir.