эм... я минус не увидел у maxprice. извиняйте за лекцию :-b :-b :-b :)) :)) :))
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Цитатаminprice = MarketInfo(Symbol(), MODE_BID);
maxprice = MarketInfo(Symbol(), MODE_BID);
ну или просто
minprice = Bid;
maxprice = Bid;
В /ugolok-programmista/13/obuchenie-yazyku-mql4-pod-metatrader-4/4034/?do=findComment&comment=249236 Kroft указал фрагмент с ошибкой, на которую я и указал.
Новый фрагмент кода без этой ошибки Sergey Forex выложил позже - когда на неё указали.
Sergey Forex и Kroft - кто из вас ведет дискуссию?
Обсуждается непонятно чей фрагмент кода...
Kroft, что это?
ЦитатаВот такая вот петрушка, мой бот берет только общую максимальную цену, а максимальную дня не пересчитывает, вроде все по уроку второму сделал. может кто разъяснит ситуацию по второму уроку - обновленному.
Настройки
extern int BarCount = 10;
extern int HourStart = 10;
extern int HourEnd = 23;
void GetMaxPrice()
{
for (int i = 0; i
{
mp = iLow (Symbol(), PERIOD_CURRENT, i);
if (mp > maxprice)
maxprice = mp;
}
return;
}
Вы в цикле обсчитываете 10 баров неизвестно какого ТФ - и не известно в какой момент времени (из фрагмента кода не видно).
Хай какого дня (вчера или текущего) вам надо вы тоже не сообщили.
Если выявление максимума дня (вчерашнего или текущего) выполняется в начале торгов в 10, то после замены mp = iHigh... текущий хай текущего дня вы найти вроде должны - если ТФ н1, конечно.
Если же выявление хая/лоя (текущего?) дня вы выполняете в ходе торгов неоднократно в разное время, то именно на этих жестко заданных вами 10 барах хай текущего и тем более вчерашнего дня быть не обязаны - искомые вами экстремумы дня могли быть раньше последних 10 баров, только которые вы проверяете.
Нет желания подумать и более тщательно сформулировать свой вопрос?
-----
Парни, без обид: но тут не продленка в школе - учителя на зарплате ваши тетрадки проверять не обязаны...
Всё, что здесь делается - бесплатно и в личное время. И по мере возможности - времени и сил.
Если появилась какая-то проблема в освоении языка, первым делом попробуйте сами её понять.
Если не получается понять самому - постарайтесь предельно точно описать свою проблему!
Конечно, никто не запрещает и даже приветствуется то, что вы выкладываете свои наработки - изучать чужой код очень хороший способ самообучения и взаимного обучения.
Но если есть что-то, что непонятно, то старайтесь как можно четче описать/показать что не понимаете или что не так работает.
Очень часто в процессе обдуманного описания проблемы наступает пониманием что сделано не так.
Да и другим будет легче вам помочь, если вы достаточно строго опишете что пытаетесь сделать и что именно не получается.
Изменено 1 декабря, 2015 пользователем Старик
Пара советов начинающим:
- Создавать методы, которые модифицируют какие-то глобальные переменные - это зло в большом кол-ве случаев. Eсли вам нужно получить максимальную цену за период, то данный метод не должен где-то изменять глобальные переменные. Суть совета в том что старайтесь не использовать глобальные переменные. (Привет фортран)
- При создание метод нужно опираться на то что метод должен делать одну какую-то операцию и эта операция должна максимально отражена в название.
- Если у вас метод возвращает, что то и у него логичное название это очень хорошо, если внутри этот метода еще где-то проставляется глобальная переменная или метод изменяет что-то во входных параметрах (например если вы передаете класс) - это зло.
- Если уж начали программировать, то придерживайтесь определенному стилю написания кода это сильно упростит жизнь в будущем. Начните хотя бы с именования (Snake case, Camel case). Тут есть не большое описание по оформлению кода.
Вообще рекомендации можно писать бесконечно.
а если у меня идёт связка индюк, читающий параметры одной совы и передающий эти параметры в глобальные переменные для другой совы, это тоже зло?)
в чем суть такой ненависти к изменению глобальных переменных?
а если у меня идёт связка индюк, читающий параметры одной совы и передающий эти параметры в глобальные переменные для другой совы, это тоже зло?)
в чем суть такой ненависти к изменению глобальных переменных?
Это общемировая практика, которая сильно упрощает работу. Делается отдельный метод по получению данных, которые пакуются в какую-нибудь структуру и метод который берет данные из этой структуры и задает их в глобальные переменные.
struct data = get_data();
set_data_to_expert(data);
а если у меня идёт связка индюк, читающий параметры одной совы и передающий эти параметры в глобальные переменные для другой совы, это тоже зло?)
в чем суть такой ненависти к изменению глобальных переменных?
Это общемировая практика, которая сильно упрощает работу. Делается отдельный метод по получению данных, которые пакуются в какую-нибудь структуру и метод который берет данные из этой структуры и задает их в глобальные переменные.
struct data = get_data();
set_data_to_expert(data);
ничего не понял. ты хочешь сказать чтобы в сове был только один метод(функция/процедура), работающий с глобальными переменными? в чем суть-то того что ты написал? зачем обязательно данные, которые ты тащишь из/в глобальные переменные запихивать в структуру?
у меня так и сделано, индюк пишет/удаляет/модифицирует , сова только читает. ну и как бы логично что нет двух потоков, одновременно удаляющие переменные(да я бы и рад создать грамотную очередь/стек, да только что-то не встретил понятия распределения доступа к ресурсам на mql4 вобще по сути). так же логично что перед тем как лезть в переменную идут проверки на то есть ли она вобще в текущий момент или нет.
еще вопрос - чем грозит использование структур(с смешанными типами полей, стринг в их числе тоже) как таковых?
Изменено 2 декабря, 2015 пользователем dermitay
То что 1 поточный мт4 не располагает к широкому п
Коллеги, а почему в некоторых исходниках не работает режим отладки, то есть кнопки не подсвечиваются? :-? Сам привык везде принты расставлять, если честно, даже сначала и не заметил, что появилась возможность пошаговой отладки в МТ4...
Коллеги, а почему в некоторых исходниках не работает режим отладки, то есть кнопки не подсвечиваются? :-? Сам привык везде принты расставлять, если честно, даже сначала и не заметил, что появилась возможность пошаговой отладки в МТ4...
я тоже это только недавно увидел, нарадоваться теперь не могу :)) <:-p :x>
а вобще вот почитай, там вобще пробегись по всем разделам, может что новое, полезное и удобное для себя найдёшь.
http://www.metatrader5.com/ru/metaeditor/help/development/debug
Изменено 3 декабря, 2015 пользователем dermitay
ОК, спасибо!! Сейчас кстати глянул одно из последних видео Сергея, там Play активна :-? :-? - я в синхроне набираю код - ничего подобного, будем разбираться... (как обычно лень победила, поэтому и задал вопрос - так не хотелось самому искать :d)
Всем привет. Подскажите как записать в код такую команду: если ордер закрылся по ТП - удалить все отложки. Или направьте где можно поискать.
Всем привет. Подскажите как записать в код такую команду: если ордер закрылся по ТП - удалить все отложки. Или направьте где можно поискать.
логика проста - сначала ищешь ордер в истории закрытых ордеров(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)), потом сравниваешь его OrderClosePrice и OrderTakeProfit(). если между ними разница невелика(ну я к примеру беру не более 10пп по пятизнаку), то вызываешь собственноручно написанную функцию удаления всех отложенных ордеров.
функция тоже проста, перебираешь все ткущие ордера(MODE_TRADES) и удаляешь(OrderDelete) все у которых OrderType()>1.
пример кода:
int ord=OrdersHistoryTotal();
for(int i=ord; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if(MathAbs(OrderClosePrice()-OrderTakeProfit()) {
Kill();
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Kill()
{
int ord=OrdersTotal();
for(int i=ord; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()>1)
{
int tick=OrderTicket();
if(OrderDelete(tick))
{
Print("yeee!! mutherfucker!!! i kill him!! ",tick);
}
}
}
}Изменено 4 декабря, 2015 пользователем dermitay
Добрый день! Помогите пожалуйста, ищу обычный индикатор Tma.mq4, который используется в 3-ем уроке по обучению программированию.
Сбросьте, пожалуйста, у кого есть.
Добрый день! Помогите пожалуйста, ищу обычный индикатор Tma.mq4, который используется в 3-ем уроке по обучению программированию.
Сбросьте, пожалуйста, у кого есть.
Индикатор во вложении. Взят из темы ТС Победа. Называется он по другому, но это он и есть.
Спасибо. Но этот индикатор при компилировании в Meta Editor выдает много ошибок и не ставится на график.
Изменено 6 декабря, 2015 пользователем htp87
Всем доброго здравия. У меня вот такой вопрос, может кто подскажет. Как в MT4 разрешить открытие ордеров только с одним мэджиком, а с другими запретить без возможности даже открытия?
Вопрос знатокам. уже мозги себе все переломал.
Суть проблемы: сова висит на активном графике, при перекомпиляции сова НЕ деинициализируется и не инициализируется(как должна с деинит резон 2). При вызове свойств совы и нажатии ок - тоже самое, ничего не происходит(а должен быть деинит ризон 5), в логах никаких ошибок нет, при вышеописанных двух действиях(перкомпил кода и смена входных данных) - появляется только строчка с инпутами, без деинит и инит.
нормальный деинит/инит идет только в том случае, если мы сменим таймфрейм(деинит ризон 3).
но и тут лог чист аки слеза младенца - никаких ошибок(никаких абнормалов и таймаутов).
весь код гоняется через EventSetMillisecondTimer - OnTimer.
OnTimer вызывается только в OnInit.
в коде нет ни одного цикла while, все for'ы перепроверил - везде всё ок.
в OnDeinit конечно же убиваю таймер:
void OnDeinit(const int reason)
{
//--- destroy timer
ArrayFree(BD_Signals);
ArrayFree(BD_Orders);
ArrayFree(BD_News);
EventKillTimer();
}
Такой проблемы не было, откатится назад к старому коду нереально так как очень много новых функций прилеплено и всё это с исходником тесно связано.
Кто сталкивался с таким глюком - подскажите, в чем может быть проблема?
Добавлено: 07-12-2015 08:38:19
толи глюки толи я чего-то не понимаю.
берем старый код - кидаем на график, после этого заходим в свойства - ничего не меняем нажимаем "ОК" - идет полный круг деинит-инит. итак можно делать хоть стопицот раз(не меняя параметры по-умолчанию) - будет всегда идти полный круг деинит-инит.
берем новый код - кидаем на график, после этого заходим в свойства - ничего не меняем нажимаем "ОК" - ничего не происходит, пишет строку только с инпутами. опять заходим в свойства - меняем какой-либо параметр, нажимаем "ОК" - и тут наконец-таки происходит полный круг деинит-инит.
всё равно не пойму, почему тогда в первом случае полный круг происходит всегда? код по сути свой особо ничем не отличается, добавена просто туева хуча математических функций и анализа объектов графика, не более, структура кода-то осталась та же(через таймер)
Изменено 7 декабря, 2015 пользователем dermitay
Старый и новый код откомпилирован в одной версии мэтаэдитра?
По нормальному деинт-инит по ОК без изменения значений входных параметров не нужен - это явный атавизм.
Может, в последнем эдиторе сделали наконец.
Старый и новый код откомпилирован в одной версии мэтаэдитра?
По нормальному деинт-инит по ОК без изменения значений входных параметров не нужен - это явный атавизм.
Может, в последнем эдиторе сделали наконец.
сова пишется мной - конечно же, все что я выше написал делал в одном и том же эдиторе. ну по поводу смены входных параметров - соглашусь, ок, аттавизм. но... перекомпил-то не меняет код совы на графике... почему?..
то есть, не особо критично конечно, но стало неудобно. то есть после перекомпиляции надо опять кидать сову на график, чтобы все изменения в коде стали актуальными, так как сова, которая крутится-вертится на графике - это сова со старым кодом(который по факту загружен в ОЗУ получается).
бред бредом блин...
с другой стороны, очень похоже на зацикливание. но тогда бы при смене таймфрейма/закидывании заново совы на график в логах бы выдалось что предыдущий экземпляр совы завершил работу некорректно - но это нет, ошибок нет и при этом всё равно то пишет то не пишет деинит ризон 1(для предыдущего экземпляра, просто пишет что ремувд иногда и всё, никаких деинитов), а должен...
Изменено 7 декабря, 2015 пользователем dermitay
Добрый день! В домашнем задании к 3-ему уроку не совсем понятно как интегрировать индикатор Stochastic в советник. Какие исходные значения нужно переносить? Какой буфер за какую линию отвечает? По идее, покупка происходит, если синяя линия пересекает снизу вверх красную при значении ниже 20, и соответственно при пересечении синей линии сверху вниз красной выше значения 80 - продажа. Помогите, пожалуйста, разобраться.
сова пишется мной - конечно же, все что я выше написал делал в одном и том же эдиторе. ну по поводу смены входных параметров - соглашусь, ок, аттавизм. но... перекомпил-то не меняет код совы на графике... почему?..
то есть, не особо критично конечно, но стало неудобно.
то есть после перекомпиляции надо опять кидать сову на график, чтобы все изменения в коде стали актуальными, так как сова, которая крутится-вертится на графике - это сова со старым кодом(который по факту загружен в ОЗУ получается).
бред бредом блин...
А чего перекомпил какого-то кода в какой-то папке должен самостоятельно менять коды/тела/настройки загруженных/активных сов на всех графиках?
Совершенно не вижу оснований для такого беспредела!...
На графика пользователь может держать несколько копий совы, в т.ч. одинаково называющиеся старые версии.
И что, перекомпиляция какой-то версии в папке должна приводить к замене всех одинаково названных сов на всех графиках?
Да метаквот за такие дела уже бы живьем закопали...
Чё-то вы путаете, коллега... :)
Ну и фича!
Реально татарская хитрость!
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем