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

 

Здравствуйте,

У меня ничего не получалось с функциями, я проверял их бесчисленное количество раз безрезультатно, поэтому я решил написать много сообщений Print() на каждом этапе моего кода, чтобы посмотреть, как далеко он зайдет, прежде чем отрубиться. На самом деле он не доходит до функции GetLots и терпит неудачу при проверке моих критериев покупки и продажи. Странно, что я не изменил эту часть кода, но что-то здесь не так - но, по крайней мере, я теперь знаю, на чем сосредоточиться!

 

Привет всем,

Я протестировал свой код ранее сегодня, и он работал относительно хорошо. Не изменяя код или критерии бэктеста (например, даты и т.д.), я провел бэктест через час, и результаты полностью изменились, т.е. никаких результатов. Поэтому мне просто интересно, почему это произошло? Например, подключение MT4?

 

...

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

crsnape@btinternet.com:
Привет всем, сегодня я протестировал свой код, и он сработал относительно хорошо. Не изменяя код или критерии бэктеста (например, даты и т.д.), я сделал бэктест через час, и результаты полностью изменились, т.е. никаких результатов. Поэтому мне просто интересно, почему это произошло? Например, подключение MT4?
 

Я не получаю никаких ошибок в своем журнале. Первая запись следующая:

2012.07.22 15:35:37 H4 Period EA EURUSD,H4: загружен успешно

Затем следует огромный список этих записей:

2012.07.22 15:47:07 TestGenerator: ошибка несопоставленных данных (превышен лимит объема 56304 на 2012.07.19 12:00)

и наконец:

2012.07.22 15:47:07 H4 Period EA inputs: MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10;

Но после этого ничего не происходит.

Мой тест проводился с 04.01.2012 по 21.07.2012.

 

...

Тогда у вас проблема с условиями входа (ваш советник никогда не пытался открыть ордер)

crsnape@btinternet.com:
Я не получаю никаких ошибок в своем журнале. Первая запись следующая:

2012.07.22 15:35:37 H4 Period EA EURUSD,H4: загружен успешно

Далее следует огромный список:

2012.07.22 15:47:07 TestGenerator: ошибка несопоставленных данных (превышен лимит объема 56304 на 2012.07.19 12:00)

и наконец:

2012.07.22 15:47:07 H4 Period EA inputs: MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10;

Но после этого ничего не происходит.

Мой тест был сделан с 04.01.2012 по 21.07.2012.
 

Да, это странно, потому что раньше он вводил позиции. У меня в коде от начала до конца написано несколько print() и ничего не записывается в журнал, даже самые начала моего кода. Даже вот это, чтобы проверить, была ли открыта предыдущая позиция на текущем баре:

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Проверка возможности длинной позиции (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST");

if (... условия входа...

 

...

Если бы ваш советник попытался на каком-либо этапе открыть ордер, это было бы записано в журнале (ошибка или нет, не имеет значения - в случае, если бы была ошибка, ошибка была бы там, если бы он открыл ордер, это было бы записано там).

Но поскольку там ничего не написано, это означает, что ваш советник так и не дошел до стадии попытки открыть ордер, а это может произойти только в том случае, если ваш набор условий, которые должны быть выполнены в советнике, так и не дошел до стадии открытия ордера. Поэтому вы должны уточнить свои условия. Начните с самого простого условия, которое, как вы знаете, будет выполнено, а затем добавляйте условия. Таким образом, вы сможете определить шаг, который мешает вам открывать ордера

crsnape@btinternet.com:
Да, это странно, потому что до этого он входил в позиции. У меня в коде от начала до конца написано несколько print() и ничего не записывается в журнал, чтобы записать даже самое начало моего кода. Даже вот это, чтобы проверить, была ли открыта предыдущая позиция на текущем баре:

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Проверка возможности длинной позиции (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST");

если (... условия входа...
 

Я поместил еще несколько Print()после команд if и думаю, что в этот момент произошел сбой, особенно красная линия, так как мой журнал прекращает печать после этой точки.

//--- ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ

string HasOrderedGV = "has_ordered_GV";

string barsGV = "bars_GV";

//--- Определяем, был ли уже размещен ордер на временном блоке H4

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("Определить, был ли уже выставлен ордер на текущий бар ", HasOrderedGV);

//--- Проверка возможности длинной позиции (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Я нашел этот код в Интернете и использовал его в своей программе. Но теперь просто интересно, будет ли он работать. Глобальная переменная barsGV объявлена как строка, однако в первой строке она ссылается на 0. Правильно ли это?

 

...

Этот код работает нормально при первом запуске.

0 проверяется по следующей причине :

double GlobalVariableGet([/TD] [TD]string name)

"Возвращает значение существующей глобальной переменной или 0, если произошла ошибка".

Ошибка при получении значения глобальной переменной будет в том случае, если глобальная переменная еще не создана. Но, как я уже сказал, при первом запуске этот код работает нормально. Проблема заключается в следующем: представьте, что вы запускаете тест, и в конце теста значение barsGV устанавливается на 5000. Теперь вы запускаете советника снова, и бары всегда будут меньше, чем значение barsGV (которое по-прежнему равно 5000). Его (код) нужно написать по-другому. Используйте что-то вроде этого

GlobalVariableSet(barsGV,0);

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

________________________________________________

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

crsnape@btinternet.com:
Я поместил еще несколько Print()после команд if и думаю, что на этом этапе произошел сбой, особенно на красной линии, так как мой журнал прекращает печать после этой точки.

//--- ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ

string HasOrderedGV = "has_ordered_GV";

string barsGV = "bars_GV";

//--- Определяем, был ли уже размещен ордер на временном блоке H4

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("Определить, был ли уже выставлен ордер на текущий бар ", HasOrderedGV);

//--- Проверка возможности длинной позиции (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Я нашел этот код в Интернете и использовал его в своем. Но теперь мне просто интересно, будет ли он работать. Глобальная переменная barsGV объявлена как строка, однако в первой строке она ссылается на 0. Правильно ли это?
 

Ааа... Понятно. Потому что глобальные переменные сохраняют свои значения в памяти. Поэтому, как вы говорите, когда он заканчивает бэктест и его значение составляет 5000, это сохраняется в памяти, даже если бэктест запускается повторно, поэтому он никогда не вернет false, потому что BarsGV не ниже 5000? Боже, как это глубоко.

И еще, если он выдает ошибку, он устанавливает HasOrderedGV в false, чтобы можно было продолжить работу с остальным кодом?

Правильно ли я вас понял?

BTW - это разрешено?

GlobalVariableSet(HasOrderedGV, false);

Потому что в книге MQL4 написано:

datetime GlobalVariableSet([/TD] [TD]string name, double value)

Второе значение в моем экземпляре - bool, а не double?

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