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

 
fxsaber:

Не вижу никаких проблем с этим.

Только сейчас понял, что EX5 предыдущей версии должен быть с защитным механизмом.

А через ресурсы EX5 прошлой версии получится передать без защиты, что не подходит.

 

Пишу индикатор на 5ке.

Не могу заставить обновлять период средней с поля ввода на графике.  На 4ке такая конструкция будет работать.

Что не так? не пойму? Поле в ините через OnChartEvent обновляется, а период нет. Ни каким образом не могу изменить.

Прикладываю простой рабочий пример.

//+------------------------------------------------------------------+
//|                                                      Probe_2.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com"
#property description "The MA "
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot MA1
#property indicator_label1  "MA 1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

//--- input parameters
 extern int PBB=10;  //  период МА
//--- indicator buffers
double         BufferMA1[];
//--- global variables
int            period_ma1;
int            period_max;

int            handle_ma1;
string sn,sPBB;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  

   sPBB=IntegerToString(PBB);
   if(ObjectFind(0,"P2edit")!=0)
    {
       ObjectCreate(0,"P2edit",OBJ_EDIT,0,0,0);
       ObjectSetInteger(0,"P2edit",OBJPROP_XDISTANCE,300);
       ObjectSetInteger(0,"P2edit",OBJPROP_YDISTANCE,1);
       ObjectSetInteger(0,"P2edit",OBJPROP_XSIZE,70);
       ObjectSetInteger(0,"P2edit",OBJPROP_YSIZE,40);
       ObjectSetInteger(0,"P2edit",OBJPROP_SELECTABLE,false);
       ObjectSetInteger(0,"P2edit",OBJPROP_BGCOLOR,clrBlack);
       ObjectSetString (0,"P2edit",OBJPROP_TEXT,sPBB);
       ObjectSetInteger(0,"P2edit",OBJPROP_FONTSIZE,16);
       ObjectSetInteger(0,"P2edit",OBJPROP_COLOR,clrGray);
       ObjectSetInteger(0,"P2edit",OBJPROP_ALIGN,ALIGN_CENTER);
       ObjectSetInteger(0,"P2edit",OBJPROP_READONLY,false);
    }


//--- set global variables
   period_ma1=int(PBB<1 ? 1 : PBB);
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMA1,INDICATOR_DATA);
   ArraySetAsSeries(BufferMA1,true);
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- create handle
   ResetLastError();

   Comment("Должна соответствовать зеленой, а равна= ",PBB);
   
   handle_ma1=iMA(NULL,PERIOD_CURRENT,period_ma1,0,1,PRICE_CLOSE);
   if(handle_ma1==INVALID_HANDLE)
     {
      Print("The iMA(",(string)period_ma1,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
 {
  if(id==CHARTEVENT_OBJECT_ENDEDIT)
   {
    string obj_name=sparam;
    if(!StringCompare(obj_name,"P2edit"))
     {
     string novPBB=NULL;
     if(ObjectGetString(0,obj_name,OBJPROP_TEXT,0,novPBB))
      {
       if(StringCompare(novPBB,sPBB,false))
        {
         PBB= (int)StringToInteger(novPBB);
         ObjectSetInteger(0,"P2edit",OBJPROP_BGCOLOR,clrBlack);
         ObjectSetInteger(0,"P2edit",OBJPROP_COLOR,clrLime);
        }
       }
Print("B OnChartEvent PBB=",PBB);
      ChartSetSymbolPeriod(0,_Symbol,_Period);
      }
    }
    return;
 }
//+------------------------------------------------------------------+
//| 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[])
  {
//    Пробовал от сюда запускать.
//   sPBB=IntegerToString(PBB);
//   if(ObjectFind(0,"P2edit")!=0)
//    {
//       ObjectCreate(0,"P2edit",OBJ_EDIT,0,0,0);
//       ObjectSetInteger(0,"P2edit",OBJPROP_XDISTANCE,300);
//       ObjectSetInteger(0,"P2edit",OBJPROP_YDISTANCE,1);
//       ObjectSetInteger(0,"P2edit",OBJPROP_XSIZE,70);
//       ObjectSetInteger(0,"P2edit",OBJPROP_YSIZE,40);
//       ObjectSetInteger(0,"P2edit",OBJPROP_SELECTABLE,false);
//       ObjectSetInteger(0,"P2edit",OBJPROP_BGCOLOR,clrBlack);
//       ObjectSetString (0,"P2edit",OBJPROP_TEXT,sPBB);
//       ObjectSetInteger(0,"P2edit",OBJPROP_FONTSIZE,16);
//       ObjectSetInteger(0,"P2edit",OBJPROP_COLOR,clrGray);
//       ObjectSetInteger(0,"P2edit",OBJPROP_ALIGN,ALIGN_CENTER);
//       ObjectSetInteger(0,"P2edit",OBJPROP_READONLY,false);
//    } 
//   
//   if(PBB==0) PBB=(int)StringToInteger(sPBB);
// 
//   if(PBB<5) period_ma1=5; else  period_ma1=PBB;
//   if(PBB>300) period_ma1=300; else  period_ma1=PBB;
   
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

   ArraySetAsSeries(close,true);//--- Установка массивов буферов как таймсерий
//--- Проверка количества доступных баров
   if(rates_total<fmax(period_max,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferMA1,EMPTY_VALUE);
     }

//--- Подготовка данных
   int count=(limit>0 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_ma1,0,0,count,BufferMA1);
   if(copied!=count) return 0;

 //Comment("ошибка = ");
 
//--- возвращаемое значение prev_calculated для следующего вызова
   return(rates_total);
  }

//+------------------------------------------------------------------+
//|            deinit                                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   int i;
   int obj_total=ObjectsTotal(0,0,-1);
   for(i=obj_total-1;i>=0;i--)
     {
      sn=ObjectName(0,i,0,-1);
      if(ObjectFind(0,sn)==0) 
        {
         if (StringFind(sn,"P2edit",0)==0) ObjectDelete(0,sn);
        }
     }
  
   Comment("");
   return;
  }
 
Zakhar Chumak:

При запросе логов с действующих VPS выдёт ошибку "Failed to get terminal logs"

Кто знает в чём может быть проблема? При этом советники на VPS работают (открывают/закрывают сделки), а логи не могу загрузить.

Похоже на слишком длинный путь к папке temp.

Заархивированные логи сначала читаются во временный файл (с расширением tmp) в системную временную папку. Произошла ошибка формирования имени временного файла

 

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


 

Что?

Никто мой вопрос  не осилит?

Что интересно. С таким вариантом OnCalculate работает. Но этот вариант не подходит.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
 
Uladzimir Izerski:

Что?

Никто мой вопрос  не осилит?

Что интересно. С таким вариантом OnCalculate работает. Но этот вариант не подходит.

При смене графика / периода PBB получает значение 10, не зависимо от того какое значение вы указали в поле ввода.

В момент переинициализации происходит так как будто это первый запуск.

Решить Вашу задачу можно двумя спсобами

1 - хранить значение PBB в глобальных переменных терминала и получать период оттуда

2 - В момент срабатывания ОнЧартЕвент делать переинициализацию индикатора MA и получать новый хендл...

 

При переходе с MQL4 на MQL5 столкнулся с глюком:

код:

ResetLastError();

int ObjTotal = ObjectsTotal(0);

int Error = GetLastError();

возвращает:

ObjTotal = 0

Error = 4022

Что это за ошибка, почему ее нет в документации?

Пробовал разные варианты: ObjectsTotal(0, -1, -1), ObjectsTotal(ChartID(), 0, OBJ_TREND) и т.д.

Результат тот-же. 

Как заставить это работать?

Терминал: MetaTrader 5, Version 5.00 build 2025.
 
Игорь Евдокимов:

Совет: хотите что-то спросить - вставляйте ПОЛНЫЙ код, а не кусок. 

В чём смысл: любой человек берёт Ваш код и запускает у себя. А кусочный код практически никто не смотрит - кусочный код - это неуважение.

Пример Вашего кода:

//+------------------------------------------------------------------+
//|                                                            1.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ResetLastError();
   int ObjTotal=ObjectsTotal(0);
   int Error=GetLastError();
   Print("ObjectsTotal: ",ObjTotal,", GetLastError: ",Error);
//---
  }
//+------------------------------------------------------------------+

Запускаем на графике на котором нет ни одного графического объекта. Результат:

2019.05.10 13:26:59.169 1 (EURUSD,H1)   ObjectsTotal: 0, GetLastError: 0

То есть никакой ошибки нет. 


Использую терминал:

2019.05.10 13:25:35.665 MetaTrader 5 x64 build 2025 started (MetaQuotes Software Corp.)
2019.05.10 13:25:35.668 Windows 10 (build 17763) x64, IE 11, UAC, Intel Core i3-3120M  @ 2.50GHz, Memory: 3712 / 8077 Mb, Disk: 77 / 415 Gb, GMT+2
2019.05.10 13:25:35.668 C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
Файлы:
1.mq5  2 kb
 
Vladimir Karputov:

Совет: хотите что-то спросить - вставляйте ПОЛНЫЙ код, а не кусок. 

Спасибо за совет, так и буду делать.

Тем не менее, вопрос остается открытым.

Уточнение: если кусок кода из предыдущего поста находится в функции OnDeinit() индикатора, то результат такой:

2019.05.10 14:08:20.105 PtS (EURUSD,H1) ObjectsTotal: 0, GetLastError: 4022

Если тот же код запустить после удаления индикатора с графика, как скрипт (1.mq5 из предыдущего поста), то получаем:

2019.05.10 14:08:33.609 1 (EURUSD,H1) ObjectsTotal: 8575, GetLastError: 0

Помогите разобраться с причиной.

Господа разработчики! Что это за ошибка, которой нет в документации?

 
Vladislav Andruschenko :

ошибка в тестере стратегий при оптимизации.

"task rejected by  tester agent "

Например, если валюта счета EUR,

  • EURJPY Нет проблем
  • Ошибка при GBPJPY


Если валюта счета - доллар США,

  • USDCAD Нет проблем
  • USDJPY Нет проблем
  • Ошибка при EURAUD


появляется при использовании в коде других валютных пар.

конкретно на моем примере - это использование расчета динамического лота



т.е. когда советник запрашивает цену другой валюты. 

@Vladislav Andruschenko

Привет, вы получили какой-либо ответ или решение этой проблемы?