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

 
Вообщем через CTrade заработало..Осталось с помощью напильника все переделать..Из вертолета подлодку опять..А говорил не умею,ни бум бум.. :)
 

Мда..все тоже самое в принципе..

 

В новом билде перестали копироваться простые структуры в цикле. Вот проверочный скрипт:

//+------------------------------------------------------------------+
//|                                             Test_Copy_Struct.mq5 |
//+------------------------------------------------------------------+
struct  trade_settings
  {
   int      reopened;
   int      reverse; 
   int      TrailingStop;
   int      WithoutlossLevel;
   int      WithoutlossProfit;
   double   LossToReverse;
   int      MAPeriod;
   int      MA_use;
   double   Lots;
   int      takeprofit; 
  };
trade_settings arr_tr_set_ini[3]={  
 {60,90,1000,100,900,2000.0,105,1,0.13,2700},   // EURUSD
 {130,1298,400,300,600,1000.0,130,1,0.1,2800},  // GBPUSD
 {110,140,200,600,800,1000.0,85,0,0.15,1700}};   // AUDUSD 
trade_settings symb_default={110,130,200,1300,1500,3000.0,100,1,0.1,1000};

class CTest_Copy_Struct
  {  
protected:
   trade_settings    m_tr_set;
public:
   void              Copy_tr_set(const trade_settings& tr_set){m_tr_set=tr_set;}
   void              Print_tr_set(){printf("Setting reopened=%u overpos=%u TrailingStop=%u WithoutlossLevel=%u WithoutlossProfit=%u" 
                        ,m_tr_set.reopened,m_tr_set.reverse,m_tr_set.TrailingStop,m_tr_set.WithoutlossLevel,m_tr_set.WithoutlossProfit);
                        printf("LossToReverse=%.2f MAPeriod=%u MA_use=%u Lots=%.2f takeprofit=%u"
                        ,m_tr_set.LossToReverse,m_tr_set.MAPeriod,m_tr_set.MA_use,m_tr_set.Lots,m_tr_set.takeprofit);}
   void              Zero(){ZeroMemory(m_tr_set);} 
  };

void OnStart()
  {
   CTest_Copy_Struct Test; 
   Test.Zero();
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[0]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[2]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(symb_default);
   Test.Print_tr_set();
   int total=ArraySize(arr_tr_set_ini);
   for(int i=0;i<3;i++)
     {
      Print("i=",i);
      Test.Copy_tr_set(arr_tr_set_ini[i]);
      Test.Print_tr_set();
     } 
  }
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
Valmars:

Результат:

2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    Access violation read to 0x00000000209FFFAC in 'E:\Program Files\Championship_2011\MQL5\Scripts\Test_Copy_Struct.ex5'
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    i=0
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    LossToReverse=3000.00 MAPeriod=100 MA_use=1 Lots=0.10 takeprofit=1000
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    Setting reopened=110 overpos=130 TrailingStop=200 WithoutlossLevel=1300 WithoutlossProfit=1500
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    ------------------------------
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    LossToReverse=1000.00 MAPeriod=85 MA_use=0 Lots=0.15 takeprofit=1700
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    Setting reopened=110 overpos=140 TrailingStop=200 WithoutlossLevel=600 WithoutlossProfit=800
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    ------------------------------
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    LossToReverse=2000.00 MAPeriod=105 MA_use=1 Lots=0.13 takeprofit=2700
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    Setting reopened=60 overpos=90 TrailingStop=1000 WithoutlossLevel=100 WithoutlossProfit=900
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    ------------------------------
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    LossToReverse=0.00 MAPeriod=0 MA_use=0 Lots=0.00 takeprofit=0
2011.11.13 09:30:44    Test_Copy_Struct (EURUSD,M15)    Setting reopened=0 overpos=0 TrailingStop=0 WithoutlossLevel=0 WithoutlossProfit=0

 

 В https://www.mql5.com/ru/docs/basis/function/events сказано в конце: "Для лучшего понимания будет полезно запустить индикатор, код которого приложен ниже."

 Код запустил. На выходных. Лучшего понимания не произошло - оно и так было, как мне думается, в норме, а вот худшие впечатления добавились. Тиков в выходные нет, поэтому prev_calculated = 0 в это время всегда, при переходе с таймфрейма на таймфрейм:

 Однако в один прекрасный момент появляется (реконнектов не было, честное благородное!) вот такое значение:

и весёлые линии на графике:

 

или раза в два менее весёлые, вот так:

 

 Были даже линии в начале истории в виде ZigZag'а (увы, забыл сделать скриншот, а воспроизвести не удалось).

 На прочих ТФ линии тоже появляются, но более разреженно. Можете легко убедиться в этом сами.

 Авторы точно хотели сказать именно это?

 Почему результат prev_calculated по меньшей мере неодинаков в отсутствии тиков, а то и вовсе странный? Что-то сбоит при прыжках с ТФ на ТФ?

 Должны ли были эти (или любые другие) линии появиться вне тиков?

 Может ли в редких случаях относительно частое перепрыгивание с ТФ на ТФ сгенерировать что-то вроде псевдотика, который и инициирует обсчёт значений баров на истории и т. п.?

 Стоит ли ожидать, что непостоянство в поведении терминала будет устранено? Или мне стоит учить матчасть?

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

 Вопросов накопилось немало... впрочем, это только начало...

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

 Продолжение...

 По той же ссылке есть фраза: "Примечание: если функция OnCalculate возвращает нулевое значение, то в окне DataWindow клиентского терминала значения индикатора не показываются."

 Видите ли в чём дело... Если будет необходимо, охотно соглашусь с любым местопроизрастанием у меня рук и тотчас побегу выпрямлять при необходимости. Но. В простых индикаторах и средней сложности ещё как-то можно выкрутиться из тех или иных ситуаций с затыками. Но по мере возрастания сложности кода любые функции копирования Copy...() (как принимающие в качестве аргумента хэндл другого индикатора, так и без него) начинают изрядно осложнять ситуацию, как кажется лично мне, занимающемуся MQL-программированием без году неделю. Наступает пороговый момент, когда уже не знаешь, что ещё можно было бы изменить в коде, потому что всё, что мог, изменил, а остальное, как тогда кажется, трогать вообще не нужно, ибо с проблемой оно никак не связано. Либо закрадывается совсем обезоруживающая мысль: менять алгоритм полностью, потому что не были заранее учтены особенности жизнедеятельности и капризы терминала. Ведь в процессе изучения MQL по документации приходится сталкиваться с нюансами, которые разработчики замалчивают, скорее всего ненароком. А ведь MQL-программист после полного изучения документации многого так не узнает... И, что самое обидное, средствами MQL многие капризы терминала либо не исправить вовсе, либо можно поставить код на сомнительные костыли и однажды больно грохнуться...

 Ладно... разошёлся я что-то сегодня. Выходной всё-таки.

 А сообщить-то я вот что хотел с утра пораньше...

 https://www.mql5.com/ru/forum/1111/page570#comment_117425 - основную проблему непрорисовки индикатора при первичном запуске терминала решить кое-как удалось (надеюсь, никто не станет спорить с тем, что как минимум индикатору фракталов ничто не должно мешать отрисовываться на всей истории исправно даже при отсутствии тиков?).

 Было:

            CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                    TimeUpBuffer[shift],
                                    exact_extremum);

заменил на:

            if(CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                       TimeUpBuffer[shift],
                                       exact_extremum)<0) return(0);

 Признаю свою невнимательность и как следствие пагубный формализм.

 Но. Это помогло в самом простом случае (специально упрощал исходный индикатор). В более сложном индикаторе такие трюки уже не помогли - в какой-то момент изменения перестали выказывать какую-либо разницу, тем более, что функций копирования там предостаточно. А очень бы хотелось получить вразумительное наставление, куда и как двигаться дальше. Ведь столько времени положено на то, что работает через пень колоду. Пока я даже не понимаю, мой ли это косяк или терминала. И не уверен, что проблема первичной отрисовки кроется лишь в нехватке if и return... кое-где подозрительно выглядит, например, else...

 Разработчикам - кину код в личку при необходимости; могу заодно приложить аналогичный по своему назначению, но реализованный иначе и работающий сразу без проблем (правда, он не совсем подходит под осваиваемые задачи и цели). 

 
 Процесс логгирования Print-функции в закладке Эксперты терминала, а также в ОЗУ и файл на диске - отдельный процесс или нет? По ощущениям - вроде как отдельный, терминал подвисает не намертво, однако почему он при интенсивном логгировании тормозит так, словно его навьючили кирпичами? Можно это как-то разгрузить? Если решил вывести элементы массива весьма среднего ArraySize, тормоза весьма ощутимы, про вывод значений элементов массивов бОльших размеров можно забыть сразу.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 

 Есть большие подозрения, что терминал чудит с кэшем (я почти не в теме, так что...). Хуже того - даже MetaEditor как-то влияет на отработку того, что происходит в то время в терминале.

 Неоднократно сталкивался с проблемой, когда изменяю код MQL-программы (Print'ующей в лог закладки Эксперта данные отладки), перекомпилирую, перехожу в окно терминала и вижу, как сыпятся повтором предыдущие результаты, хотя точно могу сказать, что это не является чем-то вроде отложенной доотработки предыдущего незавершённого запуска программы. Получается так, что через F7 в MetaEditor'е я вроде как компилирую и отправляю на запуск обновлённый код, а тем временем терминалу отдаётся команда прокрутить повторно старое (из кэша, что ли?.. или похоже на "подтасовку" операционкой страниц памяти). Любопытно то, что отменить/выгрузить "застрявший в зубах" предыдущий вариант .ex5-кода удаётся не только полной выгрузкой процесса terminal.exe, а в некоторых редких случаях - всего-навсего закрытием MetaEditor'а. Вот как хотите, так и понимайте, я просто пересказал то, что наблюдал лично.

 Недавно была ситуация, когда конструкция:

Print(1);
for(int e=0; e<ArraySize(Arr); e++)
{
   Print(Arr[e]);
}
выводила только значение от первого Print, но дожидаться следом вывода значений элементов массива было бесполезно. После удаления первого Print и перекомпиляции циклический вывод элементов массива начинался моментально. Тайный заговор Print'ов против MQL5-Community или я один такой невезучий?

 

 Дополнительно отмечу, что эти странные случаи поведения терминала наблюдались не на перегруженном окнами чартов, графическими объектами и MQL-программами экземпляре MT5, а всего-навсего при единственном чистом (не считая наброса обкатываемого индикатора) окне чарта.

 
x100intraday  Забейте лучше на проблемы - пишите на С или любом другом языке. В конце концов все, что нам нужно от терминала - получить котировки, инфу о счете и сопровождать ордера, а остальное можно писать в специализированной среде программирования и подключать через библиотеку. А то в один момент что-то поменяют, и концов не найдешь, почему не работает, если проект большой. Спрашивается - нафига такие приключения :) А если эксперт в это время должен после перекомпиляции подхватить сопровождение текущих ордеров - будет убыток, т.к. пока вы найдете что и почему...
 
ivandurak:

1. Не работает ArrayInitialize код прилагается если раскоментировать цикл то все нормально.

2. И еще при обьявлении переменных в классе и индикаторе на глобальном уровне с одинаковыми именами - выскакивает предупреждение .

 

1. Для индикаторных буферов в ините используется PlotIndexSetDouble(z,EMPTY_VALUE).

2. Выскакивает. Значит с этим надо что-то делать, члены класса рекомендуется помечать префиксом "m_".

Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
  • www.mql5.com
Пользовательские индикаторы / PlotIndexSetDouble - Документация по MQL5