Creating a robot - page 3

 
MrBrooklin:

Besides, I am actively using the information from MQL5 Reference (MQL5 Documentation tab). You can find practically everything in it. The only big disadvantage of this model is that it is written for people who already have a basic training in other programming languages, but obviously not for beginners. For example, I still don't understand the sense of the constantly occurring phrase beginning with"Returns":

AccountInfoDouble

Returns value of double type of corresponding account property


Who returns, who does it return, where does it return to, why does it return? I still don't understand it.

Best regards, Vladimir.

Vladimir, we will figure it out sooner or later). If it is necessary to perform a certain task.


Regards, Roman.

 

I would also like to add. You need a confident knowledge of English, because there are a lot of comments on the program code in English. I use Google Translate myself to understand the meaning of what's written in the program code. It's difficult, but I have no choice. Although there is a way out - Freelance, but this is only on condition that I am completely confident in my strategy by 100 percent or more.

Regards, Vladimir.

 
MrBrooklin:

I would also like to add. You need a confident knowledge of English, because there are a lot of comments on the program code in English. I use Google Translate myself to understand the meaning of what's written in the program code. It's difficult, but I have no choice. Although there is a way out - Freelance, but this is only on condition that I am completely confident in my strategy by 100 percent or more.

Sincerely, Vladimir.

No, freelancing doesn't have that process which you can develop on your own as you need. I will only be to blame for my own mistakes, not the programmer from outside. So, you will learn, learn, code, stumble, improve your strategies, and learn again.


Sincerely, Roman.

 
Роман Жилин:

No, freelancing doesn't have the process that you have in writing your own child, which you can develop as you want. And my mistakes will only be my own fault, not that of a third-party programmer. So, you will learn, learn, code, stumble, improve your strategies, and learn again.


Sincerely, Roman.

I agree! That's why I had to educate myself in my old age.

Sincerely, Vladimir.

 
MrBrooklin:

I agree! That's why I had to take up self-education in my old age.

Sincerely, Vladimir.

In your old age? How old are you, if that's not a secret? And why did you decide to take this path?

 

Roman, I have something in the templates. Perhaps some ready-made codes with comments in Russian will come in handy for you.

With best regards, Vladimir.

 //+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---РАБОТА СО СЧЁТОМ

//--- получим номер счета, на котором запущен советник
   long login=account.Login();
   Print ( "Login=" ,login);
//--- выясним тип счета
   ENUM_ACCOUNT_TRADE_MODE account_type=account.TradeMode();
//--- если счет оказался реальным, прекращаем работу эксперта немедленно!
   if (account_type== ACCOUNT_TRADE_MODE_REAL )
     {
       MessageBox ( "Работа на реальном счете запрещена, выходим" , "Эксперт запущен на реальном счете!" );
       return (- 1 );
     }
//--- выведем тип счета
   Print ( "Тип счета: " , EnumToString (account_type));
//--- выясним, можно ли вообще торговать на данном счете
   if (account.TradeAllowed())
       Print ( "Торговля на данном счете разрешена" );
   else
       Print ( "Торговля на счете запрещена: возможно, вход был совершен по инвест-паролю" );
//--- выясним, разрешено ли торговать на счете с помощью эксперта
   if (account.TradeExpert())
       Print ( "Автоматическая торговля на счете разрешена" );
   else
       Print ( "Запрещена автоматическая торговля с помощью экспертов и скриптов" );
//--- допустимое количество ордеров задано или нет
   int orders_limit=account.LimitOrders();
   if (orders_limit!= 0 )
       Print ( "Максимально допустимое количество действующих отложенных ордеров: " ,orders_limit);
//--- выведем имя компании и сервера
   Print (account.Company(), ": server " ,account.Server());
//--- напоследок выведем баланс и текущую прибыль на счете
   Print ( "Balance=" ,account.Balance(), "  Profit=" ,account.Profit(), "   Equity=" ,account.Equity());
   Print ( __FUNCTION__ , "  completed" );


//--- ПОЛУЧЕНИЕ СВОЙСТВ СИМВОЛА

//--- зададим имя символа, для которого будем получать информацию
   symbol_info.Name( _Symbol );
//--- получим текущие котировки и выведем
   symbol_info.RefreshRates();
   Print (symbol_info.Name(), " (" ,symbol_info.Description(), ")" ,
         "  Bid=" ,symbol_info.Bid(), "   Ask=" ,symbol_info.Ask());
//--- получим значения минимальных отступов для торговых операций
   Print ( "StopsLevel=" ,symbol_info.StopsLevel(), " pips, FreezeLevel=" ,
         symbol_info.FreezeLevel(), " pips" );
//--- получим количество знаков после запятой и размер пункта
   Print ( "Digits=" ,symbol_info. Digits (),
         ", Point=" , DoubleToString (symbol_info. Point (),symbol_info. Digits ()));
//--- информация о спреде
   Print ( "SpreadFloat=" ,symbol_info.SpreadFloat(), ", Spread(текущий)=" ,
         symbol_info.Spread(), " pips" );
//--- запросим тип исполнения ордеров, нет ли ограничений
   Print ( "Ограничения на торговые операции: " , EnumToString (symbol_info.TradeMode()),
         " (" ,symbol_info.TradeModeDescription(), ")" );
//--- выясним режим заключения сделок
   Print ( "Режим исполнения сделок: " , EnumToString (symbol_info.TradeExecution()),
         " (" ,symbol_info.TradeExecutionDescription(), ")" );
//--- выясним способ вычисления стоимости контрактов
   Print ( "Вычисление стоимости контракта: " , EnumToString (symbol_info.TradeCalcMode()),
         " (" ,symbol_info.TradeCalcModeDescription(), ")" );
//--- размер контрактов
   Print ( "Размер стандартного контракта: " ,symbol_info.ContractSize(),
         " (" ,symbol_info.CurrencyBase(), ")" );
//--- минимальный, максимальный размеры объема в торговых операциях
   Print ( "Volume info: LotsMin=" ,symbol_info.LotsMin(), "  LotsMax=" ,symbol_info.LotsMax(),
         "  LotsStep=" ,symbol_info.LotsStep());
//---
   Print ( __FUNCTION__ , "  completed" );

//--- ТОРГОВЫЕ ОПЕРАЦИИ

//--- зададим MagicNumber для идентификации своих ордеров
   int MagicNumber= 97184236 ;
   trade.SetExpertMagicNumber(MagicNumber);
//--- установим допустимое проскальзывание в пунктах при совершении покупки/продажи
   int deviation= 10 ;
   trade.SetDeviationInPoints(deviation);
//--- режим заполнения ордера, нужно использовать тот режим, который разрешается сервером
   trade.SetTypeFilling( ORDER_FILLING_RETURN );
//--- режим логирования: лучше не вызывать этот метод вообще, класс сам выставит оптимальный режим
   trade.LogLevel( 1 ); 
//--- какую функцию использовать для торговли: true - OrderSendAsync(), false - OrderSend()
   trade.SetAsyncMode( true );

//--- 1. ПРИМЕР ПОКУПКИ ПО ТЕКУЩЕМУ СИМВОЛУ

//--- если торговая операция не соответствует "Buy" с размером лота 0.1
   if (!trade.Buy( 0.1 ))
     {
       //--- сообщим о неудаче
       Print ( "Метод Buy() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
//--- в противном случае     
   else
     {
       //--- сообщим об успешном выполнении
       Print ( "Метод Buy() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }
     
//--- 2. ПРИМЕР ПОКУПКИ ПО УКАЗАННОМУ НАМИ СИМВОЛУ

//--- если торговая операция не соответствует "Buy" с размером лота 0.1 на символе GBPUSD
   if (!trade.Buy( 0.1 , "GBPUSD" ))
     {
       //--- сообщим о неудаче
       Print ( "Метод Buy() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
//--- в противном случае   
   else
     {
     //--- сообщим об успешном выполнении
       Print ( "Метод Buy() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//--- 3. ПРИМЕР ПОКУПКИ ПО УКАЗАННОМУ СИМВОЛУ С ЗАДАННЫМИ SL и TP

   double volume= 0.1 ;                                           // укажем объем торговой операции
   string symbol= "GBPUSD" ;                                     // укажем символ, на котором проводится операция
   int     digits=( int ) SymbolInfoInteger (symbol, SYMBOL_DIGITS ); // количество знаков после запятой
   double point= SymbolInfoDouble (symbol, SYMBOL_POINT );         // пункт
   double bid= SymbolInfoDouble (symbol, SYMBOL_BID );             // текущая цена для закрытия LONG
   double SL=bid- 1000 *point;                                   // ненормализованное значение SL
   SL= NormalizeDouble (SL,digits);                               // нормализуем Stop Loss
   double TP=bid+ 1000 *point;                                   // ненормализованное значение TP
   TP= NormalizeDouble (TP,digits);                               // нормализуем Take Profit
//--- получим текущую цену открытия для LONG позиций
   double open_price= SymbolInfoDouble (symbol, SYMBOL_ASK );
   string comment= StringFormat ( "Buy %s %G lots at %s, SL=%s TP=%s" ,
                               symbol,volume,
                               DoubleToString (open_price,digits),
                               DoubleToString (SL,digits),
                               DoubleToString (TP,digits));
//--- если торговая операция не соответствует                               
   if (!trade.Buy(volume,symbol,open_price,SL,TP,comment))
     {
       //--- сообщим о неудаче
       Print ( "Метод Buy() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
//--- в противном случае
   else
     {
       //--- сообщим об успешном выполнении
       Print ( "Метод Buy() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//--- 4. ПРИМЕР УСТАНОВКИ ОТЛОЖЕННОГО ОРДЕРА BUY LIMIT
   string symbol= "GBPUSD" ;                                     // укажем символ, на котором выставляется ордер
   int     digits=( int ) SymbolInfoInteger (symbol, SYMBOL_DIGITS ); // количество знаков после запятой
   double point= SymbolInfoDouble (symbol, SYMBOL_POINT );         // пункт
   double ask= SymbolInfoDouble (symbol, SYMBOL_ASK );             // текущая цена покупки
   double price= 1000 *point;                                     // ненормализованное цена открытия
   price= NormalizeDouble (price,digits);                         // нормализуем цену открытия
//--- все готово, теперь отправляем на сервер отложенный ордер Buy Limit

//--- если торговая операция не соответствует  
   if (!trade.BuyLimit( 0.1 ,price))
     {
       //--- сообщим о неудаче
       Print ( "Метод BuyLimit() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
//--- в противном случае
   else
     {
       //--- сообщим об успешном выполнении
       Print ( "Метод BuyLimit() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//--- 5. ПРИМЕР УСТАНОВКИ ОТЛОЖЕННОГО ОРДЕРА BUY LIMIT СО ВСЕМИ ПАРАМЕТРАМИ
   double volume= 0.1 ;                                           // укажем объем торговой операции
   string symbol= "GBPUSD" ;                                     // укажем символ, на котором выставляется ордер
   int     digits=( int ) SymbolInfoInteger (symbol, SYMBOL_DIGITS ); // количество знаков после запятой
   double point= SymbolInfoDouble (symbol, SYMBOL_POINT );         // пункт
   double ask= SymbolInfoDouble (symbol, SYMBOL_ASK );             // текущая цена покупки
   double price= 1000 *point;                                     // ненормализованное цена открытия
   price= NormalizeDouble (price,digits);                         // нормализуем цену открытия
   int SL_pips= 300 ;                                             // Stop Loss в пунктах
   int TP_pips= 500 ;                                             // Take Profit в пунктах
   double SL=price-SL_pips*point;                               // ненормализованное значение SL
   SL= NormalizeDouble (SL,digits);                               // нормализуем Stop Loss
   double TP=price+TP_pips*point;                               // ненормализованное значение TP
   TP= NormalizeDouble (TP,digits);                               // нормализуем Take Profit
   datetime expiration= TimeTradeServer ()+ PeriodSeconds ( PERIOD_D1 );
   string comment= StringFormat ( "Buy Limit %s %G lots at %s, SL=%s TP=%s" ,
                               symbol,volume,
                               DoubleToString (price,digits),
                               DoubleToString (SL,digits),
                               DoubleToString (TP,digits));
//--- все готово, отправляем на сервер отложенный ордер Buy Limit
   if (!trade.BuyLimit(volume,price,symbol,SL,TP, ORDER_TIME_GTC ,expiration,comment))
     {
       //--- сообщим о неудаче
       Print ( "Метод BuyLimit() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
   else
     {
       Print ( "Метод BuyLimit() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//--- 6. ПРИМЕР УСТАНОВКИ ОТЛОЖЕННОГО ОРДЕРА BUY STOP
   string symbol= "USDJPY" ;                                     // укажем символ, на котором выставляется ордер
   int     digits=( int ) SymbolInfoInteger (symbol, SYMBOL_DIGITS ); // количество знаков после запятой
   double point= SymbolInfoDouble (symbol, SYMBOL_POINT );         // пункт
   double ask= SymbolInfoDouble (symbol, SYMBOL_ASK );             // текущая цена покупки
   double price= 1000 *point;                                     // ненормализованное цена открытия
   price= NormalizeDouble (price,digits);                         // нормализуем цену открытия
//--- все готово, отправляем на сервер отложенный ордер Buy Stop 
   if (!trade.BuyStop( 0.1 ,price))
     {
       //--- сообщим о неудаче
       Print ( "Метод BuyStop() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
   else
     {
       Print ( "Метод BuyStop() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//--- 7. ПРИМЕР УСТАНОВКИ ОТЛОЖЕННОГО ОРДЕРА BUY STOP СО ВСЕМИ ПАРАМЕТРАМИ
   double volume= 0.1 ;                                           // укажем объем торговой операции
   string symbol= "USDJPY" ;                                     // укажем символ, на котором выставляется ордер
   int     digits=( int ) SymbolInfoInteger (symbol, SYMBOL_DIGITS ); // количество знаков после запятой
   double point= SymbolInfoDouble (symbol, SYMBOL_POINT );         // пункт
   double ask= SymbolInfoDouble (symbol, SYMBOL_ASK );             // текущая цена покупки
   double price= 1000 *point;                                     // ненормализованное цена открытия
   price= NormalizeDouble (price,digits);                         // нормализуем цену открытия
   int SL_pips= 300 ;                                             // Stop Loss в пунктах
   int TP_pips= 500 ;                                             // Take Profit в пунктах
   double SL=price-SL_pips*point;                               // ненормализованное значение SL
   SL= NormalizeDouble (SL,digits);                               // нормализуем Stop Loss
   double TP=price+TP_pips*point;                               // ненормализованное значение TP
   TP= NormalizeDouble (TP,digits);                               // нормализуем Take Profit
   datetime expiration= TimeTradeServer ()+ PeriodSeconds ( PERIOD_D1 );
   string comment= StringFormat ( "Buy Stop %s %G lots at %s, SL=%s TP=%s" ,
                               symbol,volume,
                               DoubleToString (price,digits),
                               DoubleToString (SL,digits),
                               DoubleToString (TP,digits));
//--- все готово, отправляем на сервер отложенный ордер Buy Stop 
   if (!trade.BuyStop(volume,price,symbol,SL,TP, ORDER_TIME_GTC ,expiration,comment))
     {
       //--- сообщим о неудаче
       Print ( "Метод BuyStop() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
   else
     {
       Print ( "Метод BuyStop() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//--- 8. ПРИМЕР ИСПОЛЬЗОВАНИЕ МЕТОДА "PositionOpen" ДЛЯ ОТКРЫТИЯ ПОЗИЦИИ BUY ПО ТЕКУЩЕМУ СИМВОЛУ

//--- количество знаков после запятой
   int     digits=( int ) SymbolInfoInteger ( _Symbol , SYMBOL_DIGITS );
//--- значение пункта
   double point= SymbolInfoDouble ( _Symbol , SYMBOL_POINT );
//--- получим цену покупки
   double price= SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
//--- вычислим и нормализуем уровни SL и TP
   double SL= NormalizeDouble (price- 1000 *point,digits);
   double TP= NormalizeDouble (price+ 1000 *point,digits);
//--- заполним комментарий
   string comment= "Buy " + _Symbol + " 0.1 at " + DoubleToString (price,digits);
//--- все готово, делаем попытку открыть позицию на покупку
   if (!trade.PositionOpen( _Symbol , ORDER_TYPE_BUY , 0.1 ,price,SL,TP,comment))
     {
       //--- сообщим о неудаче
       Print ( "Метод PositionOpen() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
   else
     {
       Print ( "Метод PositionOpen() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//--- 9. ПРИМЕР ИСПОЛЬЗОВАНИЕ МЕТОДА "PositionClose" ДЛЯ ЗАКРЫТИЯ ПОЗИЦИИ ПО ТЕКУЩЕМУ СИМВОЛУ

//--- закрываем позицию по текущему символу
   if (!trade.PositionClose( _Symbol ))
     {
       //--- сообщим о неудаче
       Print ( "Метод PositionClose() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
   else
     {
       Print ( "Метод PositionClose() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//--- 10. ПРИМЕР МОДИФИКАЦИи ОТКРЫТОЙ ПОЗИЦИИ (У ОТКРЫТОЙ ПОЗИЦИИ ДОСТУПНЫ ДЛЯ МОДИФИКАЦИИ ТОЛЬКО TAKE PROFIT И STOP LOSS!!!)

//--- количество знаков после запятой
   int     digits=( int ) SymbolInfoInteger ( _Symbol , SYMBOL_DIGITS );
//--- значение пункта
   double point= SymbolInfoDouble ( _Symbol , SYMBOL_POINT );
//--- получим текущую цену Bid
   double price= SymbolInfoDouble ( _Symbol , SYMBOL_BID );
//--- вычислим и нормализуем уровни SL и TP
   double SL= NormalizeDouble (price- 1000 *point,digits);
   double TP= NormalizeDouble (price+ 1000 *point,digits);
//--- все готово, делаем попытку модифицировать позицию на покупку
   if (!trade.PositionModify( _Symbol ,SL,TP))
     {
       //--- сообщим о неудаче
       Print ( "Метод PositionModify() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
   else
     {
       Print ( "Метод PositionModify() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//--- 11. ПРИМЕР МОДИФИКАЦИИ ПАРАМЕТРОВ ОТЛОЖЕННОГО ОРДЕРА

//--- тикет ордера указан только для примера, его нужно получить
   ulong ticket= 1234556 ;
//--- символ также указан для примера, его нужно получить
   string symbol= "EURUSD" ;
//--- количество знаков после запятой
   int     digits=( int ) SymbolInfoInteger (symbol, SYMBOL_DIGITS );
//--- значение пункта
   double point= SymbolInfoDouble (symbol, SYMBOL_POINT );
//--- получим цену покупки
   double price= SymbolInfoDouble (symbol, SYMBOL_ASK );
//--- вычислим и нормализуем уровни SL и TP
//--- на самом деле они должны вычисляться в зависимости от типа ордера
   double SL= NormalizeDouble (price- 1000 *point,digits);
   double TP= NormalizeDouble (price+ 1000 *point,digits);
   //--- зададим срок действия одни сутки
   datetime expiration= TimeTradeServer ()+ PeriodSeconds ( PERIOD_D1 );   
//--- все готово, делаем попытку модифицировать ордер 
   if (!trade.OrderModify(ticket,price,SL,TP, ORDER_TIME_GTC ,expiration))
     {
       //--- сообщим о неудаче
       Print ( "Метод OrderModify() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
   else
     {
       Print ( "Метод OrderModify() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//--- 12. ПРИМЕР УДАЛЕНИЯ ОТЛОЖЕННОГО ОРДЕРА ПО ЕГО ТИКЕТУ

//--- тикет ордера указан только для примера, его нужно получить
   ulong ticket= 1234556 ;
//--- все готово, делаем попытку модифицировать позицию на покупку
   if (!trade.OrderDelete(ticket))
     {
       //--- сообщим о неудаче
       Print ( "Метод OrderDelete() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
     }
   else
     {
       Print ( "Метод OrderDelete() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
             " (" ,trade.ResultRetcodeDescription(), ")" );
     }

//+------------------------------------------------------------------+
//| Расчет оптимального объема лота                                  |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
//---
   double Lots= NormalizeDouble (m_account.Balance()*Risk/ 100000.0 , 1 ); // Risk задается во входных параметрах "Input"
   if (m_account.FreeMargin()<( 1000 *Lots))
     {
      Lots= NormalizeDouble (m_account.FreeMargin()*Risk/ 100000.0 , 1 );
     }
//---
   return (LotCheck(Lots));
  }

//+------------------------------------------------------------------+
//| Закрытие всех ордеров и позиций в 23 ч.59 м.                     |
//+------------------------------------------------------------------+

//---
   int total_pos=CountPositions();
   int total_orders=CountOrders();
   if ((total_pos+total_orders)== 0 && str1.hour== 23 && str1.min== 59 )
       return ;
//---
   if (total_pos> 0 && str1.hour== 23 && str1.min== 59 )
      DeleteAllPositions();

   if (total_orders> 0 && str1.hour== 23 && str1.min== 59 )
      DeleteAllOrders();
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---

  }
//+------------------------------------------------------------------+
 
Роман Жилин:

In your old age? How old are you, if it's not a secret? And why did you choose this path?

57 and a bit. And the answer to your question about the path is already known, and I quote:

"Roman Zhilin:

No, freelancing doesn't have that process that you can develop on your own as you need. And the only one to blame for my mistakes will be myself, not a third-party programmer. So, you will have to learn, learn, code, stumble, improve your strategies, and learn again".

Sincerely, Vladimir.

 
MrBrooklin:

57 and a bit. And the answer to your question about the way is already known, and I quote:

"Roman Zhilin:

No, there is no process in freelancing, which you can develop on your own as you need. And the only one to blame for my mistakes will be myself, not a third-party programmer. So, you will have to learn, learn, code, stumble, improve your strategies, and learn again".

Sincerely, Vladimir.

Oooh, thank you very much, with so much information you can get so much done...

Just leaving on a business trip, I'm thinking of going deeper into the materials I've been given, but the coding... I could do it on a sheet of paper too, it would be a good training tool...


Regards, Roman

 
MrBrooklin:

Who returns, who does it return to, where does it return to, why does it return?

int a=5;
int b=6;

int sum=GetSum(a,b);
double ratio=GetRatio(a,b);
bool equal=IsEqual(a,b);
WithoutReturn(a,b);


int GetSum(int x, int y)
   {
   return(x+y);
   }

double GetRatio(int x, int y)
   {
   if(y==0) return(0.0);
   return((double)x/y);
   }

bool IsEqual(int x, int y)
   {
   return(x==y);
   }

void WithoutReturn(int x, int y)
   {
   //любой код, без возврата результата
   }

Functions solve certain problems. In some cases, the result of the function is a number, and in others there is no numeric result. In the first case, we need to return the number to the place where the function was called, i.e. to the place where there is an = sign. In the second, it is not necessary, so we call the function without assignment.

In the example, the first three functions return values, while the last one does not. This is how it is.

 
Aleksei Stepanenko:

Functions are needed for isolated code that solves certain problems. In some cases, the result of the function is a number, and in others there is no numeric result. In the first case, we need to return the number to the place where the function was called, that is, to the place where there is an = sign. In the second, it is not necessary, so we call the function without assignment.

In the example, the first three functions return values, while the last one does not. This is how it is.

functions are needed if the same thing needs to be done many times and if this action is an algorithm of more than one string