[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 285

 
gyfto:

Так. Вроде закончил. Вот переделанный сборщик тиков с упаковкой их в секундные свечи.

 Было:

 Стало:

 Замечания по коду.

1. Не стал делать switch-case  в выборе виртуальной свечи, чтобы сэкономить процессорное время, вместо этого закомментировал участки с выбором (т.к. выбор делается для конкретных нужд один раз до компиляции).

2. На работу с локальным временем (в оффлайне то есть) до ума не довёл.  В цикле "while(time==TimeLocal()){//пока секунда не прошла", так подозреваю, должна быть MarketInfo в FileWriteDouble (по мне, это верх идиотизма). Если подскажите что там логичней будет смотреться, буду благодарен.

3.  Авторскую конструкцию

 в первый раз я объявил в самом конце init().

4.  В начале init() динамические массивы

 вместо используемых переменных.

 5. Для оптимизации можно теоретически использовать файловые функции WinAPI и записывать в историю сразу блоком по 44 байта (длина структуры MarketInfo или как её там в .hst).

6. Полностью убрал авторское моделирование времени для записи в ячейку Time[]. По той же причине в головном цикле while нет никакой проверки на TimeLocal(), только на TimeCurrent().

7. Что ещё вы предложите для оптимизации кода? 

Из п.4 следует понимать, что Вы делали индикатор, тогда не понятны такие действия:

ArrayResize (bid, 1);//урезаем и обнуляем использованные массивы
ArrayResize (ask, 1);

Вероятнее всего подходит ArrayInitialize()?!

А ещё вероятнее всего, Вам нужно отказаться от использования индикаторных массивов.

 
TarasBY:

Вероятнее всего подходит ArrayInitialize()?!

 ArrayInitialize(ask, EMPTY_VALUE); имеете ввиду? Не подумал. Я почему стал именно урезать, испугался такого случая:

(a, b, c)//значения в ask после трёх  тиков в секунду (фантастика, но предположим).

ArrayInitialize(ask, 0);//будет (0, 0, 0)

 FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]

- в ячейку Close попадёт 0. Поэтому я и переобъявляю размер чтобы этого не случилось. Надо ArrayInitialize(ask, EMPTY_VALUE); прогнать проверить.

TarasBY: 

нужно отказаться от использования индикаторных массивов.

 Они динамические, я на это и клюнул. Меньше команд, меньше тактов процессора. Тут же надо в 500 миллисекунд обработки при любой теоретически возможной ж... уложиться.

 
подскажите кто знает, есть ли возможность заменить ордер сенд и ордер клоуз в советнике на вызов окна совершения сделок в ручную, и входить выходить в рынок через это окно, это нужно для тех брокеров у которых запрещено использование советников
 
gyfto:

 ArrayInitialize(ask, EMPTY_VALUE); имеете ввиду? Не подумал. Я почему стал именно урезать, испугался такого случая:

(a, b, c)//значения в ask после трёх  тиков в секунду (фантастика, но предположим).

ArrayInitialize(ask, 0);//будет (0, 0, 0)

 FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]

- в ячейку Close попадёт 0. Поэтому я и переобъявляю размер чтобы этого не случилось. Надо ArrayInitialize(ask, EMPTY_VALUE); прогнать проверить.


 Они динамические, я на это и клюнул. Меньше команд, меньше тактов процессора. Тут же надо в 500 миллисекунд обработки при любой теоретически возможной ж... уложиться.

Я немножко-совсем не про то: что-то мне подсказывает, что уменьшить индикаторный массив Вам не удастся. К тому же, если в таком массиве есть не заполненные ячейки, то там ВСЁ РАВНО есть какое-то значение: 0 или EMPTY_VALUE, а тогда что Вы получите в этих расчётах:

bid[ArrayMaximum(bid)];
ask[ArrayMinimum(ask)];
И по общей логике: я бы запускал весь сбор тиков в цикле и отдельно контролировал время и, как только прошло время на "новый бар", записывал его в файл, обнуляя и обрезая при этом рабочие массивы.
 
ex_kalibur:
подскажите кто знает, есть ли возможность заменить ордер сенд и ордер клоуз в советнике на вызов окна совершения сделок в ручную, и входить выходить в рынок через это окно, это нужно для тех брокеров у которых запрещено использование советников
Окно "Свойства" советника -> Вкладка "Общие" -> "Автоматическая торговля" -> Поставьте чебокс на "Ручное подтверждение" - другого способа не знаю.
 
TarasBY:

И по общей логике: я бы запускал весь сбор тиков в цикле и отдельно контролировал время и, как только прошло время на "новый бар", записывал его в файл, обнуляя и обрезая при этом рабочие массивы.


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

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

Мы с Вами о разных циклах говорим. Я о таком:

    while (!IsStopped() && IsExpertEnabled())
    {
        //---- Сбор тиков
    }
 
Кто нибудь подскажет как убрать нули после запятой? У меня почему то 4 знака после запятой показывает.  Вот код.    string l_dbl2str_12 = DoubleToStr(g_ibuf_140[0] - g_ibuf_144[0],3);
 
Demon2057:
Кто нибудь подскажет как убрать нули после запятой? У меня почему то 4 знака после запятой показывает.  Вот код.    string l_dbl2str_12 = DoubleToStr(g_ibuf_140[0] - g_ibuf_144[0],3);
https://docs.mql4.com/ru/strings/StringSubstr
 

Подскажите что я делаю не так...

Мне нужно чтобы переменная типа double содержала в себе дату в виде 0,20130429164459 (имеется в виду 2013.04.29 16:44:59)

Часть кода советника:

#include <stdlib.mqh>
bool once=false;
int start()
  {
  if (once==false)
     {
    double DTM; // дата и время в формате 0,20130429164459
    int YY=TimeYear(   TimeCurrent());   // Year
    int MN=TimeMonth(  TimeCurrent());   // Month         
    int DD=TimeDay(    TimeCurrent());   // Day
    int HH=TimeHour(   TimeCurrent());   // Hour         
    int MM=TimeMinute( TimeCurrent());   // Minute
    int SS=TimeSeconds(TimeCurrent());   // Second
    DTM = YY*0.0001+MN*0.000001+DD*0.00000001+HH*0.0000000001+MM*0.000000000001+SS;
    
   Alert ("Значение переменной DTM с 06 знаками равно ", DoubleToStrMorePrecision(DTM,6));
   Alert ("Значение переменной DTM с 07 знаками равно ", DoubleToStrMorePrecision(DTM,7));
   Alert ("Значение переменной DTM с 08 знаками равно ", DoubleToStrMorePrecision(DTM,8));
   Alert ("Значение переменной DTM с 09 знаками равно ", DoubleToStrMorePrecision(DTM,9));
   Alert ("Значение переменной DTM с 10 знаками равно ", DoubleToStrMorePrecision(DTM,10));
   Alert ("Значение переменной DTM с 11 знаками равно ", DoubleToStrMorePrecision(DTM,11));
   Alert ("Значение переменной DTM с 12 знаками равно ", DoubleToStrMorePrecision(DTM,12));
   Alert ("Значение переменной DTM с 13 знаками равно ", DoubleToStrMorePrecision(DTM,13));
   Alert ("Значение переменной DTM с 14 знаками равно ", DoubleToStrMorePrecision(DTM,14));
   Alert ("Значение переменной DTM с 15 знаками равно ", DoubleToStrMorePrecision(DTM,15));
   once=true;
      }
   return(0);
  }

 Журнал событий для Precision 12,13 и 14 выдает не правильный результат, см. фото