Criando um robô - página 3

 
MrBrooklin:

Além disso, estou usando ativamente as informações da MQL5 Reference (guia Documentação MQL5). Você pode encontrar praticamente tudo nele. A única grande desvantagem deste modelo é que ele é escrito para pessoas que já têm um treinamento básico em outras linguagens de programação, mas obviamente não para iniciantes. Por exemplo, eu ainda não entendo o sentido da frase que ocorre constantemente, começando com"Retorna":

AccountInfoDouble

Retorna o valor do tipo duplo de propriedade da conta correspondente


Quem retorna, a quem retorna, para onde retorna, por que retorna? Eu ainda não entendo.

Com os melhores cumprimentos, Vladimir.

Vladimir, mais cedo ou mais tarde descobriremos isso). Se for necessário realizar uma determinada tarefa.


Cumprimentos, Roman.

 

Eu também gostaria de acrescentar. Você precisa de um conhecimento confiante do inglês, porque há muitos comentários sobre o código do programa em inglês. Eu mesmo uso o Google Translate para entender o significado do que está escrito no código do programa. É difícil, mas não tenho escolha. Embora haja uma saída - Freelance, mas isto só na condição de que eu esteja completamente confiante em minha estratégia em 100% ou mais.

Cumprimentos, Vladimir.

 
MrBrooklin:

Eu também gostaria de acrescentar. Você precisa de um conhecimento confiante do inglês, pois há muitos comentários sobre o código do programa em inglês. Eu mesmo uso o Google Translate para entender o significado do que está escrito no código do programa. É difícil, mas não tenho escolha. Embora exista uma saída - Freelance, mas isto só na condição de que eu esteja completamente confiante em minha estratégia em 100% ou mais.

Atenciosamente, Vladimir.

Não, o freelance não tem esse processo que você pode desenvolver por conta própria, como você precisa. Eu serei o único culpado por meus próprios erros, não o programador de fora. Assim, você aprenderá, aprenderá, codificará, tropeçará, melhorará suas estratégias e aprenderá novamente.


Sinceramente, romano.

 
Роман Жилин:

Não, o freelance não tem o processo que você tem para compor seu próprio filho, que você pode desenvolver como você quiser. E meus erros serão apenas culpa minha, não de um programador de terceiros. Assim, você aprenderá, aprenderá, codificará, tropeçará, melhorará suas estratégias e aprenderá novamente.


Sinceramente, romano.

Eu concordo! É por isso que tive que me educar na minha velhice.

Atenciosamente, Vladimir.

 
MrBrooklin:

Eu concordo! É por isso que tive que me dedicar à auto-educação na minha velhice.

Atenciosamente, Vladimir.

Na sua velhice? Quantos anos você tem, se isso não é segredo? E por que você decidiu seguir este caminho?

 

Roman, eu tenho algo nos modelos. Talvez alguns códigos prontos com comentários em russo sejam úteis para você.

Com os melhores cumprimentos, 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 ()
  {
//---

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

Na sua velhice? Quantos anos você tem, se não for um segredo? E por que você escolheu este caminho?

57 e um pouco. E a resposta à sua pergunta sobre o caminho já é conhecida, e passo a citar:

"Roman Zhilin ":

Não, o freelance não tem esse processo que você pode desenvolver por conta própria, como você precisa. E o único culpado pelos meus erros será eu mesmo, não um programador de terceiros. Portanto, você terá que aprender, aprender, codificar, tropeçar, melhorar suas estratégias e aprender novamente".

Atenciosamente, Vladimir.

 
MrBrooklin:

57 e um pouco. E a resposta à sua pergunta sobre a forma como já é conhecida, e passo a citar:

"Roman Zhilin ":

Não, não há nenhum processo em freelancing, que você pode desenvolver por conta própria, conforme sua necessidade. E o único culpado pelos meus erros será eu mesmo, não um programador de terceiros. Portanto, você terá que aprender, aprender, codificar, tropeçar, melhorar suas estratégias e aprender novamente".

Atenciosamente, Vladimir.

Oooh, muito obrigado, com tanta informação você pode conseguir fazer tanta coisa...

Saindo em uma viagem de negócios, estou pensando em ir mais fundo nos materiais que me foram dados, mas a codificação... Eu também poderia fazê-lo em uma folha de papel, seria uma boa ferramenta de treinamento...


Cumprimentos, romano

 
MrBrooklin:

Quem retorna, a quem retorna, para onde retorna, por que retorna?

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)
   {
   //любой код, без возврата результата
   }

As funções resolvem certos problemas. Em alguns casos, o resultado da função é um número, e em outros não há resultado numérico. No primeiro caso, precisamos retornar o número ao local onde a função foi chamada, ou seja, ao local onde há um = sinal. No segundo, não é necessário, portanto, chamamos a função sem atribuição.

No exemplo, as três primeiras funções retornam valores, enquanto a última não o faz. É assim que é.

 
Aleksei Stepanenko:

As funções são necessárias para códigos isolados que resolvem certos problemas. Em alguns casos, o resultado da função é um número, e em outros não há resultado numérico. No primeiro caso, precisamos retornar o número ao lugar onde a função foi chamada, ou seja, ao lugar onde há um = sinal. No segundo, não é necessário, portanto, chamamos a função sem atribuição.

No exemplo, as três primeiras funções retornam valores, enquanto a última não o faz. É assim que é.

funções são necessárias se a mesma coisa precisar ser feita muitas vezes e se esta ação for um algoritmo de mais de uma cadeia