Hatalar, hatalar, sorular - sayfa 3147

 
Hepinize iyi günler. Söyleyin lütfen, Sleep() işlevi Expert Advisor test modunda mı yürütülüyor (elbette gerçek keneler üzerinde test ediliyor)?
 
SuhanovDM94 # :
Hepinize iyi günler. Söyleyin lütfen, Sleep() işlevi Expert Advisor test modunda mı yürütülüyor (elbette gerçek keneler üzerinde test ediliyor)?

Koşu - Testçinin zamanı uygun miktarda değiştirilir.

 
fxsaber # :

Koşu - Test Cihazının zamanı uygun değere göre değiştirilir.

Çok teşekkürler!

 
Wizard # :
Pozisyon açıldıktan sonra (hangisinde) mql5'te aynı kene boyutunu bir şekilde bulmak mümkün müdür?

Bunun mümkün olduğu ortaya çıkıyor. for döngüsü ayrı bir işleve, OnTick() işlevine veya sizin takdirinize bağlı olarak eklenir. Başkalarının ilginç görüşü. Örneğin, ultra hassas bir sistem oluşturmak için bir şeye ihtiyacım var. Bu nedenle, pozisyonları açma ve kapama fonksiyonları da dahil olmak üzere kütüphaneler olmadan yazıyorum. Kim ne derse desin mqh kütüphaneleri işi yavaşlatır, örneğin derleme 1.5 kat daha uzun sürer. Her şeyi tek bir dosyaya yazmak daha iyidir. Ve stil, OOP veya prosedürel, burada bir rol oynamaz. MQL5 asla C++ düzeyinde bir dil olmayacak, hiçbir şekilde sınırlı değil. Kütüphanelerin anlamı...

 #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 );
      }
   }
}

 

Bu hatayı nasıl aldım - bir gösterge var, ondan çalışan bir uzman var. Gösterge değişir. yeniden derlenir. Göstergedeki değişiklikler grafikte açıkça görülebilir.Uzman Danışman test cihazında çalıştırılır, ancak hiçbir şeyi değiştirmemiş gibi. Aynı sonuç.

Şimdi, terminali yeniden başlatır ve bundan sonra test cihazını çalıştırırsanız, yeni kodu zaten görecektir.

Ne tür bir şamanizm açık değil

Ex5 göstergesi kaldırıldı. Test cihazı hiçbir şey olmamış gibi çalışmaya devam eder. Peki, infaz için dosyayı nereden alıyor????

 
Roman # :

3184
Göstergede garip davranış.
for döngüsü vücuda girer, her tikte değil, yeni bir mumda yalnızca bir kez.

Ama i == 0 ve verilen koşul i> = 0'a izin verir

aynı çubuk limitini işaretlerken = 0
ilk i = -1 değeri ve i>=0 koşulu anlamına gelir
bu yüzden döngüye girmez.

 
Nikolai Semko # :

aynı çubuk limitini işaretlerken = 0
ilk i = -1 değeri ve i>=0 koşulu anlamına gelir
bu yüzden döngüye girmez.

Teşekkürler, birine baktım.

Ama şimdi gösterge arabelleği IndBuff[i] aralık dışında bir dizi yapıyor.
Onun neye ihtiyacı var? Neden ilk i=limit altında tahsis edilmiyor?


 //+------------------------------------------------------------------+
//|                                                       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 # :

Teşekkürler, birine baktım.

Ama şimdi gösterge arabelleği IndBuff[i] aralık dışında bir dizi yapıyor.
Onun neye ihtiyacı var? Neden ilk i=limit altında tahsis edilmiyor?

   //Проверка и расчёт количества просчитываемых баров
   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 # :

Böylece her çubukta döngüye girer, ancak her kene için gereklidir.

Eskiden böyle çalışırdı

keneler için i>=0,

çubuklar için i>0

Şimdi incir, tamponla nasıl çalışacağınızı anlayacaksınız.

 

Ve hepsi, IndBuff arabelleğinin Rate_total + 1'e kadar ayrılmadığı için
Ve ArrayResize bunun için geçerli değil.
Yapıyı kırdı. Şimdi, if-s yoluyla, her şeyi çitlemek için mi?

 //+------------------------------------------------------------------+
//| 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)
Neden: