Créer un robot - page 3

 
MrBrooklin:

En outre, j'utilise activement les informations de la référence MQL5 (onglet Documentation MQL5). On peut y trouver pratiquement tout. Le seul gros inconvénient de ce modèle est qu'il est écrit pour des personnes qui ont déjà une formation de base dans d'autres langages de programmation, mais évidemment pas pour des débutants. Par exemple, je ne comprends toujours pas le sens de la phrase qui revient constamment et qui commence par"Returns" :

AccountInfoDouble

Retourne la valeur du type double de la propriété du compte correspondant.


Qui revient, qui revient, où revient-il, pourquoi revient-il? Je ne le comprends toujours pas.

Meilleures salutations, Vladimir.

Vladimir, nous trouverons bien une solution tôt ou tard). S'il est nécessaire d'effectuer une certaine tâche.


Salutations, Roman.

 

Je voudrais également ajouter. Vous devez avoir une bonne connaissance de l'anglais, car il y a beaucoup de commentaires sur le code du programme en anglais. J'utilise moi-même Google Translate pour comprendre la signification de ce qui est écrit dans le code du programme. C'est difficile, mais je n'ai pas le choix. Bien qu'il existe une porte de sortie - le freelance, mais à condition que je sois totalement confiant dans ma stratégie, à 100 % ou plus.

Salutations, Vladimir.

 
MrBrooklin:

Je voudrais également ajouter. Vous devez avoir une bonne connaissance de l'anglais, car il y a beaucoup de commentaires sur le code du programme en anglais. J'utilise moi-même Google Translate pour comprendre la signification de ce qui est écrit dans le code du programme. C'est difficile, mais je n'ai pas le choix. Bien qu'il existe une porte de sortie - le freelance, mais à condition que je sois totalement confiant dans ma stratégie, à 100 % ou plus.

Sincèrement, Vladimir.

Non, le freelancing n'a pas ce processus que vous pouvez développer vous-même selon vos besoins. Je ne serai responsable que de mes propres erreurs, pas du programmeur extérieur. Vous allez donc apprendre, apprendre, coder, trébucher, améliorer vos stratégies et apprendre à nouveau.


Sincèrement, Roman.

 
Роман Жилин:

Non, le freelancing n'a pas le processus que vous avez dans la composition de votre propre enfant, que vous pouvez développer comme vous le souhaitez. Et mes erreurs ne seront que ma propre faute, pas celle d'un programmeur tiers. Vous allez donc apprendre, apprendre, coder, trébucher, améliorer vos stratégies et apprendre à nouveau.


Sincèrement, Roman.

Je suis d'accord ! C'est pourquoi j'ai dû m'instruire dans ma vieillesse.

Sincèrement, Vladimir.

 
MrBrooklin:

Je suis d'accord ! C'est pourquoi j'ai dû me lancer dans l'auto-éducation à un âge avancé.

Sincèrement, Vladimir.

Dans votre vieillesse ? Quel âge avez-vous, si ce n'est pas un secret ? Et pourquoi avez-vous décidé de suivre cette voie ?

 

Roman, j'ai quelque chose dans les modèles. Peut-être que des codes prêts à l'emploi avec des commentaires en russe vous seront utiles.

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

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

Dans votre vieillesse ? Quel âge avez-vous, si ce n'est pas un secret ? Et pourquoi avez-vous choisi cette voie ?

57 et un peu. Et la réponse à votre question sur le chemin est déjà connue, je cite :

"Roman Zhilin:

Non, le freelancing n'a pas ce processus que vous pouvez développer par vous-même selon vos besoins. Et la seule personne à blâmer pour mes erreurs sera moi-même, et non un programmeur tiers. Vous devrez donc apprendre, apprendre, coder, trébucher, améliorer vos stratégies et apprendre à nouveau".

Sincèrement, Vladimir.

 
MrBrooklin:

57 et un peu. Et la réponse à votre question sur la façon dont est déjà connue, et je cite :

"Roman Zhilin:

Non, il n'y a pas de processus dans le freelancing, que vous pouvez développer vous-même selon vos besoins. Et la seule personne à blâmer pour mes erreurs sera moi-même, et non un programmeur tiers. Vous devrez donc apprendre, apprendre, coder, trébucher, améliorer vos stratégies et apprendre à nouveau".

Sincèrement, Vladimir.

Oooh, merci beaucoup, avec autant d'informations on peut faire beaucoup de choses...

Partant en voyage d'affaires, je pense approfondir le matériel qui m'a été donné, mais le codage... Je pourrais aussi le faire sur une feuille de papier, ce serait un bon outil d'entraînement...


Salutations, Roman

 
MrBrooklin:

Qui revient, vers qui revient-il, où revient-il, pourquoi revient-il?

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

Les fonctions permettent de résoudre certains problèmes. Dans certains cas, le résultat de la fonction est un nombre, et dans d'autres, il n'y a pas de résultat numérique. Dans le premier cas, nous devons retourner le nombre à l'endroit où la fonction a été appelée, c'est-à-dire à l'endroit où se trouve le signe =. Dans le second, ce n'est pas nécessaire, nous appelons donc la fonction sans affectation.

Dans l'exemple, les trois premières fonctions renvoient des valeurs, tandis que la dernière ne le fait pas. C'est comme ça.

 
Aleksei Stepanenko:

Les fonctions sont nécessaires pour le code isolé qui résout certains problèmes. Dans certains cas, le résultat de la fonction est un nombre, et dans d'autres, il n'y a pas de résultat numérique. Dans le premier cas, nous devons retourner le nombre à l'endroit où la fonction a été appelée, c'est-à-dire à l'endroit où se trouve le signe =. Dans le second, ce n'est pas nécessaire, nous appelons donc la fonction sans affectation.

Dans l'exemple, les trois premières fonctions renvoient des valeurs, tandis que la dernière ne le fait pas. C'est comme ça.

sont nécessaires si la même chose doit être faite plusieurs fois et si cette action est un algorithme de plus d'une chaîne.