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

 
Aleksandr Slavskii #:

"틱 배열에서 최대값 찾기"-무엇의 최대값을 찾아야 하나요?

틱스[복사된-1].bid 또는 틱스[복사된-1].flags

농담입니다)))))


복사 틱과 복사 속도를 혼동했을 가능성이 높지만 거기에도 구조 배열이 있고 필요한 구조의 요소를 지정할 수 있습니다.

double PrevClose = rates[copied-1].close;

코드에 추가 줄이 생겼습니다.

CopyTicks와 CopyRates는 복사할 때 배열 크기 자체를 할당하기 때문에 이 줄은 필요하지 않습니다.

힌트 주셔서 감사합니다. 몰랐네요. 만일을 대비해 이 줄을 삽입합니다.

요금에서는 모든 가격이 평균화되고 막대를 고려하지만 틱에서는 그렇지 않다는 농담을 올바르게 이해 했습니까? 그래서 막대 가격이 아닌 임의의 시간 간격을 사용하기 위해 틱을 사용했습니다. 비슷한 수식의 CopyRates는 복사된 변수를 시간 간격의 최대 값인 ulong 유형으로 채웠습니다. 이 문제도 해결할 수 없었습니다.

 
maxvoronin74 #:

팁 주셔서 감사합니다. 몰랐어요. 만일을 대비해 이 줄을 삽입합니다.

요금은 모든 가격이 평균화되고 막대를 고려하지만 틱은 그렇지 않다는 농담을 제가 올바르게 이해했나요? 그래서 막대 가격이 아닌 임의의 시간 간격을 사용하기 위해 틱을 사용했습니다. 비슷한 수식의 CopyRates는 복사된 변수를 시간 간격의 최대 값인 ulong 유형으로 채웠습니다. 이 문제도 해결할 수 없었습니다.

모든 것이 잘못되었습니다.

MqlRates는 구조이며, 이를 변수로 취급합니다.

MqlTick도 구조체입니다.

당신은 따뜻함과 부드러움을 결합하려고 노력하고 있으므로 컴파일러가 당신을 이해하지 못합니다.

나도)))))

아마도 내가 유용한 것을 제안 할 수 있지만 코드에서 무엇을 찾으려는지 명확하지 않습니다.

 
Aleksandr Slavskii #:

모두 잘못되었습니다.

MqlRates는 구조이며, 이를 변수로 취급합니다.

MqlTick도 구조체입니다.

따뜻함과 부드러움을 결합하려고 하므로 컴파일러가 이해하지 못합니다.

나도 마찬가지입니다))))

아마도 내가 유용한 것을 제안 할 수 있지만 코드에서 무엇을 찾으려는지 명확하지 않습니다.

작업은 막대에 관계없이 임의의 기간 동안의 WPR(윌리엄스 퍼센트 범위) 값의 차이를 얻을 수 있도록 WPR(윌리엄스 퍼센트 범위)을 수정하는 것입니다.
 
maxvoronin74 #:
작업은 막대에 관계없이 임의의 기간 동안의 WPR(윌리엄스 퍼센트 범위) 값의 차이를 얻을 수 있도록 WPR(윌리엄스 퍼센트 범위)을 수정하는 것입니다.

이것이 원하는 결과일 가능성이 있습니다(확실하지는 않지만).

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double bid[];
   for(int i = 0; i < copied; i++)
      bid[i] = ticks[i].bid;
   double PrevClose = bid[copied - 1]; // Получаем последний элемент массива как значение PrevClose
   double highestHigh = ArrayMaximum(bid, 0, copied); // Находим максимальное значение в массиве ticks
   double lowestLow = ArrayMinimum(bid, 0, copied); // Находим минимальное значение в массиве ticks
 
Aleksandr Slavskii #:
double lowestLow = ArrayMinimum(bid, 0, copied);

감사합니다. 제가 수업을 제대로 이해했다면 여기까지입니다:

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
double ask_arr[];
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
double highestBid = ArrayMaximum(bid_arr, 0, copied-1);
double lowestBid = ArrayMinimum(bid_arr, 0, copied-1);
double highestAsk = ArrayMaximum(ask_arr, 0, copied-1);
double lowestAsk = ArrayMinimum(ask_arr, 0, copied-1);
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR
그러나 안타깝게도 bid_arr[i] = ticks[i].bid; 줄에서 'namemyexpert.mq5'(204,12)의 범위를 벗어난 배열로 인해 Expert Advisor가 차트에서 벗어났습니다.
 
maxvoronin74 #:

감사합니다. 제가 교훈을 제대로 배웠다면 다음과 같은 결과가 나왔습니다:

어쨌든 모든 틱을 반복하고 있으므로이 루프에서 복사 할 수는 없지만 한 번에 최대-최소값을 찾을 수 있습니다.

그건 그렇고, 복사하는 경우 먼저 복사하는 배열의 크기를 설정하는 것이 좋을 것입니다. 루프가 우리를 위해 그것을하지 않을 것이며 첫 번째 반복에서 배열에서 날아갈 것입니다. CopyTicksRange만 대상 배열 자체의 크기를 조정합니다.

 
JRandomTrader #:

어차피 모든 틱을 순환하기 때문에 이 주기에서는 복사할 수 없지만 최대-최소값을 한 번에 찾을 수 있습니다.

그건 그렇고, 복사하는 경우 먼저 복사 할 배열의 크기를 설정하는 것이 좋을 것입니다. 루프가 우리를 위해 그것을하지 않을 것이며 첫 번째 반복에서 배열에서 날아갈 것입니다. CopyTicksRange만 대상 배열 자체의 크기를 조정합니다.

저는 완벽 주의자이며 구조 배열의 개별 요소를 정렬하는 것은 스티로폼으로 유리를 치는 것과 같습니다.
할당되지 않은 배열에 대해서는 그럴만한 이유가 있습니다. 새벽 1시인데 아내가 제 귀에 대고 "잘 시간이다, 잘 시간이다"라고 말하거든요. ))))))
 
Aleksandr Slavskii #:
저는 완벽주의자이기 때문에 배열된 구조의 개별 요소를 정렬하는 것은 스티로폼으로 유리를 두드리는 것과 같습니다.
배열을 분산하지 않은 데에는 그럴 만한 이유가 있습니다. 시간은 새벽 1시이고 아내가 "잘 시간, 잘 시간"이라는 말을 내 귀에 대고 있습니다. )))))).
뭐, 밤 또는 아침 무화과 하나).
예, 한 번에 최대 값을 찾는 것이 맞습니다. 그렇게하는 것이 훨씬 더 편리합니다. 나는 오늘 아침에 약간 멍청합니다.
 
JRandomTrader #:

어차피 모든 틱을 순환하기 때문에 이 주기에서는 복사할 수 없지만 최대-최소값을 한 번에 찾을 수 있습니다.

그건 그렇고, 복사하는 경우 먼저 복사 할 배열의 크기를 설정하는 것이 좋을 것입니다. 루프가 우리를 위해 그것을하지 않을 것이며 첫 번째 반복에서 배열에서 날아갈 것입니다. CopyTicksRange만 대상 배열 자체의 크기를 조정합니다.

죄송합니다. 제가 부주의했습니다. 수정했습니다. 고마워요. ArrayMaximum 값이 가격이 아니라 인덱스라는 사실을 잊고 있었습니다. 하지만 이제 고쳤습니다.

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
ArrayResize(bid_arr,copied,100000);
double ask_arr[];
ArrayResize(ask_arr,copied,100000);
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
int IndMaxBid = ArrayMaximum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с максимальной ценой
double highestBid = bid_arr[IndMaxBid]; // Самая высокая цена bid за период
int IndMinBid = ArrayMinimum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с минимальной ценой
double lowestBid = bid_arr[IndMinBid]; // Самая низкая цена bid за период
int IndMaxAsk = ArrayMaximum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с максимальной ценой
double highestAsk = ask_arr[IndMaxAsk]; // Самая высокая цена ask за период
int IndMinAsk = ArrayMinimum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с минимальной ценой
double lowestAsk = ask_arr[IndMinAsk]; // Самая низкая цена ask за период
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR

ArrayMaximum이 틱 배열에서 작동하지 않았기 때문에 루프에 if를 사용하여 대체 계산을 시도했습니다. 이것이 더 나은 이유는 무엇일까요?

 
maxvoronin74 #:

왜 더 나은가요?

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double highestHigh = 0, lowestLow = DBL_MAX;
   for(int i = 0; i < copied; i++)
     {
      if(highestHigh < ticks[i].ask) // Находим максимальное значение в массиве ticks
         highestHigh = ticks[i].ask;
      if(lowestLow > ticks[i].bid) // Находим минимальное значение в массиве ticks
         lowestLow = ticks[i].bid;
     }
사유: