오류, 버그, 질문 - 페이지 1175

 
A100 :

.............. 함수(검색, 계산 등)는 일반적으로 길이/크기를 반환하거나 실패 시 -1을 반환하여 오류 처리를 크게 단순화합니다.

값 범위의 절반을 희생할 정도는 아닙니다.
 

인사말. 역 신호의 경우 주문 그리드에 대한 공통 테이크를 설정하는 데 사용할 함수를 초보자에게 알려주십시오.

 
파일 작업 마스터하기. MQL4/5가 csv 또는 txt 파일에서 더 빠른지 아는 사람이 있습니까?
 
paladin800 :
파일 작업 마스터하기. MQL4/5가 csv 또는 txt 파일에서 더 빠른지 아는 사람이 있습니까?
큰 상자
 
papaklass :
파일 작업을 통해 어떤 작업을 해결하려고 합니까?
위치의 상태를 파일에 쓰고 이 데이터를 동일한 MT4로 읽어야 합니다. 한 캐릭터의 위치를 다른 캐릭터와 연관시켜야 합니다. 예를 들어 EURUSD 의 포지션 수 에 이미 제한이 있는 경우 GBPUSD에 대해 더 이상 열지 마십시오. 파일 작업 없이도 할 수 있습니다. 파일 작업으로 작업 하는 방법을 배워서 시야를 넓히고 싶습니다.
 

다른 연결된 리소스 표시기를 사용하는 Expert Advisor에서 연결된 리소스 표시기를 호출하는 방법에 대한 코드 예제를 제공하십시오. 예를 들어 인디케이터 A가 있는데 거기에서 B가 호출 되고 A를 사용하는 Expert Advisor C도 있습니다.

이와 관련하여 도움말이 이해하기 어려울 정도로 작성되었습니다. 표시기 A의 일반적인 구성: #resource "\\Indicators\B.ex4" 그리고 iCustom(::Indicators\B.ex4) - 표시기 A를 단독으로 실행할 때 제대로 작동합니다. 그러나 A가 #resource "\\Indicators\A.ex4" EA에 삽입 되면 중첩 표시기에 대해 리소스를 로드할 수 없음 오류가 발생합니다. 이는 어떤 이유로 라이브러리 디렉토리가 언급되는 완전히 비뚤어진 합성 경로를 나타냅니다. 표시기 B는 자체 내부에서 검색됩니다( MQL4\Libraries\::Indicators\B.ex4::Indicators\B.ex4 ).

 
meat :

ArraySize 에 관해서는 요전에 MQL4에서 비슷한 문제를 제기했습니다: https://www.mql5.com/ru/forum/152471 . 내가 이해하는 한 MQL5에서는 모든 것이 이 계획과 동일해야 합니다.

그리고 이 969 빌드는 언제 나타났습니까? 어쩐지 제 호소를 들어주셨나 봐요. :) 이 문제에 대해 서비스 데스크에서는 옵티마이저의 잘못된 작업에 원인이 있고, 새 빌드에서는 uint로 타입을 변경하겠다고 답변했습니다. 더 정확하게는, 사실 문서화되지 않은 여전히 uint입니다. :) 그런데 ArrayResize도 uint로 변경됩니다. 나는 그들에게 즉시 ulong 으로 변경하라고 조언했습니다. 그렇지 않으면 가까운 장래에 대용량을 저장할 때 32비트 값이 부족하기 때문에 이 문제로 돌아가야 할 것입니다.

오류 시 -1 값에 대해서는 다음과 같은 이유로 문제가 없어야 합니다. (int)-1 = (uint)-1 = 0xFFFFFFFF = UINT_MAX, 즉 비트 표현은 동일합니다. 사실, 비교 작업은 이미 다른 결과를 제공합니다. 저것들. 코드가 다음과 같은 경우:

그것은 올바르지 않을 것입니다.

다시 한 번 요청에 감사드립니다. ArraySize 및 ArrayRange 함수의 반환 유형을 변경하지 않고 int 유형을 그대로 두고 코드 최적화 프로그램을 수정했습니다. 이제 귀하가 설명한 오류가 없을 것입니다.

MQL 배열의 총 요소 수는 INT_MAX를 초과할 수 없으며 변경되지 않습니다.
MQL 프로그램에 더 큰 배열이 필요한 경우 별도의 클래스(예: CBigArray)를 생성해야 합니다.
 

mql5에서 iCustom을 마스터하려고합니다. 그는 mql4의 마스터였습니다 :)

작업은 MACD와 유사한 것을 그리는 것이지만 빠른 이동 평균 대신 예제 폴더에 있는 VIDYA 표시기를 사용해야 합니다.

표준 MACD 코드를 사용하고 빠른 이동 평균 대신 VIDYA에 대한 매개변수를 삽입했습니다. 문제는 모든 것이 컴파일되지만 아무것도 그려 지지 않는다는 것입니다.

아래 코드에서 표준 MACD 코드를 변경한 2곳을 강조 표시했습니다. 다른 모든 것은 동일합니다. 내가 놓친 다른 것을 알려주세요. 나는 그것이 코드의 어딘가에 있다고 가정합니다 ...

 //+------------------------------------------------------------------+
//|                                                         MACD.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright    "2009, MetaQuotes Software Corp."
#property link          "http://www.mql5.com"
#property description "Moving Average Convergence/Divergence"
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots    2
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_type2   DRAW_LINE
#property indicator_color1  Silver
#property indicator_color2  Red
#property indicator_width1   2
#property indicator_width2   1
#property indicator_label1   "MACD"
#property indicator_label2   "Signal"
//--- input parameters
 Первый вставленный кусок:
input int                  Per= 7 ;               // Per
input int                 Per1= 21 ;             // Per1
input int                 Shift= 0             // Shift
 Конец

input int                 InpSlowEMA= 84 ;               // Slow EMA period
input int                 InpSignalSMA= 9 ;               // Signal SMA period
input ENUM_APPLIED_PRICE InpAppliedPrice= PRICE_CLOSE ; // Applied price
//--- indicator buffers
double                    ExtMacdBuffer[];
double                    ExtSignalBuffer[];
double                    ExtFastMaBuffer[];
double                    ExtSlowMaBuffer[];
//--- MA handles
int                       ExtFastMaHandle;
int                       ExtSlowMaHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtMacdBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,ExtSignalBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,ExtFastMaBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 3 ,ExtSlowMaBuffer, INDICATOR_CALCULATIONS );
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger ( 1 , PLOT_DRAW_BEGIN ,InpSignalSMA- 1 );
//--- name for Dindicator subwindow label
   IndicatorSetString ( INDICATOR_SHORTNAME , "MACD(" + string (InpSlowEMA)+ "," + string (InpSignalSMA)+ ")" );
//--- get MA handles
 Второй вставленный кусок
   ExtFastMaHandle= iCustom ( NULL , 0 , "Examples\\VIDYA" ,
                     Per,
                     Per1,
                     Shift
                     );
 Конец
   ExtSlowMaHandle= iMA ( NULL , 0 ,InpSlowEMA, 0 , MODE_SMA ,InpAppliedPrice);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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 &TickVolume[],
                 const long &Volume[],
                 const int &Spread[])
  {
//--- check for data
   if (rates_total<InpSignalSMA)
       return ( 0 );
//--- not all data may be calculated
   int calculated= BarsCalculated (ExtFastMaHandle);
   if (calculated<rates_total)
     {
       Print ( "Not all data of ExtFastMaHandle is calculated (" ,calculated, "bars ). Error" , GetLastError ());
       return ( 0 );
     }
   calculated= BarsCalculated (ExtSlowMaHandle);
   if (calculated<rates_total)
     {
       Print ( "Not all data of ExtSlowMaHandle is calculated (" ,calculated, "bars ). Error" , GetLastError ());
       return ( 0 );
     }
//--- we can copy not all data
   int to_copy;
   if (prev_calculated>rates_total || prev_calculated< 0 ) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
       if (prev_calculated> 0 ) to_copy++;
     }
//--- get Fast EMA buffer
   if ( IsStopped ()) return ( 0 ); //Checking for stop flag
   if ( CopyBuffer (ExtFastMaHandle, 0 , 0 ,to_copy,ExtFastMaBuffer)<= 0 )
     {
       Print ( "Getting fast EMA is failed! Error" , GetLastError ());
       return ( 0 );
     }
//--- get SlowSMA buffer
   if ( IsStopped ()) return ( 0 ); //Checking for stop flag
   if ( CopyBuffer (ExtSlowMaHandle, 0 , 0 ,to_copy,ExtSlowMaBuffer)<= 0 )
     {
       Print ( "Getting slow SMA is failed! Error" , GetLastError ());
       return ( 0 );
     }
//---
   int limit;
   if (prev_calculated== 0 )
      limit= 0 ;
   else limit=prev_calculated- 1 ;
//--- calculate MACD
   for ( int i=limit;i<rates_total && ! IsStopped ();i++)
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
   SimpleMAOnBuffer(rates_total,prev_calculated, 0 ,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Nilog :

mql5에서 iCustom을 마스터하려고합니다. 그는 mql4의 마스터였습니다 :)


로그에 무엇을 기록합니까? 오류 검사가 없습니다(예: 핸들을 가져올 때). 새 표시기의 버퍼 번호가 이전 표시기와 일치합니까?
 

모르겠어, 이미 그랬을지도 모르지만, 문제는 이 새로운 bar , 버퍼에 대한 PLOT_EMPTY_VALUE 값이 0.0 으로 설정되어 있는데, 사실 가끔은 완전히 다른 값이 있다는 것이다.