创建一个机器人 - 页 3 12345678 新评论 Роман Жилин 2020.09.26 14:54 #21 MrBrooklin:此外,我正在积极使用MQL5参考资料(MQL5文档 标签)中的信息。你几乎可以在其中找到所有的东西。这种模式的唯一大缺点是,它是为已经接受过其他编程语言基本训练的人编写的,但显然不适合初学者。例如,我仍然不明白不断出现的以"回报"开头的短语的意义。 帐户信息双倍 返回 相应账户属性的双倍类型的值 谁回来了,谁回来了,回到哪里去了,为什么回来了?我还是不明白。最好的问候,弗拉基米尔。 弗拉基米尔,我们迟早会搞清楚的)。如果有必要执行某项任务。 问候,罗曼。 MrBrooklin 2020.09.26 14:59 #22 我还想补充一点。你需要有自信的英语知识,因为程序代码上有很多英文注释。我自己用谷歌翻译来理解程序代码中所写的意思。这很难,但我没有选择。虽然有一条出路--自由职业者,但这只有在我对自己的战略完全有信心的情况下,才能做到100%或更多。 问候,弗拉基米尔。 Роман Жилин 2020.09.26 15:02 #23 MrBrooklin:我还想补充一点。你需要有自信的英语知识,因为程序代码上有很多英文注释。我自己用谷歌翻译来理解程序代码中所写的意思。这很难,但我没有选择。虽然有一条出路--自由职业者,但这只是在我对自己的战略完全有信心的情况下,以100%或更多的方式。真诚的,弗拉基米尔。 不,自由职业没有这个过程,你可以根据自己的需要自行发展。我只会为自己的错误负责,而不是为来自外部的程序员负责。因此,你将学习,学习,编码,跌跌撞撞,改善你的策略,并再次学习。 真诚的,罗曼。 MrBrooklin 2020.09.26 15:07 #24 Роман Жилин:不,自由职业者没有你写自己的孩子那样的过程,你可以按照自己的意愿发展。而且我的错误只会是我自己的错,而不是第三方程序员的错。因此,你将学习,学习,编码,跌跌撞撞,改善你的策略,并再次学习。真诚的,罗曼。 我同意!这就是为什么我不得不在晚年教育自己。 真诚的,弗拉基米尔。 Роман Жилин 2020.09.26 15:08 #25 MrBrooklin:我同意!这就是为什么我不得不在晚年接受自我教育。真诚的,弗拉基米尔。 在你的晚年?如果这不是一个秘密的话,你多大了?而你为什么决定走这条路? MrBrooklin 2020.09.26 15:13 #26 Roman,我在模板中有一些东西。也许一些带有俄语注释的现成代码会派上用场。最好的问候,弗拉基米尔。 //+------------------------------------------------------------------+ //| 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 () { //--- } //+------------------------------------------------------------------+ MrBrooklin 2020.09.26 15:20 #27 Роман Жилин:在你的晚年?如果这不是一个秘密,你多大了?而你为什么选择这条道路?57岁,有一点。而你关于路径 的问题, ,答案已经知道了,我引用一下。"Roman Zhilin: 不,自由职业者没有那个过程,你可以根据自己的需要自行发展。而要为我的错误负责的将是我自己,而不是第三方程序员。因此,你将不得不学习,学习,编码,跌跌撞撞,改进你的策略,再学习"。真诚的,弗拉基米尔。 Роман Жилин 2020.09.26 15:57 #28 MrBrooklin:57岁,有一点。而你关于 方式的 问题的答案已经知道了,我引用一下。"Roman Zhilin: 不,在自由职业中没有任何程序,你可以根据自己的需要自行发展。而要为我的错误负责的将是我自己,而不是第三方程序员。因此,你将不得不学习,学习,编码,跌跌撞撞,改进你的策略,再学习"。真诚的,弗拉基米尔。 哦,非常感谢你,有了这么多的信息,你可以完成很多事情...... 刚刚出差离开,我想深入研究我所得到的材料,但编码...我也可以在一张纸上做,这将是一个很好的培训工具...... 问候,罗曼 Aleksei Stepanenko 2020.09.26 17:02 #29 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) { //любой код, без возврата результата } 函数解决了某些问题。在某些情况下,函数的结果是一个数字,而在另一些情况下,没有数字结果。 在第一种情况下,我们需要将数字返回到函数被调用的地方,也就是有=符号的地方。在第二种情况下,这是没有必要的,所以我们在调用函数 时不进行赋值。 在这个例子中,前三个函数返回值,而最后一个函数不返回。事情就是这样的。 Renat Akhtyamov 2020.09.26 17:07 #30 Aleksei Stepanenko:对于解决某些问题的孤立的代码来说,需要函数。在某些情况下,函数的结果是一个数字,而在另一些情况下没有数字结果。 在第一种情况下,我们需要将数字返回到函数被调用的地方,即有=符号的地方。在第二种情况下,这是没有必要的,所以我们在调用函数 时不进行赋值。在这个例子中,前三个函数返回值,而最后一个函数不返回。事情就是这样的。 如果同样的事情需要做很多次,如果这个动作是一个以上的字符串的算法,就需要用到函数 12345678 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
此外,我正在积极使用MQL5参考资料(MQL5文档 标签)中的信息。你几乎可以在其中找到所有的东西。这种模式的唯一大缺点是,它是为已经接受过其他编程语言基本训练的人编写的,但显然不适合初学者。例如,我仍然不明白不断出现的以"回报"开头的短语的意义。
帐户信息双倍
返回 相应账户属性的双倍类型的值
谁回来了,谁回来了,回到哪里去了,为什么回来了?我还是不明白。
最好的问候,弗拉基米尔。
弗拉基米尔,我们迟早会搞清楚的)。如果有必要执行某项任务。
问候,罗曼。
我还想补充一点。你需要有自信的英语知识,因为程序代码上有很多英文注释。我自己用谷歌翻译来理解程序代码中所写的意思。这很难,但我没有选择。虽然有一条出路--自由职业者,但这只有在我对自己的战略完全有信心的情况下,才能做到100%或更多。
问候,弗拉基米尔。
我还想补充一点。你需要有自信的英语知识,因为程序代码上有很多英文注释。我自己用谷歌翻译来理解程序代码中所写的意思。这很难,但我没有选择。虽然有一条出路--自由职业者,但这只是在我对自己的战略完全有信心的情况下,以100%或更多的方式。
真诚的,弗拉基米尔。
不,自由职业没有这个过程,你可以根据自己的需要自行发展。我只会为自己的错误负责,而不是为来自外部的程序员负责。因此,你将学习,学习,编码,跌跌撞撞,改善你的策略,并再次学习。
真诚的,罗曼。
不,自由职业者没有你写自己的孩子那样的过程,你可以按照自己的意愿发展。而且我的错误只会是我自己的错,而不是第三方程序员的错。因此,你将学习,学习,编码,跌跌撞撞,改善你的策略,并再次学习。
真诚的,罗曼。
我同意!这就是为什么我不得不在晚年教育自己。
真诚的,弗拉基米尔。
我同意!这就是为什么我不得不在晚年接受自我教育。
真诚的,弗拉基米尔。
在你的晚年?如果这不是一个秘密的话,你多大了?而你为什么决定走这条路?
Roman,我在模板中有一些东西。也许一些带有俄语注释的现成代码会派上用场。
最好的问候,弗拉基米尔。
在你的晚年?如果这不是一个秘密,你多大了?而你为什么选择这条道路?
57岁,有一点。而你关于路径 的问题, ,答案已经知道了,我引用一下。
"Roman Zhilin:不,自由职业者没有那个过程,你可以根据自己的需要自行发展。而要为我的错误负责的将是我自己,而不是第三方程序员。因此,你将不得不学习,学习,编码,跌跌撞撞,改进你的策略,再学习"。
真诚的,弗拉基米尔。
57岁,有一点。而你关于 方式的 问题的答案已经知道了,我引用一下。
"Roman Zhilin:不,在自由职业中没有任何程序,你可以根据自己的需要自行发展。而要为我的错误负责的将是我自己,而不是第三方程序员。因此,你将不得不学习,学习,编码,跌跌撞撞,改进你的策略,再学习"。
真诚的,弗拉基米尔。
哦,非常感谢你,有了这么多的信息,你可以完成很多事情......
刚刚出差离开,我想深入研究我所得到的材料,但编码...我也可以在一张纸上做,这将是一个很好的培训工具......
问候,罗曼
谁回来了,回到谁那里去了,回到哪里去了,为什么回来了?
函数解决了某些问题。在某些情况下,函数的结果是一个数字,而在另一些情况下,没有数字结果。 在第一种情况下,我们需要将数字返回到函数被调用的地方,也就是有=符号的地方。在第二种情况下,这是没有必要的,所以我们在调用函数 时不进行赋值。
在这个例子中,前三个函数返回值,而最后一个函数不返回。事情就是这样的。
对于解决某些问题的孤立的代码来说,需要函数。在某些情况下,函数的结果是一个数字,而在另一些情况下没有数字结果。 在第一种情况下,我们需要将数字返回到函数被调用的地方,即有=符号的地方。在第二种情况下,这是没有必要的,所以我们在调用函数 时不进行赋值。
在这个例子中,前三个函数返回值,而最后一个函数不返回。事情就是这样的。