Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1356

 
Evgeny Dyuka #:
Почему может не выволиться в журнал команда Print?

Срабатывает защита от ... неверных действий пользователя. Выполните в терминале, во вкладке "Эксперты" правый клик и выполните команду "Просмотр".

 

Здравствуйте господа и госпожи! 

 Не кидайтесь тапками за мой вопрос. Понимаю что он наивный, но все мы "Боже какими мы были наивными" (романс).

 Я написал советника по оригинальному алгоритму. Тестирование показывает, что он наиболее эффективен в скальперском режиме. О результатах пока умолчу, потому что не поверите, мол знаем мы тут изобретателей перпетуум мобиле и Граалей. Он не тот и не другой и у него есть серьезный недостаток - он как все скальперские стратегии зависит от величины спреда и комиссий и стоплевел. Настройка у него практически одна  - SL , на тесте 6-10 pps на 5 ти знаках. Можете меня просветить как с этим бороться или с каким брокером можно играть в эти игры.

 
Здравствуйте. 
Есть индикатор. Он суммирует лимитные заявки в стакане и выводит это в виде диаграммы.
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2

#property indicator_label1 "Delta buy"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrWhite
#property indicator_width1 3

#property indicator_label2 "Delta sell"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_color2 clrBlue
#property indicator_width1 3

int iStart;
double iDelta1[];
double iDelta2[];

void OnDeinit(const int reason)
{
  string symbol = Symbol();

  MarketBookRelease(symbol);
}

void OnInit()
{
  string symbol = Symbol();

  SetIndexBuffer(0, iDelta1, INDICATOR_DATA);
  ArraySetAsSeries(iDelta1, true);
  
  SetIndexBuffer(1, iDelta2, INDICATOR_DATA);
  ArraySetAsSeries(iDelta2, true);

  IndicatorSetString(INDICATOR_SHORTNAME, "OrderBook");
  IndicatorSetInteger(INDICATOR_DIGITS, Digits());

  MarketBookAdd(symbol);
}

int OnCalculate(
  const int bars,
  const int counted,
  const datetime& time[],
  const double& open[],
  const double& high[],
  const double& low[],
  const double& close[],
  const long& ticks[],
  const long& volume[],
  const int& spread[]
)
{
  if (iStart == 0)
  {
    iStart = 1;
    ZeroMemory(iDelta1);
    ZeroMemory(iDelta2);
  }
  else if (bars != counted)
  {
    iDelta1[0] = iDelta1[1];
    iDelta2[0] = iDelta2[1];
  }

  string symbol = Symbol();

  double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
  double bid = SymbolInfoDouble(symbol, SYMBOL_BID);

  MqlBookInfo levels[];

  bool book = MarketBookGet(symbol, levels);

  int indexBuy = 1;
  int indexSell = 1;
  long volumeBuy = 0;
  long volumeSell = 0;


  if (book)
  {
    int size = ArraySize(levels);

    for (int k = 0; k < size; k++)
    {
      if (levels[k].price >= ask) 
      {
        volumeSell += indexSell * levels[k].volume;
        indexSell++;
         
      }
    }

    for (int k = size - 1; k >= 0; k--)
    {
      if (levels[k].price <= bid) 
      {
        volumeBuy += indexBuy * levels[k].volume;
        indexBuy++;
     
      }
    }
  }

 iDelta1[0] = (double) ( - volumeSell);
 iDelta2[0] = (double) (volumeBuy); 
  return bars;
}
И при каждом новом изменении стакана он переписывает прошлую сумму. А как сделать чтобы он накапливал сумму? То есть, не переписывал данные на текущем баре, а прибавлял? Пытался все реализовать через цикл while и суммировать данные пока текущий бар не сдвинулся, но что-то пошло не так. Прошу сильно не бить за такой банальный вопрос.
 

FileOpen возвращает ошибку 5001 (Не может быть открыто одновременно более 64 файлов).
Вроде каждый раз корректно закрываю через FileClose(file_handle).

Где и как накапливается счетчик открытых файлов и как его сбросить?

 

Здравствуйте!

Может быть, есть «кто в теме»… Ищу решение, каким способом можно полученную с помощью WebRequest байтовую последовательность ZIP-файла преобразовать в ZIP-архив и распаковать на диск средствами MQL5.

Поиск решения привел меня к статье «Работаем с ZIP-архивами средствами MQL5 без использования сторонних библиотек» от 2015 ( https://www.mql5.com/ru/articles/1971 ). Здесь автор показал решение и опубликовал класс CZip для работы с ZIP-архивами. Однако, применить это решение не удается – при компиляции, MetaEditor не может собрать исполняемый файл ссылаясь на ошибки в библиотеке класса CZip.

Суть моего вопроса, может быть сведена к следующему: - как можно отдельно использовать методы класса CZip, в частности CreateFromCharArray() и UnpackZipArchive(), включив их непосредственно в код скрипта?

//+------------------------------------------------------------------+
//|                                                     ZipTask2.mq5 |
//|                                 Copyright 2015, Vasiliy Sokolov. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vasiliy Sokolov."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Zip\Zip.mqh>

CZip Zip;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string cookie,headers;
   string mql_url="https://www.mql5.com/ru/code/download/9";
   int timeout=5000;
   uchar data[],zip_array[];
   if(!WebRequest("GET",mql_url,cookie,NULL,timeout,data,0,zip_array,headers))
     {
      printf("Unable to download ZIP archive from "+mql_url+". Check request and permissions EA.");
      return;
     }
   if(!Zip.CreateFromCharArray(zip_array))
     {
      printf("Loaded bad ZIP archive. Check results array.");
      return;
     }
   printf("Archive successfully loaded. Total files: "+(string)Zip.TotalElements());
   Zip.UnpackZipArchive("Alligator",FILE_COMMON);
  }
//+------------------------------------------------------------------+
Работаем с ZIP-архивами средствами MQL5 без использования сторонних библиотек
Работаем с ZIP-архивами средствами MQL5 без использования сторонних библиотек
  • www.mql5.com
Язык MQL5 развивается, и в него постоянно добавляются новые функции для работы с данными. С некоторых пор, благодаря нововведениям, стало возможно работать с ZIP-архивами штатными средствами MQL5 без привлечения сторонних библиотек DLL. Данная статья подробно описывает, как это делается, на примере описания класса CZip — универсального инструмента для чтения, создания и модификации ZIP-архивов.
 
Повторю вопрос.
Есть сервис который периодически создает файлы (закрываю все корректно через FileClose).
После запуска обычно первый фаил создается нармально, потом FileOpen начинает возвращать ошибку 5001.
Но все это рандомно - то работает то нет. При этом когда этот же код запускаю в скрипте или эксперте проблему не замечал.
Как обойти этот запрет?
 
Evgeny Dyuka #:
Повторю вопрос.
Есть сервис который периодически создает файлы (закрываю все корректно через FileClose).
После запуска обычно первый фаил создается нармально, потом FileOpen начинает возвращать ошибку 5001.
Но все это рандомно - то работает то нет. При этом когда этот же код запускаю в скрипте или эксперте проблему не замечал.
Как обойти этот запрет?

Вы хотите чтобы кто-то написал аналогичный сервис с теми-же ошибками как у вас и рассказал вам что надо исправить?

 
Alexey Viktorov #:

Вы хотите чтобы кто-то написал аналогичный сервис с теми-же ошибками как у вас и рассказал вам что надо исправить?

Начал вырезать лишее что бы код выложить и все заработало ))
В функии поиска файла не закрывался поиск через FileFindClose().
В любом случае, спасибо за ответ.
 
Evgeny Dyuka #:
Начал вырезать лишее что бы код выложить и все заработало ))
В функии поиска файла не закрывался поиск через FileFindClose().
В любом случае, спасибо за ответ.

Да, все что пользует файл, его открывает (открывает доступ к файлу) ))) И требуется закрытие файла (доступа). 

Лишнее закрытие вернет -1 без последствий, а забытый открытый файл может создать кучу проблем)

 

Напомните в input блоке можно комментарий не выводить в параметры робота?

sinput long   MagicNumber=123;      // Магический номер

чтобы в параметрах все же вылазил MagicNumber вместо - Магический номер (это как пример)