記事"デルタインジケータの例によるボリュームコントロールを特徴とする株式インジケータの開発"についてのディスカッション - ページ 9

 
Aleksey Vyazmikin:

オープン・インタレストを例にとれば、このようなコードを考えていたのですか?

取引デルタ、私は私たちの対話が行われているスレッドで、インジケーターを参照しています。

つまり、これらのデルタをフローティング・ウィンドウ(たとえば直近の100件)または昇順(特定の日付からn+1、たとえば当日の開始日から)で、どの期間についてまとめるのですか?なぜこの期間なのか?

そう、このコードはおよそであれば、* 100。これはロボットに適している。

私は異なる戦術のためのウィンドウの数を持っている。このようなものです:


 

先物が最接近すると同時に活発に取引され始める(一部の市場では、6B,6E,RB,CL,GCのようにグローバルに資産価格を決定する)と仮定すると、デルタはこの日付の初めから要約されるべきである。

株式のデルタを扱う場合、起点を決定するのははるかに困難です。現実には、(ClusterDelta のような)ほとんどのシステムは、例えば 90 バーのような固定の移動窓を取ります。 しかし、注意深く考えるならば、例えば 30 日間のような、過去のある極端な価格を基準として取る方が正しいでしょう。

 

コジツィンさん、

これは今までで最高のデルタ・インディケータです。

デルタの売り買い(ヒストグラムのバーの大きさを比較するのがベスト)の色を変えて、正の値だけをプロットするように修正しようとしましたが、うまくいきませんでした。

もう一つの質問ですが、水平ヒストグラムの代わりに垂直ヒストグラムをプロットすることは可能ですか?https://www.mql5.com/ja/articles/2714 を使って 垂直ヒストグラムをプロットしようとしたのですが、どの値もプロットされませんでした。実際、垂直ヒストグラムにボリュームの値をプロットしようとしたのですが、ボリュームのどのキングもプロットされませんでした(NormalizeDoubleを使って longからdoubleに変換しています)。

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

Statistical distributions in the form of histograms without indicator buffers and arrays
Statistical distributions in the form of histograms without indicator buffers and arrays
  • www.mql5.com
Histograms allow researchers to visually evaluate the distribution of statistical data grouped by the frequency of their penetration into a certain (predetermined) interval. Histograms and their use in the statistical data analysis are a well-studied topic with multiple articles devoted to it [1, 2, 3, 4, 5, 6, 7] and a large number of CodeBase...
削除済み  
frcardim:

コジツィンさん

おめでとうございます!これは今までで最高のデルタインジケータです。

ありがとう!

デルタの売り買い(ヒストグラムのバーの大きさを比較するのに最適なもの)の色を変えて、正の値だけをプロットするように修正しようとしましたが、うまくいきませんでした。

DisplayValues()関数を この関数に置き換えてください:

//+------------------------------------------------------------------+
//| Отображение значений индикатора|
//+------------------------------------------------------------------+
void DisplayValues(const int index,// Номер свечи
                   const long sumVolBuy,// Суммарный объем покупок
                   const long sumVolSell,          // Суммарный объем продаж
                   const int line                  // Номер строки вызова функциии
                   )
  {
//--- Проверяем корректность номера свечи
   if(index<0) // Если некорректный номер
     {
      Print(__FUNCTION__,":ОШИБКА!Некорректный номер свечи '",index,"'");
      return;                                       // Выходим
     }
//--- Рассчитаем дельту
   const double delta=double(sumVolBuy-sumVolSell);
//--- Заносим значения в буферы
   //bufDelta[ index ]= delta;                       // Записываем значение дельты
   bufDelta[ index ]= (delta>0) ? delta : -delta;  // Записываем значение дельты
   bufDeltaColor[ index ] =(delta>0) ?  0 : 1;     // Записываем цвет значения
   bufBuyVol[ index ] = (double)sumVolBuy;         // Записываем суму покупок
   bufSellVol[ index ]=(double)sumVolSell;         // Записываем сумму продаж
  }

もう一つの質問ですが、水平ヒストグラムの代わりに垂直ヒストグラムをプロットすることは可能ですか?

