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

 
Roman Sharanov :

나는 또한 심각한 결함을 발견했습니다. CopyClose() 호출 이 많이

루프의 통화 쌍 배열에서 인용문을 복사하는 방법을 알려주실 수 있습니까?

이중 배열이 있어야 하지만 MQL은 이를 지원하지 않습니다.

MQL4는 2차원 동적 배열에서 작동하는 것으로 보이며, ArayResize()를 통해 첫 번째 배열 차원을 직접 변경하고 두 번째 차원을 CopyClose ( )에 전달합니다.

2차원 동적 배열이 MQL5에서 작동하지 않기 때문에 1차원 배열을 구조에 래핑하고 이러한 구조의 배열을 생성합니다... 데이터 및 저장 속성(필드)에 클래스
 
Igor Makanu :

MQL4는 2차원 동적 배열에서 작동하는 것으로 보이며, ArayResize()를 통해 첫 번째 배열 차원을 직접 변경하고 두 번째 차원을 CopyClose ( )에 전달합니다.

2차원 동적 배열이 MQL5에서 작동하지 않기 때문에 1차원 배열을 구조에 래핑하고 이러한 구조의 배열을 생성합니다... 데이터 및 저장 속성(필드)에 클래스

감사합니다. 시도해 보겠습니다.

 

지표에 대한 또 다른 질문, 여기서 무엇을 더 해야 할지 모르겠습니다.

입력된 쌍의 마감과 이동 평균 간의 차이를 표시해야 합니다.

결과적으로 MA 없이 차이점만 표시되는데 무엇이 문제인가?

 #property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_style1 STYLE_SOLID
#property indicator_type2 DRAW_LINE
#property indicator_style2 STYLE_SOLID
#property indicator_width1 1
#include <MovingAverages.mqh>

input string active_1 = "EURUSD" ;
input string active_2 = "USDJPY" ;
input ENUM_TIMEFRAMES timeframe = PERIOD_H1 ;
input int ma_period = 30 ;

double firstBuffer[], secondBuffer[], dataBuffer[], maBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , dataBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 , maBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 2 , firstBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 3 , secondBuffer, INDICATOR_CALCULATIONS );
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {
//---

   CopyClose (active_1,timeframe, 0 ,rates_total,firstBuffer);
   CopyClose (active_2,timeframe, 0 ,rates_total,secondBuffer);

   int first, bar;
   if (prev_calculated == 0 ) first = begin; else first = prev_calculated - 1 ;

   for (bar = first; bar<rates_total; bar++){
      dataBuffer[bar] = firstBuffer[bar]-secondBuffer[bar];
   }

   ExponentialMAOnBuffer(rates_total,prev_calculated,begin,ma_period,dataBuffer,maBuffer);
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu :

루프에서 주문을 정렬해야 합니다. 모든 틱마다가 아니라 ... 더 정확하게 말하면 틱이 와서 루프에서 모든 주문을 계산했습니다. for(j=0;j<OrderTotal;j++)

OrdersTotal()은 열려 있는 주문의 수를 보여줍니다(모든 상품에 대한 주문을 포함하여 보류 중인 주문 포함 ... 일반적으로 ... 터미널에서 볼 수 있는 미결 주문의 수, 즉 얼마나 많은 주문인지)))

0에서 OrdersTotal()-1까지 배열에서와 같이 주문 번호 매기기 - 이것은 마지막 주문이며, 아마도 각 틱에서 로그에 존재하지 않는 티켓을 출력할 것입니다. # [OrdersTotal()] 또는 기타 어려운 정보 추측합니다

예, 그렇습니다. 그리고 나는 그가 모든 명령을 통과하기를 원합니다. 처음에는 기능이 조금 달랐지만, 원인을 찾고 고쳐나가길 바라는 마음에서 최대한 단순화 시켰습니다. 전체 순차 열거는 드물게 틱이 발생하거나 차트에서 어드바이저를 제거하고 새 틱이 도착하지 않은 경우에만 발생합니다.

나는 항상 EA가 함수의 본문에 들어가면 루프를 종료할 때까지 다른 틱에 더 이상 응답하지 않아야 한다고 생각했지만, 그렇지 않은 것 같습니다. 이 상황을 해결하는 방법은 무엇입니까?

테스트()
{
정수 합계;
총계 = OrdersTotal();
log("총계 = " + 총계 +"; ");

(int j = 0; j < 총계; j++)
{
log("j = " + j +"; ");
}
반환(0);
}

 
Андрей :
매 틱마다 모든 주문에 대한 정보가 필요한 이유는 무엇입니까? 예를 들어 매 분, 5분, ..., 매시와 같이 주문 보기에 대한 제한을 도입하는 것이 좋지 않을까요?

문제는 각 틱에 대한 정보가 필요하다는 것조차 아니지만, 올바르게 이해하면 새 틱이 도착하기 전에 주기가 끝날 시간이 없고 새 틱이 어떻게 든 카운트를 중단한다는 것입니다. 이전 스크린샷을 찾지 않으시도록 다시 스크린샷을 첨부하겠습니다. EA가 52로 계산된 다음 93으로 점프했음을 보여줍니다. 드물게 틱이 발생하면 어드바이저가 차트에서 제거된 후 마지막 주기와 마찬가지로 계정이 정상적으로 종료됩니다.

코드는 이미 최대한 단순화되었습니다.

테스트()
{
정수 합계;
총계 = OrdersTotal();
log("총계 = " + 총계 +"; ");

(int j = 0; j < 총계; j++)
{
log("j = " + j +"; ");
}
반환(0);
}

파일:
test.jpg  82 kb
 
Artyom Trishkin :

이것을 어떻게 압니까? 이것은 사실이 아닙니다.

틱 도착으로 시작된 모든 계산이 완료될 때까지 모든 후속 틱은 건너뜁니다 .

조금 더 높게 썼으니 저도 같은 상황인데 이미 극한까지 단순화 시켜놓고 정상적으로는 어떤 계산을 할 수 없을 뿐만 아니라 단순히 순서대로 나열해서 정리하면 된다는 결론에 이르렀습니다. 로그에 숫자를 표시합니다.

나는 또한 항상 "틱의 도착으로 시작된 모든 계산이 완료될 때까지 모든 후속 틱은 건너뜁니다."라고 믿었습니다. 그러고 싶지만 새로운 진드기 외에는 다른 이유를 찾을 수 없습니다.

 
Artyom Trishkin :

코드 없이는 아무도 알 수 없습니다.

다음은 동일한 문제가 있는 매우 단순화된 코드입니다. 새 틱은 주문 번호의 순차적 표시를 깨뜨립니다.

테스트()
{
정수 합계;
총계 = 주문 총계() ;
log("총계 = " + 총계 +"; ");

(int j = 0; j < 총계; j++)
{
log("j = " + j +"; ");
}
반환(0);
}

 
Algotrader18 :

다음은 동일한 문제가 있는 매우 단순화된 코드입니다. 새 틱은 주문 번호의 순차적 표시를 깨뜨립니다.

테스트()
{
정수 합계;
총계 = OrdersTotal();
log("총계 = " + 총계 +"; ");

(int j = 0; j < 총계; j++)
{
log("j = " + j +"; ");
}
반환(0);
}

이 코드는 오류 없이 컴파일됩니까? 난 믿지 않아...
 
Roman Sharanov :

지표에 대한 또 다른 질문, 여기서 무엇을 더 해야 할지 모르겠습니다.

입력된 쌍의 마감과 이동 평균 간의 차이를 표시해야 합니다.

결과적으로 MA 없이 차이점만 표시되는데 무엇이 문제인가?

이것은 훌륭합니다!

소설!

예를 들어, 저는 20년의 경험을 가진 성공적인 거래자입니다.

"입력된 쌍의 마감과 이동 평균 간의 차이"가 필요한 이유를 이해하지 못합니다.

또한 이러한 차이를 기반으로 이동 평균을 만들 수 있습니까? - 공상!

견적을 기반으로 이동 평균을 구축하는 방법을 알고 있습니까? - 그것도 아니요?

그래서 문제가 무엇입니까?

 
Algotrader18 :

다음은 동일한 문제가 있는 매우 단순화된 코드입니다. 새 틱은 주문 번호의 순차적 표시를 깨뜨립니다.

테스트()
{
정수 합계;
총계 = OrdersTotal();
log("총계 = " + 총계 +"; ");

(int j = 0; j < 총계; j++)
{
log("j = " + j +"; ");
}
반환(0);
}

이 코드는 작동합니다. 유추하여 수행하십시오.

 int NumberOfOrders( int magic_)
  {
   int i,res= 0 ,k= OrdersTotal (); string sy= Symbol ();
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if (( OrderMagicNumber ()==magic_) && ( OrderSymbol ()==sy)) res++;
        }
     }
   return (res);
  }