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

 
Chiripaha:

: )))))))) Да - правильно. Все упреки принимаю! - За это еще раз извиняюсь. - Это все издержки сильно развитого (специальными упражнениями)

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

Поэтому все Ваши претензии по адресу и я виновен.

             но только вопрос остался нерешенным...

Как его в итоге разрешить?

Если Вы считаете, что я чего-то не услышал, то уточните пожалуйста. Я понимаю технику обратной связи (за умение "слышать"), но решения пока не увидел.

Как получить нужное число без округления в формате Дабл, до 3-го знака после запятой, к примеру, в значении Ask = 1,20667 ?  -  Решение типа "StrToDouble(DoubleToStr(Ask,3)) = 1,2100    // 1,2100 - это получившийся результат (т.е. округляет)"   не сработало.

Заранее спасибо за Ваши терпимость и понимание.

DoubleToStr(Ask,3)  !=  DoubleToStr(Ask,Digits) !!! - это нужно было увидеть.

А решение в файле (это проверочный скрипт).

Файлы:
test_ind.mq4  2 kb
 
alsu:

Посмотрел Ваш код.... слишком вы все запутали)))

Я не вполне понимаю, зачем аккумулировать тики, ведь нам достаточно хранить в памяти (или даже не хранить, ведь текущий бар надо писать в HST - иначе график не будет обновляться) параметры текущего бара - шесть чисел TOHLCV, и при поступлении тиков обновлять их по мере необходимости, а по заданному условию (TimeCurrent()-O>1) делать отсечку баров.

Попробуйте переработать код таким образом, он сократится раз в 8, я гарантирую это (проверено:)


Вот так? Переделал алгоритм, убрал аккумулятор, перевёл на эксперта, добавил градацию тиков на бычьи-медвежьи, добавил хвосты у свечей по иному алгоритму, всё раскомментировал. Проверить пока не на чем, тиков-то в выходных нет. По поводу объёма - мне кажется, дело было в FileFlush, она же работает с буфером. На будущее зарёкся что-либо ставить между FileSeek и FileFlush...
Файлы:
elz.jp.mq4  23 kb
 
IgRU4ek:

DoubleToStr(Ask,3)  !=  DoubleToStr(Ask,Digits) !!! - это нужно было увидеть.

А решение в файле (это проверочный скрипт).


Спасибо большое.

Я пока так и не понял механизм - почему в моем варианте не работало и почему "DoubleToStr(Ask,3)  !=  DoubleToStr(Ask,Digits)" - Видимо, в справочнике не все особенности функций раскрыты.

Вашу функцию разобрал - понял ее ход решения. Но я был уверен, что должен был существовать более "простой" путь решения, ведь набор функций в языке программирования для того и служит, чтобы типичные задачи ими решать, а не создавать каждому пользователю эти типичные функции самостоятельно. Я наивно предполагал, что DoubleToStr() как раз эту задачу и решает. - Не понимаю тогда смысла ее применения (в чем ее нюансы). Я ведь обычный пользователь, а не программист, чтобы до таких деталей "доходить". Когда пользоваться продуктами создания в этом случае, если все время будет уходить на детализацию программирования.

Еще раз спасибо. Сейчас попробую вписать это все в код. Надеюсь, что все заработает.

 
Chiripaha:

Спасибо большое.

Я пока так и не понял механизм - почему в моем варианте не работало и почему "DoubleToStr(Ask,3)  !=  DoubleToStr(Ask,Digits)" - Видимо, в справочнике не все особенности функций раскрыты.

Вашу функцию разобрал - понял ее ход решения. Но я был уверен, что должен был существовать более "простой" путь решения, ведь набор функций в языке программирования для того и служит, чтобы типичные задачи ими решать, а не создавать каждому пользователю эти типичные функции самостоятельно. Я наивно предполагал, что DoubleToStr() как раз эту задачу и решает. - Не понимаю тогда смысла ее применения (в чем ее нюансы). Я ведь обычный пользователь, а не программист, чтобы до таких деталей "доходить". Когда пользоваться продуктами создания в этом случае, если все время будет уходить на детализацию программирования.

Еще раз спасибо. Сейчас попробую вписать это все в код. Надеюсь, что все заработает.

DoubleToStr() производит преобразование с числом в два этапа: сначала округляет (по правилам математики) число до нужного знака, а затем переводит его в строку.
 

Попробуйте для Вашего случая

double x = MathFloor(y*1000)/1000; 

 
IgRU4ek:
DoubleToStr() производит преобразование с числом в два этапа: сначала округляет (по правилам математики) число до нужного знака, а затем переводит его в строку.


Спасибо за пояснения. Я этого, конечно, не знал и грешил в этом случае на StrToDouble(). Но после Вашего пояснения теперь предполагаю, что они обе округляют : (

Зачем округлять - непонятно. Т.к. если бы нужно было округлить, то лучше в этом случае, предварительно использовать к-нить функцию округления (по надобности) - ту же Нормализацию. Тогда были бы обе возможности и с округлением, и без. А так получаются лишние нагромождения. Тем более непонятно почему округляет, когда мне нужно просто сделать итак уже имеющееся число просто другим типом. Я его уже получил (число), зачем его малювать дополнительно.

 
Roger:

Попробуйте для Вашего случая

double x = MathFloor(y*1000)/1000; 


Точно! Прикольное решение. Я его раньше встречал, но в моем случае что-то упустил. Вам, Александр, тоже Большое спасибо! - Теперь у меня 2 решения будет! : )) (за мульт "Простоквашино")
 

Такой теоретический вопрос. Цена закрытия, с точки зрения тика - это бид или аск последнего тика в свече? Я замечал, что если бид записать в Close[0], то котировка на бегунке такая же, как на минутках.

Подумал-подумал... Бид по-идее... 

 
Zhunko:
Много ошибок. Может пример посмотреть и сделать по аналогии?


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

 В инклюде импортируется функция, и объявляются функции, которые нужно импортировать. Между объявлениями ставится знак ;

 Вот я написал инклюд и библиотеку (с одной функцией правда, но это только для теста).

 Включение вот:

//+------------------------------------------------------------------+
//|                                       HozIncludeToScalper_M1.mqh |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

#import "Scalper_M1_lbr.ex4"

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA);

// Очередная функция

// Очередная функция

// Очередная функция

#import

 Когда все необходимые (используемые канкретной совой) функции объявлены, в конце ставим #import

Вот сама библиотека:

//+-------------------------------------------------------------------------------------+
//|                                                                  Scalper_M1_lbr.mq4 |
//|                                                                                 hoz |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property library

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA)
{
   switch (typeOfMA)
   {
      case 1:      return (iMA(NULL, i_fastMATF, i_fastMAPeriod, i_fastMAShift, i_fastMAMethod, i_fastMAApplied, i_fastMAIndex));
      case 2:      return (iMA(NULL, i_slowMATF, i_slowMAPeriod, i_slowMAShift, i_slowMAMethod, i_slowMAApplied, i_slowMAIndex));
      case 3:      return (iMA(NULL, i_filtrMATF, i_filtrMAPeriod, i_filtrMAShift, i_filtrMAMethod, i_filtrMAApplied, i_filtrMAIndex));
   }
}

 Она даже не компилируется.

'i_fastMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 38)
'i_fastMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 50)
'i_fastMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 66)
'i_fastMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 81)
'i_fastMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 97)
'i_fastMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 114)
'i_slowMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 38)
'i_slowMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 50)
'i_slowMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 66)
'i_slowMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 81)
'i_slowMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 97)
'i_slowMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 114)
'i_filtrMATF' - variable not defined    E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 38)
'i_filtrMAPeriod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 51)
'i_filtrMAShift' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 68)
'i_filtrMAMethod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 84)
'i_filtrMAApplied' - variable not defined       E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 101)
'i_filtrMAIndex' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 119)
18 ошибок, 0 предупреждений     

 У Вас в библиотеке ничего не объявляется, и ошибок нет, а у меня почему-то есть. Разницы не нашёл никакой..

 

Виктор, у Вас в функции очень много переменных и ни одна не объявлена.

Компилятор же сообщил:

variable not defined

Переменная не объявлена. Таких 18 штук.

==============

Судя по конструкции функции, она узкоспециальная. Зачем её выносить в библиотеку? Тем более, что она, наверняка, будет вызываться в цикле на каждом баре.

Вы что-то про скорость и оптимизацию говорили. Вы создаёте очень тормозной код. В MQL4 не надо помещать функции в цикле. Чем меньше вызовов функций в цикле, тем быстрее работает код.

==============

Давно, когда начинал писать на MQL4, написал первый свой индикатор индексов валют. Тоже там функции, работа со строками... Пипец, что было... Время на перключение ТФ уходило по 5 минут.

Потом посидел, подумал, ликвидировал все функции, раскрыл их прямо в блоке цикла. Ликвидировал работу со строками, заменив их на идентификаторы. Всё, что можно было расчитать заранее и что не менялось, так и расчитывал (оптимизация). Перенёс код в эксперт. В итоге самый тяжёлый пересчёт при переключении ТФ составлял 15 секунд. Потом перенёс расчёты в DLL. Теперь около 5 секунд.

Причина обращения: