Стать хорошим программистом (Часть 4): повышаем скорость программирования
Введение
Каждый программист мечтает максимально быстро писать код. Никто не хочет тратить неделю на написание небольшой программы или куска кода, уж точно никто не любит тратить часы или даже дни на решение проблемы, которая тормозит весь процесс разработки.
Все программисты хотят стать быстрее
- Вы не встречали видео на YouTube, в котором кто-то пишет MQL5-код? Бывает так, что за таким видео практически невозможно успеть, потому что ты разрабатываешь намного медленнее. Хочется хоть немного приблизиться к такой скорости.
- У некоторых программистов скорость написания кода просто запредельная. Они тратят всего несколько минут на сложный алгоритм, тогда как у вас на это могли бы уйти часы или даже дни.
- Иногда желание научиться работать быстрее и эффективнее связано с работой во Фрилансе — хочется опередить конкурентов, а для этого неплохо было выполнять заказы быстрее.
- А иногда просто хочется впечатлить супруга/супругу или партнера своими суперспособностями, умением быстро и эффективно писать код, допуская меньше ошибок при разработке сложных алгоритмов и при этом затрачивая меньше времени.
- Кроме того, скорость может быть особенно важна, когда нужно быстро выпустить обновление, например продукта на Маркете, с исправлением критических ошибок.
Устраивайтесь поудобнее, берите ручку и блокнот — ваш ожидает поток ценнейшей информации, которая подскажет, как увеличить скорость написания кода и сохранить при этом высокое качество работы.
Что вам НЕ понадобится:
- Большой опыт в разработке
- Новейшая механическая клавиатура
- Уверенные навыки слепой печати
- Большая память, много ядер или мощный графический процессор компьютера
Быстрый программист Vs Быстрый кодер
Для начала я бы хотел объяснить разницу между двумя разными понятиями, которые я использую в статье: программист и кодер.
Программист | Кодер |
---|---|
У программистов больше опыта в написании кода. Они несут ответственность практически за все в проекте, например: дизайн, планирование работы, написание кода и все остальное, что связано с проектом. | Любого, кто может написать хоть какой-то код, можно назвать кодером. Обычно считается, что у кодеров меньше опыта и меньше навыков в сравнении с программистами (разработчиками). У них нет обширных алгоритмических знаний, зачастую это те, кто начинают свой путь в области разработки с какого-то одного определенного языка программирования. Часто кодерам поручают писать отдельные фрагменты кода, которые затем можно легко передать разработчику для использования в проекте. Кодеру не нужно знать в деталях, что происходит внутри проекта. Например, заказчик во Фрилансе может нанять кодера для написания функции трейлинг-стопа в советнике. Тогда он просто идет и пишет код, добавляет вызов внутри функции Ontick, пару раз тестирует полученное в MetaTrader 5, чтобы убедиться, что все работает, перед тем как отправлять заказчику |
В этой же статье мы будем говорить о «разработчиках» в более широком смысле — как же ускориться при разработке систем. Поэтому мы коснемся разных частей проекта, включая дизайн, рабочую этику, используемые инструменты, процесс написания кода, отладку и т.д.
Как программировать быстрее
1. Избегайте ошибок и плохой архитектуры
Разработчикам кажется, что они тратят много времени на написание кода. Но на самом деле мы тратим большую часть времени на вычитку кода, отладку и обдумывания решений.
Иногда часа три уходит на отладку кода, который был написан за 30 минут. И чем больше в коде ошибок, тем больше времени займет весь процесс до получения готового проекта. То есть весь процесс замедляется из-за ошибок. Поэтому лучшее решение — это не допускать ошибки.
Плохая архитектура + ошибки = можно забыть о быстром результате
Плохо, если в вашем проекте содержатся ошибки, но еще хуже, если вы не сможете их обнаружить или провести отладку из-за плохой архитектуры. Для примера приведу здесь небольшой фрагмент кода из советника, который мне как-то дали для исправления.
ouble NPB=ND(m_account.Balance()*PortionPC,2); if(CbT==0||PortChange<0||(PortChange>0&&NPB>PortionBalance))PortionBalance=NPB; if(Pb+Ph<0)DrawDownPC=-(Pb+Ph)/PortionBalance; if(!FirstRun&&DrawDownPC>=MaxDDPercent/100) { ET(A,displayColorLoss,"Equity Stop Loss Reached"); if(PlaySounds)PlaySound(AlertSound); return(0); } if(-(Pb+Ph)>MaxDD)MaxDD=-(Pb+Ph); MaxDDPer=MathMax(MaxDDPer,DrawDownPC*100); if(SaveStats)Stats(false,TimeCurrent()<NextStats,PortionBalance,Pb+Ph); //+-----------------------------------------------------------------+ //| | //+-----------------------------------------------------------------+ double StepAB=InitialAB*(1+StopTradePercent),StepSTB=m_accout.Balance()*(1-StopTradePercent), NextISTB=StepAB*(1-StopTradePercent); if(StepSTB>NextISTB){ InitialAB=StepAB; StopTradeBalance=StepSTB; } double InitPortion=StopTradeBalance*PortionPC; if(PortionBalance<InitPortion) { if(CbT==0) { AllowTrading=false; if(PlaySounds)PlaySound(AlertSound); Print("Portion Balance dropped below stop trade percent"); MessageBox("Reset EA, account balance dropped below stop trade percent on "+Symbol()+Period()," Warning",48); return(0); } else if(!ShutDown&&!RecoupClosedLoss) { ShutDown=true; if(PlaySounds)PlaySound(AlertSound); Print("Portion Balance dropped below stop trade percent"); return(0); } }
Очень яркий пример плохой архитектуры. Поэтому неудивительно, что в коде куча багов. Как видите, код настолько запутан, что его сложно понять с первого взгляда. Возможно, даже сам автор не до конца смог понять, что же он написал.
А еще может не повезти (как мне), и вы возьмете во Фрилансе заказ на исправление ошибок в программе, где все 10 000 строк похожи на этот пример (я уже потратил на работу более трех недель и до сих пор не закончил ее).
Вот что я думаю. Важно быть последовательным при написании кода, придерживаться определенных правил при именовании функций, создании переменных и т.д. Выберите те, что вам ближе и понятнее и придерживайтесь этих правил.
2. Освойте быструю отладку
По первому пункту уже ясно, что ошибки замедляют весь процесс и крадут наше время. Работа с ошибками и отладка — очень обширная тема, ее не уместить в одну статью. Я всем рекомендую прочитать статью «Отладка программ на MQL5».
И в области отладки есть способы сэкономить время с некоторыми приемами быстрой отладки.
1. В редакторе MetaEditor используйте стилизатор кода .
Стиль напрямую не относится к отладке, но он является важным шагом на пути к ней. Этот замечательный инструмент причешет внешний вид вашего кода, сделает его более понятным и удобным для чтения.
2. Используйте Print и Comment.
Чтобы быстрее разобраться и понять, что же не работает, добавляйте комментарии и вывод в журнал во всех подозрительных моментах.
Это может помочь отловить ошибку там, где вы ее не ожидаете.
3. Не начинайте вносить изменения прежде, чем вы на 100% поймете, как все работает.
Наверняка у многих случалось такое: вы удаляете кусок кода, чтобы система заработала правильно, а потом оказывается, что проблема была не в этом коде. Тогда приходится тратить время на восстановление, и при этом нет гарантии, что вы все сделаете правильно и не добавите еще больше ошибок.
Прежде чем что-то удалять, внимательно почитайте документацию (если это стандартная функция или встроенный метод). Если все еще не уверены, спросите на форуме. Иногда, когда я сомневаюсь в каких-то местах, я копирую весь код в текстовый файл. Так я не боюсь удалять, изменять и пробовать новые решения, чтобы потом применить работающие моменты в исходном коде, который не работал из-за ошибок.
3. Библиотеки придумали не просто так
При работе с библиотеками очень важно использовать классы по их прямому назначению. Попытки пропустить важные шаги из-за лени или по другим причинам неизбежно приведут к катастрофе.
Если вы используете Стандартную библиотеку, рекомендуется придерживаться стандартных процедур при создании экземпляров класса библиотеки или при обращении к ним, именно так, как задумали разработчики библиотек.
Например, вместо ленивого обращения к библиотеке торговых классов и использования непонятных и непоследовательных имен как, например, в этом фрагменте кода:
#include <Trade\AccountInfo.mqh> // класс для работы со свойствами торгового счета #include <Trade\SymbolInfo.mqh> // класс для работы со свойствами торгового инструмента #include <Trade\OrderInfo.mqh> // класс для работы со свойствами отложенных ордеров #include <Trade\OrderHistoryInfo.mqh> // класс для работы со свойствами ордеров из истории #include <Trade\PositionInfo.mqh> // класс для работы со свойствами открытых позиций #include <Trade\DealInfo.mqh> // класс для работы со свойствами сделок из истории #include <Trade\Trade.mqh> // класс для совершения торговых операций #include <Trade\TerminalInfo.mqh> // класс для получения свойств окружения в терминале //--- CAccountInfo ac; CSymbolInfo symb; COrderInfo orders; CHistoryOrderInfo hist_orders; CPositionInfo pos; CDealInfo _clos; CTrade my_trade; CTerminalInfo info;
стоит использовать последовательные и понятные всем обращения к библиотекам. Лучший способ — это работать с членами класса, где m_*** обозначает членов определенного класса.
Вот так:
#include <Trade\AccountInfo.mqh> // класс для работы со свойствами торгового счета #include <Trade\SymbolInfo.mqh> // класс для работы со свойствами торгового инструмента #include <Trade\OrderInfo.mqh> // класс для работы со свойствами отложенных ордеров #include <Trade\OrderHistoryInfo.mqh> // класс для работы со свойствами ордеров из истории #include <Trade\PositionInfo.mqh> // класс для работы со свойствами открытых позиций #include <Trade\DealInfo.mqh> // класс для работы со свойствами сделок из истории #include <Trade\Trade.mqh> // класс для совершения торговых операций #include <Trade\TerminalInfo.mqh> // класс для получения свойств окружения в терминале //--- CAccountInfo m_account; //члены класса AccountInfo CSymbolInfo m_symbol; //члены класса SymbolInfo COrderInfo m_order; //члены OrderInfo CHistoryOrderInfo m_orderhistory; //члены класса OrderHistoryInfo CPositionInfo m_position; //члены класса PositionInfo CDealInfo m_deal; //члены класса Deal Info CTrade m_trade; //члены класса TradeInfo CTerminalInfo m_terminal; //члены класса TerminalInfo
И не забывайте добавлять в комментарии в конце ссылки на библиотеку, чтобы в следующий раз при работе с кодом было четко понятно, какие данные тут нужно получить.
Кроме того, решение задач с использованием готовых стандартных библиотек вместо написания собственного кода всякий раз с нуля само по себе увеличивает скорость написания кода. Эти библиотеки создавались профессиональными программистами для оптимальной работы с языком MQL5. Они позволяют соблюдать принцип DRY (don't repeat yourself, не повторяйся) и ускорить процесс разработки. Я советую всем использовать стандартные библиотеки, а также множество дополнительных библиотек, опубликованных в Code Base или доступных на маркете.
Посмотрите на два примера кода и определите, кто же из разработчиков работает быстрее:
Все с нуля (похоже на стиль начинающего программиста) | Код с использованием стандартной библиотеки |
---|---|
double SymbolAsk(string symbol) { if (symbol == "") symbol = Symbol(); return SymbolInfoDouble(symbol, SYMBOL_ASK); } double SymbolBid(string symbol) { if (symbol == "") symbol = Symbol(); return SymbolInfoDouble(symbol, SYMBOL_BID); } int SymbolDigits(string symbol) { if (symbol == "") symbol = Symbol(); return (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS); } double SymbolLotSize(string symbol) { if (symbol == "") symbol = Symbol(); return SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE); } double SymbolLotStep(string symbol) { if (symbol == "") symbol = Symbol(); return SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP); } double SymbolMaxLot(string symbol) { if (symbol == "") symbol = Symbol(); return SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX); } double SymbolMinLot(string symbol) { if (symbol == "") symbol = Symbol(); return SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN); } | #include <Trade\SymbolInfo.mqh> CSymbolInfo m_symbol; input string Input_symbol = "EURUSD"; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- string symbol = Input_symbol=="" ? Symbol() : Input_symbol; m_symbol.Name(symbol); //Устанавливает имя символа для нашего объекта класса CSymbolInfo //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- m_symbol.RefreshRates(); //Обновляем, чтобы получить последнюю котировку double SymbolAsk = m_symbol.Ask(); double SymbolBid = m_symbol.Bid(); double SymbolDigits = m_symbol.Digits(); double SymbolLotSize = m_symbol.ContractSize(); double SymbolLotStep = m_symbol.LotsStep(); double SymbolMaxLot = m_symbol.LotsMax(); double SymbolMinLot = m_symbol.LotsMin(); } |
Те, кто используют стандартную библиотеку, могут быть в три раза продуктивнее. Кроме того, сокращение кода позволяет сократить вероятность ошибок в нем.
4. Стремитесь к порядку в коде
За свою карьеру программиста вы, наверное, тоже встречали в советниках подобный код:
if(LbT>0) { BEb=ND(BEb/LbT,Digits()); if(BCa<0)BEb-=ND(BCa/PipVal2/(LbB-LbS),Digits()); if(Pb>PbMax||PbMax==0)PbMax=Pb; if(Pb<PbMin||PbMin==0)PbMin=Pb; if(!TradesOpen) { FileHandle=FileOpen(FileName,FILE_BIN|FILE_WRITE); if(FileHandle>-1) { FileWriteInteger(FileHandle,TbF); FileClose(FileHandle); TradesOpen=true; if(Debug)Print(FileName+" File Written: "+TbF); } } }
Такой кусок кода несложно написать. Но с ним будет сложно работать далее, например, проводить отладку — велики шансы, что вы не вспомните значения некоторых переменных и придется все писать заново. Возможно, вы сэкономите время при написании, но потратите гораздо больше потом.
Вас возненавидят за сложнейшие алгоритмы, из-за которых вы и сами будете путаться.
Просто отвратительно пихать всю логику в одно место и засовывать кучу операторов в одну единственную функцию — вы потратите так много времени на тщательное упорядочивание кода, при этом придется следить за тем, чтобы все это работало.
Если нужны определенные операторы, возможно, стоит создать отдельные функции — они упорядочат ваши действия, вы будете завершать одну вещь, прежде чем переходить к другой.
5. Устраните отвлекающие факторы
Отключите звук телефона (или вообще выключите сам телефон). Научитесь контролировать себя — не надо каждый раз брать телефон и проверять лайки или новые посты в соцсетях. Если часто отвлекаться на соцсети, ни о какой эффективности и речи быть не может. Если у вас дома шум и гам, постарайтесь найти место, где сможете спокойно закончить свой проект.
Если проект действительно важный, вы можете убрать все, что отвлекает: закрыть двери, выключить телефон, закрыть социальные сети, сконцентрироваться и доделать.
Нам, как разработчикам, приходится так сложно в этом современном мире, где столько всего интересного всего в паре кликов от нас, в телефонах под рукой. Все эти видео с котиками и фото в инстаграме так отвлекают.
И именно когда проект доходит до какой-то сложной задачи, когда решение или код не приходит на ум, так заманчиво сделать паузу и посмотреть, что происходит в мире, или плюнуть на все и пойти тусить.
Конечно, надо делать перерывы и общаться с друзьями. Я и сам не сижу за компьютером 24 часа в сутки, даже когда появляется очень много проектов на MQL5. Но я все же верю, что должен быть подходящий график работы и его надо придерживаться. Если по графику еще не время проверять соцсети, не открывайте их. Если по графику вы сейчас должны писать код, пишите код, решайте задачи, с которыми сталкиваетесь, не бросайте, даже если сталкиваетесь с чем-то сложным. Если честно, я сам не всегда придерживаюсь графика в том смысле, что могу посидеть над проектом дольше, если нет других срочных дел.
Поверьте, со всеми этими отвлекающими моментами вы можете потратить пять часов на код, которые могли бы написать за 45 минут.
6. Читайте документацию и учитесь
Нашли решение своей проблемы на форуме? Не торопитесь копировать его в свой проект, хотя иногда так и хочется сэкономить время и быстрее все закончить (о копировании кода я упоминал в первой статье). Гораздо важнее понять, как же предложенное решение работает. Потом может быть тяжело работать с таким скопированным кодом, если вдруг что-то пойдет не так. Особенно если сам кусок кода будет содержать ошибку, а вы не поймете.
Рекомендую всем почаще обращаться к документации, особенно по тем темам, в которых вы чувствуете себя неуверенно или которые не изучили в достаточной степени.
Как это поможет программировать быстрее?
Чем больше знаете о языке MQL5, тем более уверенным становитесь, тем быстрее принимаете решения и тем быстрее пишете правильный код. Всегда сложно найти тот самый код, наиболее подходящий для воплощения вашей идеи. Именно на поиски и размышления уходит так много времени. И даже написать простейший код может быть сложно, когда вы еще недостаточно хорошо разбираетесь в конкретной области, например в программировании индикаторов, советников или скриптов. Нужные же навыки и умения приходят только с опытом.
А где взять этот самый опыт? Ответ прост: учитесь, применяйте знания на практике и экспериментируйте
У тех, кто хорошо разбирается в языке MQL5, практически бесконечные возможности, и они легко могут превратить свою идею в эффективный и содержательный код. Например, они четко знают, когда нужно использовать
- Массивы
- Циклы For/While
- Файлы для хранения/чтения данных
- Запрос и чтение данных с веб-сервера
- и кучу других полезных вещей — все их не уместишь в одной статье.
7. Интервальные повторения
Возвращаясь к предмету через определенные интервалы, повторяя время от времени, мы запоминаем материал намного лучше. Память нашего мозга ограниченна и хранит только то, что мы регулярно используем. Поэтому если нужно что-то сохранить в памяти, надо регулярно это повторять. Поэтому нужно постоянно оттачивать навыки, закреплять их.
Как?
Поскольку одна из причин, по которой затягивается написание кода — пробелы в знаниях в определенных областях, надо находить такие области (о некоторых из них говорится в данной статье). А потом над ними надо работать, упорно и регулярно, до тех пор, пока не будем чувствовать себя настолько уверенно, что они больше не будут тормозить процесс разработки. Используя эффективные техники обучения, можно освоить даже самые сложные навыки, например машинное обучение или самоадаптирующиеся алгоритмы.
8. Горячие клавиши и возможности редактора MetaEditor
Запомнить сочетания клавиш несложно, зато какой эффект они дают — вы сэкономите кучу времени при написании кода. Я могу назвать себя профессионалом в вопросе использования горячих клавиш. Поэтому с удовольствием поделюсь некоторыми эффективными и особенно полезными сочетаниями для работы в редакторе MetaEditor.
Начните использовать горячие клавиши, и ваша жизнь изменится. Идеальный вариант — выполнять вообще все действия с клавиатуры и не использовать мышь. Думаю, каждый программист в самом начале своего пути должен максимально полно освоить работу на клавиатуре, ведь это наш рабочий инструмент.
Приведу здесь свои любимые сочетания клавиш для работы на Window PC. Думаю, пользователи Mac могут заменить CTRL на COMMAND;
Клавиши | Действие |
---|---|
F4 | Переключение между MetaTrader 5 и MetaEditor |
F7 | Компиляция кода |
CTRL+F7 | Компиляция всех открытых документов |
CTRL+C | Скопировать выделенный код |
CTRL+V | Вставить выделенный код |
CTRL+X | Вырезать выделенный код |
CTRL+Z | Отменить изменения в коде |
CTRL+Y | Вернуть изменения в коде |
CTRL+A | Выбрать весь код |
CTRL+END | Переместить курсор на последнюю строку кода в документе |
CTRL+HOME | Переместить курсор на первую строку кода в документе |
SHIFT + стрелки (влево, вверх, вправо, вниз) | Выделить код в нужном направлении |
TAB | Увеличить отступ в выделенном коде |
SHIFT+TAB | Уменьшить отступ в выделенном коде |
CTRL+ Backspace | Удалить все слово в строке |
HOME | Переместить курсор на начало строки |
END | Переместить курсор на конец строки |
CTRL+ ? | //--- Вставить разделить кода в следующую строку |
CTRL+> | //+------------------------------------------------------------------+ //| Добавить такой блок в текущую и две следующие строки | //+------------------------------------------------------------------+ |
CTRL+" | // Вставить два слэша в начало строки |
CTRL+, | Применить стилизатор к текущему документу |
CTRL+F4 | Закрыть текущий документ |
CRL +F5 | Начать/возобновить отладку по историческим данным |
CTRL+T | Открыть/закрыть набор инструментов |
CTRL+D | Открыть/закрыть навигатор |
ALT+G | Перейти к объявлению переменной/функции |
WINDOWS+T | Для навигации по приложениям на панели задач, например, если я хочу открыть браузер (Chrome) и поискать информацию |
CTRL+F | Открыть окно поиска |
CTRL+S | Сохранить текущий документ |
CTRL + стрелки направления | Перемещаться в направлении по пробелам (через слово) |
CTRL+ + | Перейти вперед |
CTRL+ - | Перейти назад |
CTRL+SHIFT+U | Перевести выделенный код (слово) в верхний регистр |
CTRL+U | Перевести выделенный код (слово) в нижний регистр |
Настройки MetaEditor
Также помочь писать код быстрее могут правильные настройки редактора MetaEditor. Приведу здесь несколько настроек, которые всем рекомендую попробовать.
Надо отметить эти поля
- Вставка () и закрывающих }]" — действенный способ избежать глупых ошибок (неожиданное завершение программы, отсутствие скобок), которые иногда трудно заметить, особенно при работе с большим кодом.
- Подсветка парных скобок — поможет понять границы функции или блока кода, в котором вы находитесь.
- Подсветка текущей строки — иногда сложно найти строку кода, с которой вы только что работали. Подсветка поможет быстро увидеть нужную строку при прокрутке.
- Включить историю буфера обмена — история копирования позволит легко выбрать любой ранее скопированный фрагмент.
К другим полезным настройкам можно отнести выбор подходящего именно вам размера шрифта.
Поиграйте с настройками, чтобы выбрать то, что подходит именно вам. Настройки доступны в меню Сервис \ Настройки.
9. Научитесь гуглить
Навыки эффективного поиска информации тоже позволяют сэкономить время и ускорить написание кода. При программировании мы часто сталкиваемся с проблемами и затруднениями, которые требуют немедленного решения. Невозможно знать все, но можно знать, где искать, и тогда можно справиться с практически любой задачей.
Достаточно просто погуглить, чтобы найти правильный ответ, так? Нет!
Взглянем на один пример, в котором обычный пользователь застрял при чтении массива из бинарного файла и открыл Google, чтобы найти решение.
Первое, что делает большинство людей, это открывает Google и в строке поиска пишет что-то вроде как прочитать массив из бинарного файла (how to read an array in a binary file). Вот что выдает поиск:
Обратите внимание: общее количество выданных результатов поиска превышает 98 миллионов.
В интернете так много всякого мусора и ненужной информации. Есть опасность, что вы потратите кучу времени в поисках нужного (или еще хуже - попадете на ненадежный сайт, хакеры могут украсть ваши личные данные). Поисковый запрос получился слишком расплывчатым, чтобы получить конкретный немедленный результат, который нам нужен. А чтобы получить именно желаемый результат, надо составить очень точный и конкретный запрос.
Есть очень много советов по поиску для тех, кто хочет углубиться в эту тему. Например, я рекомендую посмотреть это короткое видео. Здесь же я расскажу только о двух советах.
1. Поиск на конкретном сайте
Лучшее место для поиска ответов, касающихся MQL5 — это, конечно же, MQL5.com. Поэтому при поиске в гугле можно явно указывать сайт MQL5.com для поиска ответов и решений.
Добавьте site:MQL5.com в конце поискового запроса. Вот такой результат вы получите:
В этот раз поиск вернул только 568 подходящих результатов, все они с сайта MQL5.com. Указывая site: URL, мы подсказываем гуглу, на каком сайте искать.
2. Более конкретный поиск
Иногда даже результатов с сайта MQL5.com может быть слишком много, ведь сайт очень большой. Бывает, что вы четко знаете, что хотите получите. Для таких случаев есть один способ, который я лично использую, хотя он не рекомендован гуглом. В любом случае он работает, но для поиска нужно знать, из какого раздела сайте MQL5 результаты буду более приоритетными: статьи, форум, библиотека Codebase и т.д. Когда такой поиск может быть полезным:
- Вы хотите глубже изучить предмет по статьям
- Хотите быстро получить решение на форуме
- Посмотреть, как это делали другие, в готовых кодах из Codebase
Поиск нужно задавать в формате MQL5 + раздел + поисковый запрос. В нашем примере будет так:
MQL5 forum how to read an array in a binary file
Хоть этот метод и должен искать в конкретном разделе, мы не указали гуглу, на каком сайте надо искать, поэтому лучше в данном случае добавить указание site:MQL5.com. В итоге поисковый запрос выглядит теперь так: forum how to read an array in a binary file site:MQL5.com. На это гугл вернет 399 результатов.
Заключение
Я продолжаю собирать советы, которые помогут повысить качество и скорость программирования, а также в целом повысить продуктивность. В следующей статье я добавлю больше новых советов. Это несложные правила, которых можно придерживаться каждый день и вырабатывать полезные привычки.
Спасибо за внимание. Ваши комментарии, дополнения и новые полезные советы приветствуются в обсуждении к статье.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/9752
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
но только всё строго наоборот...
приведённый в статье код как "нехороший", он профессиональный
а то что выдаётся за хорошее - гонево
PS/ всегда проверяётся допустимость и корректность аргументов. "не верь никому, даже себе"
В статье приведён такой фрагмент кода как примерный:
Это не члены указанных классов. Кажется, автор не понимает что такое члены классов.
В статье приведён такой фрагмент кода как примерный:
Это не члены указанных классов. Кажется, автор не понимает что такое члены классов.
А вы уверены что надо что-то знать чтобы других учить?
Хороший пример. Надо взять на вооружение:
А вы уверены что надо что-то знать чтобы других учить?
Вообще-то чтобы учить надо знать, но не все это знают :)