从头开始自学MQL5语言 - 页 84

 
Georgiy Merts #:

这就是我要说的!

而你说'没有人见过'。没有人感兴趣--所以没有人看过(小丑们不感兴趣--他们没有看过)。那些有兴趣的人--他们已经看到了。

向版主发送了对该小丑的投诉,并将这样做,直到你被禁。
 
Vladimir Baskakov #:
向版主发送了关于这个小丑的投诉,并将这样做,直到你被禁止。

哦,用他的光屁股吓唬刺猬......。

 
Georgiy Merts #:

哦,用他的光屁股吓唬刺猬......。

我不着急。
 
Georgiy Merts #:

我看不出有什么问题。

对。填充的数组被声明,然后--它被再次填充,用其他数据。在我看来,对于一个初学者来说,这是一个相当可以接受的错误。

而这是一个错误吗?

当我声明变量和数组时,我必须立即填满它们。如果在声明的那一刻,确切的价值是未知的,我就用明知无效的价值来填补它。如果一个变量在没有初始化的情况下被声明,然后被使用,它可能包含随机值,这些随机值将在工作中被使用,而这个工作的结果将是不正确的,而且很难发现问题(我已经不止一次发现)。

但如果一个变量在创建时就被初始化为无效值,在使用未初始化变量的情况下,将立即发现它包含一些垃圾,很容易找到它的来源,并发现该变量是在没有初始化的情况下使用的。

因此,我个人认为,声明一个已经填充的数组是很好的做法。但我们应该在那里采取WRONG_VALUE值。

我一点也不反对初始化变量甚至数组。例如,像这样

int ExtHandle[21] = {};

也将是一个初始化的数组。但在这种情况下,即使这样做也是没有必要的,因为整个数组在OnInit()中已经被填充。所以我认为没有任何必要。甚至皮诺曹和他的苹果在这里也不起作用,因为在使用(读取)数值之前,它们已经被初始化了。

 
Alexey Viktorov #:

我一点也不反对初始化变量,甚至数组。例如,像这样

也将是一个初始化的数组。但在这种特殊情况下,即使这样做也是没有必要的,因为在OnInit()中,整个数组都被填充了。所以我认为没有任何必要。甚至皮诺曹和他的苹果在这里也不起作用,因为在使用(读取)数值之前,它们已经被初始化了。

呃...那么它将在哪里被 "初始化"?根据代码,这样的数组将被填满垃圾。

在我看来,正如我已经说过的,在创建时用非无效的值进行初始化是很好的做法。

int ExtHandle[3] = {WRONG_VALUE;WRONG_VALUE;WRONG_VALUE};

当然,如果数组很大--用这种方法填充它是不合理的,在这种情况下,我使用DEBUG版本,在这个版本中,我用非无效值填充大数组,而在RELEASE版本中,没有填充。

这种做法多次使我免于使用未初始化的变量。

 
SanAlex #:

你在代码中的名字--你设置的代码我在你的名字下创建,以了解。但这并不奏效。


那么,谁该为你的坏手负责呢?

在图片上你可以看到,计算值是9.08253,转换后是9.08,不要告诉我小数点后16位中的1。

还有,如果你得到一个小于最小体积的值

我不得不输入另一个变量来显示...

 
Georgiy Merts #:

呃...那么它在哪里会被 "初始化 "呢?根据代码,这样的数组将充满了垃圾。

在我看来,在创建时用无效的值进行初始化是很好的做法,我已经说过了。

当然,如果数组很大--用这种方法填充它是不合理的,在这种情况下,我使用DEBUG版本,在这个版本中,我用非无效值填充大数组,而在RELEASE版本中,没有填充。

这种做法多次使我免于使用未初始化的变量。

就在这里,在突出显示的循环中。并注意到一个事实,即我只是在谈论一个阵列。

关于交易、自动交易系统和策略测试的论坛

在MQL5中从头开始自学

SanAlex, 2021.11.29 07:17

我不明白你在说什么。我亲手做的。你是什么意思?代码来自终端,但方式本身,如何实现在测试器中打开几对,我个人实现了这个结果。

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

告诉我,我在哪里从你那里拿了代码。

//+------------------------------------------------------------------+

//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\Trade.mqh>
//---
CTrade ExtTrade;
//+------------------------------------------------------------------+
input double MaximumRisk        = 0.02; // Maximum Risk in percentage
//---
int    ExtHandle[]= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
double LotsRisk[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
string symb_name[]= {"EURUSD","GBPUSD","USDCHF","USDJPY","USDCAD","AUDUSD","AUDNZD",
                     "AUDCAD","AUDCHF","AUDJPY","CHFJPY","EURGBP","EURAUD","EURCHF",
                     "EURJPY","EURNZD","EURCAD","GBPCHF","GBPJPY","CADCHF","GBPAUD"
                    };

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ExtTrade.SetExpertMagicNumber(0);
   ExtTrade.SetMarginMode();
//---
   for(int i=0; i<20; i++)
     {
      ExtTrade.SetTypeFillingBySymbol(symb_name[i]);
      //--- Moving Average indicator
      ExtHandle[i]=iMA(symb_name[i],_Period,12,6,MODE_SMA,PRICE_CLOSE);
      if(ExtHandle[i]==INVALID_HANDLE)
        {
         printf("Error creating MA indicator");
         return(INIT_FAILED);
        }
     }
//---
   return(INIT_SUCCEEDED);
  }


我已经删除了代码中与我们的对话无关的所有内容。嗯,几乎所有的东西...

 
Alexey Viktorov #:

就在那里,在突出显示的循环中。并注意到一个事实,即我只是在谈论一个阵列。

是的,这是正确的。在我看来,这是正常的做法。

 
SanAlex #:

这个几乎已经准备好了--我只需要删除不必要的非功能性功能。这个多货币专家顾问来自这个 "MACD样本.mq5"

我似乎已经删除了所有不必要的东西,以便它能够工作。我必须把它打磨得有滋有味,然后我再把它贴在这里。

屏幕截图 2021-11-29 155519

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

这是我目前得到的情况--也许有人会做得更好

附加的文件:
00001_Mult.mq5  15 kb
 
Alexey Viktorov #:

我真的希望这不是你写的...。

这里有一个工作函数

你所要做的就是输入风险大小,不从全额自由保证金中计算...

大家今天好,心情好

我花了很长时间来理解和研究数组,但我已经有了结果,因为我自己写了计算12个货币对的风险的函数代码。

问候,弗拉基米尔。

//+------------------------------------------------------------------+
//| Входные параметры советника                                      |
//+------------------------------------------------------------------+

input double   Risk0=1.0;           //Риск для валютной пары EURUSD (% от баланса)
.
.
.
.
input double   Risk11=1.0;           //Риск для валютной пары EURJPY (% от баланса)

//+------------------------------------------------------------------+
//| Функция Money_Management рассчитывает размер лота в зависимости  |
//| от риска, заданного во входных параметрах советника.             |
//+------------------------------------------------------------------+
double Money_Management()
  {
//--- объявляем динамический массив
   double risk[];
//--- устанавливаем размер массива
   ArrayResize(risk,12);
//--- заполняем массив значениями риска
   ArrayFill(risk,0,1,Risk0);
   ArrayFill(risk,1,1,Risk1);
   ArrayFill(risk,2,1,Risk2);
   ArrayFill(risk,3,1,Risk3);
   ArrayFill(risk,4,1,Risk4);
   ArrayFill(risk,5,1,Risk5);
   ArrayFill(risk,6,1,Risk6);
   ArrayFill(risk,7,1,Risk7);
   ArrayFill(risk,8,1,Risk8);
   ArrayFill(risk,9,1,Risk9);
   ArrayFill(risk,10,1,Risk10);
   ArrayFill(risk,11,1,Risk11);
//---
   double price=0.0;
   double margin=0.0;
   double MaximumRisk=risk[11]/100;
//---
   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
      return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
      return(0.0);
   if(margin<=0.0)
      return(0.0);
//---
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//---
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);
//---
   if(lot<min_volume)
      lot=min_volume;
   if(lot>max_volume)
      lot=max_volume;
   return(lot);
  }
//+------------------------------------------------------------------+