MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 846

 
erotin:

ロットの配給のどこが悪いのか、教えてください。

すべてが間違っている。EAが通過すべきチェックとは...」という記事を読む。そこには、既成の機能がある。

 

空のテンプレートを作成し、iCustom()関数に必要なものを準備しました。

気になるiCrossADのインジケータを関数に入れました。

この関数は動作し、一番外側の上矢印と下矢印のインデックスを正しく見つけますが、これらの矢印が設定された価格値が間違っています。

コードは短いので、ここに書いておきますが、念のため、このアドバイザーとインジケーターのファイルを添付しておきます。

//+------------------------------------------------------------------+
//|                                             TestDoEasyPart08.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property description ""
#property strict
//--- includes
#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---
input string               Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD";//----- "Внешние параметры индикатора iCrossAD" -----

input uint                 InpPeriodFind           = 400;                 // Bars for calculate
input uint                 InpUnheckedBars         = 2;                   // Unchecked bars
input uint                 InpPeriodIND            = 21;                  // CCI period

//--- global variables

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

uint            period_find = InpPeriodFind;       //Number bars for calculate

int            CrossAD;                           //Хэндл индикатора iCrossAD

double         Buf_Arrow_Sell[],                  //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
               Last_Arrow_Sell_volume,            //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
               Last_Arrow_Sell_index;             //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossAD
               
double         Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(Buf_Arrow_Buy, true);
   ArraySetAsSeries(Buf_Arrow_Sell, true);
//---
   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- delete objects
   ObjectsDeleteAll(0,"",-1);
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int n=0;
   
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!MQLInfoInteger(MQL_TESTER))
      engine.OnTimer();
  }
ファイル:
iCrossAD.mq5  49 kb
 

Experts」タブのログエントリーはこのようになっています。

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0.

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0

2019.05.20 15:11:16.798 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

2019.05.20 15:11:16.798 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0


 
Sergey Voytsekhovsky:

Experts」タブのログエントリーはこのようになっています。

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0.

矢印が作成された価格=-11211905.17483469の代わりに



 

Sergey Voytsekhovsky:

...

代わりに矢印が作成された価格 = -11211905.17483469

Ctrl+Dを押して、インジケーターの線に沿って マウスを動かし、データウィンドウでそのバッファの持つ値を確認します。

 
Artyom Trishkin:

Ctrl+Dを押して、インジケーターの線に沿って マウスをドラッグし、データウィンドウでそのバッファがどのような値を持っているかを見てください。

私の理解が正しければ、私はそこにいない猫を部屋の中で探していたのでしょうか?配列には価格ではなく、その時のインジケーターの値が格納されていたのですね。ありがとうございます、考え直します。

最後の質問ですが、コンパイラは2つの警告を出します。


sign mismatch Test_iCustom.mq5 79 20

sign mismatch Test_iCustom.mq5 92 20


その理由がわからないのですが、教えてください。符号の不一致」(Yandex翻訳機)の意味とは?


 
Sergey Voytsekhovsky:

私の理解が正しければ、私はそこにいない猫を部屋の中で探していたのでしょうか?配列には価格ではなく、その時のインジケーターの値が格納されていたのですね。ありがとうございます、考え直します。

最後の質問ですが、コンパイラは2つの警告を出します。


sign mismatch Test_iCustom.mq5 79 20

sign mismatch Test_iCustom.mq5 92 20


その理由がわからないのですが、教えてください。符号の不一致」(Yandex翻訳機)とはどういう意味ですか?


ナンバーサインをなくしてしまうかもしれません。これらのコード行を表示します。

 
Artyom Trishkin:

ナンバーサインをなくしてしまうかもしれません。これらのコード行を表示します。

for(n=0; n<period_find; n++)
2つ目も全く同じです(Arrows配列で0以外の値を探すループ)。
 
Sergey Voytsekhovsky:
2つ目も全く同じです(配列「Arrows」で0以外の値を探すループ)。

変数nと period_findの 型は何ですか? 最も重要なことは、彼らが見せなかった...。

試してみてください。

for(n=0; n<(int)period_find; n++)

OnTick()ハンドラのレベルでループ変数を宣言しているのはなぜですか?

こんなやり方もあるんですね。

for(int n=0; n<(int)period_find; n++)

OnTick() から n 宣言は削除できます。

 
Artyom Trishkin:

変数nとperiod_findの型は何ですか?最も重要なことで、表示されないのは...。

uint            period_find = InpPeriodFind;       //Number bars for calculate
int             n=0;