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

 
mwwm:

どうすればいいのか?

どうやるんですか?
 
Artyom Trishkin:
どうやるんですか?
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &Op[], 
                const double &Hi[], 
                const double &Lo[], 
                const double &Cl[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
  { 
   ArraySetAsSeries(time,true); 
   ArraySetAsSeries(Op,true); 
   ArraySetAsSeries(Hi,true); 
   ArraySetAsSeries(Lo,true); 
   ArraySetAsSeries(Cl,true); 
//--- 
double mas[];
   if(prev_calculated==0) 
     { 
      int prices1=CopyOpen(Symbol(),0,0,Bars(_Symbol,_Period),Op);
      int prices2=CopyHigh(Symbol(),0,0,Bars(_Symbol,_Period),Hi); 
      int prices3=CopyLow(Symbol(),0,0,Bars(_Symbol,_Period),Lo); 
      int prices4=CopyClose(Symbol(),0,0,Bars(_Symbol,_Period),Cl); 
      int prices5=CopyTime(Symbol(),0,0,Bars(_Symbol,_Period),time); 

     } 
   else 
     { 

      int prices1=CopyOpen(Symbol(),0,0,1,Op);
      int prices2=CopyHigh(Symbol(),0,0,1,Hi); 
      int prices3=CopyLow(Symbol(),0,0,1,Lo); 
      int prices4=CopyClose(Symbol(),0,0,1,Cl);     
      int prices5=CopyTime(Symbol(),0,0,1,time);     
       }   
      for(int i=rates_total-1;i>=0 && !IsStopped();) {
      mas[i]=Op[i]/Cl[i];
      i--;
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+-------------------------------

簡略化すると、CopyOpenはOnCalculateには 不要と理解していますが、ターミナルウィンドウからしか履歴を見ないということでしょうか。

 
mwwm:

簡略化すると、OnCalculateにはCopyOpenは不要ですが、ターミナルウィンドウから履歴だけを見るように?

Array masはtick毎に0サイズで作成され、それ以外の場所ではサイズが変わりません。そのため、アクセスするとアレイオーバーランが発生します。

この問題を解決するには、すべてのヒストリーバーの読み取りを含むサイズにリサイズするか、インジケーターバッファ(プログラムのグローバル変数として 宣言されています)にバインドする必要があります。私の理解が正しければ、これらの値はインジケータを使用して表示されるはずです。

 
mwwm:

簡略化すると、CopyOpenはOnCalculateには余計だと理解していますが、ターミナルウィンドウからしか履歴を見ないようにするため?

//+------------------------------------------------------------------+
//|                                                         Test.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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "Open/Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         BufferOC[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Задаём массив BufferOC как буфер индикатора
   SetIndexBuffer(0,BufferOC,INDICATOR_DATA);
//--- Устанавливаем ему направление индексации как у таймсерии
   ArraySetAsSeries(BufferOC,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Проверка на минимальное колиество баров для расчёта
   if(rates_total<1) return 0;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1) // если это первый запуск, или изменение истории, или открытие нового бара
     {
      limit=rates_total-1;                   // установим начало цикла на начало исторических данных
      ArrayInitialize(BufferOC,EMPTY_VALUE); // инициализируем массив
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(close[i]==0) continue;
      BufferOC[i]=open[i]/close[i];
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Ihor Herasko:

mas配列はtick毎に0サイズで作成され、それ以外の場所ではサイズを変えません。したがって、これを参照すると、配列から抜けることになります。

この問題を解決するには、すべてのヒストリーバーの読み取りを含むサイズにリサイズするか、インジケーターバッファ(プログラムのグローバル変数として 宣言される)にバインドする必要があります。私の理解が正しければ、インジケータを使って表示しなければならないのは、これらの値です。

私のミスです、mas[]は本当はグローバル配列であるべきですが、インジケータバッファも適当ではなく、むしろ中間の多次元配列になるでしょう。インジケーターバッファ経由ではなく、M5に最適なアレイサイズを決定する方法は?

 
mwwm:

私の不手際で、mas[]は本当はグローバル配列なのですが、indicator bufferも適当ではなく、むしろ中間の多次元配列になるのでしょう。M5で最適なアレイサイズを決定する方法として、インジケーターバッファではなく、どのような方法があるのでしょうか?

多次元というのがよくわからない。ここでは一次元の配列について述べています。また、MQL4では、配列の最大次元は4です。

配列のサイズをタイムシリーズと同じにするには、必要なシンボルと期間のチャートで利用可能なバーの数 に応じてサイズを変更する必要があります。

double fArray[];
int nBarsCnt = iBars(<символ>, <таймфрейм>);
if (ArrayResize(fArray, nBarsCnt) != nBarsCnt)
{
   // Не удалось изменить размер массива
   return;
}

ArraySetAsSeries(fArray, true);
 
mwwm:

私の不手際で、mas[]は本当はグローバル配列なのですが、indicator bufferも適当ではなく、むしろ中間の多次元配列になるのでしょう。M5の最適なアレイサイズを決定する方法として、インジケーターバッファではなく、どのような方法があるのでしょうか?

なぜ、インジケータ・バッファとして配列を使いたくないのでしょうか?これらはサブシステムで監視されているので、仕事がしやすくなります。

そして、中間指標となるバッファ配列も簡単です。

SetIndexBuffer(1,BufferMA,INDICATOR_CALCULATIONS);
 

こんにちは。

プラットフォーム上の出来高はティック出来高ですが、リアル出来高になるのでしょうか?

 
Олег Литинский:

こんにちは。

プラットフォーム上ではボリュームがカチカチになっていますが、実際のボリュームはどうなるのでしょうか?

それはないでしょう。MT5を使用し、いくつかのブローカーはそこで実際のボリュームを提供しています。

 

こんにちは。

以下の問題について、ご教示ください。

1)いくつかの条件が満たされた後、注文が 開始されます。

{
price=High[1]+OrderPoint*Point;
stoploss=Low[1]-Point;
takeprofit=price+price-stoploss;
OrderSend(Symbol(),OP_BUYSTOP,1,price,3,stoploss,takeprofit);
}

価格がストップロス(この保留中の注文の)を既に通過している場合、保留中の注文を追加し、削除する場所を教えてください。

回答を探しているうちにフォーラムに迷い込んでしまい、くだらない質問で申し訳ありません。

ありがとうございました。