Creación de un robot - página 3

 
MrBrooklin:

Además, estoy utilizando activamente la información de MQL5 Reference (pestaña MQL5 Documentation). Puedes encontrar prácticamente de todo en él. La única gran desventaja de este modelo es que está escrito para personas que ya tienen una formación básica en otros lenguajes de programación, pero obviamente no para principiantes. Por ejemplo, sigo sin entender el sentido de la frase que se repite constantemente y que comienza con"Returns":

AccountInfoDouble

Devuelve el valor del tipo doble de la propiedad de la cuenta correspondiente


¿Quiénes vuelven, quiénes vuelven, a dónde vuelven, por qué vuelven? Todavía no lo entiendo.

Saludos cordiales, Vladimir.

Vladimir, tarde o temprano nos daremos cuenta). Si es necesario realizar una determinada tarea.


Saludos, Roman.

 

También me gustaría añadir. Se necesita un conocimiento seguro del inglés, porque hay muchos comentarios en el código del programa en inglés. Yo mismo utilizo Google Translate para entender el significado de lo que está escrito en el código del programa. Es difícil, pero no tengo otra opción. Aunque hay una salida - Freelance, pero esto es sólo a condición de que estoy completamente seguro de mi estrategia en un 100 por ciento o más.

Saludos, Vladimir.

 
MrBrooklin:

También me gustaría añadir. Se necesita un conocimiento seguro del inglés, porque hay muchos comentarios en el código del programa en inglés. Yo mismo utilizo Google Translate para entender el significado de lo que está escrito en el código del programa. Es difícil, pero no tengo otra opción. Aunque hay una salida - Freelance, pero esto es sólo a condición de que estoy completamente seguro de mi estrategia en un 100 por ciento o más.

Sinceramente, Vladimir.

No, el trabajo autónomo no tiene ese proceso que puedes desarrollar por tu cuenta según tus necesidades. Sólo tendré la culpa de mis propios errores, no del programador de fuera. Así que aprenderá, aprenderá, codificará, tropezará, mejorará sus estrategias y volverá a aprender.


Sinceramente, Roman.

 
Роман Жилин:

No, el trabajo por cuenta propia no tiene el proceso que tienes al componer tu propio hijo, que puedes desarrollar como quieras. Y mis errores sólo serán culpa mía, no de un programador ajeno. Así que aprenderás, aprenderás, codificarás, tropezarás, mejorarás tus estrategias y volverás a aprender.


Sinceramente, Roman.

Estoy de acuerdo. Por eso tuve que educarme en mi vejez.

Sinceramente, Vladimir.

 
MrBrooklin:

Estoy de acuerdo. Por eso tuve que emprender la autoeducación en mi vejez.

Sinceramente, Vladimir.

¿En su vejez? ¿Qué edad tienes, si no es un secreto? ¿Y por qué decidió tomar este camino?

 

Roman, tengo algo en las plantillas. Quizás algunos códigos listos para usar con comentarios en ruso le resulten útiles.

Saludos cordiales, Vladímir.

 //+------------------------------------------------------------------+
//| 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 ()
  {
//---

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

¿En su vejez? ¿Qué edad tienes, si no es un secreto? ¿Y por qué eligió este camino?

57 y pico. Y la respuesta a su pregunta sobre el camino ya se conoce, y cito:

"Roman Zhilin ":

No, el trabajo autónomo no tiene ese proceso que puedes desarrollar por tu cuenta según tus necesidades. Y el único culpable de mis errores seré yo mismo, no un programador ajeno. Así que tendrás que aprender, aprender, codificar, tropezar, mejorar tus estrategias y volver a aprender".

Sinceramente, Vladimir.

 
MrBrooklin:

57 y pico. Y la respuesta a tu pregunta sobre el camino ya se conoce, y cito:

"Roman Zhilin ":

No, no hay ningún proceso en el trabajo autónomo, que puedas desarrollar por tu cuenta según tus necesidades. Y el único culpable de mis errores seré yo mismo, no un programador ajeno. Así que tendrás que aprender, aprender, codificar, tropezar, mejorar tus estrategias y volver a aprender".

Sinceramente, Vladimir.

Oooh, muchas gracias, con tanta información se pueden hacer muchas cosas...

Justo al salir de viaje de negocios, estoy pensando en profundizar en los materiales que me han dado, pero la codificación... También podría hacerlo en una hoja de papel, sería una buena herramienta de entrenamiento...


Saludos, Roman

 
MrBrooklin:

¿Quién regresa, a quién regresa, a dónde regresa, por qué regresa?

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

Las funciones resuelven ciertos problemas. En algunos casos, el resultado de la función es un número, y en otros no hay resultado numérico. En el primer caso, tenemos que devolver el número al lugar donde se llamó a la función, es decir, al lugar donde hay un signo =. En el segundo, no es necesario, por lo que llamamos a la función sin asignación.

En el ejemplo, las tres primeras funciones devuelven valores, mientras que la última no lo hace. Esto es así.

 
Aleksei Stepanenko:

Las funciones son necesarias para el código aislado que resuelve ciertos problemas. En algunos casos, el resultado de la función es un número, y en otros no hay resultado numérico. En el primer caso, necesitamos devolver el número al lugar donde se llamó a la función, es decir, al lugar donde hay un signo =. En el segundo, no es necesario, por lo que llamamos a la función sin asignación.

En el ejemplo, las tres primeras funciones devuelven valores, mientras que la última no lo hace. Esto es así.

son necesarias si hay que hacer lo mismo muchas veces y si esta acción es un algoritmo de más de una cadena
Razón de la queja: