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

 
Vitaly Muzichenko :

사이클에서는 그렇게 보이며 기능 없이도 할 수 있습니다.

고맙습니다.

그러나 나는 기능을 제거했습니다 - 브레이크는 남아있었습니다 .... 젠장.

 
Aleksey Vyazmikin :

고맙습니다.

그러나 나는 기능을 제거했습니다 - 브레이크는 남아있었습니다 .... 젠장.

나는 어떻게 든 4=>5에서 프로그램을 다시 작성하기 시작한 다음 4-ke에서 Low[1], Time[0] 및 기타와 같은 모든 구성을 현대적인 것으로 대체했습니다. 즉, CopyLow , CopyTime , 프로그램 4에서도 -ke 작업이 빨라졌습니다. 이제 나는 오래된 디자인을 사용하지 않고 새로운 디자인만 사용합니다. 따라서 코드를 5th 플랫폼으로 쉽게 전송할 수 있으며 거래 기능만 변경하면 됩니다.

 
Vitaly Muzichenko :

나는 어떻게 든 4=>5에서 프로그램을 다시 작성하기 시작한 다음 4-ke에서 Low[1], Time[0] 및 기타와 같은 모든 구성을 현대적인 것으로 대체했습니다. 즉, CopyLow , CopyTime , 프로그램 4에서도 -ke 작업이 빨라졌습니다. 이제 나는 오래된 디자인을 사용하지 않고 새로운 디자인만 사용합니다. 따라서 코드를 5th 플랫폼으로 쉽게 전송할 수 있으며 거래 기능만 변경하면 됩니다.

재채기를 할 때마다 어레이를 채우는 데 리소스가 소모되지 않습니까?

막대가 열렸을 때 정보를 배열에 복사한 다음 거기에서 코드로 가져오는 것이 합리적일 수 있습니까? 바가 열리면 거래합니다.

 
Aleksey Vyazmikin :

재채기를 할 때마다 어레이를 채우는 데 리소스가 소모되지 않습니까?

막대가 열렸을 때 정보를 배열에 복사한 다음 거기에서 코드로 가져오는 것이 합리적일 수 있습니까? 바가 열리면 거래합니다.

어레이는 새 막대에 채워질 수 있으므로 더 적은 리소스가 소비됩니다. 예를 들어 여러 곳에서 iLow[1]로 작업하는 경우 변수에 한 번 넣고 배열이 아닌 변수를 읽는 것이 바람직합니다.

그렇게 가정하자

 // Инициализация TIME[0] TIME[1]
   ArraySetAsSeries (TM, true );
   if ( CopyTime (dSymbol, Period (), 0 , 2 ,TM)< 0 ) return ;
  TIME_0=TM[ 0 ];
  TIME_1=TM[ 1 ];
다음으로 TM[ 0 ] TM[ 1 ] 이 아닌 TIME_0 및 TIME_1 변수로 작업합니다.
 
Vitaly Muzichenko :

어레이는 새 막대에 채워질 수 있으므로 더 적은 리소스가 소비됩니다. 예를 들어 여러 곳에서 iLow[1]로 작업하는 경우 변수에 한 번 넣고 배열이 아닌 변수를 읽는 것이 바람직합니다.

그렇게 가정하자

그러나 MT4는 훨씬 더 빠릅니다. 실망스럽습니다.

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

Aleksey Vyazmikin , 2017.07.21 15:07

왜 환상을 가지고 있습니까? 나는 당신의 아이디어를 이해했고 그것이 작동하고 있음을 확인했으며 요청이 한 번 발생하고 고문이 작동하는 데 몇 개의 막대가 필요한지 안다면 효과를 줄 것입니다.

아니면 다른 사람이 구조를 사용하도록 제안했습니까? 그럼 화내지 말고 설명해주세요!


환상이 없습니다. 하나의 양초에 대해 2개 이상의 매개변수를 가져와야 하는 경우 메시지/질문에서 함수를 사용하여 각 양초 매개변수에 대해 이 함수를 개별적으로 호출해야 합니다. 즉, Copy***()를 2회 이상 수행하지만 CopyRates()를 사용하면 한 번의 복사 호출만 필요합니다.

복사할 양은 완전히 다른 문제입니다. 원하는 표시기 값이 있는 막대를 먼저 계산한 다음 복사해야 할 수도 있습니다. 제 기억이 맞다면 복사할 양을 알 수 없다고 했습니다. 우리는 어떤 환상에 대해 이야기하고 있습니까?

극단적인 경우에는 10개의 막대를 복사하고 그 중에서 검색할 수 있습니다. 찾지 못하면 다른 10개를 복사합니다. 복사는 비용이 많이 드는 작업이며 배열을 정렬하는 것이 더 저렴합니다.

일반적으로 많은 옵션이 있습니다. 이 모든 것을 문서화하는 것은 불가능하며 더 이상 문서화되지 않을 것입니다. 이것은 프로그래밍 수업에서 가르칩니다. 그러나 불행하게도 모든 교사가 이것을 하는 방법을 아는 것은 아니며 모든 학생이 교실에서 이것을 이해하기를 원하는 것도 아닙니다. 그리고 아주 시작은 교사가 문제에 대한 자세한 설명을 요구하는 2-5학년의 산수 수업에 있습니다. 그러나 여기에 동일한 문제가 있습니다.

 
Alexey Viktorov :

환상이 없습니다. 하나의 양초에 대해 2개 이상의 매개변수를 가져와야 하는 경우 메시지/질문에서 함수를 사용하여 각 양초 매개변수에 대해 이 함수를 개별적으로 호출해야 합니다. 즉, Copy***()를 2회 이상 수행하지만 CopyRates()를 사용하면 한 번의 복사 호출만 필요합니다.

복사할 양은 완전히 다른 문제입니다. 원하는 표시기 값이 있는 막대를 먼저 계산한 다음 복사해야 할 수도 있습니다. 제 기억이 맞다면 복사할 양을 알 수 없다고 했습니다. 우리는 어떤 환상에 대해 이야기하고 있습니까?

극단적인 경우에는 10개의 막대를 복사하고 그 중에서 검색할 수 있습니다. 찾지 못하면 다른 10개를 복사합니다. 복사는 비용이 많이 드는 작업이며 배열을 정렬하는 것이 더 저렴합니다.

일반적으로 많은 옵션이 있습니다. 이 모든 것을 문서화하는 것은 불가능하며 더 이상 문서화되지 않을 것입니다. 이것은 프로그래밍 수업에서 가르칩니다. 그러나 불행하게도 모든 교사가 이것을 하는 방법을 아는 것은 아니며 모든 학생이 교실에서 이것을 이해하기를 원하는 것도 아닙니다. 그리고 아주 시작은 교사가 문제에 대한 자세한 설명을 요구하는 2-5학년의 산수 수업에 있습니다. 그러나 여기에도 같은 문제가 있습니다.

환상에 대해 - "말한 내용을 이해하려고 하는 대신 무슨 일이 일어나는지 알아내기 위해 몇 가지 놀라운 반대가 제기됩니다."라는 귀하의 진술에 대한 응답이 있었고, 귀하가 제안한 옵션이 환상의 영역에서 나왔다는 사실에는 응답하지 않았습니다. .

나는 당신의 개념을 완벽하게 이해하고 이것은 당신에 대한 답변에 나와 있습니다.

그러나 알 수 없는 양의 데이터로 작업을 제안하는 방법을 잘 이해하지 못했습니다. 코드 형식으로 예제를 제공할 수 있습니까?

 

이 링크를 사용하여 지표를 감사하고 최적화하는 데 도움을 요청합니다. https://www.mql5.com/en/code/16805 - 문제는 많은 수의 막대가 나타날 때 지표가 많이 느려지기 시작한다는 것입니다. 테스트 중에 나타납니다.

그리고 모든 눈금이 아니라 막대를 열 때만 계산하는 방법은 무엇입니까? 고문의 방법이 맞지 않았습니다. 첫 번째 눈금 후에 모든 값이 사라지고 다음 막대에만 나타납니다...

Donchian Channel MTF
Donchian Channel MTF
  • 투표: 13
  • 2016.12.13
  • Mladen Rakic
  • www.mql5.com
Мультитаймфреймовая версия канала Дончиана.
 
Aleksey Vyazmikin :

환상에 대해 - "말한 내용을 이해하려고 하는 대신 무슨 일이 일어나는지 알아내기 위해 몇 가지 놀라운 반대가 제기됩니다."라는 귀하의 진술에 대한 응답이 있었고, 귀하가 제안한 옵션이 환상의 영역에서 나왔다는 사실에는 응답하지 않았습니다. .

나는 당신의 개념을 완벽하게 이해하고 이것은 당신에 대한 답변에 나와 있습니다.

그러나 알 수 없는 양의 데이터로 작업을 제안하는 방법을 잘 이해하지 못했습니다. 코드 형식으로 예제를 제공할 수 있습니까?


전에 답변...

알렉세이 빅토로프 :

극단적인 경우에는 10개의 막대를 복사하고 그 중에서 검색할 수 있습니다. 찾지 못하면 다른 10개를 복사합니다. 복사는 비용이 많이 드는 작업이며 배열을 정렬하는 것이 더 저렴합니다.

그러나 손전등의 양은 없는 것이 좋으며 한 장으로 버틸 수 있도록 거의 최대입니다.

예제 코드는 작성하지 않겠습니다. 일반 프로그래머는 힌트만 있으면 됩니다. 다음은 예제 알고리즘입니다.

  1. 채널이 교차하는 거리에서 대략적인 막대 수를 결정합니다. 15로 둡니다.
  2. 두 표시기 버퍼를 모두 복사합니다.
  3. CopyRates()를 사용하여 막대 값 복사
  4. 루프에서 낮은 막대와 채널의 아래쪽 경계를 비교하는 것과 동시에 채널의 위쪽 경계와 높은 막대의 값을 비교하기 시작합니다. 교차점 중 하나가 발견되면 막대 인덱스를 변수에 저장하고 두 번째 교차점을 계속 찾습니다. 교차 막대 인덱스의 두 변수가 모두 값을 가질 때 루프를 종료합니다.

따라서 필요한 경우 하나의 사본과 하나의 사이클에서 두 개의 교차점을 찾을 수 있습니다. ArraySetAsSeries()도 필요하지 않습니다. 교차점을 찾을 때 가능하고 제 생각에는 막대 번호가 아니라 시간을 기억하는 것이 좋습니다. 막대의 시간을 알더라도 그 숫자를 결정하는 데 어려움이 없습니다.

질문에주의하십시오 : 표시기 버퍼를 1 값으로 복사하고 상위 막대를 1로 복사하고 이러한 값을 비교하는 루프, 또는 특정 양을 한 번 복사하고 두 배열의 값을 비교하는 루프 서로?

 

어제 다음과 같이 썼습니다.

일:

각 틱 에서 열기, 높음, 낮음, 닫기 및 시간 요소의 "InpCountCopy"를 가져옵니다.

구현:

  1. "0"에서 "InpCountCopy-1"로 루프 - 루프에서 한 번에 하나의 열기, 높음, 낮음, 닫기 및 시간을 얻습니다.
  2. 한 번에 요소를 MqlRates "InpCountCopy" 구조로 가져온 다음 구조를 반복합니다.

기회:

OnTick 또는 OnTimer(1초)에서 확인 방법을 선택할 수 있습니다.

 //+------------------------------------------------------------------+
//|                                      Copy OHLC vc Copy Rates.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.001"
//--- input parameter
input int InpCountCopy= 1000 ;
input bool OnTickOnTimer= false ; // OnTickOnTimer: false -> OnTick, true -> OnTimer 1 second
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   if (OnTickOnTimer)
       EventSetTimer ( 1 );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   if (OnTickOnTimer)
       return ;
   Testing();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   if (!OnTickOnTimer)
       return ;
   Testing();
  }
//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
void Testing()
  {
//--- for once one element
   ulong start= GetMicrosecondCount ();
   for ( int i= 0 ;i<InpCountCopy;i++) // in one operation we get one element.
     {
       double open= iOpen (i);
       double high= iHigh (i);
       double low= iLow (i);
       double close= iClose (i);
       datetime time= iTime (i);
     }
   ulong end= GetMicrosecondCount ()-start;
   string text=(OnTickOnTimer)? "OnTimer" : "OnTick" ;
   text=text+ "\n" + "OHLC: " + IntegerToString (end);

//--- for one operation we get "InpCountCopy" elements.
   start= GetMicrosecondCount ();
   MqlRates Rates[];
   if (!iRates(Rates, 0 ,InpCountCopy))
       return ;
   for ( int i= 0 ;i<InpCountCopy;i++)
     {
       double open=Rates[i].open;
       double high=Rates[i].high;
       double low=Rates[i].low;
       double close=Rates[i].close;
       datetime time=Rates[i].time;
     }
   end= GetMicrosecondCount ()-start;
   text=text+ "\n" + "Rates: " + IntegerToString (end);

   Comment (text);
  }
//+------------------------------------------------------------------+ 
//| Get Open for specified bar index                                 | 
//+------------------------------------------------------------------+ 
double iOpen ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   double Open [ 1 ];
   double open= 0 ;
   int copied= CopyOpen (symbol,timeframe,index, 1 , Open );
   if (copied== 1 )
      open= Open [ 0 ];
   return (open);
  }
//+------------------------------------------------------------------+ 
//| Get the High for specified bar index                             | 
//+------------------------------------------------------------------+ 
double iHigh ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   double High [ 1 ];
   double high= 0 ;
   int copied= CopyHigh (symbol,timeframe,index, 1 , High );
   if (copied== 1 )
      high= High [ 0 ];
   return (high);
  }
//+------------------------------------------------------------------+ 
//| Get Low for specified bar index                                  | 
//+------------------------------------------------------------------+ 
double iLow ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   double Low [ 1 ];
   double low= 0 ;
   int copied= CopyLow (symbol,timeframe,index, 1 , Low );
   if (copied== 1 )
      low= Low [ 0 ];
   return (low);
  }
//+------------------------------------------------------------------+ 
//| Get Close for specified bar index                                | 
//+------------------------------------------------------------------+ 
double iClose ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   double Close [ 1 ];
   double close= 0 ;
   int copied= CopyClose (symbol,timeframe,index, 1 , Close );
   if (copied== 1 )
      close= Close [ 0 ];
   return (close);
  }
//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   datetime Time [ 1 ];
   datetime time= 0 ;
   int copied= CopyTime (symbol,timeframe,index, 1 , Time );
   if (copied== 1 )
      time= Time [ 0 ];
   return (time);
  }
//+------------------------------------------------------------------+ 
//| Get Rates for specified bar index                                | 
//+------------------------------------------------------------------+ 
bool iRates( MqlRates   &Rates[], const int index, int count, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   int copied= CopyRates (symbol,timeframe,index,count,Rates);
   if (copied!=count)
       return ( false );
//---
   return ( true );
  }
//+------------------------------------------------------------------+


파일:
사유: