Как кодировать? - страница 114

 
matrixebiz:
Как настроить часы торговли в советнике?

Я пробовал следующее;

int TradeHour;

if(Hour()17) TradeHour = false;

но, похоже, это не подчиняется правилу, он просто торгует, когда угодно, и у меня есть && TradeHour в моих заявлениях о покупке/продаже.

Спасибо

Пробовали ли вы определить TradeHour как булево число, а не целое число?

bool TradeHour;

if ((Hour()17)){ TradeHour = false;}

Кроме того, вам могут понадобиться дополнительные скобки.

 
matrixebiz:
Как настроить часы торговли в советнике?

Я пробовал следующее;

int TradeHour;

if(Hour()17) TradeHour = false;

но, похоже, это не подчиняется правилу, он просто торгует, когда угодно, и у меня есть && TradeHour в моих заявлениях о покупке/продаже.

Спасибо

Как Hour() может быть меньше 9 и больше 17? Вы имели в виду Or (||)?

Люкс

 
luxinterior:
Как Hour() может быть меньше 9 И больше 17? Вы имели в виду Or (||)? Lux.

Хорошее замечание по поводу luxinterior! Это определенная проблема. Я это упустил.

 

Извините, я имел в виду ||

и я пытался сделать следующее;

//+---------Переменные торгового часа------------------

// if (Hour() < StartHour) TradeHourS = false;

// if (Hour() > EndHour) TradeHourE = false;

Итак, если StartHour=5 и EndHour=17, то он должен торговать только в эти часы, правильно?

Но он торгует в любое время? Это проблема при использовании тестера стратегий?

 

Почему бы просто не использовать пример прямо из файла справки?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

Люкс

 

Возврат строки из экспортируемых функций c/c++ DLL

Привет всем,

Я разработал набор функций для управления настройками конфигурации из эксперта.

Эти функции экспортируются c++ DLL, и каждая из экспортируемых функций имеет конвекцию вызова __stdcall, запрошенную моим MQL4.

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

Естественно, функция не может:

- возвращать указатель на локальную переменную (переменная выходит из области видимости)

- возвращать указатель на глобальную переменную dll (проблемы с одновременным доступом)

- возвращать указатель на строку, выделенную из кучи (нужны функции для освобождения памяти, которые будут вызываться из советника: мне не нравится такой подход).

Поэтому я решил передавать строку и размер строки из советника. Es:

string buffer;

GetString( buffer, 30 );

[/CODE]

and from the c++ dll, something like this

void __stdcall GetString( LPTSTR buffer, int BufSize )

{

// Read a string from a some source

....

// -1 to take into account the terminating null character

StringCchCopy( buffer, BufSize-1, ReadStringFromASource );

}

[/CODE]

Here starts the weird behaviour of MQL managing strings returned from a DLL.

using the following code:

string buffer;

GetString( buffer, 30 );

the first time buffer contains the right string. A first question arises: buffer is not initialized but after calling GetString it contains the string returned. I have to suppose that MQL allocates space for a string variable when it's declared.

Next time GetString() is called the string returned seems to be truncated to the length-1 of the previous string length and not resetted as expected because of the 'string buffer;' statement.

Tried even:

[CODE]

string buffer = " "; // 'allocate' 30 blank characters

GetString( buffer, StringLen(buffer) );

but after the first time, when the execution returns to this code, the assignment of buffer does not work any more and buffer still contains the previous read string, and it seems it can only contains the number of characters of his content.

At first I have thought that the null character is not handled very well by MQL and modified the c++ code like this ...

[CODE]

CopyMemory( buffer, ReadStringFromASource, min(BufferSize,ReadStringFromASourceLength) );

и не добавлять завершающий нулевой символ.

Но при вызове из MQL не возвращается вообще никакой строки.

Есть ли у кого-нибудь ответ?

 
luxinterior:
Почему бы просто не использовать пример прямо из файла справки?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

Lux

Да, я пробовал это;

bool TradeHour=false;

if(Hour()>=12 || Hour()<17) TradeHour=true

но строка OR не работает, потому что если час будет равен 22, то это удовлетворяет первой части "if(Hour()>=12" и все равно торгует, когда захочет, и я добавил && TradeHour к операторам Buy/Sell. Второй пример, который я привел, должен помочь, но я не понимаю.

 
luxinterior:
Почему бы просто не использовать пример прямо из файла справки?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

[/code]

Lux

Я думаю, что если ваша цель - торговать между 12:00 и 17:00, то вам просто нужно сделать следующее:

[code]

bool TradingEnabled=false; // Глобальная переменная

...

...

TradingEnabled=false; // Сброс при каждом тиковом прогоне

if(Hour()>=12 && Hour()<17)

TradingEnabled=true;

...

...

if( TradingEnabled )

{

// Логика торговли здесь

}

...

...

 
gorgoroth:
Я думаю, что если ваша цель - торговать между 12:00 и 17:00, вам просто нужно сделать следующее:

bool TradingEnabled=false; // Global variable

...

...

TradingEnabled=false; // Reset every tic run

if(Hour()>=12 && Hour()<17)

TradingEnabled=true;

...

...

if( TradingEnabled )

{

// Trading logic here

}

...

...

Не делаю ли я то же самое, поступая следующим образом?

if (Hour() 17) TradeHour = false;

То есть, если час находится между 12 и 17, то TradeHour = true, правильно?

(Добавляя && TradeHour в мое заявление о покупке/продаже).

 
luxinterior:
Как Hour() может быть меньше 9 И больше 17? Вы имели в виду Or (||)? Lux

О, и я действительно имел в виду &&, потому что вы правы, час не может быть меньше 9 и больше 17, что делает утверждение ложным, но если час равен 10, то он не меньше 9 и не больше 17, поэтому утверждение становится истинным.

Возможно, такой способ вводит MT4 в заблуждение, но в любом случае этот способ работает;

int TradeHour;

TradeHour = ((Hour()>=StartHour) && (Hour()<EndHour));

Спасибо