MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 566

 
Vitaly Muzichenko :

다음 기능을 사용해 보세요.

통화와 선물 모두에서 이 기능을 사용한다면 그렇게 간단하지 않습니다. 여기에서 마진 비율을 고려해야 합니다.


 
Alexey Viktorov :

통화와 선물 모두에서 이 기능을 사용한다면 그렇게 간단하지 않습니다. 여기에서 마진 비율을 고려해야 합니다.

백분율 손실에 대해 이야기하는 경우 마진은 우리에게 관심이 없으며 포지션이 닫힐 때 반환됩니다.

 
Vitaly Muzichenko :

백분율 손실에 대해 이야기하는 경우 마진은 우리에게 관심이 없으며 포지션이 닫힐 때 반환됩니다.

잠을 충분히 못 잤거나 전혀 일어나지 않은 것 같습니다...
 
Alekseu Fedotov :

아마도

어떻게? 말해주세요!
 
Nikolay Gaylis :

이것만 알아차려서 죄송합니다.

그리고 나뿐만 아니라 터미널도 본질적으로 차이점을 보지 못합니다. 어레이의 범위를 벗어 났습니다.

 
Vitaly Muzichenko :

다음 기능을 사용해 보세요.

도와 주셔서 감사합니다! 불행히도 보편적인 솔루션을 구현하는 것은 불가능했고 다음과 같이 해야 했습니다.

 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 );}
 }
}

브로커에게 유동 레버리지가 있는 경우 로트 계산 시 이를 어떻게 고려해야 하는지 자세히 알려주세요. 아니면 위의 옵션을 입력해도 영향이 없을까요?

 

또 다른 표시기, 배열도 범위를 벗어났습니다.

아무 문제 없이 차트에 올려져 있는데 EA에서 호출하면 ...array out of range in 'HiLo.mq4' (121,15) 라고 나옵니다.

문제가 무엇입니까?

 #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 :

또 다른 표시기, 배열도 범위를 벗어났습니다.

아무 문제 없이 차트에 올려져 있지만 EA에서 호출하면 ...array out of range in 'HiLo.mq4'(121,15)라고 나옵니다.

문제가 무엇입니까?


차트에 1000개의 막대가 있는지 확인하지 않습니다. 예를 들어, 터미널이 열리는 순간 모든 차트에는 0개의 막대가 있지만 터미널은 이미 지표를 시작했습니다(이를 수행하는 이유는 명확하지 않지만 사실은 사실입니다). 따라서 표시기 버퍼 에 대한 액세스는 시계열 배열의 한계를 넘어서게 됩니다.

 
Ihor Herasko :

차트에 1000개의 막대가 있는지 확인하지 않습니다. 예를 들어, 터미널을 여는 순간 모든 차트에는 0개의 막대가 있지만 터미널은 이미 지표를 시작했습니다(이를 수행하는 이유는 명확하지 않지만 사실은 사실입니다). 따라서 표시기 버퍼 에 대한 액세스는 시계열 배열의 한계를 넘어서게 됩니다.

 if ( Bars <cb) return ( 0 );

여전히 날아다닌다.

 
PolarSeaman :

여전히 날아다닌다.

검사가 근본적으로 잘못되었기 때문입니다. Bars가 1000을 반환하고 cb도 1000을 반환했다고 가정해 보겠습니다. 그런 다음 루프에서 첫 번째 반복에서 i 값은 1000을 얻습니다. 루프 본문의 첫 번째 조건에서:

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

배열에서 한 번에 두 개의 종료: 인덱스 1000과 인덱스 1001로 막대에 액세스. 결국 차트에 1000개의 막대가 있는 경우 첫 번째 막대의 인덱스는 0이고 마지막 막대는 999입니다.

더 나아가 사이클의 본체를 따라 역사상 훨씬 더 먼 바에 대한 호소가 있습니다.

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

초기 점검 시 이 모든 사항을 고려해야 합니다.

올바르게 확인하는 방법? MQL4 도움말에서 IndicatorCounted() 함수의 예를 살펴보십시오. 이제는 IndicatorCounted()를 Rates_total(Bars) 및 prev_calculated(IndicatorCounted()) 변수를 공유하는 것으로 바꾸는 것이 좋습니다.