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

 

Такой вопрос. Как сейчас оптимизировать? Скелет советника сейчас такой:

init(){
        //если файл истории не существовал, формируем заголовок
}

start(){
        //ловим тики
        //смотрим, сколько прошло секунд с последнего вызова start():
                //если 1 или больше, то---(блок свеч)---
                        //запоминаем, сколько прошло секунд
                        //---(блок выбора режима)---
                        //формируем RateInfo - столько раз, сколько прошло секунд
                //если 0, то---(блок теней)---
                        //редактируем RateInfo - столько раз, сколько прошло секунд в прошлый раз
}

//---(блок выбора режима)---
//флаги в экстерне - все бычьи, все медвежьи или любые
//если все бычьи, то в close всегда ask
//если все медвежьи, то в close всегда bid
//Если любые, то
        //если текущий бид меньше предыдущего, то медвежья
        //в любом другом случае бычья

 Перенёс open-close в переменные и убрал второй ставший ненужным блок FileSeek, добавил выбор стиля свеч (все бычьи, все медвежьи, любые), добавил тени если следующий аск или бид больше или меньше предыдущих хая и лоу, добавил трассировку с принтованием, включающуюся флагом в шапке, всё капитально раскомментировал со ссылками на номера строк, постарался к форуму сделать код читабельным.  Принтование тоже с указанием №строки.

 Теперь смотрите:

 

 Вверху тиковый таймфрейм, внизу секундный. Тени (хвосты) - это когда в одну секунду было поймано два тика и бид или аск отличается от предыдущего. Тиковый работает как часы. Секундный запаздывает, значит на обработку тика тратится времени больше, чем минимальный временный интервал между тиками. Поэтому и спрашиваю, как оптимизировать код. Код прикрепляю, - повторюсь, что всё капитально раскомментил. Если надо проверить как работает - вешаете как советника на минутки, потом в автономных ищете и открываете 'sec'+имя инструмента.

Файлы:
hhi.jt.mq4  29 kb
 
david2:
Как осуществить такую функцию в советнике? При срабатывании TP или SL на любом из ордеров Bay должны закрыватся все ордера Bay.

Если есть опыт программирования то подсказка:

1. после открытия  ордера бай считаете количество ордеров бай

2. Сохраняете их количество в глобальной переменной

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

Функции по учету количества ордеров по типу открытой позиции и по закрытию позиций выбранного типа(бай или селл) в кодобазе есть.

Много полезного в функциях от Ким 

 

О преобразовании типов переменных.
Записал значение коэффициента double K в описание линии в виде текста (K=0,573).
В ходе исполнения кода значение коэффициента K неоднократно менялось.
Теперь хочу умножить переменную double Z на записанное значение K=0,573 после извлечения описания линии string ObjectDescription(string name).
Возможно ли в MQL преобазование переменной типа string в переменную типа double?, что бы опять получить 0,573. Если возможно дайте, пожалуйста, ссылку.
С уважением. Shurkin.

 
Shurkin:

Возможно ли в MQL преобазование переменной типа string в переменную типа double?, что бы опять получить 0,573. Если возможно дайте, пожалуйста, ссылку.
.

https://docs.mql4.com/ru/convert/StrToDouble
 
08:05:30 Сек.ТФ AUDUSD,M1: 15
08:05:31 Тик.тф AUDUSD,M1: 0
08:05:33 Тик.тф AUDUSD,M1: 0
08:05:33 Тик.тф AUDUSD,M1: 0
08:05:35 Тик.тф AUDUSD,M1: 0
08:05:38 Тик.тф AUDUSD,M1: 0
08:05:39 Тик.тф AUDUSD,M1: 0
08:05:39 Тик.тф AUDUSD,M1: 0
08:05:40 Тик.тф AUDUSD,M1: 0
08:05:41 Тик.тф AUDUSD,M1: 0
08:05:42 Тик.тф AUDUSD,M1: 0
08:05:42 Тик.тф AUDUSD,M1: 0
08:05:43 Тик.тф AUDUSD,M1: 0
08:05:51 Сек.ТФ AUDUSD,M1: 15062
08:05:54 Тик.тф AUDUSD,M1: 0
08:05:54 Тик.тф AUDUSD,M1: 0
08:05:55 Тик.тф AUDUSD,M1: 0
08:05:56 Тик.тф AUDUSD,M1: 0
08:05:56 Тик.тф AUDUSD,M1: 0
08:05:57 Тик.тф AUDUSD,M1: 0
08:05:58 Тик.тф AUDUSD,M1: 0
08:05:58 Тик.тф AUDUSD,M1: 16
08:05:59 Тик.тф AUDUSD,M1: 0
08:06:00 Тик.тф AUDUSD,M1: 0
08:06:06 Тик.тф AUDUSD,M1: 0
08:06:06 Тик.тф AUDUSD,M1: 0
08:06:09 Сек.ТФ AUDUSD,M1: 10156
08:06:16 Тик.тф AUDUSD,M1: 0
08:06:16 Тик.тф AUDUSD,M1: 0
08:06:17 Тик.тф AUDUSD,M1: 0
08:06:18 Тик.тф AUDUSD,M1: 0
08:06:26 Сек.ТФ AUDUSD,M1: 5078
08:06:27 Тик.тф AUDUSD,M1: 0
08:06:28 Тик.тф AUDUSD,M1: 0
08:06:30 Тик.тф AUDUSD,M1: 31

08:06:32 Сек.ТФ AUDUSD,M1: 15

 Часть лога со взведённым миллисекундным таймером в обоих  кодах (тикового и секундного таймфреймов). Всё, что в голову пока приходит, - убрать циклы вообще, т.е. один или больше тиков в секунду без разницы сколько прошло секунд с последнего тика - это всегда одна свеча. Если был второй и т.д. тик в секунду, - свеча с тенями. Но тогда будет секундный ТФ с "дырами" и по High[15] предположим я уже не возьму значение аска 15 секунд назад...

 
hoz:

Задался я вопросом написать функцию. Суть такая, что необходимо что, при откате N-свечей в в определённую строну, просчитывать количество свечей. НО. Для это есть несколько условий, а точнее будет со временем их перечень.

Скажем так, тренд, например, направлен вниз,... пошёл откат вверх. Я хочу чтоб если прошло 5 свечей вверх, и каждая свеча была бычья, и, например, размер каждой свечи был больше заданного i_sizeOfCurrBar, и ещё какие-н. условия, то выводим количество баров непрерывно бычьих, и возвращаем какой-то результат из функции.

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

Вот что у меня, есть:

 

 На данный момент идёт просто перебор от предпоследнего бара, то бара с индексом 6, т.е. 5 баров в подряд. Но мне нужно, чтоб эксперт просчитывал только бары, которые вляются бычьими, а не все в подряд. Как это будет адекватнее реализовать?

 По размеру я вроде как отфильтровал верно.

Ну а когда всё будет уже прописано, снизу уже счётчик будет просчитывать количество непрерывных баров с nht,etvsvb параметрами и если таких баров достаточно, то возвращается какое-н. значение функции.

Как всегда оригинально: считать бары "сзаду"...

for (int i=Bars-1; i>=Bars-6; i--)
 
Zhunko:

Много разных способов есть:

1. Через глобальную переменную.

2. Через файл.

3. Через iCustom().

4. Через глобальные графические переменные.

5. Маппинг. Можно передать данные из одного терминала в другой терминал. Или в одном терминале передать данные из одного окна в другое окно без ограничений глобальных переменных МТ4.


Что из этого работает быстрее всего?
 
gyfto:

Что из этого работает быстрее всего?
5. Маппинг. 
 
hoz:
В принте у неё значение 1 и 2... Что тут вообще за хрень?
Print("i = ", i, "; up = ", cnt, "; cnt = ", cnt);

Просто невнимательность. А вообще здешняя bool 4-байтовая, что вовсе не обязывает её принимать значения только 0 и 1. С++ boolearn - та да, 1-байтовая. Я лично использую bool в двоичной арифметике  в switch(), если надо делать множественный выбор, уповая на то, что она всегда 0 либо 1))) Вот так:

bool f1, f2, f3, f4//флаги

switch(8*f4+4*f3+2*f2+f1){
   case 0:
   ...
   case 15:
}//без default
 
gyfto:

Такой вопрос. Как сейчас оптимизировать? Скелет советника сейчас такой:

 Перенёс open-close в переменные и убрал второй ставший ненужным блок FileSeek, добавил выбор стиля свеч (все бычьи, все медвежьи, любые), добавил тени если следующий аск или бид больше или меньше предыдущих хая и лоу, добавил трассировку с принтованием, включающуюся флагом в шапке, всё капитально раскомментировал со ссылками на номера строк, постарался к форуму сделать код читабельным.  Принтование тоже с указанием №строки.

 Теперь смотрите:

 Вверху тиковый таймфрейм, внизу секундный. Тени (хвосты) - это когда в одну секунду было поймано два тика и бид или аск отличается от предыдущего. Тиковый работает как часы. Секундный запаздывает, значит на обработку тика тратится времени больше, чем минимальный временный интервал между тиками. Поэтому и спрашиваю, как оптимизировать код. Код прикрепляю, - повторюсь, что всё капитально раскомментил. Если надо проверить как работает - вешаете как советника на минутки, потом в автономных ищете и открываете 'sec'+имя инструмента.

В логику сильно не вникал, но, что-то мне подсказывает, что есть лишние вычисления. Год-полтора назад я решал однотипную задачу со сбором котировок и формированием М1 свечей с чёткой нарезкой по началу астрономической минуты.
Если будет интересно, можете глянуть несколько моментов чисто по оптимизации Вашего кода (файл). Правда, если серъёзно говорить об оптимизации, нужно замерять время исполнения кода. ;)
Файлы:
hhi.jt_c_.mq4  23 kb