Ошибки, баги, вопросы - страница 670

 

Не отображаются, бары и OHLC только по металлам на Альпари, у остальных все нормально. Котировки идут, ордера ставятся. Переставлял терминал в новую папку, не помогает. Где может быть ошибка ? W7 64

 

 
BoraBo:

Не отображаются, бары и OHLC только по металлам на Альпари, у остальных все нормально. Котировки идут, ордера ставятся. Переставлял терминал в новую папку, не помогает. Где может быть ошибка ? W7 64

Аналогично. Видно, на сервере что-то отключили. В техподдержку Альпари.

 
void OnStart()
  {
//---
symbol2csv(Symbol(),Period());
  }
//+------------------------------------------------------------------+
int symbol2csv(string smb,ENUM_TIMEFRAMES tf)
  {
   ResetLastError();
   int filehandle=FileOpen(smb+"_"+tf2str(tf)+".csv",FILE_WRITE|FILE_CSV,",");
   if(filehandle!=INVALID_HANDLE)
     {
      MqlRates rates[];
      int i=0,copyed=CopyRates(smb,tf,From,To,rates);
      ArraySetAsSeries(rates,false);
      FileWrite(filehandle,"\"Date\" \"Time\" \"Open\" \"High\" \"Low\" \"Close\" \"Volume\""); // writing header
      for(i=0;i<copyed;i++)
        {
         FileWrite(filehandle,TimeToString(rates[i].time,TIME_DATE),TimeToString(rates[i].time,TIME_MINUTES),DoubleToString(rates[i].open,_Digits),DoubleToString(rates[i].high,_Digits),DoubleToString(rates[i].low,_Digits),DoubleToString(rates[i].close,_Digits),rates[i].real_volume);
        }
      FileClose(filehandle);
      Print(smb+" exported "+IntegerToString(copyed));
      return copyed;
     }
   else Print("FileOpen failure. Error is ",GetLastError());
   return -1;
  }
Почему в файле колонка Volume всегда содержит 0? И как сделать чтоб записывался объем?
 
Graff:
Почему в файле колонка Volume всегда содержит 0? И как сделать чтоб записывался объем?

real_volume  для форекс инструментов???

может для начала просто тиковый попробуете tick_volume

 

В чем ошибка понять ну просто не могу?

Вот код, сократил до минимума:

//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

//---------- MQL5 --------------
int ecx = 0;//-- Кол-во тестируемых пар --
string g_s_SymbolsTrade[] = {"AUDCAD","AUDCHF","AUDJPY","AUDNZD","AUDUSD","CADCHF","CHFJPY","EURAUD","EURCAD","EURCHF","EURGBP","EURJPY","EURNZD","EURUSD",
"GBPCHF","GBPJPY","GBPUSD","NZDUSD","USDCAD","USDCHF","USDJPY"};

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   //-- Сколько всего валютных пар --
   ecx = ArraySize(g_s_SymbolsTrade);
   //-- Установить таймер на каждую секунду --
   if (EventSetTimer(1) == false) return(-1);//int 08
   
   return(0);//ret;
}
//----------------------------------------------------------------------------//
void OnDeinit(const int reason)
{
   EventKillTimer();//timer off
}
//+------------------------------------------------------------------+
//| 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[])
{
    
//--- return value of prev_calculated for next call
   return(rates_total);//ret;
}

//+------------------------------------------------------------------+
////////////////////////////////////////////////////////////////////////////////
//                           Expert Timer function                            //
////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
void OnTimer()//int 08
{
static bool b_Flag = false;
string db_SymbolName;
MqlRates rates[];
int edx;

   if (b_Flag == true) return;//ret -- реентерабельность --
   b_Flag = true;//cli
   //---------------------------------------------
   for (int ebx = 0; ebx < ecx; ebx++){
      db_SymbolName = g_s_SymbolsTrade[ebx];
      edx=CopyRates(db_SymbolName,_Period,0,1,rates);
      if (edx != 1){//cmp edx,1 | jne
         b_Flag = false;//sti
         return;//jne ret;
      }   
   }//loop ecx       
   Print ("Загрузка завершена.");
   //---------------------------------------------
   b_Flag = false;//sti
}

Запускаю, бывает сразу или после переключения периода графиков вдруг терминал начинает дико тормозить, а весь журнал забивается вот этим:


В чем причина, это мой косяк или ошибка в функции CopyRates ?

 
pusheax:

В чем причина, это мой косяк или ошибка в функции CopyRates ?

У обоих.

Попробуй так:

void OnTimer()//int 08
{
static bool b_Flag = false;
if (b_Flag == true) return;//ret -- реентерабельность --
string db_SymbolName;
MqlRates rates[ecx];    // поправка здесь.
int edx;


   b_Flag = true;//cli
   //---------------------------------------------
   for (int ebx = 0; ebx < ecx; ebx++){
      db_SymbolName = g_s_SymbolsTrade[ebx];
      edx=CopyRates(db_SymbolName,_Period,0,1,rates);
      if (edx != 1){//cmp edx,1 | jne
         b_Flag = false;//sti
         return;//jne ret;
      }   
   }//loop ecx       
   Print ("Загрузка завершена.");
   //---------------------------------------------
   b_Flag = false;//sti
}
 
MetaDriver:

У обоих.

Попробуй так:


Нет к сожалению не помогло.

Я правда записал так: MqlRates rates[100];

а то так: MqlRates rates[ecx]; - выдает ошибку при компиляции.

И еще мне понравилась идея перенести наверх:

if (b_Flag == true) return;//ret -- реентерабельность --

но к сожалению результат тот же самый.

Может есть еще какие нибудь идеи?

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных - Документация по MQL5
 
papaklass:

Если в терминале в настройках графиков стоит количество баров unlimited. Уменьшите количество баров.

да у него вроде всего-то один бар копируется.
 
papaklass:

Так на 25 инструментах. У меня на 12-ти такая же лабуда была, пока не сократил количество баров

Тогда значит в сервисдеск. Терминал не должен эксгумировать с диска всю историю по символу при чтении 1 бара.

Даже если в настройках unlimited.  Кешировать надо по умному кагбэ..

--

Совет в общем правильный. Я тут поразмышлял - он ведь говорит, что "при переключении периодов". Т.е. терминал всё хранит в минутках, он начинает расчитывать недостающие периоды, и упирается в нехватку памяти для буферов.

Кароче - оба виноваты. Пуш - в том что памяти не прикупил, а хочет многа-многа валютных пар да в безлимите (или около безлимита).

А MQ - что не обрабатывают как ошибку индикатора (типа "Error XXXX : закатайте губу, товарисч."), а только как свою.

 

Бывает ошибка сразу без переключения периода.

Как с этим бороться вообще не понятно, такой вариант тоже не работает:

void OnTimer()//int 08
{
static bool b_Flag = false;

   if (b_Flag == true) return;//ret -- реентерабельность --
   b_Flag = true;//cli
   

string db_SymbolName;
//MqlRates rates[100];
int edx;
double           open_array[1];      // массив для копирования цен открытия
double           close_array[1];      // массив для копирования цен закрытия
   
   
   //---------------------------------------------
   for (int ebx = 0; ebx < ecx; ebx++){
      db_SymbolName = g_s_SymbolsTrade[ebx];
      //edx=CopyRates(db_SymbolName,_Period,0,1,rates);
      edx = 0;//xor edx,edx
      edx += CopyOpen(db_SymbolName,_Period,0,1,open_array);
      edx += CopyClose(db_SymbolName,_Period,0,1,close_array);
      if (edx != 2){//cmp edx,2 | jne
         b_Flag = false;//sti
         return;//jne ret;
      }   
   }//loop ecx       
   Print ("Загрузка завершена.");
   //---------------------------------------------
   b_Flag = false;//sti
}

По одному инструменту за тик, даже если заработает тоже не выход, так как для InstaForex гружу 108 пар:

string g_s_SymbolsTrade[] = {"EURUSD","GBPUSD","USDCHF","USDJPY","USDCAD","AUDUSD","AUDCAD","AUDCHF","AUDJPY","EURGBP","EURCHF","EURJPY","NZDUSD","AUDNZD",
"EURNZD","EURCAD","GBPAUD","GBPCAD","GBPNZD","CHFJPY","CADCHF","CADJPY","NZDCAD","NZDCHF","NZDJPY","EURAUD","GBPCHF","GBPJPY","AUDCZK","AUDDKK","AUDHKD",
"AUDHUF","AUDMXN","AUDNOK","AUDPLN","AUDSEK","AUDSGD","AUDZAR","CADCZK","CADDKK","CADHKD","CADHUF","CADMXN","CADNOK","CADPLN","CADSEK","CADSGD","CADZAR",
"CHFCZK","CHFDKK","CHFHKD","CHFHUF","CHFMXN","CHFNOK","CHFPLN","CHFSEK","CHFSGD","CHFZAR","CZKJPY","DKKJPY","EURCZK","EURDKK","EURHKD","EURHUF","EURMXN",
"EURNOK","EURPLN","EURSEK","EURSGD","EURZAR","GBPCZK","GBPDKK","GBPHKD","GBPHUF","GBPMXN","GBPNOK","GBPPLN","GBPSEK","GBPSGD","GBPZAR","HKDJPY","HUFJPY",
"MXNJPY","NOKJPY","NZDCZK","NZDDKK","NZDHKD","NZDHUF","NZDMXN","NZDNOK","NZDPLN","NZDSEK","NZDSGD","NZDZAR","SEKJPY","SGDJPY","USDCZK","USDHKD","USDHUF",

"USDMXN","USDPLN","USDSGD","ZARJPY","USDDKK","USDNOK","USDRUR","USDSEK","USDZAR"};

на минутах пока последнюю пару загрузишь бар уже поменялся.

Может есть другой способ в течении минуты получить Open и Close по всем валютным парам?