기고글 토론 "MQL4에서 MQL5로 이전하기" - 페이지 4

 
Interesting :

이 디자인의 기능에 대해 많이 의심하기 시작했습니다. 블록의 논리를 이해하려고 아무리 노력해도 이해할 수 없었습니다(그리고 열심히 노력했습니다)....

의심이란 무엇인가요? 그것은 올바르게 계산됩니다.

//+------------------------------------------------------------------+
//|test.mq5 |
//+------------------------------------------------------------------+
#include <InitMQL4.mqh>
double   close[];
int      total,count;
datetime time[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   count=Bars(_Symbol,_Period);
   total=CopyClose(_Symbol,_Period,0,count,close);
   total=CopyTime(_Symbol,_Period,0,count,time);
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   int N=7;
   int shift=iBarShiftMQL4(_Symbol,_Period,time[N]);
   Print("TIME",time[N],"BAR=",shift," CLOSE=",close[shift]);
  }
//+------------------------------------------------------------------+
int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
//+------------------------------------------------------------------+
[삭제]  
DC2008 :

뭐가 문제인가요? 숫자를 제대로 세고 있습니다.

이제 핵심을 짚어보겠습니다.


1. MT4에서 이 줄을 작성하고 H4에서 코드를 실행합니다.

Print(iBarShift(Symbol(),Period(),1274356800,false)); //날짜 20.05.2010 12:00 pm

그런 다음 MT5와 문자열에 대해 동일한 작업을 수행합니다.

int shift=iBarShiftMQL4(_Symbol,_Period,StringToTime("20.05.2010 12:00"),false);

결과적으로 8을 얻습니다.


2. 그 후 정확히 동일한 작업을 수행하지만 D1을 사용합니다.

결과적으로 MT4는 1을 반환하고 MT5는 0을 반환합니다.

이제 iBarShiftMQL4의이 구현이 필요한 것과 얼마나 일치하는지 누가 말할 수 있습니까?

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
 

이걸 사용해보세요:

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
     {
      if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
      if(time<time1) return(1);
      else return(0);
     }
   else return(-1);
  }
 

다시 말하지만, 지금 쓰고 있는 기능에 대해 읽어보셨나요?

MCL4에서는 다음과 같이 정확하게 작성됩니다.

double iClose( string symbol, int timeframe, int shift)
shift 매개변수로 지정된 해당 차트(심볼, 차트주기)에서 막대의 종가 값을 반환합니다. 오류가 있는 경우 이 함수는 0을 반환합니다. 오류에 대한 자세한 정보를 얻으려면 GetLastError() 함수를 호출합니다.
현재 차트의 경우 종가에 대한 정보는 미리 정의된 Close[] 배열에 있습니다.

그리고 당신은....

return(-1);

운영자가 무엇을 보고 있는지...

 

감사합니다, CoreWinTT.

고정 함수: iClose, iLow, iHigh, iOpen, iTime, iVolume. 오류 발생 시 -1 대신 0을 반환합니다.

 

언제 도서관에 올까요?

그래서 그들은 적어도

왜냐하면 당신이 그것을 열면 질문이 발생하고 위의 쓰여진????의 의미가 발생하기 때문입니다.

또한 적어도 모든 질문이 해결 된 기능을 수집하고 나머지의 오류를 연구하기 위해 진행합니다.

 
bool  SetIndexBuffer(
   int                    index,         // 버퍼 인덱스
   double                 buffer[],      // 배열
   ENUM_INDEXBUFFER_TYPE  data_type      // 저장할 내용
   );

얼마 전 누군가가 μl4 환경을 만드는 영리한 방법을 제안했습니다.

의 배열을 사용하여

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[])

배열을 사용하자는 제안을 했지만, 이 배열은 const 상태를 가지고 있기 때문에 사용하기가 어려울 것입니다.

전역 버퍼를 만들 수 없습니다.

를 선언해야 하기 때문입니다.

SetIndexBuffer

지정된 표시기 버퍼를 전역으로 선언된 double 타입의 1차원 동적 배열과 연결합니다.

하지만 이중 타입만 가능하며, 날짜-시간 타입의 볼륨과 배열은 전달되지 않습니다.

남은 것은 mql4 모듈 내에서 이러한 배열을 시작하는 것뿐입니다.

이는 사실상 표시기.... 를 다시 작성하는 것과 같습니다.

 
CoreWinTT:

언제 도서관에 올까요???

이미 있습니다.
 
비어 있고 비어 있고 정의 만 있고 그 이상은 없습니다....
[삭제]  
CoreWinTT:

언제 도서관에 올까요?

그래서 그들은 적어도

왜냐하면 당신이 그것을 열면 질문이 발생하고 위의 쓰여진????의 의미가 발생하기 때문입니다.

또한 적어도 모든 질문이 해결되는 기능을 수집하고 나머지 부분에서 오류를 연구하기 위해 진행합니다.

오랫동안 개인 라이브러리에는이 주제에 대한 많은 솔루션이 있습니다.

예를 들어, 저는 처음부터 IsTesting () 및 이와 유사한 것들을 사용해 왔으며 모든 것이 오랫동안 날짜와 시간으로 해결되었습니다 (물론 다른 솔루션도 있습니다)....

또 다른 한 가지는 MT5 자체에 이러한 "오래된 솔루션"이 있다는 것입니다 ...