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

 
Alexey Volchanskiy :

1. 이제 화면 해상도와 크기를 살펴보십시오. 나는 8.1에서 그것을 하는 방법을 모른다, 나는 지금 10에 있다. 분명히 모든 컨트롤이 옮겨졌습니다. 일반적인 그림은 표준 눈금으로 프로그램을 작성하고 사용자가 일반적으로 확대한 것을 설정할 때입니다. 화면이 작은 노트북이 없잖아요? 일반적으로 증가합니다. tk. 작은 부분은 보기 힘듭니다.

다음은 10-ke에서 구성하는 방법입니다.

2. 100% 기준을 적용해야 합니다.

1. "큰" 화면이 있는 노트북이 있습니다... :-)

2. 그랬다.

도와주셔서 감사합니다...

 
Roman Shiredchenko :

1. "큰" 화면이 있는 노트북이 있습니다... :-)

2. 그랬다.

도와주셔서 감사합니다...

나는 또한 질문을 읽는 동안 허가에 대해 생각했습니다. 답은 저보다 앞서 있었습니다.

당신은 이해합니다 - 모든 장치의 모든 화면에 대한 플랫폼을 작성하는 것은 비현실적입니다)

 
new-rena :

나는 또한 질문을 읽는 동안 허가에 대해 생각했습니다. 그들은 나보다 앞서갔습니다.

당신은 이해합니다 - 모든 장치의 모든 화면에 대한 플랫폼을 작성하는 것은 비현실적입니다)

센크스... :-) 오랜만에 왔네요... 상황이... :-)

모두 같은 얼굴. 무엇을 기쁘게!

비록 볼거리가 많지는 않지만...

 
F7에 의해 호출된 창에서 줄 주석으로 Expert Advisor의 매개변수를 분리하는 방법을 문서에서 기억할 수 없고 찾을 수 없습니다.
 
new-rena :

나는 또한 질문을 읽는 동안 허가에 대해 생각했습니다. 답은 저보다 앞서 있었습니다.

당신은 이해합니다 - 모든 장치의 모든 화면에 대한 플랫폼을 작성하는 것은 비현실적입니다)

예, Windows에서 글을 쓰고 와이드스크린 화면이 고객에게 전달되기 시작했을 때 GUI를 다시 작업하는 데 지쳤던 걸로 기억합니다.
 
Vladimir Tkach :
F7에 의해 호출된 창에서 줄 주석으로 Expert Advisor의 매개변수를 분리하는 방법을 문서에서 기억할 수 없고 찾을 수 없습니다.

 sinput string separator = "" ;   //в комментарий записать пустой символ "Alt+(Num)255"
 
안녕하세요!
 // Существует алгоритм сортировки "ПУЗЫРЬКОМ" по убыванию

void bubble_sort( int &a[], int length)
   {
     for ( int i= 0 ; i<length- 1 ; i++)
        {
         bool swapped = false ;
         for ( int j= 0 ; j<length-i- 1 ; j++)
             {
               if (a[j] < a[j+ 1 ])
                  {
                   int b = a[j];
                   a[j] = a[j+ 1 ];
                   a[j+ 1 ] = b;
                   swapped = true ;
                  }
             }
         if (!swapped)
               break ;
        }
   }

// Есть массив D[][2]. Подскажите пожалуйста, как правильно организовать сортировку массива D[][2] 
// сначала по параметру с индексом "0", а потом по параметру с индексом "1"
// Такой вариант не проходит (сортирует не правильно):

double D[][ 2 ];                                   // Исходный динамический массив
double S[ 2 ];                                     // Временный статический массив

//        Исходный     Сортировка по индексу "0"    Сортировка по индексу "1"
//          7  4                  9  5                         9  8
//          3  9                  9  8                         9  5
//          9  5                  7  4                         7  6                              
//          9  8                  7  6                         7  4
//          7  6                  3  9                         3  9
//         ......

int     R= ArrayRange (D, 0 );
       Fun();

void Fun()
   {
     int n= 0 ;                                     // Техническая переменная
     int cur_0= 0 ;                                 // Значение массива D[j]  [0] в строке с индексом "j"
     int fol_0= 0 ;                                 // Значение массива D[j+1][0] в строке с индексом "j+1" 
     int cur_1= 0 ;                                 // Значение массива D[j]  [1] в строке с индексом "j"
     int fol_1= 0 ;                                 // Значение массива D[j+1][1] в строке с индексом "j+1" 

     for ( int i= 0 ; i<R- 1 ; i++)                     // Сортировка по индексу "0"
        {
         bool swapped = false ;
         for ( int j= 0 ; j<R-i- 1 ; j++)
             {
              cur_0=a[j]  [ 0 ];
              fol_0=a[j+ 1 ][ 0 ];
               if (cur_0 < fol_0)
                  {
                   for (n= 0 ; n< 2 ; n++)
                        S[n]=D[j][n];             // Значения из строки [j] во временный массив 
                   for (n= 0 ; n< 2 ; n++)
                        D[j][n]=D[j+ 1 ][n];       // Значения из строки [j+1] в строку [j]
                   for (n= 0 ; n< 2 ; n++)
                        D[j+ 1 ][n]=S[n];           // Значения из временного массива в строку [j+1]
                   swapped = true ;
                  }
             }
         if (!swapped)
               break ;
        }

     for (i= 0 ; i<R- 1 ; i++)                         // Сортировка по индексу "1"
        {
         swapped = false ;
         for (j= 0 ; j<R-i- 1 ; j++)
             {
              cur_0=a[j]  [ 0 ];
              fol_0=a[j+ 1 ][ 0 ];
              cur_1=a[j]  [ 1 ];
              fol_1=a[j+ 1 ][ 1 ];
               if ( (cur_0 == fol_0) &&             // При равенстве значений по индексу "0"
                  (cur_1 <  fol_1) )
                  {
                   for (n= 0 ; n< 2 ; n++)
                        S[n]=D[j][n];             // Значения из строки [j] во временный массив 
                   for (n= 0 ; n< 2 ; n++)
                        D[j][n]=D[j+ 1 ][n];       // Значения из строки [j+1] в строку [j]
                   for (n= 0 ; n< 2 ; n++)
                        D[j+ 1 ][n]=S[n];           // Значения из временного массива в строку [j+1]
                   swapped = true ;
                  }
             }
         if (!swapped)
               break ;
        }
   }
Excel에서처럼 보이게 하는 방법))

모든 것이 잘 작동합니다!!!! 알고리즘에 관한 것이 아닙니다. 질문이 삭제되었습니다 .
 

여기에서 4가지를 결정했습니다.

표시 코드가 있습니다. 요청 및 입찰 라인을 계산하고 그립니다 . + Sec_at_Num_Aver_of_Ticks 초당 수신된 X 개의 새로운 Num_Aver_of_Ticks 틱의 평균 속도를 계산합니다. X = Num_Aver_of_Ticks / (time_s - ExtMapBuffer3[Num_Aver_of_Ticks]);

Expert Advisor에서 이 변수 X(시작 기능의 끝 참조) 의 값을 어떻게 계산할 수 있습니까?

 //+------------------------------------------------------------------
//
//
//
//
//+------------------------------------------------------------------
#property copyright "ROMANBEST"
#property link        "rshiredchenko@mail.ru"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrLimeGreen
#property indicator_color2 clrBlue            // Цвет второй линии
//#property indicator_color3 clrGray         // Цвет третьей линии - гистограммы
//---- buffers
extern int MaxDrawTicks= 100 ;
extern int Num_Aver_of_Ticks= 15 ;
//--- Создаём динамические массивы
double ExtMapBuffer1[];                       // Индикаторный массив значений цен Bid
double ExtMapBuffer2[];                       // Индикаторный массив значений цен Ask 
               // Кол-во тиков для среднего Num_Aver_of_Ticks / кол-во секунд, за которое эти тики поступили 
 // При обращении к любому члену массива по индексу (допустим i) нужно убедиться что i>=0 и i<ArraySize(High) 
double ExtMapBuffer3[];                       // Массив значений времени в сек. с момента запуска индикатора 
int size;                                     // Вспомогательная переменная для массива
 // При обращении к любому члену массива по индексу (допустим i) нужно убедиться что i>=0 и i<ArraySize(High) 

                                  
int myBars;
int i;
int delimeterCounter;
int _start,tickCounter;
double Sec_at_Num_Aver_of_Ticks; // кол-во секунд, за которое  поступило среднее количество тиков для расчёта 
                                 // (Num_Aver_of_Ticks)
  
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexBuffer ( 0 , ExtMapBuffer1);           // Назначение массива буферу
   SetIndexStyle ( 0 , DRAW_LINE , STYLE_SOLID , 2 );   // Стиль линии    
   SetIndexEmptyValue ( 0 , 0.0 );
   
   SetIndexBuffer ( 1 , ExtMapBuffer2);           // Назначение массива буферу
   SetIndexStyle ( 1 , DRAW_LINE , STYLE_SOLID , 2 );   // Стиль линии    
   SetIndexEmptyValue ( 1 , 0.0 ); 
 
   
    
//--- устанавливаем размер динамического массива
   if ( ArrayResize (ExtMapBuffer3,MaxDrawTicks)< 0 ) { Print ( " Ошибка в изменении размера массива времени поступления тиков " ); return ( false );}
//--- установим индексацию для буфера как в таймсерии для динамического массива
     // ArraySetAsSeries(ExtMapBuffer3,true);
    
//---   Возвращает количество элементов указанного массива. 
   size= ArraySize (ExtMapBuffer3);
   if (size> 0 ) Print ( "Размер массива: " ,size);
   else Print ( "Ошибка. Массив пустой " ,size);     
                                                           // for(int i=0;i<=100;i++) Print(" ExtMapBuffer3[i] = ", ExtMapBuffer3[i]);   
   //--- заполняем начальные 50 элементов значением 4
 //  ArrayFill(ExtMapBuffer3,0,50,4);
//--- заполняем 50 элементов (начиная с 50-го) значением 8
 //   ArrayFill(ExtMapBuffer3,50,50,8);
//--- выводим значения всех элементов
 //  for(int i=0;i<ArraySize(ExtMapBuffer3);i++) Print(" i =  ", i, " ExtMapBuffer3 =  ", ExtMapBuffer3[i]);                      

//   ------------
   
   Print ( "Обнуляем тики и время их поступления" );
   for (i= Bars - 1 ;i>= 0 ;i--) { ExtMapBuffer1[i]= 0.0 ; ExtMapBuffer2[i]= 0.0 ; ExtMapBuffer3[i]= 0.0 ;} 
  
   //--- запомним начальное значение для подсчёта секунд c момента старта системы
   _start = GetTickCount ();   
//----
   return ( 0 );
  }
  
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| сдвинем массив                                                   |
//+------------------------------------------------------------------+
void SetDelimeter()
  {
//----
   string delimeterDate= TimeToStr ( Time [ 0 ]);
   if (myBars!= 0 )
      {
       Print ( "Ставим разделитель" );      
       int handle= WindowFind ( "Ticks" );
       if (! ObjectCreate (delimeterDate, OBJ_VLINE ,handle, Time [ 0 ], 0 ))
         {
         Print ( "Неудачная попытка создания разделителя в окне " ,
         handle, " по времени " , TimeToStr ( CurTime ()));
         Print ( "Ошибка №" , GetLastError (), ", имя разделителя " ,delimeterDate);
         }
       else 
         {
         ObjectSet (delimeterDate, OBJPROP_COLOR ,DarkGreen);
         ObjectSet (delimeterDate, OBJPROP_STYLE , STYLE_DASHDOT );
         ObjectsRedraw ();
         }
      }
//----   
  }
//+------------------------------------------------------------------+
//| сдвинем массив                                                   |
//+------------------------------------------------------------------+
void ShiftArray()
  {
//----
   int V_lines;
   string delimeterName;
   datetime firstTime;
   int BarFirstTime;
   
   if (tickCounter> 2 *MaxDrawTicks)
      {
       for (i=tickCounter;i>=MaxDrawTicks;i--) { ExtMapBuffer1[i]= 0.0 ; ExtMapBuffer2[i]= 0.0 ; ExtMapBuffer3[i]= 0.0 ; }
      tickCounter=MaxDrawTicks;
      }
   for ( int cnt=tickCounter;cnt> 0 ;cnt--)
      {
      ExtMapBuffer1[cnt]=ExtMapBuffer1[cnt- 1 ];
      ExtMapBuffer2[cnt]=ExtMapBuffer2[cnt- 1 ];
      ExtMapBuffer3[cnt]=ExtMapBuffer3[cnt- 1 ];
      }
   V_lines= ObjectsTotal ();
   for ( int z= 0 ;z<V_lines;z++)
      {
      delimeterName= ObjectName (z); 
       if ( ObjectFind (delimeterName)!=- 1 )
         {
         if ( ObjectType (delimeterName)== OBJ_VLINE ) 
            {
            firstTime= ObjectGet (delimeterName, OBJPROP_TIME1 );
            BarFirstTime= iBarShift ( NULL , 0 ,firstTime);
            firstTime= Time [BarFirstTime+ 1 ];
             ObjectSet (delimeterName, OBJPROP_TIME1 ,firstTime); 
            }
         }       
      }
//----   
  }
//+------------------------------------------------------------------+
//| признак нового бара                                              |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//----
   bool res= false ;
   if (myBars!= Bars )
      {
      res= true ;
      myBars= Bars ;
      }   
//----
   return (res);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {   
   //--- выводим значения всех элементов
   // for(int i=0;i<ArraySize(ExtMapBuffer3);i++) Print(" i =  ", i, " ExtMapBuffer3 =  ", ExtMapBuffer3[i]);      
   //--- получим время в миллисекундах, прошедших с момента старта системы 
   uint time_ms= GetTickCount () - _start;
   //--- получим время в секундах, прошедших с момента старта системы 
   double time_s=time_ms/ 1000 ;
   double X;                       // вспомогательная переменная 
   
   int     counted_bars= IndicatorCounted ();
//----
   if (isNewBar())
     {
       // установить разделитель
       //tickCounter++;
      SetDelimeter();
      ExtMapBuffer1[ 0 ]= Bid ;  
      ExtMapBuffer2[ 0 ]= Ask ; 
             //ExtMapBuffer3[0]= time_s;  
       //--- заполняем c tickCounter элементов значением time_s
     // ArrayFill(ExtMapBuffer3,tickCounter,1,time_s);  
     if (tickCounter >= 0 && tickCounter < ArraySize (ExtMapBuffer3) && tickCounter <= Num_Aver_of_Ticks)    
     {
       //--- заполняем начальный и последующие элементы значениями time_s
       if (tickCounter == 0 ) ArrayFill (ExtMapBuffer3, 0 , 1 ,time_s);
       else                    ArrayFill (ExtMapBuffer3,tickCounter, 1 ,time_s);
       //--- выводим значение элемента
       for ( i= 0 ;i< 1 ;i++) Print ( " tickCounter =  " , tickCounter, " ExtMapBuffer3 =  " , ExtMapBuffer3[tickCounter]);     
     }        
     }
   else
      
     {
      tickCounter++;
      ShiftArray();
      ExtMapBuffer1[ 0 ]= Bid ; 
      ExtMapBuffer2[ 0 ]= Ask ;  
      ExtMapBuffer3[ 0 ]= time_s;  
       // массив    // индекс начального элемента // количество элементов // значение, которым заполняется массив      
       //--- заполняем начальные (с нуля) tickCounter  элементов значением time_s
       //ArrayFill(ExtMapBuffer3,tickCounter,1,time_s);    
                                               // X = tickCounter/time_s;  
       if (tickCounter >= 0 && tickCounter < ArraySize (ExtMapBuffer3) && tickCounter <= Num_Aver_of_Ticks)    
          {
       //--- заполняем начальный и последующие элементы значениями time_s
             if (tickCounter == 0 ) ArrayFill (ExtMapBuffer3, 0 , 1 ,time_s);
             else                    ArrayFill (ExtMapBuffer3,tickCounter, 1 ,time_s);
       //--- выводим значение элемента
           for ( i= 0 ;i< 1 ;i++) Print ( " tickCounter =  " , tickCounter, " ExtMapBuffer3 =  " , ExtMapBuffer3[tickCounter]);     
          }                                                                         
     }
 /*    
    if (tickCounter > Num_Aver_of_Ticks) то ищем индекс массива с минимумом http://docs.mql4.com/ru/array/arrayminimum и заполняем его значением секунд 
    следующего тика...   Потом считаем разность между этим значением и следующим минимумом...
    Псле заполнения массива до ExtMapBuffer3[Num_Aver_of_Ticks]. Читать минимум, максимум. Переписываем минимум. Разница значений 
    ExtMapBuffer3[максимум] и ExtMapBuffer3[минимум] будет время в секундах поступления Num_Aver_of_Ticks.
    
*/     
      Sec_at_Num_Aver_of_Ticks =  time_s - ExtMapBuffer3[Num_Aver_of_Ticks];
      
       if (tickCounter >= Num_Aver_of_Ticks  && (time_s - ExtMapBuffer3[Num_Aver_of_Ticks])!= 0 ) 
          X = Num_Aver_of_Ticks / (time_s - ExtMapBuffer3[Num_Aver_of_Ticks]);        
       
      
     if (time_s!= 0 ) 
       Comment (
               "tickCounter = " , tickCounter, "\n" ,
               "secondCounter = " ,     NormalizeDouble (time_s, Digits ) , "\n" ,
               "ExtMapBuffer1[0] = " , NormalizeDouble (ExtMapBuffer1[ 0 ], Digits ) , "\n" ,
               "ExtMapBuffer2[0] = " , NormalizeDouble (ExtMapBuffer2[ 0 ], Digits ) , "\n" ,
               "ExtMapBuffer3[0] = " , NormalizeDouble (ExtMapBuffer3[ 0 ], Digits ) , "\n" ,
               "Average speed for average quantity of tics = " , NormalizeDouble (X, 2 ), " Num_Aver_of_Ticks/Sec_at_Num_Aver_of_Ticks " , "\n" ,
               "Num_Aver_of_Ticks =  " , Num_Aver_of_Ticks, " Время в секундах поступления  Num_Aver_of_Ticks = " ,Sec_at_Num_Aver_of_Ticks  , "\n" ,
               "Average speed since running = " , NormalizeDouble (tickCounter/time_s, Digits ) , " All Tick/All Second " , "\n" ,
              
              
           "" ) ;    
                    
            
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 
Roman Shiredchenko :

여기에서 4가지를 결정했습니다.

표시 코드가 있습니다. 요청 및 입찰 라인을 계산하고 그립니다 . + Sec_at_Num_Aver_of_Ticks 초당 수신된 X 개의 새로운 Num_Aver_of_Ticks 틱의 평균 속도를 계산합니다. X = Num_Aver_of_Ticks / (time_s - ExtMapBuffer3[Num_Aver_of_Ticks]);

Expert Advisor에서 이 변수 X(시작 기능의 끝 참조) 의 값을 어떻게 계산할 수 있습니까?

태블릿에서 코드를 보기는 어렵지만 답은 스스로 제안합니다. X 값을 버퍼에 씁니다.
 
Artyom Trishkin :
태블릿에서 코드를 보기는 어렵지만 답은 스스로 제안합니다. X 값을 버퍼에 씁니다.

덕분에. 아르티옴. 저도 마찬가지에요... :-)


나는 오래전에 이 인덱스를 작성했고 코드 베이스에서 Rosha 코드를 기초로 사용했습니다.

사유: