English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Стать хорошим программистом (Часть 4): повышаем скорость программирования

Стать хорошим программистом (Часть 4): повышаем скорость программирования

MetaTrader 5Примеры | 14 октября 2021, 09:26
3 081 7
Omega J Msigwa
Omega J Msigwa

Введение

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

Быстрое программирование

Все программисты хотят стать быстрее

  • Вы не встречали видео на 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, практически бесконечные возможности, и они легко могут превратить свою идею в эффективный и содержательный код. Например, они четко знают, когда нужно использовать


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. Приведу здесь несколько настроек, которые всем рекомендую попробовать.

Настройка MetaEditor

Надо отметить эти поля

  • Вставка () и закрывающих }]" — действенный способ избежать глупых ошибок (неожиданное завершение программы, отсутствие скобок), которые иногда трудно заметить, особенно при работе с большим кодом.
  • Подсветка парных скобок — поможет понять границы функции или блока кода, в котором вы находитесь.
  • Подсветка текущей строки — иногда сложно найти строку кода, с которой вы только что работали. Подсветка поможет быстро увидеть нужную строку при прокрутке.
  • Включить историю буфера обмена — история копирования позволит легко выбрать любой ранее скопированный фрагмент.

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

Поиграйте с настройками, чтобы выбрать то, что подходит именно вам. Настройки доступны в меню Сервис \ Настройки.


9. Научитесь гуглить

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

Достаточно просто погуглить, чтобы найти правильный ответ, так?  Нет!  

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

Первое, что делает большинство людей, это открывает Google и в строке поиска пишет что-то вроде как прочитать массив из бинарного файла (how to read an array in a binary file). Вот что выдает поиск:

Как гуглить проблему из MQL5

Обратите внимание: общее количество выданных результатов поиска превышает 98 миллионов. 

В интернете так много всякого мусора и ненужной информации. Есть опасность, что вы потратите кучу времени в поисках нужного (или еще хуже - попадете на ненадежный сайт, хакеры могут украсть ваши личные данные). Поисковый запрос получился слишком расплывчатым, чтобы получить конкретный немедленный результат, который нам нужен. А чтобы получить именно желаемый результат, надо составить очень точный и конкретный запрос.

Есть очень много советов по поиску для тех, кто хочет углубиться в эту тему. Например, я рекомендую посмотреть это короткое видео. Здесь же я расскажу только о двух советах.

1. Поиск на конкретном сайте

Лучшее место для поиска ответов, касающихся MQL5 — это, конечно же, MQL5.com. Поэтому при поиске в гугле можно явно указывать сайт MQL5.com для поиска ответов и решений.

Добавьте  site:MQL5.com в конце поискового запроса. Вот такой результат вы получите:

Результаты поиска по сайту mql5

В этот раз поиск вернул только 568 подходящих результатов, все они с сайта MQL5.com. Указывая  site: URL, мы подсказываем гуглу, на каком сайте искать.

2. Более конкретный поиск

Иногда даже результатов с сайта MQL5.com может быть слишком много, ведь сайт очень большой. Бывает, что вы четко знаете, что хотите получите. Для таких случаев есть один способ, который я лично использую, хотя он не рекомендован гуглом. В любом случае он работает, но для поиска нужно знать, из какого раздела сайте MQL5 результаты буду более приоритетными: статьи, форум, библиотека Codebase и т.д. Когда такой поиск может быть полезным:

  •  Вы хотите глубже изучить предмет по статьям
  •  Хотите быстро получить решение на форуме 
  •  Посмотреть, как это делали другие, в готовых кодах из Codebase

Поиск нужно задавать в формате MQL5 + раздел + поисковый запрос. В нашем примере будет так: 

MQL5 forum how to read an array in a binary file

Все еще не самые точные результаты поиска по MQL5

Хоть этот метод и должен искать в конкретном разделе, мы не указали гуглу, на каком сайте надо искать, поэтому лучше в данном случае добавить указание 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

Последние комментарии | Перейти к обсуждению на форуме трейдеров (7)
Maxim Kuznetsov
Maxim Kuznetsov | 15 окт. 2021 в 13:03

но только всё строго наоборот...

приведённый в статье код как "нехороший", он профессиональный

а то что выдаётся за хорошее - гонево

PS/ всегда проверяётся допустимость и корректность аргументов. "не верь никому, даже себе"

Andriy Konovalov
Andriy Konovalov | 17 окт. 2021 в 02:32

В статье приведён такой фрагмент кода как примерный:

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

Это не члены указанных классов. Кажется, автор не понимает что такое члены классов.

Aliaksandr Hryshyn
Aliaksandr Hryshyn | 17 окт. 2021 в 09:08
Andriy Konovalov #:

В статье приведён такой фрагмент кода как примерный:

Это не члены указанных классов. Кажется, автор не понимает что такое члены классов.

А вы уверены что надо что-то знать чтобы других учить?

Aliaksandr Hryshyn
Aliaksandr Hryshyn | 17 окт. 2021 в 09:39
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

Хороший пример. Надо взять на вооружение:

int OnInit()//Это событие OnInit
  {//Открывающая скобка
//Ниже будет мой код
....


  }//Закрывающая скобка
Andriy Konovalov
Andriy Konovalov | 17 окт. 2021 в 20:55
Aliaksandr Hryshyn #:

А вы уверены что надо что-то знать чтобы других учить?

Вообще-то чтобы учить надо знать, но не все это знают :)

Многослойный перцептрон и алгоритм обратного распространения ошибки (Часть II): Реализация на Python и интеграция с MQL5 Многослойный перцептрон и алгоритм обратного распространения ошибки (Часть II): Реализация на Python и интеграция с MQL5
Уже доступен пакет Python для разработки интеграции с MQL, что открывает двери для многих возможностей, таких как изучение данных и создание и использование моделей машинного обучения. Эта встроенная интеграция MQL5 в Python открывает для нас много возможностей, которые позволяют построить от простой линейной регрессии до моделей глубокого обучения. Давайте разберемся, как установить и подготовить среду разработки и использовать некоторые библиотеки машинного обучения.
Стать хорошим программистом (Часть 3): 5 советов, чтобы лучше программировать на MQL5 Стать хорошим программистом (Часть 3): 5 советов, чтобы лучше программировать на MQL5
Статья обязательна к прочтению для всех, кто хочет улучшить свою карьеру программиста. Цель этой серии статей — помочь любому читателю, даже опытному, улучшить навыки программирования. Описанные в статье идеи работают как для начинающих MQL5-программистов, так и для профессионалов.
Графика в библиотеке DoEasy (Часть 85): Коллекция графических объектов - добавляем вновь создаваемые Графика в библиотеке DoEasy (Часть 85): Коллекция графических объектов - добавляем вновь создаваемые
В статье закончим создание классов-наследников класса абстрактного графического объекта и начнём реализацию хранения этих объектов в классе-коллекции. В частности — создадим функционал для добавления в класс-коллекцию вновь создаваемых стандартных графических объектов.
Графика в библиотеке DoEasy (Часть 84): Классы-наследники абстрактного стандартного графического объекта Графика в библиотеке DoEasy (Часть 84): Классы-наследники абстрактного стандартного графического объекта
В статье рассмотрим создание классов-наследников объекта абстрактного стандартного графического объекта терминала. Объект этого класса описывает общие для всех графических объектов свойства. Т.е. это просто некий графический объект. Для уточнения его принадлежности к реальному графическому объекту нам необходимо унаследоваться от него, и в классе объекта-наследника прописать свойства, присущие этому конкретному графическому объекту.