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

 
fxsaber #:


ЗЫ При размере экрана 1920x1200 получается выводить полностью картинку 1916x1173 (ToolBar отключен).

Он же не отключен, а просто сдвинут вверх за экран

 
Nikolai Semko #:

Он же не отключен, а просто сдвинут вверх за экран

.
 
fxsaber #:
.

а, ну да. Но все равно шапка сдвинута вверх.
Ну короче, нет нормального решения. А хотелось бы оключать и рамку и шапку и toolbar программно.
Впрочем, с Вашим решением со сдвижкой влево и вверх, уже можно что-то изобразить. Спасибо.

 
Nikolai Semko #:

а, ну да. Но все равно шапка сдвинута вверх.
Ну короче, нет нормального решения. А хотелось бы оключать и рамку и шапку и toolbar программно.
Впрочем, с Вашим решением со сдвижкой влево и вверх, уже можно что-то изобразить. Спасибо.

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

#property service

#define CHART_TOOLBAR_HEIGHT 31
#define CHART_HEADER_HEIGHT 35
#define CHART_BORDER_SIZE 12
#define CHART_MAX_EXCESS 20

// После запуска все чарты можно раскрывать во весь экран через ALT+D вместо F11.
void OnStart()
{
  const int X0 = -CHART_BORDER_SIZE;
  const int Y0 = -CHART_HEADER_HEIGHT - CHART_TOOLBAR_HEIGHT;
  
  const int X1 = TerminalInfoInteger(TERMINAL_SCREEN_WIDTH) + X0 + CHART_MAX_EXCESS;
  const int Y1 = TerminalInfoInteger(TERMINAL_SCREEN_HEIGHT) + Y0 + CHART_MAX_EXCESS;

  for (long Chart = ChartFirst(); Chart != -1; Chart = ChartNext(Chart))
  {
    ChartSetInteger(Chart, CHART_FLOAT_LEFT, X0);
    ChartSetInteger(Chart, CHART_FLOAT_TOP, Y0);
    ChartSetInteger(Chart, CHART_FLOAT_RIGHT, X1);
    ChartSetInteger(Chart, CHART_FLOAT_BOTTOM, Y1);
  }
}

Не представлял раньше, что это важно для визуального восприятия.

 
fxsaber #:

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

Не представлял раньше, что это важно для визуального восприятия.

жаль в 4ке нет сервисов)

Спасибо за решение.

 

Пожелание: хотелось бы выделение нескольких строк не идущих подряд в ME c Ctrl вот так:


 

дыра в котировках при копировании тиков на кастомный символ.

на оригинальном символе дыры нет.


//+------------------------------------------------------------------+
//|                                                       script.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
// Создание копии символа для ускорения Тестера
#property script_show_inputs

#include <Symbol.mqh> //https://www.mql5.com/ru/code/18855
#include <ErrorDescription.mqh> // https://www.mql5.com/ru/code/79

  int CloneTicks( string SymbFrom = NULL, string SymbTo = NULL, const ulong _from_msc = 0, const ulong _to_msc = LONG_MAX ) 
  {
    int Res;
    SymbFrom = (SymbFrom == NULL) ? _Symbol : SymbFrom;
    if (SymbTo == NULL) { Print("SymbTo == NULL"); return -1; }
    if (SymbTo == SymbFrom) { Print("SymbTo == SymbFrom"); return -1; }
    if (!::SymbolInfoInteger(SymbTo, SYMBOL_CUSTOM)) { Print("SymbTo != SYMBOL_CUSTOM"); return -1; }
    MqlTick Ticks[];
    ::CopyTicksRange(SymbFrom, Ticks, COPY_TICKS_ALL, _from_msc, _to_msc);
    Res = ::CustomTicksReplace(SymbTo, _from_msc, _to_msc, Ticks);

    return(Res);
  }
  
void OnStart()
{
  const SYMBOL Symb("TESTER_" + _Symbol); // Создали символ

  Symb.DeleteHistory();
   Symb.Delete(true);
   Symb.Create(NULL,_Symbol);

  if (Symb.IsExist()) // Если символ создан
  {
  
    //Symb = _Symbol; // Скопировали с основного символа все свойства и баровую историю (+ тиковую, если кастомный) - клон
   Symb.CloneProperties();
   CustomSymbolSetString(Symb.Name,SYMBOL_PATH,"");
    // Сделали валюты символа валютой счета
    Symb.SetProperty(SYMBOL_CURRENCY_BASE, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY));
   
    if (Symb.On()) {};// // Включили в Обзор рынка
      //ChartOpen(Symb.Name, PERIOD_CURRENT); // Открыли график нового символа

    if (!Symb.CloneRates(_Symbol)) Print("err rates: ",ErrorDescription(GetLastError()));

    datetime date_from=D'2019.01.01';
    datetime dt_start=date_from;
    while (dt_start<TimeCurrent()) {
      Print(dt_start);
      ulong date_start_msc=(ulong)dt_start*1000;
      ulong date_end_msc=(ulong)(dt_start+86400)*1000-1;
       //if (!Symb.CloneHistory(_Symbol,date_start_msc,date_end_msc)) Print("err: ",GetLastError());
       //if (!Symb.CloneTicks(_Symbol,date_start_msc,date_end_msc)) Print("err ticks: ",ErrorDescription(GetLastError()));
       if (!CloneTicks(_Symbol,Symb.Name,date_start_msc,date_end_msc)) {
         int Error = GetLastError();
         if (Error != 0) Print("err ticks: ",ErrorDescription(Error));
         }
       MqlTick t1[], t2[];
       int ticks1=CopyTicksRange(_Symbol,t1,COPY_TICKS_INFO,date_start_msc,date_end_msc);
       if (ticks1==-1) Print("CopyTicksRange 1 error: ",ErrorDescription(GetLastError()));
       int ticks2=CopyTicksRange(Symb.Name,t2,COPY_TICKS_INFO,date_start_msc,date_end_msc);
       if (ticks2==-1) Print("CopyTicksRange 2 error: ",ErrorDescription(GetLastError()));
       if (ticks1 == 0) { Print("ticks = 0"); } else
       if (ticks1 != ticks2) {
         Print("wrong ticks count: ",ticks1," / ", ticks2);
         } else Print("ticks: ",ticks1);
       dt_start+=86400;
    }
    
    dt_start=date_from;
    int wrong_bars=0;
    while (dt_start<TimeCurrent()) {
       if (iBarShift(_Symbol,PERIOD_M1,dt_start,true)>=0 && iBarShift(Symb.Name,PERIOD_M1,dt_start,true) < 0) {
         Print("wrong bar: ",dt_start);
          wrong_bars++;
          }
       dt_start+=60;
    }
    Print("total wrong bars: ",wrong_bars);
    //if (Symb.On()) // Включили в Обзор рынка
      ChartOpen(Symb.Name, PERIOD_CURRENT); // Открыли график нового символа
  }
  Print("end");
}


почему CopyTicksRange с кастомного символа возвращает 0 на все интервалы? по факту, они копируются (не все).


...
CS      0       19:01:05.587    script (EURAUD,M1) 2022.09.26 00:00:00
CS      0       19:01:06.049    script (EURAUD,M1) wrong ticks count: 422353 / 0
CS      0       19:01:06.051    script (EURAUD,M1) 2022.09.27 00:00:00
CS      0       19:01:06.519    script (EURAUD,M1) wrong ticks count: 418359 / 0
CS      0       19:01:06.520    script (EURAUD,M1) 2022.09.28 00:00:00
CS      0       19:01:06.962    script (EURAUD,M1) wrong ticks count: 467637 / 0
CS      0       19:01:06.964    script (EURAUD,M1) 2022.09.29 00:00:00
CS      0       19:01:07.348    script (EURAUD,M1) wrong ticks count: 401260 / 0
CS      0       19:01:07.350    script (EURAUD,M1) 2022.09.30 00:00:00
CS      0       19:01:07.725    script (EURAUD,M1) wrong ticks count: 406932 / 0
...
CS      0       19:01:10.011    script (EURAUD,M1) wrong bar: 2022.01.24 11:14:00
CS      0       19:01:10.011    script (EURAUD,M1) wrong bar: 2022.01.24 11:15:00
CS      0       19:01:10.011    script (EURAUD,M1) wrong bar: 2022.01.24 11:16:00
CS      0       19:01:10.105    script (EURAUD,M1) total wrong bars: 2796

.

уже выкладывал, но всем всё равно.

чей баг?

 

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

Ошибки, баги, вопросы

teset, 2022.10.05 15:58

CS      0       19:01:10.011    script (EURAUD,M1) wrong bar: 2022.01.24 11:14:00
CS      0       19:01:10.011    script (EURAUD,M1) wrong bar: 2022.01.24 11:15:00
CS      0       19:01:10.011    script (EURAUD,M1) wrong bar: 2022.01.24 11:16:00
CS      0       19:01:10.105    script (EURAUD,M1) total wrong bars: 2796

Вы сначала копируете в кастомный бары, а затем тики. При запихивании тиков в кастомный MT5 принудительно генерирует из них бары и прописывает их в баровую историю. Поэтому несовпадение обязано быть, ведь на торговом сервере и тики с барами несинхронизированы местами. Копируйте сначала тики, а затем бары, тогда бары не будут отличаться.

 
teset #:

почему CopyTicksRange с кастомного символа возвращает 0 на все интервалы?

Баг. Пишите сюда.

Пользовательские символы. Ошибки, баги, вопросы, предложения. - Попробуйте удалить всю баровую и тиковую историю.
Пользовательские символы. Ошибки, баги, вопросы, предложения. - Попробуйте удалить всю баровую и тиковую историю.
  • 2019.02.23
  • www.mql5.com
Нужно удалить последнюю неделю котировок кастомного символа. Требуется удалить последние сутки истории кастомного символа и выставить в Обзор рынка последний тик после удаления. либо чтобы TicksDelete TicksReplace заменял тик в Обзоре рынка на последний в истории
 

я проверяю только существование бара. значит, тиков не было десятки минут на реальном символе, а бары были? то есть, эта штука проверяет бары, но по факту и тики.

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

Причина обращения: