Удаление дубликатов из массива. - страница 2

 

Я предлагаю придумать алгоритм формирования ключевого значения из значений в столбцах 2,3,4,5,6,7,8,9,10,11. Для этого даже необязательно брать все столбцы. Посмотрите, может достаточно будет двух-трёх. Ключевое значение писать в первый столбец ещё на этапе заполнения массива и проверять его на дублирование.

Могу предложить два варианта формирования ключевого значения:
1. Все значения привести к типу string и сцепить их в одну строку.
2. Все значения привести к типу int просуммировать их.

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

 
Для полного понимания того, что хочу добиться выкладываю полный код.
Первоначальная разработка взята из ветки 'автооптимизатор', xeon предложил достаточно интересный вариант автоматической оптимизации экспертов. Но я начал его затачивать под свой эксперт.

Подключение к эксперту:
#include <Optimization.mqh>

Обращение к функции:
Tester(Symbol());


На данный момент идут пляски вокруг дубликатов в массивах, дальше хочу добавить:
1. Закачку минутной истории по нужным парам в базу торгового терминала
2. конвертацию минутной истории во все таймфреймы и копирования сконвертированных данных в терминал тестера

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

Но сначала нужно бы с массивом разобрать дубликаты по моему мнению не дают выбрать более подходящий вариант. Поэтому избавиться бы от них
Файлы:
 
 //-----------------------Переведем в числовой формат----------------------------
       TotalTradesTransit=StrToDouble(TotalTrades);
       GrossProfitTransit=StrToDouble(GrossProfit);
       ExpectedPayoffTran=StrToDouble(ExpectedPayoff);
       nodubl=true;
       if(MinTr < TotalTradesTransit && MaxTr > TotalTradesTransit){                    //Отфильтруем по количеству сделок
          PrFactDouble = StrToDouble(ProfitFactor);
          if(PrFactDouble==0){PrFactDouble=1000;}                    //Убираем 0 в прибыльности для правильного анализа
//---------------------- Поиск дубликатов --------------------------------       
           for(Dubl=0;Dubl<=ResizeArayNew;Dubl++){
               if(GrossProfitTransit == ArrayData[Dubl][1]){
                  if(TotalTradesTransit == ArrayData[Dubl][2]){
                     if(PrFactDouble == ArrayData[Dubl][3]){
                        if(ExpectedPayoffTran == ArrayData[Dubl][4]){
                           nodubl=false;
           }}}}}
//------------------------------------------------------------------------
           if(nodubl){
              ArrayData[text][1]=GrossProfitTransit;                                
              ArrayData[text][2]=TotalTradesTransit;
              ArrayData[text][3]=PrFactDouble;
              ArrayData[text][4]=ExpectedPayoffTran;
              ArrayData[text][5]=StrToDouble(Perem1);
              ArrayData[text][6]=StrToDouble(Perem2);
              ArrayData[text][7]=StrToDouble(Perem3);
              ArrayData[text][8]=StrToDouble(Perem4);
              ResizeArayNew++; 
    }}}
 
xeon, спасибо за приведенный пример.
Вопрос к тебе такой для чего ты используешь дробные значения, если на самом деле они целые.
Пришлось прочесать весь код в исправлениях. Или может быть тайный смысл в этом есть.

Как например смысла в строчке
if(PrFactDouble==0){PrFactDouble=1000;} //Убираем 0 в прибыльности для правильного анализа

я моло вижу. Для правильного анализа и 0.0 можно оставить. Всеравно же только сортировка идет, расчеты то никакие не видуться. С какой целью ты присваиваешь переменной значение 1000
 
HIDDEN писал (а):
xeon, спасибо за приведенный пример.
Вопрос к тебе такой для чего ты используешь дробные значения, если на самом деле они целые.
Пришлось прочесать весь код в исправлениях. Или может быть тайный смысл в этом есть.

Как например смысла в строчке
if(PrFactDouble==0){PrFactDouble=1000;} //Убираем 0 в прибыльности для правильного анализа

я моло вижу. Для правильного анализа и 0.0 можно оставить. Всеравно же только сортировка идет, расчеты то никакие не видуться. С какой целью ты присваиваешь переменной значение 1000
1) значения TotalTrades и ExpectedPayoff = double соответственно пришлось массив делать double
2) При сортировке максимальные значения оказываются на вершине списка, а 0.0 как известно меньше 1.0 :-) и соответственно будет меньше чем даже прибыльность 1.0
 
xeon, каким образом решаешь вопрос по синхронизации базы катеровок в терминале где торгует эксперт и в терминале где проходит оптимизация?
 
HIDDEN писал (а):
xeon, каким образом решаешь вопрос по синхронизации базы катеровок в терминале где торгует эксперт и в терминале где проходит оптимизация?
Над этим я не думал, но решение видится в использовании DDE
 
Для DDE нужно прогу отдельную будет писать, я вот думаю как штатными способами реализовать, частично реализовано, но вот беда с принудительной перезаписью HST файлов пока не совсем еще разобрался.
 
HIDDEN писал (а):
Для DDE нужно прогу отдельную будет писать, я вот думаю как штатными способами реализовать, частично реализовано, но вот беда с принудительной перезаписью HST файлов пока не совсем еще разобрался.
а если вариан через data center https://www.metaquotes.net/ котировки синхранизированы на этапе получения
 
Вообще оптимизацию лучьше наверное делать на тех же катеровках что и тестируется эксперт. поэтому я лично хочу сделать копирование рые файлов из одной папки в другую. Это впринципе не сложно. Сложность вся в том что обновление рые файлов происходит только по закрытию терминала или окна с валютной парой.
Поэтому я хочу сделать скрипт или интегрировать в сам эксперт генерацию hst файлов по барам в окне. Т.е. допустим открыть М1 валютной пары в нее поступают катеровки, потом их конвертим в нужные нам таймфреймы с записью на диск. После того как конвертнули скопировали в папку тестера и уже по этим данным прогнали оптимизацию.

Генерация рые файлов должна быть сделана до открытия терминала тестера.
Или вот сейчас изучяю NTFS ссылки, но проблема впринципе останется.

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