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版では埋めないようにしています。

この方法によって、私は初期化されていない変数を使うことから何度も救われました。

ここ、ハイライトされたループの中です。そして、私が話していたのは1つのアレイだけだったという事実にもご注目ください。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL5をゼロから独学で学ぶ

サン・アレックス さん 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 #:

その場で、ハイライトされたループの中に。そして、私が話していたのは1つのアレイだけだったという事実にもご注目ください。

はい、その通りです。私見では、通常の練習。

 
SanAlex #:

こちらはほぼ完成しています。あとは不要な非機能を削除するだけです。この多通貨 Expert Advisor は、この "MACD Sample.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);
  }
//+------------------------------------------------------------------+