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

 
Vitaly Muzichenko :

---

추신이지만 일반적으로 예를 들어 동일한 어레이에서 많은 것들이 잘못되었습니다.

도움과 팁 감사합니다!!! 이것이 컴파일 방법입니다

 //+------------------------------------------------------------------+
//|                                                        Funct.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int UP; //Глобальная переменная

//_____________________________________Массивы для Handleлов____________________________________
double HandleFractalDown_W1[],HandleFractalUP_W1[];     // одномерный динамический массив

//_____________________________________Массивы для фракталов____________________________________
double FractalDown_W1[],FractalUP_W1[];     // одномерный динамический массив

//-----------------------------------------------------------------------------------------------
int   Fractal_W1= iFractals ( Symbol (), PERIOD_W1 ); //Хендл индикатора

//----------------------------------------------------------------------
void OnStart ()
  {
   CopyBuffer (Fractal_W1, 0 , TimeCurrent (), Bars ( Symbol (), PERIOD_W1 ),HandleFractalUP_W1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer (Fractal_W1, 1 , TimeCurrent (), Bars ( Symbol (), PERIOD_W1 ),HandleFractalDown_W1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries (FractalUP_W1, true );   //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries (FractalDown_W1, true ); //Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

  Search_Fractal( PERIOD_W1 , HandleFractalUP_W1, FractalUP_W1); //Пользовательская функция заполнения массива FractalUP_W1 значениями
                                                               //верхних фракталов  

  }
//+------------------------------------------------------------------+

//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal( ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0 ;                       //Глобальная переменная
   int i= Bars ( Symbol (),period); //Колличество баров на W1 графике
   
   for ( int n= 0 ; n< i; n++)
     {
       //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
       if (handle[n]!= EMPTY_VALUE )
        {
         UP++;
         fract_mass[UP] = handle[n];
        }
     }
  }
//+------------------------------------------------------------------+
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • 2021.02.13
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
약간 조정하면 51.20까지 오류와 함께 충돌이 발생할 때까지 거의 정상적으로 작동합니다.

배열 기능(BRN, W1)이 범위를 벗어남

 //+------------------------------------------------------------------+
//|                                                        Funct.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int UP; //Глобальная переменная

//_____________________________________Массивы для Handleлов____________________________________
double HandleFractalDown_W1[],HandleFractalUP_W1[];     // одномерный динамический массив

//_____________________________________Массивы для фракталов____________________________________
double FractalDown_W1[],FractalUP_W1[];     // одномерный динамический массив

//-----------------------------------------------------------------------------------------------
int   Fractal_W1= iFractals ( Symbol (), PERIOD_W1 ); //Хендл индикатора

//----------------------------------------------------------------------
void OnStart ()
  {
   CopyBuffer (Fractal_W1, 0 , TimeCurrent (), Bars ( Symbol (), PERIOD_W1 ),HandleFractalUP_W1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer (Fractal_W1, 1 , TimeCurrent (), Bars ( Symbol (), PERIOD_W1 ),HandleFractalDown_W1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries (HandleFractalUP_W1, true );   //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries (HandleFractalDown_W1, true ); //Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

  Search_Fractal( PERIOD_W1 , HandleFractalUP_W1, FractalUP_W1); //Пользовательская функция заполнения массива FractalUP_W1 значениями
                                                               //верхних фракталов  
  }
//+------------------------------------------------------------------+



//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal( ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0 ;                       //Глобальная переменная
   int i= Bars ( Symbol (),period); //Колличество баров на W1 графике

   for ( int n= 0 ; n< i; n++)
     {
       //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
       if (handle[n]!= EMPTY_VALUE )
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert ( "Frakt= " ,fract_mass[UP]);
        }
     }
  }
//+------------------------------------------------------------------+
무엇이 될 수 있습니까?
 
Kira27 :
약간 조정하면 51.20까지 오류와 함께 충돌이 발생할 때까지 거의 정상적으로 작동합니다.

배열 기능(BRN, W1)이 범위를 벗어남

무엇이 될 수 있습니까?

이것을 시도하십시오. 배열 크기가 설정되어 있지 않습니다.

 void Search_Fractal( ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0 ;                       //Глобальная переменная
   int i= Bars ( Symbol (),period); //Колличество баров на W1 графике
   ArrayResize (fract_mass,i+ 1 );
   for ( int n= 0 ; n< i; n++)
     {
       //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
       if (handle[n]!= EMPTY_VALUE )
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert ( "Frakt= " ,fract_mass[UP]);
        }
     }
  }

일반적으로 이것은 최상의 솔루션이 아닙니다.

 
Kira27 :
약간 조정하면 51.20까지 오류와 함께 충돌이 발생할 때까지 거의 정상적으로 작동합니다.

배열 기능(BRN, W1)이 범위를 벗어남

무엇이 될 수 있습니까?

충돌 문제를 해결한 라인

 ArrayResize (handle,i, 0 ); //*------Строчка решившая проблему
 //+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal( ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0 ;                       //Глобальная переменная
   int i= Bars ( Symbol (),period); //Колличество баров на W1 графике

