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

 
Artyom Trishkin #:

А что есть в журнале при снятии советника с графика? Обычно там пишется какие объекты утекают, что даёт направление поиска

Угу. Логи я удалил. Но не беда, повторить не долго. Сейчас запущу советник на серваке, утром (может раньше) будут логи.

Но насколько я помню, не смог в них найти указание на то куда утекает память.

И советник не удаляется с графика, скорее всего просто перезагружается сервак, так как в логах отсутствует запись о закрытии терминала. Но это не точно.

 
Aleksandr Slavskii #:

Угу. Логи я удалил. Но не беда, повторить не долго. Сейчас запущу советник на серваке, утром (может раньше) будут логи.

Но насколько я помню, не смог в них найти указание на то куда утекает память.

И советник не удаляется с графика, скорее всего просто перезагружается сервак, так как в логах отсутствует запись о закрытии терминала. Но это не точно.

Вы не поняли смысла моего вопроса. Не нужно ждать на сервере, когда там закончится память и он лопнет.

Если в коде есть утечка объектов, то на домашнем локальном компьютере при запущенном советнике перекомпилируйте его - в логи должно быть выведено сообщение о количестве и типе утекаемых объектов. Ну либо запустите его на графике и снимите сразу - тоже должно появиться сообщение об утечке, если она, конечно, есть.

 
Artyom Trishkin #:

Вы не поняли смысла моего вопроса. Не нужно ждать на сервере, когда там закончится память и он лопнет.

Если в коде есть утечка объектов, то на домашнем локальном компьютере при запущенном советнике перекомпилируйте его - в логи должно быть выведено сообщение о количестве и типе утекаемых объектов. Ну либо запустите его на графике и снимите сразу - тоже должно появиться сообщение об утечке, если она, конечно, есть.

Ничего не пишет при компиляции. Удаляет и ставит по новой. Всё. 

NM      0       00:18:47.545    Experts expert Comm (SBRF-12.23,M1) removed
JI      0       00:18:47.547    Experts expert Comm (SBRF-12.23,M1) loaded successfully
KQ      0       00:18:47.560    Experts expert Comm (RTS-12.23,M1) removed
EE      0       00:18:47.562    Experts expert Comm (RTS-12.23,M1) loaded successfully

На серваке ещё пока работает. Подожду, может там в логах, что то напишет.

 
Aleksandr Slavskii #:

Попытался сделать аналог коммента, только чтоб буковки были побольше.

Через какое то время после запуска советника с комментом на нескольких графиках, происходит что то не хорошее, вплоть до потухания экрана и перезагрузки сервака)))

Понятно, что что то делаю не правильно с классом CCanvas, а вот что именно неправильно, я не понимаю.

Кажется понял. Поправьте если понял не правильно.

У меня в коде на каждом тике создаётся ресурс с разными именами. 

код из канваса

      //--- generate resource name
      m_rcname="::"+name+(string)ChartID()+(string)(GetTickCount()+MathRand());
      //--- initialize data with zeros
      ArrayInitialize(m_pixels,0);
      //--- create dynamic resource
      if(ResourceCreate(m_rcname,m_pixels,width,height,0,0,0,clrfmt))

А при следующем обновлении картинки этот ресурс судя по всему не удаляется.

Объект один и тот же, ресурсы к нему лепятся разные.

В общем переделал код. 

вроде так он должен быть правильным.

#include <Canvas\Canvas.mqh>
//+------------------------------------------------------------------+
void Comm(string txt, color clr = clrYellow, int FontSize = 20, string Font = "Consolas", int flag = FW_BOLD)
  {
   int shift = 0;
   if(ChartGetInteger(0, CHART_SHOW_ONE_CLICK))
      shift = 60;

   CCanvas canvas;
   canvas.FontNameSet(Font);
   canvas.FontFlagsSet(flag);
   canvas.FontSizeSet(FontSize);

   int width = 0, height = 0;
   string result[];
   int size = StringSplit(txt, StringGetCharacter("\n", 0), result);
   height = (int)(FontSize * 1.8 * size);

   for(int i = 0; i < size; i++)
     {
      int w = canvas.TextWidth(result[i]);
      if(width < w)
         width = w;
     }

   if(ObjectFind(0, "Comment") < 0)
      canvas.CreateBitmapLabel(0, 0, "Comment", 5, 20 + shift, width, height, COLOR_FORMAT_ARGB_NORMALIZE);
   else
      canvas.Attach(0, "Comment", width, height, COLOR_FORMAT_ARGB_NORMALIZE);
   canvas.Erase(0x00FFFFFF);

   for(int i = 0; i < size; i++)
      canvas.TextOut(0, (int)(FontSize * 0.8 * i), result[i], ColorToARGB(clr, 255));

   canvas.Update(true);
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

Ничего не пишет при компиляции. Удаляет и ставит по новой. Всё. 

На серваке ещё пока работает. Подожду, может там в логах, что то напишет.

Журнал "Эксперты"

 
Artyom Trishkin #:

Журнал "Эксперты"

В журнале Эксперты, стерильная чистота.

//---

Да в общем то в причине проблемы разобрались.

Остаётся вопрос, как при закрытии программы, удалить из памяти ресурс созданный канвасом.

Объект я удаляю у него есть имя, а вот имя ресурса в "protected" и его никак не узнаешь.

М да,  ООП "весёлая штука". 

В итоге пришлось объявлять канвас в глобале, а не в теле функции и добавить в деинит  canvas.Destroy();

Полёт нормальный)

 

Всем доброго дня и хорошего настроения!

Уже очень давно пользуюсь готовой функцией расчёта лота в зависимости от риска, но в ней не было привязки к размеру стоп-лосса. Сегодня решил написать с нуля свою функцию в виде скрипта (для удобства проверки), но уже с учётом стоп-лосса. Прошу посмотреть формулу расчёта размера лота (выделена жёлтым цветом). Возможно, что-то упустил.

Всякого рода проверки на минимальный, максимальный лот, шаг и т.д., и т.п., не включал, т.к. этим займусь позже!

С уважением, Владимир.

//+------------------------------------------------------------------+
//|                                   Lot_Size_Depending_On_Risk.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
input double Risk=5;      // Размер риска
input uint Stop_Loss=500; // Размер стоп-лосса
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot_Size_Depending_On_Risk()
  {
   //--- определим валюту депозита
   string symbol="";
   string account_currency="";
   symbol=account_currency==AccountInfoString(ACCOUNT_CURRENCY) ? "EURUSDrfd" : "USDRUBrfd";
   double trading_account_currency=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_BID),2);
   double lot=(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*Risk*0.01)/(Stop_Loss*trading_account_currency);
   return(lot);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Print(DoubleToString(Lot_Size_Depending_On_Risk(),2));
  }
//+------------------------------------------------------------------+
 
MrBrooklin #:

Всем доброго дня и хорошего настроения!

Уже очень давно пользуюсь готовой функцией расчёта лота в зависимости от риска, но в ней не было привязки к размеру стоп-лосса. Сегодня решил написать с нуля свою функцию в виде скрипта (для удобства проверки), но уже с учётом стоп-лосса. Прошу посмотреть формулу расчёта размера лота (выделена жёлтым цветом). Возможно, что-то упустил.

Всякого рода проверки на минимальный, максимальный лот, шаг и т.д., и т.п., не включал, т.к. этим займусь позже!

С уважением, Владимир.

Обязательно надо учесть стоимость одного тика.

 
Alexey Viktorov #:

Обязательно надо учесть стоимость одного тика.

Привет, Алексей! Спасибо, что откликнулся. В целях самообразования хочу понять с какой целью нужно учесть стоимость одного тика и ещё кратко поясни, в какой части формулы его применить, если тебя это не затруднит. Возможно, что не совсем понял о чём речь.

С уважением, Владимир.

 
MrBrooklin #:

Привет, Алексей! Спасибо, что откликнулся. В целях самообразования хочу понять с какой целью нужно учесть стоимость одного тика и ещё кратко поясни, в какой части формулы его применить, если тебя это не затруднит. Возможно, что не совсем понял о чём речь.

С уважением, Владимир.

Для определения суммы которую трейдер готов потерять в случае неудачи. Убыток = Loss*стоимость пункта*лот. Отсюда — лот = допустимый убыток/(Loss*стоимость пункта) Формула примерная.