Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 282

 

amavladi:


Дело не тейке,я хочу разобраться в механнике работы циклов,чтобы в последствии написать сложный советник. Оператор "return" меня выкидывает на новый  "start" , а  это не всегда нужно.

В любом случае спасибо за ответ .

Да не за что. Суть в том, что если Вы хотите разобраться в "механике" с помощью "третьих лиц", то для этого необходимо сформулировать проблему этим самым "лицам", т.е. расписать, чего Вы хотели бы получить от алгоритма, а не то, что Вы получили.

"Цикл зацикливается" - это не проблема, поскольку если в цикле нет ничего кроме оператора continue, то он обязан будет зациклиться, пока условие зацикливания не станет ложным.

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

 
amavladi:

HELP!

Если найдется добрая душа на форуме,подскажите мои ошибки . Начал осваивать MQL4 ,написал простеиший советник ,который открывает ордер ,а потом его закрывает по небольшому  takeprofit .Попытался проверить его на тестере стратегий и обнаружил ,что мои операторы циклов  for и while зацикливаются,если написаны так:

 

//--------------------------------------------------------------------

   while (Ask<=Level)

   { RefreshRates();

     continue;

   }         

Ну здесь все вроде просто.

Тестер стратегий генерирует тик, вызывает start() и ждет завершения этой функции чтобы сгенерировать следующий тик.

Поэтому, если хотите чтобы Ваш робот не зависал в тестере, уйдите от такой конструкции. В Вашем случае цена Ask меняться не будет, пока не будет выполнен выход из start().

А получив команду return функция start завершает работу, тем самым дает тестеру понять что нужно сгенерировать следующий тик.

Более того, не в тестере стратегий, а в реальном режиме, Ваш код будет работать как Вы и предполагаете, поскольку RefreshRates будет обновлять цену Ask.

Ваш код вполне рабочий, но для тестера стратегий - входит в бесконечный цикл.

Использование return тут поможет. Когда наберетесь побольше опыта вы сами уйдете от подобных конструкций. Удачи Вам.

 
Reshetov:


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

Код рабочий, просто всегда есть нюансы о которых новички не знают...
 
Reshetov:

Да не за что. Суть в том, что если Вы хотите разобраться в "механике" с помощью "третьих лиц", то для этого необходимо сформулировать проблему этим самым "лицам", т.е. расписать, чего Вы хотели бы получить от алгоритма, а не то, что Вы получили.

"Цикл зацикливается" - это не проблема, поскольку если в цикле нет ничего кроме оператора continue, то он обязан будет зациклиться, пока условие зацикливания не станет ложным.

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

Вот не люблю я когда на новичков выливают кучу грязи. Ну напишите просто по-человечески типа - вопрос плохо/неточно/не правильно сформулирован, или - ошибка тут или тут. Сами вспомните себя когда что-то начинали учится делать, тоже ведь не раз небось глупый вопрос задавали. А метафора о пьяном ёжике разве вносит хоть какой-то позитив в решение проблемы? Разве что приятно на фоне новичка почувствовать себя крутым в блеске собственного величия.
 
paladin800:
Вот не люблю я когда на новичков выливают кучу грязи.

Свинья везде грязь найдет © Народная поговорка

Где вы нашли грязь? Если нашли, то обратитесь к модератору.

paladin800:
А метафора о пьяном ёжике разве вносит хоть какой-то позитив в решение проблемы?

Обратитесь к администрации, чтобы добавили в правила запрет на метафоры и ёжиков.

 
Reshetov:

Свинья везде грязь найдет © Народная поговорка

Где вы нашли грязь? Если нашли, то обратитесь к модератору.

Обратитесь к администрации, чтобы добавили в правила запрет на метафоры и ёжиков.

А зачем модераторы и админы... тут дело в воспитанности, профессиональной этике, такте, толерантности, гуманности в конце концов... тут админы не помогут.

А если вы не до конца понимаете суть проблемы, то лучше ничего не советуйте... Иногда лучше жевать... Хотя выпендриться за счет других - ваше право... 

 
elugovoy:

тут дело в воспитанности, профессиональной этике, такте, толерантности, гуманности в конце концов...

Угу. Детский сад и институт благородных девиц в одном флаконе.

Дык может быть забьём с переходом на личности и продолжим отвечать на вопросы новичков? А то какая-то флудерастия от сторонников гуманитарных подходов в сугубо техническом топике получается.

 
         Хотел бы выразить благодарность Евгению Луговому (обладающему потрясающими телепатическими способностями).Вы на все сто % ответили на мой вопрос по проблемам работы циклов в тестере и в реале.В тот же вечер я пробежался по статье "Тестирование и оптимизация советников " по ссылке http://articles.mql4.com/ru/824  (это для таких ,как я новичков) и понял ,что тестер создает реальный  ход цены дискретно и выдает новые котировки только на следующей итерации всего советника,поэтому переписал код для тестирования ,используя  серии операторов IF ,там где раньше стояли  операторы циклов. Так же для  таких, как я, новичков советую детально ознакомится с "Общими функциями" языка MQL4 (ссылка http://docs.mql4.com/ru/common).С удивлением обнаружил ,что есть разница в работе одной и той же функции в  терминале на реале и терминале в тестере стратегий.Например Sleep() в тестере не вызывает никаких задержек,как должен, и работает только в реале.И последнее,для опрометчивых (вроде меня) любителей условно -бесконечных циклов  int start()                                   {   double Level=1300;                                 while (Ask<=Level)   continue;Последние две строки этого кода ,  при всей своей невинности, после запуска на терминале в реальном валютном окне,до тех пор пока цена не дойдет до 1300,будут оттягивать на себя гиганское количество процессорного времени (на моем 2х ядерном 25%).Мой друг посоветовал ,если нельзя отказаться от цикла,то нужно вставлять Sleep( int 100) ,то есть давать интервал от 100 до 200 миллисекунд для разгрузки процессора.int start()                                   {   double Level=1300;                                 while (Ask<=Level)  { Sleep( int 100)       continue;   }
P.S.     Для  "третих лиц"любителей выражений:пьяный ежик,дык забьем,флудерастия и т.п. (хотя мы и в сугубо техническом топике) позволю себе дать небольшую ссылку на  Федора Михайловича Достоевского,который в романе "Идиот" через князя Мышкина сообщает очень странную вещь:"Красота спасет мир!",над чем ,окружающие его "третьи лица" ,язвительно насмехаются.Благодарю вас еще  раз за то,что напомнили мне о нашем великом классике.      А ,вас Евгений, прошу передать привет Молдавии,хотя я давно уже живу в другой стране,но родился я в Кишиневе.
   
 
amavladi:
    

Да нет никаких телепатических-то ))) я думаю все на такие грабли наступали, кто хотел "поймать" цену, скажем для трала... в том числе и я лет 6 назад.

К слову, топик для новичков и он не "сугубо технический".

Привет передам.

Удачи. 

 
elugovoy:

Да нет никаких телепатических-то ))) я думаю все на такие грабли наступали, кто хотел "поймать" цену, скажем для трала... в том числе и я лет 6 назад.

К слову, топик для новичков и он не "сугубо технический".

Привет передам.

Удачи. 

   Насчет телепатии и "сугубо технический"-это я для господина Reshetov   : )))

   Удачи и вам. 

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