초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 989

 
Aleksey Vyazmikin :

이 메시지의 이유를 어떻게 찾을 수 있습니까?

프로파일러

 
Artyom Trishkin :

0의 반환 값을 확인하는 방법을 모르십니까? 그리고 제로 리턴으로 OnCalculate()를 종료하는 방법을 모르십니까? 사이트 검색에서 정보 검색을 시도한 적이 있습니까?

  1. 함수에서 필요한 값 가져오기
  2. 제로를 확인하십시오
    1. 0이면 0을 반환합니다.
    2. 0이 아니면 n3으로
  3. 받은 값으로 작업
평점이 13,000이 넘는 사람에게 이 리소스에 대한 논리의 기초를 말할 줄은 꿈에도 몰랐습니다...

이것은 지표가 아닙니다.

각 호출에 대해 확인을 수행해야 하는지 또는 OnTick 시작 시 한 번으로 충분한지 여부를 구체적으로 설명했습니다...

반품은 허용되지 않습니다... 테스터에서 대기를 반복하는 것은 불가능하지만 실제 생활에서는 작동해야 합니다(또는 작동하지 않습니까?).

내 평가는 프로그래밍을 위한 것이 아니며 프로그래머도 아닙니다. 이 어려운 사업을 당신과 같은 사람들 덕분에 배운 것뿐입니다. 지식이 있는 사람들의 피드백은 저에게 매우 중요합니다.

이해 주셔서 감사합니다.

 
Artyom Trishkin :

프로파일러

그리고 그것이 하루에 한 번 또는 더 적은 빈도로 발생한다면?

 
안녕하세요. 어째서인지 핸들은 모든 주기로 설정되어 있을 때만 전송을 하는데 특정 시간에 놓았더니 아무 것도 없습니다. 문제가 무엇인지 불분명합니다. 전역 변수 가 아닌 핸들로 직접 드라이브를 시도했지만 결과는 동일합니다. 뭐가 문제 야??? 값은 한 기간의 값이어야 합니다.
 //+------------------------------------------------------------------+
//|                                                        77777.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    0
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
//----
input string xBars= "2018.11.19 00:00" ;             //Дата начала отсчета
input bool DataBars= false ;                         //Считать по дате (true)
input int InpMAShift= 1 ;                           //Сдвиг бара расчета 
input ENUM_TIMEFRAMES Timeframes= PERIOD_D1 ;       //Таймфрейм скользящей
input ENUM_MA_METHOD   Method= MODE_EMA ;             //Метод  расчета скользящей
input ENUM_APPLIED_PRICE AppliedPrice= PRICE_CLOSE ; //Расчет цены скользящей
input ENUM_LINE_STYLE MAStyle= STYLE_DASH ;         //Стиль всех скользящих линий
input int InpMAPeriod1= 5 ;                         //Скользящая 1 периода

//----
int handle_ma,shift;
double BufferPrice[];
//---
int period;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   period=(InpMAPeriod1< 1 ? 1 : InpMAPeriod1);
//---
   SetIndexBuffer ( 2 ,BufferPrice, INDICATOR_CALCULATIONS );
   ArraySetAsSeries (BufferPrice, true );
//--- create MA's handles
   ResetLastError ();

//----------------------------------------------------------------+
//                     ПРОБЛЕМА ТУТ 
//
//----------------------------------------------------------------+
   handle_ma= iMA ( NULL , PERIOD_D1 ,period, 0 , MODE_SMA , PRICE_CLOSE );         //ПРОБЛЕМА ТУТ 
 //  handle_ma=iMA(NULL, PERIOD_CURRENT ,period,0,MODE_SMA,PRICE_CLOSE);      / / БЕЗ ПРОБЛЕМЫ
   if (handle_ma== INVALID_HANDLE )
     {
       Print ( "The iMA (" ,( string )period, ") object was not created: Error " , GetLastError ());
       return INIT_FAILED ;
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ObjectDelete ( 0 , "Proba" );
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| 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< 4 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     {
      limit=rates_total- 1 ;
       ArrayInitialize (BufferPrice, 0 );
     }
//--- Подготовка данных
   int count=(limit> 1 ? rates_total : 2 ),copied= 0 ;
   copied= CopyBuffer (handle_ma, 0 , 0 ,count,BufferPrice);
   if (copied!=count) return 0 ;
//----   
if (DataBars== false )
    shift=InpMAShift;
 else
    shift=iBarShift(NULL,PERIOD_CURRENT,StringToTime(xBars)); 
    
 double ma1=BufferPrice[shift];
 datetime tm= iTime ( NULL ,Timeframes,shift);
 
 Comment ( NormalizeDouble (BufferPrice[shift], _Digits ), "    " ,shift);
 
 
   HLine( "Proba" , "" ,tm,ma1,MAStyle, 1 ,Red);

//--- return value of prev_calculated for next call

   return (rates_total);
  }
//+------------------------------------------------------------------+
void HLine( string name,
           string text,
           datetime tm,
           double price,
           int stl,
           int wid,
           color clr)
  {
   if ( ObjectFind ( 0 ,name)!= 0 )
     {
       ObjectCreate ( 0 ,name, OBJ_HLINE , 0 ,tm,price);
       ObjectSetInteger ( 0 ,name, OBJPROP_TIME , tm);
       ObjectSetString ( 0 ,name, OBJPROP_TEXT ,text); 
       ObjectSetString ( 0 ,name, OBJPROP_FONT , "Times New Roman" ); 
       ObjectSetInteger ( 0 ,name, OBJPROP_FONTSIZE , 10 ); 
       ObjectSetInteger ( 0 ,name, OBJPROP_STYLE , stl);
       ObjectSetInteger ( 0 ,name, OBJPROP_WIDTH , wid);
       ObjectSetInteger ( 0 ,name, OBJPROP_COLOR , clr);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
       ObjectSetInteger ( 0 ,name, OBJPROP_HIDDEN , true ); 
     }
  }

 
kopeyka2 :
안녕하세요. 어째서인지 핸들은 모든 주기로 설정되어 있을 때만 전송을 하는데 특정 시간에 놓았더니 아무 것도 없습니다. 문제가 무엇인지 불분명합니다. 전역 변수 가 아닌 핸들로 직접 드라이브를 시도했지만 결과는 동일합니다. 뭐가 문제 야???
       ResetLastError ();
   if ( CopyBuffer (handle_ma, 0 , 0 ,count,BufferPrice)< 0 )
     {
       PrintFormat ( "Failed to copy data from the handle_ma indicator, error code %d" , GetLastError ());
       return ( 0.0 );
     }
//   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);

오류를 연구하십시오. Artyom은 모든 것을 10 번 확인해야한다고 올바르게 말합니다 ...

 2019.01 . 25 20 : 12 : 26.169 Test777 (Si Splice,M1)  Failed to copy data from the handle_ma indicator, error code 4806

ERR_INVALID_ARRAY

4006

잘못된 유형의 배열, 잘못된 크기 또는 깨진 동적 배열 개체


ERR_INDICATOR_DATA_NOT_FOUND

4806

요청한 데이터를 찾을 수 없음


 
kopeyka2 :
안녕하세요. 어째서인지 핸들은 모든 주기로 설정되어 있을 때만 전송을 하는데, 특정 시간에 놓았더니 아무 것도 없습니다. 문제가 무엇인지 불분명합니다. 전역 변수 가 아닌 핸들로 직접 드라이브를 시도했지만 결과는 동일합니다. 뭐가 문제 야??? 값은 한 기간의 값이어야 합니다.

Scriptor의 표시기에서 CodeBase의 예를 가져오셨습니까? 권리? 그런 다음 해당 코드(최근에 게시됨)에서 이름이 MTF로 나타나지만 MCP가 없는 예를 찾습니다.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. 즉, 현재 기호에 대한 데이터를 수신하지만 차트 기간과 다른 시간대의 데이터를 수신하려면 다중 시간대 표시기의 예가 필요합니다. 아직 MCP로 올라갈 가치가 없습니다. 표준 클래스를 사용하는 OOP에 있습니다. 혼란스러워.

예를 들어 이 계산은 다음과 같습니다.

 //--- Подготовка данных
   int count=(limit> 1 ? rates_total : 2 ),copied= 0 ;
   copied= CopyBuffer (handle_ma, 0 , 0 ,count,BufferPrice);
   if (copied!=count) return 0 ;

현재 기간 및 기호에서 작동하는 MA에만 해당됩니다. 다른 기간에 작업하는 경우 계산이 다릅니다. 봐 - 모든 것이 가깝고 나는 당신에게 방향을 제안했습니다.

 
Artyom Trishkin :

Scriptor의 표시기에서 CodeBase의 예를 가져오셨습니까? 권리? 그런 다음 해당 코드(최근에 게시됨)에서 이름이 MTF로 나타나지만 MCP가 없는 예를 찾습니다.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. 즉, 현재 기호에 대한 데이터를 수신하지만 차트 기간과 다른 시간대의 데이터를 수신하려면 다중 시간대 표시기의 예가 필요합니다. 아직 MCP로 올라갈 가치가 없습니다. 표준 클래스를 사용하는 OOP에 있습니다. 혼란스러워.

예를 들어 이 계산은 다음과 같습니다.

현재 기간 및 기호에서 작동하는 MA에만 해당됩니다. 다른 기간에 작업하는 경우 계산이 다릅니다. 봐 - 모든 것이 가깝고 나는 당신에게 방향을 제안했습니다.

감사해요...
 
Aleksey Vyazmikin :

오류를 연구하십시오. Artyom은 모든 것을 10 번 확인해야한다고 올바르게 말합니다 ...

ERR_INVALID_ARRAY

4006

잘못된 유형의 배열, 잘못된 크기 또는 깨진 동적 배열 개체

감사해요
 
kopeyka2 :
감사해요

제발, 방금 잘못된 오류를 복사했습니다. 다음과 같아야합니다.

ERR_INDICATOR_DATA_NOT_FOUND

4806

요청한 데이터를 찾을 수 없음

결론은 막대의 수가 시간대에 따라 다르며 이를 고려해야 한다는 것입니다.

 
Aleksey Vyazmikin :

제발, 방금 잘못된 오류를 복사했습니다. 다음과 같아야합니다.

ERR_INDICATOR_DATA_NOT_FOUND

4806

요청한 데이터를 찾을 수 없음

결론은 막대의 수가 시간대에 따라 다르며 이를 고려해야 한다는 것입니다.

방금 이것을 확인했습니다. 그러나 문제는 핸들을 하나의 일정한 기간 동안 설정함으로써

다른 시간대의 CopyBuffer 값은 전송되지 않습니다. 설정된 핸들 기간에 값은 이었고 더 작은 기간에는 0.0(영)이었습니다. 버퍼를 찾아 이동... 0. CopyBuffer에 전달되지 않는 이유는 무엇입니까?

사유: