Вопросы от "чайника" - страница 111

 
openlive:

теперь выдает 

2012.02.26 15:47:46 Tester file C:\Users\openlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DDD286B60B1DB9B989A2FFC701\MQL5\Files\signal10000.csv open error [32]

Во-первых, проверьте что там у вас в папке C:\Users\openlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DDD286B60B1DB9B989A2FFC701\MQL5\Files\

Второе: ошибки 32 в MQL5 нет. Странно... Вы проверяете хендл после попытки открывия файла и код последней ошибки после попытки открытия?

 
DenisR:
Что такое "режим математических расчётов"?
В режиме математических расчетов нет прогонов по истории - за счет этого достигается максимальная скорость когда требуется производить мат.вычисления без использования торговых операций. В этом режиме, если оптимизировать торговый эксперт, придется рыночное окружение (побарное/потиковое поступление в эксперт исторических данных, спред и пр.) моделировать самостоятельно. В этом случае можно использовать какие угодно исторические данные, брать их из предварительно подготовленного файла.
 
DenisR:
Что такое "режим математических расчётов"?

В этом режиме вызывается только OnTester();  Но сложность и объём расчётов в OnTester() не ограничивается.  Если сами посчитаете прибыль вашего эксперта при заданных входных параметрах - сможете использовать генетический алгоритм тестера для оптимизации.
 

Помогите пожалуйста разобраться, мозг кипит.

1. Я понимаю так что переход на x64 ОС, связан с тем что на 4 байтах более 4 ГБайт оперативки не "разметишь". У меня x64 ОС, почему указатели у меня занимают 4 байта (касается не только mql, также и в C++))?

2. Вопрос по MT4: почему при вызове dll функции:

#import "MemoryDLL.dll"
void fn(double j[]);           // Подозреваю что так отдается адрес?
#import

int start()
{
   double dVal[1];
   fn(dVal);
   retutn(0);
} 

в dll переменную можно нормально принять в таких вариантах:

extern "C" __declspec(dllexport) void fn(double &j);       // Почему так работает????
// и так
extern "C" __declspec(dllexport) void fn(double *j);       // Думаю что должно работать только так

хотя предполагаю что указатель и ссылка, по идеи должны быть не совместмы, например потому что указатель на double занимает у меня 4 байта.

 Так работает:

#import "MemoryDLL.dll"
void fn(double j);           
#import
                                                  // Согласен

extern "C" __declspec(dllexport) void fn(double j);  

Не работает:

#import "MemoryDLL.dll"
void fn(double j);           
#import
                                                  // Почему нет???

extern "C" __declspec(dllexport) void fn(double &j);  

 Хотя бы как привильно (хочу передать несколько массивов)? А то не хочу через задний ход.

 
220Volt:

 Хотя бы как привильно (хочу передать несколько массивов)? А то не хочу через задний ход.

 

 

а в MQL в объявлении функции кто будет & ставить?
 
sergeev:
а в MQL в объявлении функции кто будет & ставить?

Да, наверное так будет правильно. Только все равно МКЛ как-то не по Си работает (могу ошибаться).

 
220Volt:

Да, наверное так будет правильно. Только все равно МКЛ как-то не по Си работает (могу ошибаться).

есть одно отличие в передаче  - все нужно передавать только по ссылке &,  по указателю  ' * ' можно передавать только объекты классов

 

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

extern "C" __declspec(dllexport) void fn(double &j);  
// и так
extern "C" __declspec(dllexport) void fn(double *j);  
// Прототип для MQL - void fn(&s[]);

Можно попробывать найти объяснение типа - передается участок памяти "как есть" а принимающая сторона сама решает что с ним делать (записать адрес в значение или копировать адрес). Но эта гипотеза разрушается тем фактом что не работает так:

extern "C" __declspec(dllexport) void fn(double j);  

// Прототип для MQL - void fn(&s[]);

Можно опять попытаться найти объяснение - в первых дувух на вход подается адрес в поле "значение", а принимающая сторна решает что с этим делать. В противовес этому тот факт что в С++ комипилятор говорит что так делать нельзя, по его мнению или так:

 

fn(int *x)
{
}

int i;
fn(&i);

  или так:

fn(int &x)
{
}

int i;
fn(i); 
В общем ничего кроме противоречий я не вижу.
 

Сам спросил, сам отвечу.

Пришел к выводу что ссылка и указатель по большему вещи одинаковые. Есть Небольшие отличия:

  • записать адрес в ссылку можно только один раз, в указатель много
  • отличный синтаксис

Очень важным моментом является: если у вызываемой функции аргумент - ссылка или указатель, то фактически передается адрес. Это очень важно понимать при вызове из dll.

 

Подскажите чайнику, как найти точное значение пересечения главной и индикаторной линии стохастика?

Визуально это просто, а как реализовать программно?