このインジケータでは不可能です。
 

コジツィンさん、


まずはおめでとうございます!素晴らしい、素晴らしい、素晴らしい仕事だ!これこそ私が求めていたものです。

しかし、このインジケーターは私の願望の半分です。デルタの 上にボリンジャーバンドを描いて、資金の流れが通常の動きよりも大きいところを表示したいのです。試してみたのですが、同じウィンドウでボリンジャーバンドのラインを見ることができませんでした。助けていただけませんか?

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


ロドリゴ・ピメンタ

削除済み  
rpimentaf:

助けていただけますか?

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


ロドリゴ・ピメンタ

申し訳ありませんが、私はBBと仕事をしていません。

Freelanceをご利用ください。

 
Alexey Kozitsyn:

一般的に、ダニとガラスを使った我々のマーケットでは、とてもクールなことができる。

私もそう思う。私はデルタをずっと見てきた

素晴らしいインジケーターをお持ちですね!

私は1分足以下のタイムフレームでデルタを見ていますが、価格が現地の高値をブレイクし、ストップ(青いデルタ)の代わりに市場の売りがあるときです。通常、このような仕掛けの後、価格は修正されます。

写真

まあ、そんな感じだ。

私の質問は違います。最近、インジケーターの書き方を勉強し始めたんだ。科学的な方法とコピーペーストを使って、少しずつマスターしています。

デルタ・ダイバージェンスのインジケーターを書きたいと思いました。これはAPバーのデルタ売り(赤)とダウンバーの青デルタのコードです。

あなたのインジケータの助けを借りて、iCustomを通して私のインジケータは正常に動作します。

しかし、私は勉強中なので、自分のインジケーターを書きたいと思っています。もう3日目ですが、なかなか動いてくれません。もし難しくなければ、何がエラーなのか教えてください。

デルタを求めるロジックは以下の通りです:現在のバーのデルタは必要ないので、CopyTicksをコピーするときのティック数として、前のバーのOnCalculate, tick_volume[] , のティックボリュームを使ってデルタを計算できると判断しました。メタエディタはコンパイルしてくれますが、tick volume longでは異なるデータ型を使っていて、CopyTicksではuintでティック数を指定する必要があるという警告が出ます。 コピー開始時刻は同じtime[]で取得しています、

テスターでテストすると、"Array out of range "というエラーが出ます。どの限界を超えているのか、何をどう変更すればインジケーターが動作しないのか判断できませんが、少なくともこのエラーを取り除くことはできます。

これが加算器のコードです。あまり笑わないでください。

#property indicator_chart_window 
#property indicator_buffers 5 
#property indicator_plots   1
  
#property indicator_label1  "Diver_handl" 
#property indicator_type1   DRAW_COLOR_CANDLES 
//--- キャンドルを塗る色を2色設定する(カラーバッファに格納される) 
#property indicator_color1  clrRed,clrBlue
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 // ここではあまり必要ない。

//--- 入力パラメータ 
//--- インジケータ・バッファ
double         ColorCandlesBuffer1[];//キャンドル・バッファ
double         ColorCandlesBuffer2[];
double         ColorCandlesBuffer3[];
double         ColorCandlesBuffer4[];
double         ColorCandlesColors[]; // カラーバッファ

string symbol;  //--- キャラクター名 
double _Delta;
//+------------------------------------------------------------------+ 
//| カスタムインジケータ初期化関数 
//+------------------------------------------------------------------+ 
int OnInit()
  {
//--- インジケータ・バッファのマッピング 
   SetIndexBuffer(0,ColorCandlesBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorCandlesBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorCandlesBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,ColorCandlesBuffer4,INDICATOR_DATA);
   SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX);
   
//--- 空の値(描画されない値) 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   
//--- バーが描かれるシンボルの名前 
   symbol=_Symbol;
   
//--- シンボル表示の設定 
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
   IndicatorSetString(INDICATOR_SHORTNAME,"Diver("+symbol+")");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+ 
//| カスタム・インジケータ反復関数 
//+------------------------------------------------------------------+ 
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[])
  {
   int i,limit;
   int buf_size=rates_total-prev_calculated;
   if(rates_total<2)
      return(0);

   if(prev_calculated<3)
     {
      limit=1;
      // 配列を空の値で初期化する
      ArrayInitialize(ColorCandlesBuffer1,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer2,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer3,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer4,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesColors,EMPTY_VALUE);
     }
   else limit=rates_total-1;

   MqlTick Ticks[];   //ティックデータを格納する配列を宣言する。
   
   for(i=limit; i<rates_total-1; i++)
     {
      CopyTicks(Symbol(),Ticks,COPY_TICKS_TRADE,0,tick_volume[i]);  // ローソク足のティック・ボリュームに等しい量のティック・データをTicks配列にコピー tick_volume[i]
      SetBarData(time[i],Ticks,i,_Delta,tick_volume[i]);地下の//関数

      if(open[i-1]<close[i-1] && _Delta<0)
        {
         ColorCandlesBuffer1[i-1]=open[i-1];
         ColorCandlesBuffer2[i-1]=high[i-1];
         ColorCandlesBuffer3[i-1]=low[i];
         ColorCandlesBuffer4[i-1]=close[i];
         ColorCandlesColors[i-1]=1;
        }
      else if(open[i]>close[i] && _Delta>0)
        {
         ColorCandlesBuffer1[i-1]=open[i-1];
         ColorCandlesBuffer2[i-1]=high[i-1];
         ColorCandlesBuffer3[i-1]=low[i];
         ColorCandlesBuffer4[i-1]=close[i];
         ColorCandlesColors[i-1]=0;
        }
      else
        {
         ColorCandlesBuffer1[i]=0.0;
         ColorCandlesBuffer2[i]=0.0;
         ColorCandlesBuffer3[i]=0.0;
         ColorCandlesBuffer4[i]=0.0;
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
// 適切なティックでバーを埋める
void SetBarData(const datetime TimeBar,const MqlTick &Ticks[],int &Pos,double &Delta,const long vol)
  {
  int i=0;
   while(i<vol)
     {
      MqlTick Tick=Ticks[Pos];  // 刻みデータ・バッファの読み取り値を変数にコピーする
      if(i>=vol)
         break;   // iのサンセットがティック・ボリュームに等しいとき † vail
      if((bool)(Tick.flags  &TICK_FLAG_BUY))  // フラグが「買い」の場合、デルタに追加する。
         Delta+=(double)Tick.volume;
      else if((bool)(Tick.flags  &TICK_FLAG_SELL)) // フラグがSellの場合、デルタから減算する。
         Delta-=(double)Tick.volume;
      i++;
     }
   return;
  }
//+------------------------------------------------------------------+
たくさん実験したので、宣言されたけど使われていない変数という形で、以前の実験からのアーティファクトがあるかもしれない。
削除済み  
s22aa:

差し支えなければ、エラーの内容を教えてください。

一目見ただけでは正確なエラー箇所はわかりませんが、手始めに私のインジケーターでCopyTicks()がどのように処理されているかを見てください。特に、値の戻り 値と起こりうるエラーの処理です。

はい、配列のオーバーランが発生したら...配列にいくつの値があり、どの要素にアクセスしているかを見てください。また、データを受信した後、最初と最後の値のペイントを解除して、すべてのデータが受信されたかどうかを確認することもできます。

 
Alexey Kozitsyn:

私のインジケーターでCopyTicks()がどのように処理されているかを見てください。

うわぁ、複雑だ。ティックは時間間隔と番号の両方でコピーされます。一般的に、システムはコスモナウトよりも悪くない複製されます)))

どこでやったかわかりました。

MqlTick Tick = Ticks[Pos];

配列を変数にコピーしようとしている。なぜかコンパイラが反応せず、テスターで実行するとテスターがハングアップするのが不思議です。

何か他の方法を考えてみます。
 
s22aa:

配列を変数にコピーしようとしています。


いいえ、そうではありません。その通りだ。完全に混乱してる。明日はもっといい朝を迎えられそうだ。明日はきっとうまくいく