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

 

이름이 L1, L2, L3 ... Ln인 변수를 2차원 배열에 쓰는 루프에서 정렬할 수 있는지 알려주십시오.

3개의 변수가 있는 예(사실 더 많은 변수가 있으므로 번거로운 것으로 판명됨):

 //+------------------------------------------------------------------+
//|                                                            1.mq4 |
//|                        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"
#property strict

extern string L1 = "1.15110;1.14105;1.13240;1.12370;1.11640;1.11170;1.10655;1.09895;1.08850;1.07850;1.06475;" ;
extern string L2 = "1.32130;1.31030;1.29860;1.29042;1.27985;1.25605;1.24725;1.23565;1.22505;1.20815;1.20115;1.18850;1.16690;1.14465;" ;
extern string L3 = "0.94947;0.93222;0.91472;0.90077;0.89075;0.88658;0.86814;0.84687;0.82795;0.81132;0.79022;0.75976;" ;

//Надо: Вместо rsLevels[] задать двухмерный массив

string rsLevels[]; 

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{

//Надо: Перебрать в цикле переменные L1, L2, L3 и записать в двухмерный массив 

 L1 = StringTrimLeft ( StringTrimRight (L1));
 
 if ( StringSubstr (L1, StringLen (L1)- 1 , 1 ) != ";" )
  L1 = StringConcatenate (L1, ";" );

 int s = 0 ,i = StringFind (L1, ";" , s);
 string current;
 
 while (i> 0 )
 
 {
 
  current= StringSubstr (L1, s, i - s);
  
   ArrayResize (rsLevels, ArraySize (rsLevels) + 1 );
  
  rsLevels[ ArraySize (rsLevels) - 1 ] = current;
  
  s = i + 1 ;
  
  i = StringFind (L1, ";" ,s);
  
 }
 
//---------------------------------------------------------

 for ( int x= 0 ; x< ArraySize (rsLevels); x++)
  
 {

   Print (rsLevels[x]); 
   
 }
 
 return ( INIT_SUCCEEDED );
}
 
kopeyka2 :

답변 해주셔서 감사합니다. 전체 코드. 어레이의 정적 크기를 늘렸습니다. 연산자에서 제로 컨트롤 항목을 제거했습니다 ... 일반적인 "공백". 덧셈을 계산하지 않는 이유를 이해하고 싶습니다. 지금 내 코드에 무엇이 빠져 있습니까? 힌트를 주셔서 감사합니다. 아직 mql5에서 정적 배열 로 작업하지 않았습니다.....

코드가 업데이트되었습니다. 같은 질문...

다음은 코드를 컴파일하는 동안 발생하는 오류입니다.


 
stepystr :

이름이 L1, L2, L3 ... Ln인 변수를 2차원 배열에 쓰는 루프에서 정렬할 수 있는지 알려주십시오.

3개의 변수가 있는 예(사실 더 많은 변수가 있으므로 번거로운 것으로 판명됨):

주제는 물론 (MQL4 및 MQL5의 경우) "비뚤어진" 주제이므로 질문 시작 시 질문이 처리되는 플랫폼을 나타내는 것이 나쁘지 않을 것입니다))

 
stepystr :

이름이 L1, L2, L3 ... Ln인 변수를 2차원 배열에 쓰는 루프에서 정렬할 수 있는지 알려주십시오.

3개의 변수가 있는 예(사실 더 많은 변수가 있으므로 번거로운 것으로 판명됨):

먼저 미래 배열의 두 번째 차원에서 값의 수를 결정해야 합니다. 요소의 수가 같지 않다는 것은 이미 분명합니다. 아마도 최대값을 취해야 하고 추가 값이 있는 경우 예를 들어 0 또는 -1로 채우십시오. 그리고 첫 번째 측정은 알고 있는지 여부를 미리 결정하는 데 방해가 되지 않습니다. 그런 다음 중첩 루프에서 L1을 취하고 필요한 모든 것을 배열에 쓰고, 외부 루프의 두 번째 반복은 L2에 있는 모든 것을 다음 인덱스에 씁니다.


그리고 아주 정확하게는 구조에 밀어 넣는 것이 좋습니다.

 struct name
   {
     double L1[];
     double L2[];
     double Ln[];
   }arr[];
그런 다음 첫 번째 차원과 두 번째 차원 모두에서 차원을 변경할 수 있습니다. 즉, 1차원 배열 안에 1차원 배열이 있을 것입니다.
 
Alexandr Sokolov :

다음은 코드를 컴파일하는 동안 발생하는 오류입니다.


나는이 코드와 Tf를 단축했습니다. 나는 단지 눈치 채지 못했습니다. 질문은 근본적입니다. 왜 정적 배열 의 요소가 계산을 위해 처리되지 않습니까?

여기서 나는 오류없이 컴파일을 확인했습니다))) 계산 결과는 동일합니다 - ZERO !!! 배열 열기[], 닫기[] 등 - 그다지 중요하지 않습니다....

 //+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, "
//---- номер версии индикатора
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots    0
//----
input int        nBars = 20 ;
input double     CorrectorHL = 1.0 ;           //Корректор HL фильтрации размера свечи
input double     CorrectorOC = 1.0 ;           //Корректор OC фильтрации размера свечи
input color      ColorLines = clrLime ;         //Цвет линий
input bool       Tf = false ;
//----
int     limit= 0 ,br= 0 ,to_copy= 0 ;
double corrHL,corrOC;
double averpips,averpipsHL,coeff;
double filterOC,filterHL,candle,candleHL;
double opn,hgh,lw,cls;
double Open[ 65 ],High[ 65 ],Low[ 65 ],Close[ 65 ];
double level_1,level_2,level_3;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ObjectsDeleteAll ( 0 , "UP Period " );
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   if (CorrectorHL<= 0 )
      corrHL= 1 ;
   else
      corrHL=CorrectorHL;
   if (CorrectorOC<= 0 )
      corrOC= 1 ;
   else
      corrOC=CorrectorOC;
//----
   if (nBars< 0 )
      to_copy= 6 ;
   else
      to_copy=nBars;
       //+------------------------------------------------------------------+
//| Поиск события и установка меток  на графике                      |
//+------------------------------------------------------------------+
   if ( CopyOpen ( NULL , PERIOD_H4 , 0 ,to_copy,Open)<to_copy)
       return ( 0 );
   if ( CopyHigh ( NULL , PERIOD_H4 , 0 ,to_copy,High)<to_copy)
       return ( 0 );
   if ( CopyLow ( NULL , PERIOD_H4 , 0 ,to_copy,Low)<to_copy)
       return ( 0 );
   if ( CopyClose ( NULL , PERIOD_H4 , 0 ,to_copy,Close)<to_copy)
       return ( 0 );
     int indexmass= ArraySize (Open);
//----
   if (Tf== true )
     {
       if (prev_calculated== 0 )
         for ( int j= 0 ; j<=to_copy; j++)
           {
             opn=Open[j];
            hgh=High[j];
            lw=Low[j];
            cls=Close[j];
             if (opn>cls)
               candle+=opn-cls;
             if (cls>opn)
               candle+=cls-opn;
            candleHL+=hgh-lw;
            br+= 1 ;
           } //for j
       if (br> 0 )
        {
         averpips=candle/br;
         averpips= NormalizeDouble (averpips, _Digits );
         averpipsHL=candleHL/br;
         averpipsHL= NormalizeDouble (averpipsHL, _Digits );
         filterOC=averpips;
         filterHL=averpipsHL;
        }
     
     }
   Comment ( "indexmass  " ,indexmass, "  Open " ,Open[ 10 ], "  candle  " ,candle, "  averpips " ,averpips);
//--- return value of prev_calculated for next call
   return (rates_total);
  }
그것은 중요하지 않습니다
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2 :

나는이 코드와 Tf를 단축했습니다. 나는 단지 눈치 채지 못했습니다. 질문은 근본적입니다. 왜 정적 배열 의 요소가 계산을 위해 처리되지 않습니까?

여기서 나는 오류없이 컴파일을 확인했습니다))) 계산 결과는 동일합니다 - ZERO !!! 배열 열기[], 닫기[] 등 - 그다지 중요하지 않습니다....

컴파일할 때 프로그래머 자신의 논리적 오류는 확인되지 않습니다. 컴파일러가 아직 마음을 읽을 수 없기 때문에 이것은 프로그래머의 양심에 남아 있습니다.

 
Сергей Таболин :

주제는 물론 (MQL4 및 MQL5의 경우) "비뚤어진" 것이므로 질문의 시작 부분에서 질문이 다루어지는 플랫폼을 나타내는 것이 나쁘지 않을 것입니다))

MQL4.

 
Artyom Trishkin :

컴파일할 때 프로그래머 자신의 논리적 오류는 확인되지 않습니다. 컴파일러가 아직 마음을 읽을 수 없기 때문에 이것은 프로그래머의 양심에 남아 있습니다.

나는 기본적으로 어디에서 원인을 찾고 있습니까? 이미 존재하는 코드의 기록이나 코드에 정적 배열 을 처리하기 위한 다른 것이 없나요?

나는 내가 모르는 것을 알 수 없다 ... 따라서 나는 경험이있는 외부 관찰자에게 내가 모르는 곳을 표시하도록 요청합니다)))
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2 :

나는 기본적으로 어디에서 원인을 찾고 있습니까? 이미 존재하는 코드의 기록이나 코드에 정적 배열 을 처리하기 위한 다른 것이 없나요?

나는 내가 모르는 것을 알 수 없다 ... 따라서 나는 경험이있는 외부 관찰자에게 내가 모르는 곳을 표시하도록 요청합니다)))

그것은 계산에 도달하지 않습니다


여기 초기화가 있습니다

 input bool       Tf = false ;


그리고 여기 테스트 조건이 있습니다

 if (Tf== true )
 
테스터에서 SQLite 데이터베이스 작업을 사용할 수 있습니까? 데이터 추가 및 변경에 대해 이야기하고 있습니다.
사유: