приключения новичка - страница 10

 
niko:
Your wish is my command (я собирался сказать 'high flyer', но потом проверил словарь в Интернете и, очевидно, это грубый комментарий, неважно)

Хорошо. Я только бегло просмотрел, так как сейчас вы ведете себя слишком беспорядочно, на мой вкус.

Вы не основывали свои изменения на последней версии моего кода.

Поэтому я понятия не имею, делала ли последняя версия моего кода то, что вам было нужно, до того, как вы начали добавлять новые вещи в предыдущую версию.

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

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


CB.

 
niko wrote >>

Тим,

Я довел код до того состояния, когда при компиляции не сообщается об ошибках (это было просто исправление нескольких ошибок, которые вы выделили), хотя в тестере стратегий он еще не делает никаких сделок. Но я озадачен кое-чем: ...

Привет, Ник,

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


Возможно, приведенный ниже пример комментированного кода немного прояснит ситуацию.


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

Код выглядит хорошо. Осталось еще несколько мелочей, которые я пометил в файле как TODO, но главная задача, которая стоит перед вами сейчас - это отладка и тестирование.


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


В MT4 вашим основным инструментом тестирования будет тестер стратегий и файлы журналов (на вкладке "Журнал"), а также инструменты "Результаты", "График" и "Отчет".


В случае с лог-файлом я часто нахожу, что проще открыть весь файл в Microsoft Notepad, чем пытаться просмотреть его часть через просмотрщик журнала. Не забывайте очищать файл журнала/журнал перед каждым запуском, иначе в итоге вы просмотрите много старой и, возможно, уже неактуальной информации. После каждого прогона в тестере стратегий вы просматриваете лог-файл на наличие как сообщений отладочных операторов, так и системных сообщений metatrader. Вы можете использовать документацию MetaTrader onine, чтобы посмотреть коды ошибок для получения дополнительной информации. Также используйте инструменты Результаты, Графики и Отчеты, чтобы увидеть, что делает программа в определенном наборе условий.


Совет - при первых тестовых прогонах делайте период тестирования коротким, чтобы минимизировать количество данных в лог-файле.


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


Эффективное управление лог-файлами и отладочными утверждениями - это, я считаю, ключ к хорошему и эффективному тестированию и отладке в среде MetaTrader. Я видел, как люди на этом форуме ворчали по поводу отсутствия средств отладки в MetaTrader. Миллионы строк коммерческого кода были успешно отлажены и протестированы с использованием средств, не более сложных, чем те, что вы найдете в MetaTrader. Эти средства могут быть базовыми, но они прекрасно работают, если вы знаете, как правильно их использовать.


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


Ник, этот путь еще предстоит пройти. Для меня тестирование, отладка и оптимизация - "заставить все это работать" - самая интересная часть работы и часто самая сложная. Я передам вам код, чтобы вы приступили к тестированию, и буду ждать от вас вопросов и/или проблем, с которыми вы столкнетесь.


С уважением,

Тим



Простой пример кода для демонстрации разницы между глобальной переменной и параметром функции

//+------------------------------------------------------------------+
//| Hello Trader.mq4 |
//| Copyright © 2009, Your Name |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Your Name"
#property link ""


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
stringMyGlobalVariable; // This global variable which holds a string i.e text value has been declared
// but as yet has no value in it. It is a 'container' which at this point in time holds
// only an empty or null string.

int init()

{

MyGlobalVariable = "Nick"; // Now we assign i.e put a value in the variable. Our 'container' which is named
// MyGlobalVariable now holds the string value of "Nick"

return(0);
}


//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}


//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

MyFunction(MyGlobalVariable); // This calls the function named MyFunction which is declared below
// This function requires one string parameter.

// In this case we have passed it our global variable as a parameter.

// MyFunction("Fred"); // We could also pass this function the literal string "Fred"

// MyFunction(12.739); // This would not work. The passed value must be a string because that is what we
// have declared the parameter as in the function declaration below.

// MyFunction(DoubleToStr(12.739,3)); // This would work because we have used an inbuilt MT4 function to convert the decimal
// number to a string i.e "12.739").
// We can also pass other functions as parameters as we have shown here, provided the
// function that we are using as a parameter returns the correct data type which in
// this case is a string.

return(0);
}


//+------------------------------------------------------------------+
//| A function with one parameter |
//+------------------------------------------------------------------+


void MyFunction(string MyFunctionParameter) // The function is declared with a parameter in the same way that a varible is declared
// but it is a function parameter not a variable. It can be used just like a variable
// but only inside the function. The big difference is that it can be passed a different value
// from outside the function whenever the function is called. This enables functions to
// be used as general purpose blocks or modules.
// Function parameters are also used in some circumstances to return values from the
// function to the outside world but that is another more complex story for another day!

{
Comment(MyFunctionParameter); // The value passed to 'MyFunctionParameter' will be displayed at the top, left hand
// corner of the screen

}

Файлы:
 
Эй, CB, это странно, поскольку я всегда сохраняю файл mq4 как новый, с последней датой, чтобы отделить другие файлы. Должно быть, путаница проскочила. Скобку я хотел включить, но подумал, что в какой-то момент вы попросили меня убрать ее (она была последней, но без последней start() был бы несбалансированным. поэтому я убрал и первую, но я верну ее обратно).
 
niko:
Привет, CB, это странно, так как я всегда сохраняю файл mq4 как новый, с последней датой, чтобы отделить другие файлы. путаница, должно быть, проскочила. скобку я хотел включить, но я думал, что в какой-то момент вы попросили меня удалить ее (она была последней, но без последней, start() был бы несбалансированным. поэтому я удалил и первую, но я поставлю ее обратно).

Давайте не будем начинать добавлять и удалять скобки по своей воле. Я уже указывал ранее, что у вас есть совершенно лишний набор, оба из которых можно убрать.

Вот последняя версия. Пожалуйста, сделайте следующее:

- Сначала скомпилируйте ее и исправьте все ошибки - так вы будете знать, что любые последующие ошибки вызваны изменениями, которые вы можете внести.

- Сообщите мне, были ли ошибки, которые вам пришлось исправлять.

- Попробуйте и посмотрите, делает ли он то, что вам нужно.

- Дайте мне знать, как все прошло - и дайте мне знать, какие изменения, по вашему мнению, вам нужно внести.


CB

Файлы:
 
Спасибо, CB. Я займусь этим, извините, если я вас немного расстроил.
 

Спасибо, Тим,

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

 
niko:
Спасибо, СиБи. Я займусь этим, извини, если я тебя немного расстроил.

Не беспокойтесь, приятель. Просто стараюсь делать шаг за шагом.


CB

 

Привет, CB,


Я исправил несколько ошибок в коде, в основном не хватало скобок, они выделены в коде. Больше никаких синтаксических ошибок.

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

Я попытался выяснить, где находится ошибка (я предполагаю, что в fnSHouldWeTrade или fnOrderDuplicate).

Последняя версия кода прилагается, я добавил значения в TopFilter и BotFilter, чтобы позволить стратегии совершать сделки.

ps: я понял, почему я вставил старый код для вас раньше, я переустановил mt4 в другую папку (без ошибок подключения) и код был старым дубликатом из старой папки.

 
niko:

Привет, CB,


Я исправил несколько ошибок в коде, в основном не хватало скобок, они выделены в коде. Больше никаких синтаксических ошибок.

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

Я попытался выяснить, где находится ошибка (я предполагаю, что в fnSHouldWeTrade или fnOrderDuplicate).

Последняя версия кода прилагается, я добавил значения в TopFilter и BotFilter, чтобы стратегия могла совершать сделки.

ps: я понял, почему я вставил старый код для вас раньше, я переустановил mt4 в другую папку (без ошибок подключения) и код был старым дубликатом из старой папки :)


Изменить:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Bid+TakeProfit*Point, "Nikos First EA",0,0,Red);

to:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Ask-TakeProfit*Point, "Nikos First EA",0,0,Red);


CB

 
Спасибо CB, я должен был это заметить, поэтому ошибка была в конце (130).
Причина обращения: