Новая версия платформы MetaTrader 5 build 2360: Расширение интеграции с SQLite - страница 6

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Slava
Модератор
13448
Slava  
Artem Mordvinkin:

Господа разработчики, добрый день!

Я уже писал о проблеме тестирования мултивалютных сов на новом билде - об отказе терминала подгружать данные символов, отличных от символа тестирования (он их "не видит") . Я протестировал советник на котировках с классическим названием (MQDemo) EURUSD, GBPUSD и тд - работает, в моем же случае, на парах с измененным названием EURUSDRfd и тд (скрин прилагаю), тест мультисовы невозможен тк не подгружаются котировки пар, отличных от пары выбранной в тестере. Не отправляйте к новичкам - это не вопрос кода и тд (все уже было перепробовано - и на одном брокере работает, на другом нет) Мой брокер достаточно крупный в России (не кухня - предвосхищаю уклон на экзотичность:))

Подскажите  (если не будете решать проблему)  где можно взять предыдущий билд? На нем все работало. Спасибо. Если есть желание удостовериться в проблеме самолично - пишите в личку - дам логин и пароль к демосчету


Написал Вам в личку

Сергей Таболин
2644
Сергей Таболин  

После построения трендовой в тестере ObjectGetValueByTime() выдаёт только значение цены последней точки привязки этой трендовой. Может поправите?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Не могу понять...© В августе 44-го

Сергей Таболин, 2020.03.17 10:39

И я так же подумал. Добавил в код

     Print(TimeToString(rates[2+i].time));

Время читается правильно, а значение трендовой на всех барах берётся по последней цене построения этой самой трендовой.

2020.03.17 12:31:32.004 2018.01.04 01:00:00   2018.01.03 23:00
2020.03.17 12:31:32.004 2018.01.04 01:00:00   ~~if(rates[2].high = 1.20156 > t_h = 1.20156) -1 || summ = 0
2020.03.17 12:31:32.004 2018.01.04 01:00:00   ~~if(rates[2].low = 1.20097 < t_l = 1.20097) +1 || summ = 0
2020.03.17 12:31:32.004 2018.01.04 01:00:00   2018.01.03 22:00
2020.03.17 12:31:32.004 2018.01.04 01:00:00   ~~if(rates[3].high = 1.20286 > t_h = 1.20156) -1 || summ = -1
2020.03.17 12:31:32.004 2018.01.04 01:00:00   ~~if(rates[3].low = 1.20097 < t_l = 1.20097) +1 || summ = -1
2020.03.17 12:31:32.004 2018.01.04 01:00:00   2018.01.03 21:00
2020.03.17 12:31:32.004 2018.01.04 01:00:00   ~~if(rates[4].high = 1.20295 > t_h = 1.20156) -1 || summ = -2
2020.03.17 12:31:32.008 2018.01.04 01:00:00   ~~if(rates[4].low = 1.20008 < t_l = 1.20097) +1 || summ = -1
2020.03.17 12:31:32.008 2018.01.04 01:00:00   2018.01.03 20:00
2020.03.17 12:31:32.008 2018.01.04 01:00:00   ~~if(rates[5].high = 1.20289 > t_h = 1.20156) -1 || summ = -2
2020.03.17 12:31:32.008 2018.01.04 01:00:00   ~~if(rates[5].low = 1.20215 < t_l = 1.20097) +1 || summ = -2
2020.03.17 12:31:32.008 2018.01.04 01:00:00   2018.01.03 19:00
2020.03.17 12:31:32.008 2018.01.04 01:00:00   ~~if(rates[6].high = 1.20313 > t_h = 1.20156) -1 || summ = -3
2020.03.17 12:31:32.008 2018.01.04 01:00:00   ~~if(rates[6].low = 1.20239 < t_l = 1.20097) +1 || summ = -3
2020.03.17 12:31:32.008 2018.01.04 01:00:00   summ = -3

Slava
Модератор
13448
Slava  
Сергей Таболин:

После построения трендовой в тестере ObjectGetValueByTime() выдаёт только значение цены последней точки привязки этой трендовой. Может поправите?


В той ветке Вы представили код, иллюстрирующий проблему.

В пределах одного вызова создаёте объект на графике и тут же берёте его значения. Так?

А Вы уверены, что когда Вы берёте значения объекта, этиот объект уже отрисован на графике? Я не уверен.

Создайте сначала трендовую линию. Как угодно, руками или скриптом. И только потом запустите скрипт, который берёт значения объекта

Сергей Таболин
2644
Сергей Таболин  
Slava:

В той ветке Вы представили код, иллюстрирующий проблему.

В пределах одного вызова создаёте объект на графике и тут же берёте его значения. Так?

А Вы уверены, что когда Вы берёте значения объекта, этиот объект уже отрисован на графике? Я не уверен.

Создайте сначала трендовую линию. Как угодно, руками или скриптом. И только потом запустите скрипт, который берёт значения объекта

Этот код из советника. Построения и считывание значений происходят только на открытии нового бара.

Подскажите, в каком месте я не правильно закодировал?

//+------------------------------------------------------------------+
ENM_TRADESIGNAL   checkVectors(void)
{
   Print(__FUNCTION__);
   int   summ  = 0;
   int   in_Vector_Bars = 5;
   
   //ObjectDelete(ChartID(),"t_h");
   //ObjectDelete(ChartID(),"t_l");
   if(!drawTLine("t_h",rates[2+in_Vector_Bars-1].time,rates[2+in_Vector_Bars-1].high,rates[2].time,rates[2].high,true,clrAliceBlue,STYLE_DOT,1,false,false)
      ||
      !drawTLine("t_l",rates[2+in_Vector_Bars-1].time,rates[2+in_Vector_Bars-1].low ,rates[2].time,rates[2].low ,true,clrAliceBlue,STYLE_DOT,1,false,false))
         return(TRADESIGNAL_NO);
   
   for(int i = 1; i < in_Vector_Bars - 1; i++)
   {
     datetime  tm = rates[2+i].time;
     if(ObjectFind(ChartID(),"t_h") < 0) Print("Верхняя трендовая не найдена");
     if(ObjectFind(ChartID(),"t_l") < 0) Print("Нижняя трендовая не найдена");
     double    ph = NormalizeDouble(ObjectGetValueByTime(ChartID(),"t_h",tm),Digits());
     double    pl = NormalizeDouble(ObjectGetValueByTime(ChartID(),"t_l",tm),Digits());
     //double    ph = NormalizeDouble(EquationDirect(2+in_Vector_Bars-1,rates[2+in_Vector_Bars-1].high,2,rates[2].high,2+1),Digits());
     //double    pl = NormalizeDouble(EquationDirect(2+in_Vector_Bars-1,rates[2+in_Vector_Bars-1].low ,2,rates[2].low ,2+i),Digits());
     Print(TimeToString(tm));
     if(rates[2+i].high > ph) summ -= 1;
     Print("~~if(rates[",2+i,"].high = ",rates[2+i].high," > t_h = ",ph,") -1 || summ = ",summ);
     if(ratesTABO[2+i].low  < pl) summ += 1;
     Print("~~if(rates[",2+i,"].low  = ",rates[2+i].low," < t_l = ",pl,") +1 || summ = ",summ);
   }
   Print("summ = ",summ);
   
   
.........
   
   return(TRADESIGNAL_NO);
}
//+------------------------------------------------------------------+
bool  drawTLine(  const string            name_line,              // имя линии 
                  datetime                time1,                  // время первой точки
                  double                  price1,                 // цена первой точки 
                  datetime                time2,                  // время второй точки 
                  double                  price2,                 // цена второй точки 
                  bool                    obj_del,                         // удалить объект
                  const color             clr      = clrRed,      // цвет линии 
                  const ENUM_LINE_STYLE   style    = STYLE_SOLID, // стиль линии 
                  const int               width    = 1,           // толщина линии 
                  bool                    ray_left = false,       // луч влево
                  bool                    ray_right= true,        // луч вправо
                  const long              chart_ID    = 0,        // ID графика
                  const int               sub_window  = 0         // номер подокна
               )
{
   if(obj_del && ObjectFind(chart_ID,name_line) >= 0 && !ObjectDelete(chart_ID,name_line)) return(false);
   
   if(ObjectFind(chart_ID,name_line) < 0)
   {
      ResetLastError();
      if(!ObjectCreate(chart_ID,name_line,OBJ_TREND,sub_window,0,0,0,0)) 
      { 
         Print(__FUNCTION__, 
               ": не удалось создать линию тренда! Код ошибки = ",GetLastError()); 
         return(false); 
      }
      
      ChartRedraw(chart_ID);
      
   //--- установим цвет линии 
      ObjectSetInteger(chart_ID,name_line,OBJPROP_COLOR,clr); 
   //--- установим стиль отображения линии 
      ObjectSetInteger(chart_ID,name_line,OBJPROP_STYLE,style); 
   //--- установим толщину линии 
      ObjectSetInteger(chart_ID,name_line,OBJPROP_WIDTH,width); 
   //--- отобразим на переднем (false) или заднем (true) плане 
      ObjectSetInteger(chart_ID,name_line,OBJPROP_BACK,true); 
   //--- включим (true) или отключим (false) режим перемещения линии мышью 
   //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
   //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
   //--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
      ObjectSetInteger(chart_ID,name_line,OBJPROP_SELECTABLE,true); 
      ObjectSetInteger(chart_ID,name_line,OBJPROP_SELECTED,false); 
   //--- включим (true) или отключим (false) режим продолжения отображения линии влево 
      ObjectSetInteger(chart_ID,name_line,OBJPROP_RAY_LEFT,ray_left); 
   //--- включим (true) или отключим (false) режим продолжения отображения линии вправо 
      ObjectSetInteger(chart_ID,name_line,OBJPROP_RAY_RIGHT,ray_right); 
   //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
      ObjectSetInteger(chart_ID,name_line,OBJPROP_HIDDEN,false); 
   //--- установим приоритет на получение события нажатия мыши на графике 
      ObjectSetInteger(chart_ID,name_line,OBJPROP_ZORDER,0); 
   }
   
   ObjectSetInteger  (chart_ID,name_line,OBJPROP_TIME ,0,time1);
   ObjectSetDouble   (chart_ID,name_line,OBJPROP_PRICE,0,price1);
   ObjectSetInteger  (chart_ID,name_line,OBJPROP_TIME ,1,time2);
   ObjectSetDouble   (chart_ID,name_line,OBJPROP_PRICE,1,price2);
//--- успешное выполнение 
   return(true);    
}
//+------------------------------------------------------------------+
Сергей Таболин
2644
Сергей Таболин  

Запустил его ещё раз в тестере (визуальный режим).

2020.03.26 17:42:45.178 2019.01.01 00:00:00   ~~ Советник VectorH V.1.01 запущен на символе EURUSD, период графика H1
2020.03.26 17:42:45.178 2019.01.01 00:00:00   TF = 3600
2020.03.26 17:42:45.618 2019.01.02 07:00:00   checkVectors
2020.03.26 17:42:45.618 2019.01.02 07:00:00   2018.12.31 19:00
2020.03.26 17:42:45.618 2019.01.02 07:00:00   ~~if(ratesTABO[3].high = 1.14559 > t_h = 1.1454) -1 || summ = -1
2020.03.26 17:42:45.618 2019.01.02 07:00:00   ~~if(ratesTABO[3].low  = 1.14438 < t_l = 1.14415) +1 || summ = -1
2020.03.26 17:42:45.618 2019.01.02 07:00:00   2018.12.31 18:00
2020.03.26 17:42:45.618 2019.01.02 07:00:00   ~~if(ratesTABO[4].high = 1.14589 > t_h = 1.1454) -1 || summ = -2
2020.03.26 17:42:45.618 2019.01.02 07:00:00   ~~if(ratesTABO[4].low  = 1.14261 < t_l = 1.14415) +1 || summ = -1
2020.03.26 17:42:45.622 2019.01.02 07:00:00   2018.12.31 17:00
2020.03.26 17:42:45.622 2019.01.02 07:00:00   ~~if(ratesTABO[5].high = 1.14517 > t_h = 1.1454) -1 || summ = -1
2020.03.26 17:42:45.622 2019.01.02 07:00:00   ~~if(ratesTABO[5].low  = 1.14248 < t_l = 1.14415) +1 || summ = 0
2020.03.26 17:42:45.622 2019.01.02 07:00:00   summ = 0
2020.03.26 17:42:45.622 2019.01.02 07:00:00   summ = -1 ||| in_Vector_Bars - 2 = 3, -in_Vector_Bars + 2 = -3
2020.03.26 17:42:51.646 2019.01.02 08:00:00   checkVectors
2020.03.26 17:42:51.646 2019.01.02 08:00:00   2018.12.31 20:00
2020.03.26 17:42:51.646 2019.01.02 08:00:00   ~~if(ratesTABO[3].high = 1.1454 > t_h = 1.14461) -1 || summ = -1
2020.03.26 17:42:51.646 2019.01.02 08:00:00   ~~if(ratesTABO[3].low  = 1.14415 < t_l = 1.14419) +1 || summ = 0
2020.03.26 17:42:51.646 2019.01.02 08:00:00   2018.12.31 19:00
2020.03.26 17:42:51.646 2019.01.02 08:00:00   ~~if(ratesTABO[4].high = 1.14559 > t_h = 1.14461) -1 || summ = -1
2020.03.26 17:42:51.646 2019.01.02 08:00:00   ~~if(ratesTABO[4].low  = 1.14438 < t_l = 1.14419) +1 || summ = -1
2020.03.26 17:42:51.646 2019.01.02 08:00:00   2018.12.31 18:00
2020.03.26 17:42:51.646 2019.01.02 08:00:00   ~~if(ratesTABO[5].high = 1.14589 > t_h = 1.14461) -1 || summ = -2
2020.03.26 17:42:51.646 2019.01.02 08:00:00   ~~if(ratesTABO[5].low  = 1.14261 < t_l = 1.14419) +1 || summ = -1
2020.03.26 17:42:51.646 2019.01.02 08:00:00   summ = -1
2020.03.26 17:42:51.646 2019.01.02 08:00:00   summ = 0 ||| in_Vector_Bars - 2 = 3, -in_Vector_Bars + 2 = -3

Объекты "t_h" и "t_l" найдены.

Carl Schreiber
Модератор
9111
Carl Schreiber  
Carl Schreiber:
Я использую функцию OrderCalcMargin() с USDTRY на Демо-счёте MQ:
I am using the function OrderCalcMargin() with USDTRY on a Demo-Account of MQ:



n_margin всегда равен 0 с USDTRY (без ошибок), в то время как другие пары, такие как EURUSD, USDJPY,... не имеют проблем.
Спецификации для всех пар практически одинаковы: размер контракта 100'000, хеджевая маржа 100'000.
Почему это работает для EURUSD, GBPUSD, AUDJPY, но не для USDTRY?

n_margin is always 0 with USDTRY (no error) while other pairs like EURUSD,USDJPY,.. have no problems.
The specifications for all pairs are pretty much the same: Contract Size 100'000, Hedge Margin 100'000.
Why does it work for EURUSD, GBPUSD, AUDJPY but not for USDTRY?

This function does not work as well:

   long Extrem_Stop;
   bool ok = SymbolInfoInteger("USDTRY",SYMBOL_TRADE_STOPS_LEVEL,Extrem_Stop);

=> ok = true, but Extrem_Stop =0; :(

Slava
Модератор
13448
Slava  
Carl Schreiber:

This function does not work as well:

=> ok = true, but Extrem_Stop =0; :(

И в чём проблема?


Alexandr1942
5
Alexandr1942  
есть проблему с кем поговорить,версия 2368 медленно подгружаются котировки когда у другого человека все нормально,брокер говорит пишите в поддержку мт5 ,обновление не помогло *** это мт4 *** а это мт5 ***
Vladimir Karputov
Модератор
182224
Vladimir Karputov  
Alexandr1942:
есть проблему с кем поговорить,версия 2368 медленно подгружаются котировки когда у другого человека все нормально,брокер говорит пишите в поддержку мт5 ,обновление не помогло *** это мт4 *** а это мт5 ***

Форум: как вставить картинку


Добавлено.

И что значит "медленно"? Вот скорость прогрузки (учтите, что это месячный таймфрейм)



MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • www.mql5.com
Теперь вы можете не только читать статьи и скачивать программы на языке MQL5, но и участвовать в обсуждении интересующих вас тем на Форуме, оставлять комментарии к статьям и опубликованным кодам. Кроме того, вы можете не только выкладывать собственные разработки в Code Base, но и публиковать Статьи, за которые мы предлагаем вознаграждение...
Artyom Trishkin
Модератор
52905
Artyom Trishkin  
Vladimir Karputov:

...

И что значит "медленно"? Вот скорость прогрузки (учтите, что это месячный таймфрейм)

Я заметил в билде 2368 в индикаторах при первом запуске, когда истории ещё нет локально и инициируется подгрузка данных с сервера - вот эта загрузка данных (проверял загрузку трёх таймфреймов в индикатор) длится достаточно долго по сравнению с билдом 2366, на который пришлось откатиться - в нём гораздо быстрее. Иногда на порядок, а то и на несколько порядков (сейчас проверил в билде 2366:  2020.03.27 19:05:22.204    Время инициализации библиотеки: 00:00:00.516, тогда как в 2368 время подгрузки трёх таймфреймов занимало около двух с половиной минут - не важно какой запуск - холодный, или горячий). Первичную загрузку данных контролирую в тестовых индикаторах, которые делаю для статей, и потерял день в поисках сильных тормозов в своих кодах пока не откатился назад.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий