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

 

도와주세요. 표시기에 다른 버퍼를 추가했습니다(double ma_buffer_stop[];). 하지만 그리지 않고 오류가 발생하지 않습니다(

 //+------------------------------------------------------------------+
//|                                                   MTF_Moving.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                             https://www.mql5.com/ru/users/melnik |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com/ru/users/melnik"
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Black
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_LINE

double ma_buffer_slow[];
double ma_buffer_fast[];
double ma_buffer_stop[];

//--- input parameters
input int                      PeriodMaSlow= 21 ;   //Period slow Ma
input int                      PeriodMaFast= 13 ;   //Pertiod fast Ma
input ENUM_APPLIED_PRICE       PriceMa= 0 ;         //Applied price
input ENUM_MA_METHOD           MethodMa= 0 ;       //Method Ma
input ENUM_TIMEFRAMES          Timeframe= 60 ;     //Timeframe for calculate

ENUM_TIMEFRAMES prd;

int index=- 1 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , ma_buffer_slow, INDICATOR_DATA );
   SetIndexBuffer ( 1 , ma_buffer_fast, INDICATOR_DATA );
   SetIndexBuffer ( 2 , ma_buffer_stop, INDICATOR_DATA );
//---
   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[])
  {
//---
   if ((rates_total-prev_calculated-PeriodMaSlow)<= 0 ) return ( 0 );
  
   if ( Period ()>Timeframe) prd= PERIOD_CURRENT ;
   if ( Period ()<=Timeframe) prd=prd=Timeframe;
  
   for ( int i=rates_total-prev_calculated-PeriodMaSlow- 1 ;i>= 0 ;i--)
   {
       if (TimeMinute(time[i])== 0 )index= iBarShift ( Symbol (), prd, time[i], false );
      
      ma_buffer_fast[i]= iMA ( Symbol (), prd, PeriodMaFast, 0 , MethodMa, PriceMa, index);
      ma_buffer_slow[i]= iMA ( Symbol (), prd, PeriodMaSlow, 0 , MethodMa, PriceMa, index);
       if (ma_buffer_fast[i+ 1 ]>=ma_buffer_slow[i+ 1 ]&&ma_buffer_fast[i]<ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]+ 50 * Point ;}
       if (ma_buffer_fast[i+ 1 ]<=ma_buffer_slow[i+ 1 ]&&ma_buffer_fast[i]>ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]- 50 * Point ;}
   }
  
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 

확인하세요. 여기까지 왔나요?

 if (ma_buffer_fast[i+ 1 ]>=ma_buffer_slow[i+ 1 ]&&ma_buffer_fast[i]<ma_buffer_slow[i]) printf (ma_buffer_slow[i]);
이것이 가장 먼저 떠오르는 것입니다.
 

때때로 나는 0으로 나눗셈을 한다 . (모든 것이 동적일 수 있음)

나는 사단 운영에 대한 논평을 찾고 차트에 고문을 던지고 있습니다.

어떻게 든 오류가보다 일반적인 방법 인 행을 얻을 수 있습니까?

문제는 오류가 특정 상태에서만 발생한다는 것입니다. 저것들. 특정 TF와 새 양초로 사라질 수 있습니다. 4시에 깨달으면 좋습니다. 찾을 때가 있습니다.

 
Valeriy Yastremskiy :

어떻게 든 오류가보다 일반적인 방법 인 행을 얻을 수 있습니까?

전문가 로그에 항목이 있어야 합니다. 이 항목은 파일과 0으로 나눈 줄 번호를 나타냅니다.

 
Igor Makanu :

전문가 로그에 항목이 있어야 합니다. 이 항목은 파일과 0으로 나눈 줄 번호를 나타냅니다.

2020.11.27 11:55:29.795 qstr7_52_1 EURUSD,H4: 'qstr7_52_1.mq4'의 0 나누기(962.43)

딱 이것.

962.43은 동일하지만.

그게 다야))) 감사합니다!!!!!


 
Aleksei Stepanenko :

확인하세요. 여기까지 왔나요?

이것이 가장 먼저 떠오르는 것입니다.

우리는 넘어진다

이렇게 하면 내가 그린다.

   double prev01,prev02;

   if ((rates_total-prev_calculated-PeriodMaSlow)<= 0 ) return ( 0 );
  
   if ( Period ()>Timeframe) prd= PERIOD_CURRENT ;
   if ( Period ()<=Timeframe) prd=prd=Timeframe;
  
   for ( int i=rates_total-prev_calculated-PeriodMaSlow- 1 ;i>= 0 ;i--)
   {
       if (TimeMinute(time[i])== 0 )index= iBarShift ( Symbol (), prd, time[i], false );
      
      ma_buffer_fast[i]= iMA ( Symbol (), prd, PeriodMaFast, 0 , MethodMa, PriceMa, index);
      ma_buffer_slow[i]= iMA ( Symbol (), prd, PeriodMaSlow, 0 , MethodMa, PriceMa, index);
      prev01= iMA ( Symbol (), prd, PeriodMaFast, 0 , MethodMa, PriceMa, index+ 1 );
      prev02= iMA ( Symbol (), prd, PeriodMaSlow, 0 , MethodMa, PriceMa, index+ 1 );
       if (prev01>=prev02&&ma_buffer_fast[i]<ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]+ 50 * Point ;}
       if (prev01<=prev02&&ma_buffer_fast[i]>ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]- 50 * Point ;}
   }
  
 

이 배열은 교차점에서만 원하는 값을 가지며 다른 위치에서는 그 값이 EMPTY_VALUE 입니다. 그러므로 아무것도 보이지 않습니다. 전역 변수 를 도입하고 교차 지점에 값을 할당해야 합니다. 그리고 그것은 이미 교차점의 현재 값을 제공하거나 교차점이 없을 때 과거 값을 제공합니다.

 double Stop= 0 ;
int OnCalculate (....

if (ma_buffer_fast[i+ 1 ]>=ma_buffer_slow[i+ 1 ]&&ma_buffer_fast[i]<ma_buffer_slow[i]) Stop=ma_buffer_slow[i]+ 50 * Point ;
if (ma_buffer_fast[i+ 1 ]<=ma_buffer_slow[i+ 1 ]&&ma_buffer_fast[i]>ma_buffer_slow[i]) Stop=ma_buffer_slow[i]- 50 * Point ;

ma_buffer_stop[i]=Stop;
 
Aleksei Stepanenko :

이 배열은 교차점에서만 원하는 값을 가지며 다른 위치에서는 그 값이 EMPTY_VALUE 입니다. 그러므로 아무것도 보이지 않습니다. 전역 변수 를 도입하고 교차 지점에 값을 할당해야 합니다. 그리고 그것은 이미 교차점의 현재 값을 제공하거나 교차점이 없을 때 과거 값을 제공합니다.

감사합니다, 작동했습니다)

 
표시기 기능이 계속 동작 중인데 기간 변경을 강제로 취소할 수 있나요?
 
Aleksei Stepanenko :

이 배열은 교차점에서만 원하는 값을 가지며 다른 위치에서는 그 값이 EMPTY_VALUE 입니다. 그러므로 아무것도 보이지 않습니다. 전역 변수 를 도입하고 교차 지점에 값을 할당해야 합니다. 그리고 그것은 이미 교차점의 현재 값을 제공하거나 교차점이 없을 때 과거 값을 제공합니다.

PeriodMaSlow 를 2로 곱함

   if ((rates_total-prev_calculated- PeriodMaSlow )<= 0 ) return ( 0 );
  
   if ( Period ()>Timeframe) prd= PERIOD_CURRENT ;
   if ( Period ()<=Timeframe) prd=prd=Timeframe;
  
   for ( int i=rates_total-prev_calculated- PeriodMaSlow - 1 ;i>= 0 ;i--)

원본 코드는 오류 없이 작동했습니다.