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

 
niko:

За CB:


Эй, летчик! Я сделал все, что мог, с заданиями Тима и поэтому решил начать более детально изучать твой код.


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


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

См. аннотации.

Заметил следующее:

- вы объявляли функции, что ожидаете переменные, переданные им в качестве параметров, но на самом деле не передавали их при вызове функции - поэтому я попросил вас просто перенести переменные в верхний блок, чтобы они были доступны всем вашим функциям - давайте пока будем действовать так просто, как это возможно

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


Объявить:

int abcdef(int x, string s) //значит, функция с именем abcdef принимает на вход целое число и строку и возвращает на выходе целое число (в данном случае либо 0, либо 9)

{

функция делает что-то с x и s

if (некоторое условие)

return(9);

else

return(0);

}


И вызвать:

...

myResponse = abcdef(myInteger, myString);

if (myResponse == 9)

{

бла

 

Привет, CB,

Спасибо. Это та часть, которую я не мог понять, а ты мне все разъяснил. Думаю, теперь я на верном пути.

CB, вопрос1:

bool fnOrderDuplicate()

{

iDuplicateOrders=0 // CB разве iDuplicateOrders не должен быть объявлен как int или double?

iOrders = OrdersTotal()-1 // Теперь с вашей помощью я понимаю, что это вызывает функцию OrdersTotal. но опять же не следует ли объявить iOrders как переменную?

CB, вопрос2:

int fnTrade() //Почему это не "int fnTrade(string sSignal)", ведь в функции мы используем sSignal. ?

{ if(sSignal=="OP_BUY")

...

CB, вопрос 3:

Вы попросили меня убрать return(0) и } в конце кода. но это будет означать, что Start() не закрывается типичным "return(0) и скобки не закрываются, так как все предваряющие скобки (из того, что я проверил) предназначены для открытия и закрытия конкретных функций, которые мы разработали. ?

 
niko:

Привет, CB,

Спасибо. Это та часть, которую я не мог понять, а вы мне все разъяснили. Думаю, теперь я на правильном пути.

CB, вопрос1:

bool fnOrderDuplicate()

{

iDuplicateOrders=0 // CB разве iDuplicateOrders не должен быть объявлен как int или double?

iOrders = OrdersTotal()-1 // Теперь с вашей помощью я понимаю, что это вызывает функцию OrdersTotal. но опять же не следует ли объявить iOrders как переменную?

CB, вопрос2:

int fnTrade() //Почему это не "int fnTrade(string sSignal)", ведь в функции мы используем sSignal. ?

{ if(sSignal=="OP_BUY")

...

CB, вопрос 3:

Вы попросили меня убрать return(0) и } в конце кода. но это будет означать, что Start() не закрывается типичным "return(0) и скобки не закрываются, так как все предваряющие скобки (из того, что я проверил) предназначены для открытия и закрытия конкретных функций, которые мы разработали. ?

Q1: Обе эти переменные АРЕ определены. Посмотрите на переменные, которые я предложил вам перенести в раздел, где вы определили свои экстерны. Это автоматически сделает их доступными для всех функций.

Q2: Переменная sSignal, если она объявлена вне всех функций, доступна всем функциям без необходимости явно передавать ее в вызове функции.

Q3: А - теперь я понял ваше недопонимание. Интересно, зачем вы поместили туда оператор возврата и фигурную скобку. Об этом позаботился мой комментарий по поводу оператора fnTrade(). Вы заметите, что я попросил вас добавить туда оператор возврата и закрывающую скобку. Причина в том, что вы (ошибочно) объявляли все свои функции в кодовом блоке функции start().


CB

 
niko wrote >>

Привет, Тим,

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

Я приложил последнюю версию нашего кода.

Один вопрос, есть ли какая-то причина, почему мы не сделали функцию EntryRules, содержащую все (включая флаги), чтобы дать нам условие покупки/сокращения, но вместо этого мы обращаемся к ней с флагами позже, чтобы принять решение о входе?

Привет, Ник


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


После компиляции попробуйте запустить советник в тестере и посмотрите в лог-файле, делает ли он то, что вы ожидаете от него на данном этапе. Вы должны увидеть сигналы BUY и SELL для каждой из валютных пар.


На данном этапе я бы сказал, что ваш код завершен примерно на 75%.


Следующим шагом после этого будет написание еще одной функции для проверки открытых ордеров для данной валютной пары и направления торговли.


Я бы посоветовал заглянуть в документацию MT4 в раздел Торговые функции. OrdersTotal(), OrderSelect(), Order Symbol() & OrderType() выглядят вероятными кандидатами для этой задачи.


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

Я предлагаю вам сделать это после того, как вы скомпилируете, запустите и протестируете то, что вы уже сделали.


С уважением,

Тим

Файлы:
 

CB: Спасибо, это помогло мне прояснить ситуацию. По какой-то причине я думал, что все должно быть внутри функции запуска.

Вопрос: Разве мы не должны объявлять ema в функции start, поскольку мы хотим, чтобы они рассчитывались/обновлялись с каждым тиком?

 

Привет, Тим: Еще раз спасибо за помощь. Я приступлю к работе со своей стороны, как только уйду с работы сегодня вечером. Работая с вами и CB, я теперь имею больше идей о том, как собрать все вместе, и начинаю думать более гибко обо всем этом.

 
niko:

CB: Спасибо, это помогло мне прояснить ситуацию. По какой-то причине я думал, что все должно быть внутри функции запуска.

Вопрос: Разве мы не должны объявлять ema's в функции start, поскольку мы хотим, чтобы они рассчитывались/обновлялись с каждым тиком?

Нет. Если вы объявляете переменную внутри функции, она доступна только в этой функции. Если вы объявите ее вне всех функций, она будет доступна всем функциям. Поэтому вы можете объявить переменные ema в верхней части и затем выполнять математические операции с ними в функции start.


CB

 
cloudbreaker wrote >>

Нет. Если вы объявляете переменную внутри функции, она доступна только в этой функции. Если вы объявляете ее вне всех функций, она доступна всем функциям. Поэтому вы можете объявить переменные ema в верхней части и затем выполнять математические операции с ними в функции start.

CB

Спасибо, CB, теперь я понял!

 

Привет, Тим,


Я вернулся из Турции. У меня было потрясающее время в Кушадасах, и мне очень не хотелось уезжать. Турецкие люди намного дружелюбнее британцев. Я чувствовал себя там как дома, хотя никогда не был там раньше.


Последние 5 часов или около того я потратил на обновление кода, который мы разрабатываем. Я прилагаю его.

Ключевыми поправками были:

1. Я создал функцию подсчета заказов и вызвал ее в функции start. Я ожидаю, что это будет полно ошибок, так как есть части, которые я все еще не понимаю (например: как убедиться, что она следует за циклом [c], чтобы она работала только для одной валютной пары).

2. Я попытался исправить код в отношении названия currencySymbol против currencySym, так как мы изменили название на полпути. Но это могло привести к путанице.

3. Я вызвал функцию EntryRules внутри функции start.


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


Как всегда с нетерпением жду ваших поправок!

Файлы:
 

Привет, CB,


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


Еще одна вещь - я заметил, что функция start не закрыта. Поэтому я добавил "}" после первой функции в начале (), если этого не сделать, код выдает ошибку с последующей строкой функции fnGenerateSignal() (мол, определение функции для этого неожиданно).


Спасибо, как всегда. С нетерпением жду ваших комментариев/поправок!

Ник

Файлы: