오류, 버그, 질문 - 페이지 3147

 
모두에게 좋은 하루. Sleep() 함수가 Expert Advisor 테스트 모드(물론 실제 틱에 대한 테스트)에서 실행되는지 알려주십시오.
 
SuhanovDM94 # :
모두에게 좋은 하루. Sleep() 함수가 Expert Advisor 테스트 모드(물론 실제 틱에 대한 테스트)에서 실행되는지 알려주십시오.

Running - 테스터의 시간이 적절한 값으로 변경됩니다.

 
fxsaber # :

진행 중 - 테스터의 시간이 적절한 양만큼 변경됩니다.

정말 감사합니다!

 
Wizard # :
mql5에서 동일한 틱의 크기를 어떻게 든 알아낼 수 있습니까? 그 후 (어느 위치에서) 위치가 열립니까?

그것이 가능하다는 것이 밝혀졌습니다. for 루프는 별도의 함수, OnTick() 함수 또는 사용자의 재량에 따라 삽입됩니다. 다른 사람들의 흥미로운 의견. 예를 들어, 초정밀 시스템을 만들려면 무언가가 필요합니다. 따라서 위치를 열고 닫는 기능을 포함하여 라이브러리 없이 작성합니다. 누가 뭐라고 해도 mqh 라이브러리는 작업 속도를 늦춥니다. 예를 들어 컴파일은 1.5배 더 오래 걸립니다. 하나의 파일에 모든 것을 쓰는 것이 좋습니다. 그리고 스타일, OOP 또는 절차는 여기서 역할을 하지 않습니다. MQL5는 결코 C++ 수준의 언어가 되지 않을 것입니다. 절대 제한적입니다. 도서관의 의미...

 #define EXPERT_MAGIC 261                // MagicNumber эксперта
input string Symbol_T  = "XAUUSD" ;     // глобальная переменная для задаваемого символа

..............

for ( int i = PositionsTotal ()- 1 ; i >= 0 ; i--)
{
   if ( PositionGetTicket (i) > 0 && PositionGetString ( POSITION_SYMBOL ) == Symbol_T && PositionGetInteger ( POSITION_MAGIC ) == EXPERT_MAGIC)
   {
       int attempts = 0 ;       // счетчик попыток
       bool success = false ;   // флаг успешного выполнения копирования тиков
       MqlTick tick_array[];   // массив для приема тиков
         
       //--- сделаем 3 попытки получить тики
       while (attempts < 3 )
      {
         //--- замерим время старта перед получением тиков
         uint start = GetTickCount ();
         //--- дата, по которую запрашиваются тики (время открытия позиции)
         datetime Time_Open = ( datetime ) PositionGetInteger ( POSITION_TIME );
         //--- дата, с которой запрашиваются тики (достаточно взять на 30 секунд раньше открытия позиции)
         datetime Time_Start = ( datetime )(Time_Open- 30 );
         //--- запросим тиковую историю с момента Time_Start до момента Time_Open
         int received = CopyTicksRange (Symbol_T, tick_array, COPY_TICKS_ALL , Time_Start* 1000 , Time_Open* 1000 );
         if (received != - 1 )
         { 
             //--- выведем информацию о количестве тиков и затраченном времени
             PrintFormat ( "%s: received %d ticks in %d ms" , Symbol_T, received, GetTickCount ()-start);  
             //--- если тиковая история синхронизирована, то код ошибки равен нулю
             if ( GetLastError ()== 0 )
            {
               success = true ;
               break ;
            }
             else
               PrintFormat ( "%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d" , Symbol_T, received, GetTickCount ()-start, _LastError );
         }
         //--- считаем попытки
         attempts++;
         //--- пауза в 1 секунду в ожидании завершения синхронизации тиковой базы
         Sleep ( 1000 );
      }
       //--- не удалось получить запрошенные тики от самого начала истории с трех попыток 
       if (!success)
      {
         PrintFormat ( "Ошибка! Не удалось получить %d тиков по %s с трех попыток" , Symbol_T);
	 //return; (вставить, если цикл находится внутри функции типа void)
      }

       //--- узнаем количесто элементов в массиве
       int ticks = ArraySize (tick_array);

       //--- выведем bid последнего тика в массиве перед самым открытием позиции
       double last_bid_before_priceopen = tick_array[ticks- 1 ].bid;
       Print ( "BID последнего тика: " , tick_array[ticks- 1 ].bid);
       //--- выведем ask последнего тика в массиве перед самым открытием позиции
       double last_ask_before_priceopen = tick_array[ticks- 1 ].ask;
       Print ( "ASK последнего тика: " , tick_array[ticks- 1 ].ask);

       //--- узнаем цену, по которой была открыта позиция
       double Position_PriceOpen = PositionGetDouble ( POSITION_PRICE_OPEN );

       if (( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
      {
         //--- вычислим размер последнего тика, на котором была открыта позиция (для BUY позиции открытие было по цене ASK)
         double size_last_tick_ASK = NormalizeDouble ( fabs (Position_PriceOpen - last_ask_before_priceopen), _Digits );
      }
       else if (( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
      {
         //--- вычислим размер последнего тика, на котором была открыта позиция (для SELL позиции открытие было по цене BID)
         double size_last_tick_BID = NormalizeDouble ( fabs (last_bid_before_priceopen - Position_PriceOpen), _Digits );
      }
   }
}

 

이 버그를 얻은 방법 - 표시기가 있으며 전문가가 작업하고 있습니다. 표시기가 바뀝니다. 다시 컴파일됩니다. 지표의 변경 사항은 차트에서 명확하게 볼 수 있습니다.테스터에서 Expert Advisor가 실행되지만 아무 것도 변경되지 않은 것처럼 보입니다. 같은 결과입니다.

이제 터미널을 다시 시작하고 테스터를 실행하면 이미 새 코드가 표시됩니다.

어떤 종류의 샤머니즘이 분명하지 않습니다.

ex5 표시기를 제거했습니다. 테스터는 아무 일도 없었던 것처럼 계속 실행됩니다. 글쎄, 그는 실행을 위한 파일을 어디에서 얻습니까????

 
Roman # :

3184
표시기의 이상한 동작.
for 루프는 매 틱마다 가 아니라 새 촛불에 한 번만 본문에 들어갑니다.

그러나 i == 0이고 주어진 조건에서 i> = 0을 허용합니다.

동일한 바 제한 = 0에 체크할 때
첫 번째 값 i = -1을 의미하고 조건 i>=0
그래서 루프에 들어가지 않습니다.

 
Nikolai Semko # :

동일한 바 제한 = 0에 체크할 때
첫 번째 값 i = -1을 의미하고 조건 i>=0
그래서 루프에 들어가지 않습니다.

덕분에 하나 봤습니다.

그러나 이제 표시기 버퍼 IndBuff[i]가 범위를 벗어난 배열을 수행합니다.
그는 무엇을 필요로합니까? 초기 i=limit 아래에 할당되지 않는 이유는 무엇입니까?


 //+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property indicator_chart_window

#property indicator_buffers        1
#property indicator_plots          1


//indicator buffers
double IndBuff[];

double c = 0 ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
{
   SetIndexBuffer ( 0 , IndBuff, INDICATOR_DATA );
   PlotIndexSetInteger ( 0 , PLOT_DRAW_TYPE ,   DRAW_LINE );   //тип отрисовки
   PlotIndexSetInteger ( 0 , PLOT_LINE_STYLE , STYLE_SOLID ); //стиль отрисовки
   PlotIndexSetInteger ( 0 , PLOT_LINE_COLOR , clrAqua );     //цвет отрисовки
   PlotIndexSetInteger ( 0 , PLOT_LINE_WIDTH , 1 );           //толщина отрисовки
   PlotIndexSetString ( 0 ,   PLOT_LABEL , "K" );               //метка
   PlotIndexSetDouble ( 0 ,   PLOT_EMPTY_VALUE , 0.0 );         //нулевые значения считать пустыми
   
   return ( INIT_SUCCEEDED );
}


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double & price[])      
{

   ArraySetAsSeries (IndBuff, true );
   
   //-------------------------------------------------------------------------
   //Проверка и расчёт количества просчитываемых баров
   int limit = rates_total-prev_calculated;

   
   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for ( int i=limit; i>= 0 ; i--)
   {
      c = iClose ( _Symbol , PERIOD_CURRENT ,i);      
      
      IndBuff[i] = c;   //на этой строке array out of range

   }
   

   return (rates_total);
}


 
Roman # :

덕분에 하나 봤습니다.

그러나 이제 표시기 버퍼 IndBuff[i]가 범위를 벗어난 배열을 수행합니다.
그는 무엇을 필요로합니까? 초기 i=limit 아래에 할당되지 않는 이유는 무엇입니까?

   //Проверка и расчёт количества просчитываемых баров
   int limit = rates_total-prev_calculated;

   if (limit== 1 )
     limit= 2 ;
   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for ( int i=limit- 1 ; i>= 0 ; i--)
   {
      c = iClose ( _Symbol , PERIOD_CURRENT ,i);      
      
      IndBuff[i] = c;   //на этой строке array out of range

   }
 
Vitaly Muzichenko # :

따라서 각 막대에서 주기에 들어가지만 각 틱마다 필요합니다.

이런 식으로 작동하곤 했습니다.

틱의 경우 i>=0,

막대 i>0의 경우

이제 무화과를 통해 버퍼 작업 방법을 이해할 수 있습니다.

 

그리고 모든 것은 IndBuff 버퍼가 Rates_total + 1까지 할당되지 않았기 때문입니다.
그리고 ArrayResize 는 적용되지 않습니다.
구성을 위해 파산했습니다. 이제 if-를 통해 모든 것을 차단하시겠습니까?

 //+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double & price[])      
{

   ArraySetAsSeries (IndBuff, true );
   
   //-------------------------------------------------------------------------
   //Проверка и расчёт количества просчитываемых баров
   int limit = rates_total-prev_calculated;
   
   if (limit > 1 )
   {
      
       Print (rates_total, ": rates_total" );
       Print (limit, ": limit" );   
       Print ( ArraySize (IndBuff), ": IndBuff" );
   }   
   
   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for ( int i=limit; i>= 0 ; i--)
   {
      c = iClose ( _Symbol , PERIOD_CURRENT ,i);    

      IndBuff[i] = c;  //array out of range

   }
   

   return (rates_total);
}
100686: rates_total
100686: limit
100686: IndBuff
array out of range in 'Simple.mq5' (82,15)