Столкнулся с рядом проблем, помогите с логикой

 

Добрый день коллеги! Заметил изменения в редакторе в виде подсказок и т.д. и пришел к выводу что произошло очередное обновление МТ в следствии чего наружу всплыли очередные сложности. Что самое интересное это происходить стало чаще чуть ли не с каждым обновлением приходится что то переделывать и подстраивать под реалии текущего компилятора. И связываю я это с кривым кодом собственного производства :-( Раньше работало, теперь нет потому что изначально нужно было писать его правильно и проблем бы не возникало. Но раз уж они возникли и настолько критично то необходимо приводить всё к порядку, но просьба к Вам у меня будеет исключительно в логике организации исполнения, писать код буду самостоятельно. Но что бы сразу сделать его грамотно нужно разобраться в концептуальных моментах, да бы не пришлось его потом править. Прежде всего хочу описать часть системы и собственно суть проблемы, да бы потом обсудить способы реализации. Итак задача:

Поскольку требуется получение огромного массива данных на ТФ М5 за три месяца использование копитика не представляется возможным. Запрос идёт по 15 инструментам за указанный выше срок в следствии чего получения элементарной дельты по всем символам становится не возможно.  Количество тиков просто колосально да ещё при таком наборе инструментов. К сожалению для этого не хватает оперативно памяти 8 гигов и терминал намертво виснет даже не завершив задачу. Да и будь памяти больше всё равно данная процедура получения данных весьма затратна что да же мне, человеку с лозунгом "Fuck mashine time economy" становится не по себе от этой процедуры. Было принято решение сохранять историю самостоятельно в текстовый файл и получать ту же дельту уже из файла. С помощью соратников был написан советник который использует МаркетБук для мониторинга рынка по требуемым инструментам и ежеминутно записывает текущие значения в файл отдельно для каждого инструмента. С учётом того что тики приходят всегда в разное время и появление нового бара на инструментах всегда разняться, при вялом рынке доходит до нескольких минут рассогласования и событие ОНБукЕвент как раз подходит для этого дела как нельзя лучше. В итоге имею набор файлов которые обновляются ежеминутно, но при этом каждый в своё время (с приходом тика нового бара). Далее индикаторы читают информацию из файлов и строят свои буфера в соответствии с логикой и вот с ними то у меня и проблема.

Дело в том что значение индикатора мне нужно получать не каждый бар, а в момент появления сигнала базовой стратегии. Это примерно 5-6 сигналов в день. В момент появления сигнала делается задержка в 30 секунд, после чего идёт обращение к индикаторам. Вопрос: происходит ли расчёт используемых индикаторов каждый бар, если они присутствуют в советнике установленном на графике? Не зная ответа на этот вопрос было принято решения расчитывать всю историю индикатора при кадом обращении к нему. Расчёты не сложные и история просчёта редко выходит за пределы 3 месяцев, что не так уж и много для ТФ М5 в сравнении с тиками которых может быть 1000 и более на одном только баре, тут же всего лишь одно значение расчитаное по формуле. И даже история в три месяца считается очень быстро, то же стохастик без проблем. Поэтому я решил расчитывать все индикаторы полностью на всей истории расчёта при каждом обращении. В сравнении с копитиком  скорость работы увеличилась на несколько порядков. Все расчёты я делал в функции инициализации советника, что логично, ведь при обращении к индикатору он полностью просчитает весь буфер взяв данные из файла. Так раньше и было но сегодня столкнулся с проблемой.

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

Ремарка "Можно было сделать интелектуальную подгрузку данных из файла, но с тремя командами по перемещению указателя сильно то не разбежишься, это одна из причины считать историю полностью при каждом вызове индикатор поскольку при каждом вызове фал читается полностью и делает он это довольно шустро"

Итак: При условии вызова индикатора с редкой периодичностью и наличие относительно не сложных расчётов за не большую историю позволяет нам работать именно в этом ключе, НО что происходит в нутри терминала? Будет ли терминал считать его для себя на каждом баре? По сути расчёт основного буфера в функции инициализации решает проблему, но в данный момент сдлеть это возможно только с простым массивом, как передать результаты расчёта в советник в таком случае?

Советник который сохраняет историю для обучения все расчёты производит в ините в следствии чего включается внутренний механизм синхронизации расчётов индикаторов, если я правильно понимаю. То есть он дожидается когда все индикаторы будут расчитанны и после этого начинает работать с ним. Правильно? Это по мимо проверок с моей стороны на предмет получения хендла, да собственно и всё. Вопрос: Какие ещё нужно сделать проверки что бы быть точным что все индикаторы рассчитаны и имеют значения для передачи. С учётом того что истории между символами синхронизована, однако имеются отсутствующие бары на других символах??? Именно из за дырок я организовал запрос данных по времени бара, и делается это по барно в момент построения истории.

double OII10(datetime index)
  {
   double MA[1];
   ResetLastError();
   if(CopyBuffer(OI_H10,0,index,1,MA)<0)
     {
      PrintFormat("Failed to copy data from the OII10 indicator, error code %d",GetLastError());

     }
   return NormalizeDouble(MA[0],Digits());
  }

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

В итоге хочу обсудить возможные походи и решения организации работы системы в целом. Какую нужно произвести синхронизацию и т.д. Ну и возможно может какието интерессные решения по повышению надёжности.

Прикрепляю индикатор дельты, а так же файл из которого н берёт данные, так вот именно этот индикатор имеет рассогласование при сохранении. То эти инструменты построит, то другие, а так же разные данные в сохранёном файле и на входе нейронной сети при работы. Файлы обновляются каждую минуту, а сохранение набора идёт в пределах 3-4 минут что и приводит к рассогласованию результатов. Где то массива не хватает так как файл уже изменился, где то советник обращается к индикатору а он не может ответить так как ждёт нового бара.

В общем приглашаю к обсуждению и в процессе уточню вопросы по организации НАДЁЖНОЙ торгующей системы с проверками и перестраховками разного рода. Спасибо!!!!!!


Советник для сохранния истории. Там конечно ногу сломать можно и я не прошу ничего мне писать я сам всё напишу и добавлю только вот ЧТО????

Файлы:
 

Сохраняйте данные при появлении нового бара.

Читайте данные после сохранения.

Перед прочтением проверяйте, готовы ли данные.

 
Aleksey Vyazmikin:

Сохраняйте данные при появлении нового бара.

Читайте данные после сохранения.

Перед прочтением проверяйте, готовы ли данные.

Не тут чую нужен другой подход. Прогулялся после поста и пришёл к выводу что нужно в советник сразу читать все файлы, формировать массивы и потом уже с ними работать. Считай 9 индикаторов и каждый читает их по разу. Да и в обще индикаторы и файлы плохая идея. Для индикатора максимум записная книжка, которая ведётся, а когда нужен контроль рынка в реальном времени индикаторы отпадают. И вижу это примерно так.

Тфу, тфу пишущий советник сделан правильно и проблем с записью не замечалось, следовательно нужен блок контроля обновления файлов с подгрузкой в нужный момент. Да и в обще пришёл к выводу что нужно писать всё заново с нуля. Признаюсь для меня это первый настолько большой переход в работе. Последний был с МТ4 на МТ5 достаточно запоминающийся, предстоящий переход думаю мощней в разы по сравнению с переходом. Тут заново всё нужно писать. Врать не буду я не написал ни одной программы с нуля. В основном пользовался чужими кодами в том числе и благодаря именно этому форуму, за что признателен искренне всем форум чанам и говорю Вам большое спасибо!!!! Я несколько раз начинал писать с нуля, но в те времена и опыта не было и не знал с чего начать после начального оформления.

Работа предстоит трудная, но ориентиры есть!!!!! :-)

 

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

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

Сергей Таболин, 2020.09.24 13:07

Два вопроса.



После нескольких оптимизаций "залипла" вкладка.

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

П.С. После перезагрузки терминала этой вкладки уже нет...


Вопрос второй.

Почему при оптимизации выскакивает ошибка

2020.09.24 13:43:15.115 Core 5  pass 19272 tested with error "critical runtime error 502 in OnInit function (array out of range, module Experts\NC_mZZ3\nc_MPL_mZZ3_1.05.ex5, file nc_MPL_mZZ3_1.05.mq5, line 167, col 65)" in 0:00:00.000

на эту строку кода

for(int i = ArraySize(indicators); i >= 0; i--) delete netMLP[i];

при том что при одиночном тесте ничего подобного не происходит?

Ваша ситуация мне до жути напомнила мою - Вопрос второй.....
 
Сергей Таболин:
Ваша ситуация мне до жути напомнила мою - Вопрос второй.....

Друже, мир не стоит на месте всё развивается, но если что то перестало работать после обновления знамо было написано криво или не оптимально. Если код написан грамотно то подобного не происходит. В целом то фишки в редакторе появились интересные (я по ним понял что было обновление) Ну и раз такое дело стоять не нужно, нужно двигаться в ногу с прогрессом. Тем более что в моём случае это действительно возможность сделать всё грамотно. Я уже начал и начал с того что не спешу и называю переменные ассоциативно, код прибран, лишних строк нет. Планирую продумывать логику блоков по лучше, естественно не без помощи со стороны сообщества. И вот как раз вопрос. Сколько может быть открыто текстовых файлов одновременно? Могу я сначала открыть 10 файлов, потом уже заняться их чтением и скопом потом это всё закрыть.... Или же попробовать написать универсальный открыватель-функцию, посколько в работе нужно будет её дергать по мере обновления того или иного файла. Так и сделаю!!!!!


Нифигасе какой народ Вы классный, даже во времена своего отсутствия Вы умудряетесь помогать :-)

 

А вот вопрос пожалуй в тему. Задам и пойду баиньки :-)

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

struct Acum {datetime time;
             double   oi;
             double   dl;
};
Acum DATA_BR[];
Acum DATA_ED[];
Acum DATA_Eu[];
Acum DATA_GAZR[];
Acum DATA_GOLD[];
Acum DATA_LKOH[];
Acum DATA_MGNT[];
Acum DATA_MIX[];
Acum DATA_MXI[];
Acum DATA_ROSN[];
Acum DATA_RTS[];
Acum DATA_SBRF[];
Acum DATA_Si[];
Acum DATA_VTBR[];

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

bool Load_File(string Name_File, double &DataStruc[])
{
В итоге как я понял передав структуру в функцию можно с ней работать. Вести все расчёты с переменной DataStruc[]. Вопрос: Будет ли эта переменная вести себя как структура с возможностью запили в любой элемент структуры???? И если да, то после удачного завершения работы функции сама структура которая использовалась при вызове будет уже заполнена. Это так????
 
Так и знал что с первого раза не получится, как чуял. Необходимо вызывать Функцию загрузки файла с той или иной структурой, в соответствии с тем какой файл уже обновился. То есть вызвать функцию для Si файла прочитать его и записать полученные значение в структуре. Очень удобно будет потом при обращении!!!!!
 
подозреваю, что в данном случае практичнее работать с SQL
 
Mihail Marchukajtes:

Друже, мир не стоит на месте всё развивается, но если что то перестало работать после обновления знамо было написано криво или не оптимально. Если код написан грамотно то подобного не происходит. В целом то фишки в редакторе появились интересные (я по ним понял что было обновление) Ну и раз такое дело стоять не нужно, нужно двигаться в ногу с прогрессом. Тем более что в моём случае это действительно возможность сделать всё грамотно. Я уже начал и начал с того что не спешу и называю переменные ассоциативно, код прибран, лишних строк нет. Планирую продумывать логику блоков по лучше, естественно не без помощи со стороны сообщества. И вот как раз вопрос. Сколько может быть открыто текстовых файлов одновременно? Могу я сначала открыть 10 файлов, потом уже заняться их чтением и скопом потом это всё закрыть.... Или же попробовать написать универсальный открыватель-функцию, посколько в работе нужно будет её дергать по мере обновления того или иного файла. Так и сделаю!!!!!


Нифигасе какой народ Вы классный, даже во времена своего отсутствия Вы умудряетесь помогать :-)

1000 файлов можно открыть за пару секунд навскидку. Если нет приоритетных задач долгих. А они есть.
Скачать / считать и записать и потом считать дольше чем до записать и стереть конец и потом считать конец и сделать перерасчет / оптимизацию. Контроль сложен но дешевле

 
Valeriy Yastremskiy:
1000 файлов можно открыть за пару секунд навскидку. Если нет приоритетных задач долгих. А они есть.
Скачать / считать и записать и потом считать дольше чем до записать и стереть конец и потом считать конец и сделать перерасчет / оптимизацию. Контроль сложен но дешевле

Ну отлично. Мне это подходит. А что скажете по поводу работы со структурами при вызове функции??? Возможно передать структуру в вызываюмую функцию для её заполнения данными и если да, то как это организовать? Скасибо!!!!
 
Mihail Marchukajtes:
Ну отлично. Мне это подходит. А что скажете по поводу работы со структурами при вызове функции??? Возможно передать структуру в вызываюмую функцию для её заполнения данными и если да, то как это организовать? Скасибо!!!!
Структуры в аргументах функции не предусмотрены. Классы, функции, объекты. Или другая последовательность.
Причина обращения: