Новый клиентский терминал MetaTrader 4 build 204 - страница 8

 
А если этот массив нужно не только прочесть, но и изменить в другом присоединяемом файле ?
Сколько тогда параметров нужно будет передавать в вызов такой процедуры ?

По идее 2 параметра: адрес массива и индекс элемента. Впрочем, повторюсь, задачу я представляю по-прежнему довольно смутно, соответственно уверенности что говорю по делу нет.


P.S. Это конечно для одного массива. Если нужно изменить сразу несколько свойств ордера возможно лучше просто вызвать специальную функцию, меняющую этот набор параметров. Если массивы параметров глобальные, в неё можно вообще ничего не передавать. Это конечно не совсем "правильный" стиль, но всегда ли оправдан "правильный" стиль в случае MQL4 вопрос сложный. По крайней мере в моём случае ситуаций, когда нужно было одновременно менять много параметров ордера просто не было.
 
Словил крэш.

Порядок действий

1. Оффлайн (disconnect)
2. Инсталляция вручную свежескачанного мт поверх существующего, который не запускался неделю.
3. Запуск новой версии. Текущее окно - eurusdm1.
4. Импорт свежей истории eurusdm1 из hst файла другого инстанса терминала
5. Переключение на другой чарт (gbpusd, по-моему)
6. Переключение обратно на eurusd чарт рушит терминал.

Даже Refresh чарта сделать не успел.

There has been a critical error
Time : 2007.05.04 00:12
Program : Client Terminal
Version : 4.00 (build: 204, 25 Apr 2007)
Owner : MetaQuotes Software Corp. (MetaTrader)
OS : Windows XP Professional 5.1 Service Pack 2 (Build 2600)
Processors : 1, type 586, level 15
Memory : 523760/81204 kb
Exception : C0000005
Address : 004888B0
Access Type : read
Access Addr : 0869DE90

Registers : EAX=0006FBCE CS=001b EIP=004888B0 EFLGS=00010297
: EBX=01E61474 SS=0023 ESP=0012ECE8 EBP=0012F000
: ECX=0006FBCF DS=0023 ESI=01E60DF8 FS=003b
: EDX=08320020 ES=0023 EDI=00000000 GS=0000

Stack Trace : 00496BEE 00422923 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
Modules :
1 : 00400000 007BE000 C:\Documents and Settings\roman\Program Files\MetaTrader 4\terminal.exe
2 : 086A0000 00013000 C:\Program Files\ABBYY Lingvo 10 Multilingual Dictionary\LvHook.dll
3 : 09BD0000 00018000 C:\WINDOWS\system32\odbcint.dll
4 : 10930000 00049000 C:\WINDOWS\system32\PortableDeviceApi.dll
5 : 20000000 002CD000 C:\WINDOWS\system32\xpsp2res.dll
6 : 5B260000 00038000 C:\WINDOWS\system32\UxTheme.dll
7 : 5BD50000 00054000 C:\WINDOWS\system32\NETAPI32.dll
8 : 61EC0000 0000E000 C:\WINDOWS\system32\MFC42LOC.DLL
9 : 698B0000 00058000 C:\WINDOWS\system32\hnetcfg.dll
10 : 71A30000 00040000 C:\WINDOWS\system32\mswsock.dll
11 : 71A70000 00008000 C:\WINDOWS\System32\wshtcpip.dll
12 : 71A80000 00008000 C:\WINDOWS\system32\WS2HELP.dll
13 : 71A90000 00017000 C:\WINDOWS\system32\WS2_32.dll
14 : 71B00000 00012000 C:\WINDOWS\system32\MPR.dll
15 : 71BD0000 00013000 C:\WINDOWS\System32\SAMLIB.dll
16 : 71BF0000 0000E000 C:\WINDOWS\System32\ntlanman.dll
17 : 71C60000 00007000 C:\WINDOWS\System32\NETRAP.dll
18 : 71C70000 00040000 C:\WINDOWS\System32\NETUI1.dll
19 : 71CB0000 00017000 C:\WINDOWS\System32\NETUI0.dll
20 : 73B60000 00014000 C:\WINDOWS\system32\sti.dll
21 : 73D90000 000FE000 C:\WINDOWS\system32\MFC42.DLL
22 : 73FB0000 0003D000 C:\WINDOWS\system32\ODBC32.dll
23 : 746E0000 0004B000 C:\WINDOWS\system32\MSCTF.dll
24 : 74AA0000 00007000 C:\WINDOWS\system32\CFGMGR32.dll
25 : 75940000 000F8000 C:\WINDOWS\system32\MSGINA.dll
26 : 75DA0000 00091000 C:\WINDOWS\system32\MLANG.dll
27 : 75F30000 00007000 C:\WINDOWS\System32\drprov.dll
28 : 75F40000 00009000 C:\WINDOWS\System32\davclnt.dll
29 : 76330000 00010000 C:\WINDOWS\system32\WINSTA.dll
30 : 76350000 00005000 C:\WINDOWS\system32\MSIMG32.dll
31 : 76380000 00049000 C:\WINDOWS\system32\comdlg32.dll
32 : 76970000 00026000 C:\WINDOWS\system32\ntshrui.dll
33 : 769A0000 000B4000 C:\WINDOWS\system32\USERENV.dll
34 : 76B00000 00011000 C:\WINDOWS\system32\ATL.DLL
35 : 76B20000 0002E000 C:\WINDOWS\system32\WINMM.dll
36 : 76C20000 0002E000 C:\WINDOWS\system32\WINTRUST.dll
37 : 76C80000 00028000 C:\WINDOWS\system32\IMAGEHLP.dll
38 : 76D50000 00019000 C:\WINDOWS\system32\iphlpapi.dll
39 : 76F10000 00027000 C:\WINDOWS\system32\DNSAPI.dll
40 : 76F50000 0002D000 C:\WINDOWS\system32\WLDAP32.dll
41 : 76FA0000 00008000 C:\WINDOWS\System32\winrnr.dll
42 : 76FB0000 00006000 C:\WINDOWS\system32\rasadhlp.dll
43 : 76FC0000 0007F000 C:\WINDOWS\system32\CLBCATQ.DLL
44 : 77040000 000C7000 C:\WINDOWS\system32\COMRes.dll
45 : 77110000 0008C000 C:\WINDOWS\system32\OLEAUT32.dll
46 : 773C0000 00103000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll
47 : 774D0000 0013D000 C:\WINDOWS\system32\ole32.dll
48 : 77910000 000F4000 C:\WINDOWS\system32\SETUPAPI.dll
49 : 77A70000 00095000 C:\WINDOWS\system32\CRYPT32.dll
50 : 77B10000 00012000 C:\WINDOWS\system32\MSASN1.dll
51 : 77B30000 00022000 C:\WINDOWS\system32\Apphelp.dll
52 : 77BF0000 00008000 C:\WINDOWS\system32\VERSION.dll
53 : 77C00000 00058000 C:\WINDOWS\system32\msvcrt.dll
54 : 77DC0000 000AC000 C:\WINDOWS\system32\ADVAPI32.dll
55 : 77E70000 00091000 C:\WINDOWS\system32\RPCRT4.dll
56 : 77F10000 00047000 C:\WINDOWS\system32\GDI32.dll
57 : 77F60000 00076000 C:\WINDOWS\system32\SHLWAPI.dll
58 : 77FE0000 00011000 C:\WINDOWS\system32\Secur32.dll
59 : 7C800000 000F6000 C:\WINDOWS\system32\kernel32.dll
60 : 7C900000 000B1000 C:\WINDOWS\system32\ntdll.dll
61 : 7C9C0000 00819000 C:\WINDOWS\system32\SHELL32.dll
62 : 7E360000 00090000 C:\WINDOWS\system32\USER32.DLL

Call stack :
00488790:0120 [004888B0] ?UpdateDataWindowData@CIndCustom
00496750:049E [00496BEE] ?UpdateDataWindowData@CIndMain
00422900:0023 [00422923] ?UpdateDataWindowData@CChartWin
 
Короче говоря, тормоза из-за неоправданного использования строк - выделений, перевыделений, преобразований туда-обратно.

Кстати, можно обойтись и без структуры. Вместо строкового массива из 25 элементов использовать 25 переменных, каждая из которых будет сразу нужного типа. Если хотите структуризации, то используйте в именах этих переменных общий префикс.


Ок - со строковым масивом я согласен.
Вместо массива буду использовать как вы сказали 25-30 переменных сразу нужного типа.
Я вас понял - вы смотрите со стороны оптимального кода.
Но вы должны понять меня - писать советник одним большим файлом - это, по крайней мере, плохой тон в программировании.
У меня общие функции - это отдельный файл.
А получить параметры ордера - это общая функция для всех советников. И хотелось, чтобы она возвращала набор этих параметров. Если использовать 25 переменных - это, согласитесь, просто вынужденная мера.
Но, все равно, большое спасибо Slawa - я ведь не могу сделать замер производительности - нет никаких для этого инструментов.

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

Но Вы просите помощи, показывая совершенно плохой код и не понимая его проблем. На что я ответил совершенно точно - "так писать нельзя - код нужно выбросить". Вы не можете требовать от меня чего-то дополнительно. Тем более - требовать публичного обучения в форуме.


Ничего мне от вас не нужно.
Возникла проблема - я задал вопрос : "Почему медленно идет оптимизация". Разбираемся - хорошо, не разбираемся - не страшно. Вот и все.
Тем более помощи я не просил - это был вопрос.

Всем спасибо - все понятно, не совсем удобно так программировать - но я еще перепишу функции с учетом всех замечаний.

Паралельно я уже установил Омегу :) - как резервный вариант.
Кто-то подскажет - в Омеге есть отладчик ? - я просто еще ее не разбирал.
В Метатрейдере не хватает отладчика - это факт.
 
Irtron, это был однократный креш или его можно воспроизвести, выполнив описанные действия?
 
Irtron, это был однократный креш или его можно воспроизвести, выполнив описанные действия?
Воспроизвести не удалось, хотя и пробовал эту же последовательность, только с уже обновленной историей. История обновлялась по нескольким таймфреймам eurusdm1, eurusdm5, eurusdm15, eurusdm60, eurusdm240 и eurusdm1440. Честно говоря, неохота было возиться с подтиркой и импортом истории еще раз.
Кстати, забыл упомянуть, на графике eurusdm1 было несколько OBJ_TREND линий, которые перерисовываются индикатором на новых барах с помощью ObjectSet(name, OBJPROP_[PRICE[1|2]|TIME[1|2]], val).
Причина обращения: