로봇 만들기 - 페이지 3

 
MrBrooklin :

게다가 지금은 MQL5 참조(MQL5 웹사이트의 탭 - 문서 )의 정보를 적극적으로 사용하고 있습니다. 거의 모든 것을 찾을 수 있습니다. 이 가이드의 큰 단점 중 하나는 이미 다른 프로그래밍 언어에 대한 기본 교육을 받은 사람들을 위해 작성되었지만 분명히 초보자를 위한 것은 아니라는 것입니다. 예를 들어, " Returns "라는 단어로 시작하는 지속적으로 발생하는 구의 의미를 여전히 이해하지 못합니다.

AccountInfoDouble

해당 계정 속성의 두 배 값을 반환 합니다.


누가, 누구에게, 어디로, 어디로, 왜 돌아오는가 ? 오늘날까지도 나는 그것을 이해할 수 없다.

안부 인사를 전합니다. 블라디미르.

블라디미르, 조만간 우리가 알아낼 것입니다)) 물론 특정 목표를 달성하는 데 필요한 경우가 아니라면.


존경합니다, 로만.

 

그리고 더 추가하겠습니다. 왜냐하면 영어에 대한 자신감 있는 지식이 필요하기 때문입니다. 프로그램 코드에 대한 많은 주석이 있습니다. 나 자신은 프로그램 코드에 쓰여진 내용의 의미를 이해하기 위해 Google 번역을 사용합니다. 어렵지만 어디로 가야 할까요? 탈출구가 있긴 하지만 - 프리랜서 , 하지만 이것은 당신이 당신의 전략에 100% 이상 자신감을 갖는 조건입니다.

안부 인사를 전합니다. 블라디미르.

 
MrBrooklin :

그리고 더 추가하겠습니다. 왜냐하면 영어에 대한 자신감 있는 지식이 필요하기 때문입니다. 프로그램 코드에 대한 많은 주석이 있습니다. 나 자신은 프로그램 코드에 쓰여진 내용의 의미를 이해하기 위해 Google 번역을 사용합니다. 어렵지만 어디로 가야 할까요? 탈출구가 있긴 하지만 - 프리랜싱, 하지만 이것은 당신이 당신의 전략에 100% 이상 완전히 확신할 때 제공됩니다.

안부 인사를 전합니다. 블라디미르.

아니요, 프리랜서에는 필요에 따라 스스로 개발할 수 있는 아이디어를 컴파일하는 프로세스가 없습니다. 그리고 제 3자 프로그래머가 아닌 저 자신만이 제 실수에 대한 책임이 있습니다. 그러므로 공부하고, 공부하고, 코딩하고, 비틀거리고, 전략을 개선하고, 다시 공부하십시오.


존경합니다, 로만.

 
Роман Жилин :

아니요, 프리랜서에는 필요에 따라 스스로 개발할 수 있는 아이디어를 컴파일하는 프로세스가 없습니다. 그리고 제 3자 프로그래머가 아닌 저 자신만이 제 실수에 대한 책임이 있습니다. 그러므로 공부하고, 공부하고, 코딩하고, 비틀거리고, 전략을 개선하고, 다시 공부하십시오.


존경합니다, 로만.

동의한다! 그래서 노년에는 독학을 해야 했다.

안부 인사를 전합니다. 블라디미르.

 
MrBrooklin :

동의한다! 그래서 노년에는 독학을 해야 했다.

안부 인사를 전합니다. 블라디미르.

노년을 위해? 비밀이 아니라면 얼마에요? 그리고 왜 이 길을 선택하게 되었나요?

 

로만, 템플릿에 뭔가가 있습니다. 아마도 러시아어로 된 주석이 있는 기성 코드가 유용할 것입니다.

안부 인사를 전합니다. 블라디미르.

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

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

노년을 위해? 비밀이 아니라면 얼마에요? 그리고 왜 이 길을 선택하게 되었나요?

57 조금. 그리고 경로 에 대한 귀하의 질문에 대한 답변 이미 알고 있습니다.

로만 지린 :

아니요, 프리랜서에는 필요에 따라 스스로 개발할 수 있는 아이디어를 컴파일하는 프로세스가 없습니다. 그리고 제 3자 프로그래머가 아닌 저 자신만이 제 실수에 대한 책임이 있습니다. 그러니 공부하고, 공부하고, 코딩하고, 비틀거리고, 전략을 개선하고, 다시 공부하십시오."

안부 인사를 전합니다. 블라디미르.

 
MrBrooklin :

57 조금. 그리고 경로 에 대한 귀하의 질문에 대한 답변 이미 알고 있습니다.

로만 지린 :

아니요, 프리랜서에는 필요에 따라 스스로 개발할 수 있는 아이디어를 컴파일하는 프로세스가 없습니다. 그리고 제 3자 프로그래머가 아닌 저 자신만이 제 실수에 대한 책임이 있습니다. 그러니 공부하고, 공부하고, 코딩하고, 비틀거리고, 전략을 개선하고, 다시 공부하십시오."

안부 인사를 전합니다. 블라디미르.

오오오오오오오오오오오오오오오오오오오오오오오오오오오오오오오오 감사합니다.

막 출장을 떠나서 저에게 주어진 자료들을 더 깊이 파고들까 생각 중인데 코딩은 어떨지... 시트로도 가능하고 좋은 운동이 될 것 같아요...


존경합니다, 로만

 
MrBrooklin :

누가, 누구에게, 어디로, 어디로, 왜 돌아오는가 ?

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

함수는 특정 작업을 수행합니다. 작업이 다르며 일부에서는 기능의 결과가 일부 숫자의 형태로 획득되고 일부에서는 수치 결과가 제공되지 않습니다. 첫 번째 변형에서는 이 함수가 호출된 위치, 즉 = 기호가 있는 위치로 이 번호를 반환해야 합니다. 그리고 두 번째에서는 필요하지 않으므로 할당 없이 함수를 호출합니다 .

이 예에서 처음 세 함수는 값을 반환하지만 마지막 함수는 반환하지 않습니다. 그게 다야

 
Aleksei Stepanenko :

특정 작업을 해결하는 격리된 코드에는 함수가 필요합니다. 작업이 다르며 일부에서는 기능의 결과가 일부 숫자의 형태로 획득되고 일부에서는 수치 결과가 제공되지 않습니다. 첫 번째 변형에서는 이 함수가 호출된 위치, 즉 = 기호가 있는 위치로 이 번호를 반환해야 합니다. 그리고 두 번째에서는 필요하지 않으므로 할당 없이 함수를 호출합니다 .

이 예에서 처음 세 함수는 값을 반환하지만 마지막 함수는 반환하지 않습니다. 그게 다야

같은 작업을 여러 번 수행해야 하는 경우와 동시에 이 작업이 두 줄 이상의 알고리즘인 경우 함수가 필요합니다.