//***************************
   ArrayResize (handle,i, 0 ); //*------Строчка решившая проблему
//***************************

   for ( int n= 0 ; n< i; n++)
     {
       //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
       if (handle[n]!= EMPTY_VALUE )
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert ( "Frakt= " ,fract_mass[UP]);
        }
     }
  }
//+------------------------------------------------------------------+

지금 바로? 어렵지 않다면 수정합니다.

 
Kira27 :
약간 조정하면 51.20까지 오류와 함께 충돌이 발생할 때까지 거의 정상적으로 작동합니다.

배열 기능(BRN, W1)이 범위를 벗어남

무엇이 될 수 있습니까?

동시에 HandleFractalUP_W 1 배열에 특정 개수의 요소를 복사하지만 정확히 몇 개를 제어할 수는 없습니다.

다음으로 int i=Bars(Symbol(),period); //W1 차트의 막대 수

결과적으로 다시 array 에서 벗어나지 만 이미 handle[n] 에 있습니다.

채우는 논리로 조금 이해하고 서두르지 마십시오.

----

키라27 :

충돌 문제를 해결한 라인

지금 바로? 어렵지 않다면 수정합니다.

그래서 모든 것이 까다 롭지 만 성공할 것입니다.

 
Kira27 :

충돌 문제를 해결한 라인

지금 바로? 어렵지 않다면 수정합니다.

주간 차트 창에는 막대보다 프랙탈이 적고 배열이 프랙탈 가격 값으로 채워지면 90셀만 채워지고 나머지 메모리 마크업은 중복됩니다. 먼저 프랙탈 수를 계산한 다음 ArrayResize를 적용하여 메모리를 예약해야 합니까?

 
Vitaly Muzichenko :

동시에 HandleFractalUP_W 1 배열에 특정 개수의 요소를 복사하지만 정확히 몇 개를 제어할 수는 없습니다.

다음으로 int i=Bars(Symbol(),period); //W1 차트의 막대 수

결과적으로 다시 array 에서 벗어나지 만 이미 handle[n] 에 있습니다.

채우는 논리로 조금 이해하고 서두르지 마십시오.

----

그래서 모든 것이 까다 롭지 만 성공할 것입니다.

감사해요!!!

 

좋은 오후에요 여러분. 볼륨 기록을 가져올 수 없는 이유를 알아낼 수 있도록 도와주세요. 2가지 방법으로 해보았습니다.

첫 번째 방법:

MqlRates mrate5[];

if(CopyRates(_Symbol,PERIOD_M5,1,bars_used,mrate5)<0)

{

Alert("М5에 대한 기록 데이터 복사 오류 - 오류:",GetLastError(),"!!");

반품;

}

for (int i=0;i<bars_used;i++) {

인쇄(mrate5[i].real_volume)

}

두 번째 방법:

긴 볼륨5[];

if(CopyRealVolume(_Symbol,PERIOD_M5,1,bars_used,volumes5)<0)

{

Alert("М5의 볼륨 복사 오류 - 오류:",GetLastError(),"!!");

반품;

}

for (int i=0;i<bars_used;i++) {

인쇄(volumes5[i])

}

두 경우 모두 볼륨 배열에는 항상 0만 포함됩니다. 의미있는 정보는 단순히 얻을 수 없습니다 ...


 
seleand :

좋은 오후에요 여러분. 볼륨 기록을 가져올 수 없는 이유를 알아낼 수 있도록 도와주세요. 2가지 방법으로 해보았습니다.

첫 번째 방법:

 MqlRates mrate5[];
       if ( CopyRates ( _Symbol , PERIOD_M5 , 1 ,bars_used,mrate5)< 0 )
        {
             Alert ( "Ошибка копирования исторических данных для М5 - ошибка:" , GetLastError (), "!!" );
             return ;
        }
for ( int i= 0 ;i<bars_used;i++) {
Print (mrate5[i].real_volume)
}

두 번째 방법:

 long volumes5[];
       if ( CopyRealVolume ( _Symbol , PERIOD_M5 , 1 ,bars_used,volumes5)< 0 )
        {
             Alert ( "Ошибка копирования объемов для М5 - ошибка:" , GetLastError (), "!!" );
             return ;
        }
for ( int i= 0 ;i<bars_used;i++) {
Print (volumes5[i])
}

두 경우 모두 볼륨 배열에는 항상 0만 포함됩니다. 의미있는 정보는 단순히 얻을 수 없습니다 ...


  1. 코딩을 배우십시오.
  2. Forex에는 단어의 실제 볼륨이 전혀 없습니다.
 

고맙습니다. 틱 볼륨 이 있다는 것을 올바르게 이해하고 있습니까?

예를 들어 Finam 웹 사이트에서 Forex의 시세 이력을 다운로드했을 때 시가, 고가, 저가, 종가 외에도 vol. 이 볼륨이 정확히 무엇인지 지정하지 않고. 이것은 틱 볼륨입니까?

사유: