MetaTrader 5をダウンロードする

通貨バスケットをトレードするときに利用可能なパターン。 パート2

24 4月 2017, 09:19
Andrei Novichkov
0
559

イントロダクション

通貨バスケットでトレードする際に出現するパターンに関する前回の記事では、オシレーターに基づく複合インジケータに着目しました。 結合されたウィリアムズのパーセント範囲インジケーターを例として使用しました。結果として, パターンの長所と短所を分析し、実際の取引でそれらの適用性について結論付けました。

しかし、これでは十分ではありません。 オシレーターに基づくインジケーターは、通貨バスケットを評価するために技術的な分析を適用したいすべてのトレーダーのニーズをカバーすることはできません。 トレーダーのツールキットは、独自のパターンを持つ複合トレンドのインジケーターで強化することができます。 これらを検討した後にやっと、技術的なツールのセットを検討することができます。

問題を解決するためのテストインジケーターを開発しましょう。 すでにこのタスクは一度しているので、最小限の変更で、以前の記事からコードを引用することができます。 しかし最初に、結合されたインジケーターの特徴を考慮するべきである。 以前の記事で使った用語を使用します。


トレンドインジケーターの特徴

特定の制限によって、トレンドインジケーターを親のトレンドインジケータに基づいて表示することはできません。

制限 # 1。 結合されたインジケーターは、別のウィンドウに配置する必要があります。 このインジケーターを [価格チャート] ウィンドウに表示することに意味はありません。 平均化の原理は、結合されたインジケーターを構築するために使用されるので、その場合に何を表示するかは明らかではありません。 その上、適用された測定単位は図表で使用されるものと異なっています。 したがって、移動平均、ボリンジャーバンドバンド、およびその他のチャートインジケータは親インジケータとして使用することはできません。

制限 # 2。結合されたインジケータは、1つの通貨のみのステータスを示します。したがって、現在のペアステータスを表示するには、2つの複合インジケーターが必要です。 ぞれが別々のウィンドウに配置されているため、2つのウィンドウが必要です。 この理由は、スケールの違いです。 オシレーターに基づく複合インジケータは、あらかじめ定義された制限内で常に変化します。 しかし、トレンドのものではありません。 事前に最大値、または最低額は知られていません。 2つの組み合わせインジケーターの測定値に適用される移動平均を含む前述のメソッドは無意味であることを意味します。 このような計算は、トレンドインジケーターを組み合わせる場合には適していません。

親インジケーターリストの制限によって、トレンドに従ったインジケーターの組み合わせが最大限に使用されるのを防ぎます。 たとえば、ADX と 標準偏差 は、MT5メニューのトレンドインジケーターに適しています。

しかし、これはタスクを放棄する理由ではありません。 すでに知っている組み合わせのインジケーターを使用します。-バスケット通貨インデックス。


移動平均のバスケット通貨インデックス

ここで説明したような URtestIndexMA.mq5 テストインジケータを開発し、移動平均を追加します。

//+------------------------------------------------------------------+
//|                                                 testDistance.mq5 |
//|                                   2016 MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
input color   clr= clrGreen;
input color   clrMA = clrMagenta;
input int maperiod  = 10; //MA期間
double ind[],ma[];
//+------------------------------------------------------------------+
//カスタムインジケーター初期化関数                                       |
//+------------------------------------------------------------------+
//nt h, h1;
int()
  {
//---インジケーターバッファマッピング
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);        
  
   IndicatorSetString(INDICATOR_SHORTNAME,"testdistance");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,clr);
   PlotIndexSetString(0,PLOT_LABEL,"_tstdistance_");    
   ArraySetAsSeries(ma,true);  
   SetIndexBuffer(1,ma);
   PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE           );
   PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_SOLID            );
   PlotIndexSetInteger(1, PLOT_LINE_WIDTH, 1            );
   PlotIndexSetInteger(1, PLOT_LINE_COLOR, clrMA            );
   PlotIndexSetString (1, PLOT_LABEL, "_tstdistance_MA" );        
//---
   return(INIT_SUCCEEDED);
  }
  
string pair[]={"EURUSD","GBPUSD","AUDUSD","NZDUSD","USDCAD","USDCHF","USDJPY"};
bool bDirect[]={false,false,false,false,true,true,true};
int iCount=7;
  
double GetValue(int shift)
  {
   double res=1.0,t;
   double dBuf[1];
   for(int i=0; i<iCount; i++)
     {
      t=CopyClose(pair[i],PERIOD_CURRENT,shift,1,dBuf);
      if(!bDirect[i]) dBuf[0]=1/dBuf[0];
      res*=dBuf[0];
     }//end for (int i = 0; i < iCount; i++)
   return (NormalizeDouble(MathPow (res, 1/(double)iCount), _Digits) );  
  }  
//+------------------------------------------------------------------+
//カスタムインジケーター反復関数                                         |
//+------------------------------------------------------------------+
intoncalculate(const int rates_total、
                constint 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(prev_calculated==0 || rates_total>prev_calculated+1)
     {
      int rt=rates_total;
      for(int i=1; i<rt; i++)
        {
         ind[i]= GetValue(i);
        }
         rt -= maperiod;  
         for (int i = 1; i< rt; i++)
           {
            ma[i] = GetMA(ind, i, maperiod, _Digits);
           }        
     }
   else
     {
         ind[0]= GetValue(0);
          ma[0] = GetMA(ind, 0, maperiod, _Digits);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
void OnDeinit(const int reason)
  {
   string text;
   switch(reason)
     {
      case REASON_PROGRAM:
         text="Indicator terminated its operation by calling the ExpertRemove() function";break;
      case REASON_INITFAILED:
         text="This value means that OnInit() handler "+__FILE__+" has returned a nonzero value";break;
      case REASON_CLOSE:
         text="Terminal has been closed"; break;
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
     }
   PrintFormat("%s",text);
  }
//+------------------------------------------------------------------+
double GetMA(const double& arr[], int index , int period, int digit) {
   double m = 0;
   for (int j = 0; j < period; j++)  m += arr[index + j];
   m /= period;
   return (NormalizeDouble(m,digit));
        }
この一連のエントリーデータを使用すると、インジケーターは短期移動平均を使用して usd インデックスをプロットします。 次のメソッドでライン49と50を変更します。

string pair[]={"EURUSD", "EURJPY", "EURCHF", "EURGBP", "EURNZD", "EURCAD", "EURAUD"};
    bool bDirect[]={true,true,true,true,true,true,true};
URtestIndexMA2.mq5 でコンパイルを繰り返します。 その結果、ユーロ指数を示す同様のインジケーターが得られました。 EURUSD h1 に配置します。





絶対的なインジケーターの値には意味がありません。 潜在的な相場参入ポイントで MAインジケーターのクロスを数えてみましょう。 以前の記事で述べたように、ロウソク足クロージャーで固定する必要があります。 垂直線で検出されたエントリポイントをマークします。つまり、青色で買い、赤で売り。 ポジティブな結果は明白です。 ただし、利益は小さく、不安定で、収益性を高めることが必要です。 最初に、ドルインデックスインジケーターを追加します。


垂直線でMAとUSDのインデックスのグラフのクロスを見てみましょう。 結果を分析します。

  • 同じような (逆の性質の) クロスが通貨の第2組で検出されれば、トレンドの逆転の可能性が高いでしょう。 たとえば、EURUSDの場合、もしUSDがMAと上にクロスすれば、EURはMAと下にクロスするはずです。 この状況は、他と同様、ある通貨の強弱の具合を示しています。
  • 両方の通貨のインデックスチャートのクロス点が同じ方向にある場合、相場に入りません。 この場合、レンジの確率が高くなります。
  • クロスははっきりと見えるはずです。 以前の記事で考察しました。

従って最初の実用的な結論です。相場に入るとき両方の通貨の強弱を考慮しなさい。 1つの通貨が弱くなると、2番目の1つは強くなる。 その最初のシグナルは、MAのクロスのインデックスチャートです。 ただし、このシグナルは十分ではありません。2番目の通貨が反対方向に移動するのを待ちます。

遅延の問題が残ったままです。両方の通貨のインデックスチャートとクロスの間の最大距離は何でしょう? 明らかに、最小距離はゼロです。 最大に関しては、明確な回答をすることは困難です。 ただし、一定の距離が適用されることは明らかです。 1つの通貨の弱体化と強化が大幅に時間内に離れている場合、相場に参入することは危険です。 この場合、発散とトレンドの弱体化に直面している。

従って、複合トレンドのインジケーターに基づいて相場参入を検討しました。 潜在的なエントリポイントをより正確に評価するには、既に説明したインジケーターの絶対値を使いましょう。  


ジグザグを使用したクイック分析

ドミトリー Fedoseevによるこの記事からジグザグに基づいてインジケーターの1つを使用します。 米ドルインデックスチャートに直接 URiUniZigZagPriceSW.mq5 を配置してみましょう:




ここでは、ジグザグが太い青色の線として示されています。 この目的は、ジグザグセグメントの長さを分析し、整理することです。 このようにすれば、米ドル指数の "スイング振幅" を取得することができるかもしれません。

インジケーターコードを少し変更してみましょう。

//+------------------------------------------------------------------+
//                                                URiUniZigZagSW.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   3
//--- plot High
#property indicator_label1  "High"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Low
#property indicator_label2  "Low"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrGreen
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot ZigZag
#property indicator_label3  "ZigZag"
#property indicator_type3   DRAW_SECTION
#property indicator_color3  clrRed
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- plot Direction
#property indicator_label4  "Direction"
#property indicator_type4   DRAW_LINE
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1
//--- plot LastHighBar
#property indicator_label5  "LastHighBar"
#property indicator_type5   DRAW_LINE
#property indicator_style5  STYLE_SOLID
#property indicator_width5  1
//--- plot LastLowBar
#property indicator_label6  "LastLowBar"
#property indicator_type6   DRAW_LINE
#property indicator_style6  STYLE_SOLID
#property indicator_width6  1
# include<zigzag\csorcedata.mqh>
# include<zigzag\czzdirection.mqh>
# include<zigzag\czzdraw.mqh>
//+------------------------------------------------------------------+
//                                                                   |
//+------------------------------------------------------------------+
enum EDirection
  {
   Dir_NBars=0,
   Dir_CCI=1
  };
//---エントリーパラメータ
input EDirection  DirSelect=Dir_NBars;
input int                  CCIPeriod   =  14;
input ENUM_APPLIED_PRICE   CCIPrice    =  PRICE_TYPICAL;
input int                  ZZPeriod=14;
input string               name="index-usd-zz.txt";

CZZDirection*dir;
CZZDraw*zz;
//---インジケーターバッファ
double         HighBuffer[];
double         LowBuffer[];
double         ZigZagBuffer[];
double         DirectionBuffer[];
double         LastHighBarBuffer[];
double         LastLowBarBuffer[];
//+------------------------------------------------------------------+
//カスタムインジケーター初期化関数                                       |
//+------------------------------------------------------------------+
int h;
//+------------------------------------------------------------------+
//                                                                   |
//+------------------------------------------------------------------+
int()
  {
   switch(DirSelect)
     {
      case Dir_NBars:
         dir=new CNBars(ZZPeriod);
         break;
      case Dir_CCI:
         dir=new CCCIDir(CCIPeriod,CCIPrice);
         break;
     }
   if(!dir.CheckHandle())
     {
      Alert("Indicator 2 download error");
      return(INIT_FAILED);
     }
   zz=new CSimpleDraw();
//---インジケーターバッファマッピング
   SetIndexBuffer(0,HighBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,LowBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ZigZagBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,DirectionBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,LastHighBarBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,LastLowBarBuffer,INDICATOR_CALCULATIONS);
   h=FileOpen(name,FILE_CSV|FILE_WRITE|FILE_ANSI,',');
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//                                                                   |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(CheckPointer(dir)==POINTER_DYNAMIC)
     {
      delete(dir);
     }
   if(CheckPointer(zz)==POINTER_DYNAMIC)
     {
      delete(zz);
     }
  }
//+------------------------------------------------------------------+
//カスタムインジケーター反復関数                                         |
//+------------------------------------------------------------------+
int ind=0;
//+------------------------------------------------------------------+
//                                                                   |
//+------------------------------------------------------------------+
intoncalculate(const int rates_total、
                constint prev_calculated,
                const int begin,
                const double &price[]
                )
  {
   int start;
   if(prev_calculated==0)
     {
      start=0;
     }
   else
     {
      start=prev_calculated-1;
     }
   for(int i=start;i<rates_total;i++)
     {
      HighBuffer[i]=price[i];
      LowBuffer[i]=price[i];
     }
   int rv;
   rv=dir.Calculate(rates_total,
                    prev_calculated,
                    HighBuffer,
                    LowBuffer,
                    DirectionBuffer);
   if(rv==0)return(0);
   zz.Calculate(rates_total,
                prev_calculated,
                HighBuffer,
                LowBuffer,
                DirectionBuffer,
                LastHighBarBuffer,
                LastLowBarBuffer,
                ZigZagBuffer);
   if(ind<= 10) ind++;
   if(ind == 10)
     {
      double mx=0,mn=1000000;
      double lg;
      for(int i=0;i<rates_total;i++)
        {
         if(ZigZagBuffer[i]==0 || ZigZagBuffer[i]==EMPTY_VALUE) continue;
         if(ZigZagBuffer[i] > mx) mx = ZigZagBuffer[i];
         if(ZigZagBuffer[i] < mn) mn = ZigZagBuffer[i];
        }
      lg=mx-mn;
      PrintFormat("Min index: %.05f Max index: %.05f Length: %.05f",mn,mx,lg);
      lg/=100;
      double levels[100];
      int    count[100];
      ArrayInitialize(count,0);
      for(int i=1; i<101; i++) levels[i-1]=NormalizeDouble(lg*i,_Digits);
      mn=0;
      for(int i=0;i<rates_total;i++)
        {
         if(ZigZagBuffer[i]==0 || ZigZagBuffer[i]==EMPTY_VALUE) continue;
         if(mn==0) mn=ZigZagBuffer[i];
         else
           {
            lg=MathAbs(mn-ZigZagBuffer[i]);
            for(int j=0; j<100; j++)
              {
               if(lg<levels[j])
                 {
                  count[j]++;
                  break;
                 }
              }
            mn=ZigZagBuffer[i];
           }
        }
      for(int i=0; i<100; i++)
        {
         PrintFormat("%d level: %.05f count: %d",i,levels[i],count[i]);
         FileWrite(h,i,levels[i],count[i]);
        }
      FileClose(h);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
  
このインジケータは、タスクを開始して、10番目のティックのジグザグセグメントサイズを定義します。 このサイズを 100% として使用すると、1% を計算し、残りのジグザグセグメントの値を整理することができます。 その結果、1% から 100% までのジグザグセグメントの数を含む配列が得られます。 結果はLibreOfficeCalcの 図(URZZdata.zip アーカイブからダウンロード) に表示されます。 次に、対応するダイアグラムセクションと共に、ファイルの先頭を示します。


セグメントの長さ
セグメントの数
0
0.01193 2975
1
0.02387
850
2
0.0358
197
3
0.04773
54
4
0.05967
17
ほとんどゼロで満たされています。 ステップを減らす場合、この分析を続行し、微調整することもできますが、今のところ、現在の結果で満足しましょう。 すでに実用的な結論を下すことができます:
  • バスケットの通貨インデックスの組み合わせインジケーターに適用されるジグザグのセグメントサイズが一定の値を超えると、トレンドに順張りで相場に参入するのは慎重になるべきです。 ここで、セグメントサイズは、ジグザグセグメントの投影の長さを price (y) 軸にしたものです。

この「クリティカル」セグメントのサイズを定義する必要があります。 これを行うには、上記のデータに統計的なメソッドを適用します。 独自のリスク設定を使用して、分析することができます。 私の意見では、"クリティカル" セグメントは0.03 に等しくないはずです。

この例で、利用可能な履歴を分析しました。 ただし、最新の相場動向を把握したい場合は、より小さい期間 (年、4半期、または月) を使用する必要があります。

同様の分析は、すべての通貨バスケットとほとんどのタイムフレームに対して実行できます。 異なった「通貨-時間枠」セットで、図表がいかに変わるか見ることは興味深いでしょう。 開発者であれば、このアルゴリズムをかんたんに実装できます。 もちろん、1つのシグナルだけに頼るべきではありません。 確認します。 上記の手法は、多くの一般的なトレンドインジケーターに適用することができます。 しかし、オシレーターを扱う場合は無意味です。 

従って、結合されたインジケーターを使用して相場の質を改善することに向けてもう一つのステップが必要です。 シグナルを探す必要があるので、どうしたらよいでしょうか。


異なる組み合わせインジケーターの同時利用

ご存じかもしれませんが、すでに WPR に基づいて組み合わせたインジケーターがあります。 そのコードと利用可能なパターンを含む、以前の記事で詳細に検討しました。 今回は、組み合わせインジケーターと併せて適用してみよう。 多くのトレーディングシステムは同じように構築されているので、結果の構造は非常に効率的であると予想されます。トレンド-次のインジケーター + オシレーター。

前の記事のインジケーター URtestDistance.mq5、URtestWPR.mq5、URtestWPRjpy.mq5 を使用して、EURインデックス URtestDistance.mq5 インジケーターと一緒にチャートに配置してみましょう。 前の記事では、EURJPYを分析しました。従って、testWPRjpy は米ドルで稼働させてみましょう。 URtestDistance.mq5 インジケーターを変更しないために、インジケーターの名前を保持します。 このセクションのすべてのインジケーターは、URwpr.zip アーカイブにあります。

この組み合わせWPRインジケーターは、WPR間の差をプロットします。 この目的は、フィルタとして別のものを使用するときに、1つのインジケーターで前に説明したパターンを検出することです。





潜在的な相場参入ポイント (すべてではない) は、画像にマークされています。 結合された WPR(上部ウィンドウ) と複合ユーロインデックス (下のウィンドウ) が単方向パターンを示しているエントリポイントは、より信頼性が高いと見なされます。 ここでは、エントリポイントは1と6です。 インジケーターと移動平均のクロスです。

結合WPRが、売られ過ぎラインをクロスさせる正確なパターンを作ります。 他のエントリは十分ではありません。 しかし、このような点での相場参入は、損失を引き起こすことはありません、実際のトレードでこのようなリスクを取ることはありません。

通貨バスケットに含まれている結合WPRの差をプロットする組み合わせインジケーターを適用することはどの程度妥当でしょうか。 組み合わせ EUR インデックスと平行して EUR の結合された WPR を使用することがより正確ではないでしょうか? では、URtestDistance.mq5 を URtestWPR.mq5 に置き換えてみましょう。


ここでは、ユーロの組み合わせ WPR インジケーターを見ることができます。 合っているでしょうか。 この場合、YESです。 このインジケータは、ポイント2と 6 (矢印は方向を指定するために使用されている) でエントリを修正しました。 エントリ1は十分に確認されていません。 エントリ5と3は推奨されません。 ポイント4は、ポイント7にインジケーターによって修正されています。

2つの通貨の結合された WPR の差のインジケーターではなく、通貨バスケットの組み合わせ WPRインジケーターを支持して得られた結果と考えられます。 ただし、これはこの特定のケースに対してのみ当てはまります。 重要な統計情報が蓄積されるまで、毎日の使用に合わせてオシレーターの両方の種類を適用することをお勧めします。


もしかしたら "これの何が特別なことなのか?"と疑問に思うかもしれません。 インジケーターの組み合わせ使用は新しいものではありません。 なぜわざわざこの記事で話したのでしょうか? その上、パターンとは何の関係もない」。

しかし、この記事のセクションの目的は、3つの質問に答えることです。

  • この場合に使用されるオシレーターの最適な種類は何か。
  • フォームのいずれかを使用する場合、明示的な制限があるか。
  • 様々な種類のオシレーターを適用する際に、どのように正確にパターンを識別し確認するか。

これらの質問には適格に答えています。 その上、結論をテストするメソッドは明確になされました。


結論

この記事では、通貨バスケットのトレード時に発生する最もシンプルなパターンについて説明しました。 しかし、このトピックに終止符を打ったでしょうか。 少なくともそれはないでしょう。 まだまだ面白い着目点がたくさんあります。

明白ですが、繰り返してみましょう。この記事に添付されたインジケーターは、実際の取引のためのものではありません! これらは不安定であり、例示のためにだけ使用されるべきです。

この記事で使用されたプログラム:

 # Name
Type
 Description
1 testIndexMA.mq5 Indicator このテストは、移動平均で usd インジケーターを組み合わせたものです。
2 testIndexMA2.mq5 Indicator このテストは、移動平均と組み合わせた EUR インジケーター。
3 testIndexZig-Zag1.mq5 Indicator 個々のセグメントの長さを測定し、ジグザグインジケーター。
4 testWPR.mq5 Indicator EURのテスト結合 WPR インジケーター。
5 testWPRjpy.mq5 Indicator USD のテスト結合 WPR インジケーター。
6 testDistance.mq5 Indicator この組み合わせインジケーターは、2つの間の差をプロットします。 ここでは、 URtestWPR.mq5 と URtestWPRjpy.mq5 (ユーロと米ドル) です。

MetaQuotes Software Corp.によりロシア語から翻訳された
元の記事: https://www.mql5.com/ru/articles/2960

添付されたファイル |
testIndexMA.mq5 (4.82 KB)
testIndexMA2.mq5 (4.96 KB)
ZZdata.zip (37.28 KB)
wpr.zip (45.32 KB)
グラフィカルインタフェースX:レンダーテーブルの新機能(ビルド9) グラフィカルインタフェースX:レンダーテーブルの新機能(ビルド9)

今日までは、ライブラリの最も高度なテーブルはCTableでした。このテーブルは、OBJ_EDIT型のエディットボックスから組み立てられており、さらなる開発は難しいです。したがって、機能の最大化においては、ライブラリ開発の現段階を考慮しても、CCanvasTable型のレンダーテーブルを開発する方が賢明です。その現バージョンはまったく使えない状態ですが、この記事から始めて状況を改善していきましょう。

グラフィカルインタフェースを備えたユニバーサルチャンネル グラフィカルインタフェースを備えたユニバーサルチャンネル

すべてのチャネルインジケータは、上中下の3ラインとして表示されます。 移動平均インジケーターは主にチャネルに使用されますが、中央の線の描画原理は移動平均に似ています。 上下の線は中心線から等しい距離に位置します。 この距離は、標準偏差値 (ボリンジャーバンドバンド)、または ATR値 (ケルトナーチャネル) を使用して、価格のパーセント (エンベロープインジケータ) としてポイント単位で決定されます。

グラフィカルインターフェイスX:レンダーテーブルの更新とコード最適化(ビルド10) グラフィカルインターフェイスX:レンダーテーブルの更新とコード最適化(ビルド10)

レンダーテーブル(CCanvasTable)に新しい機能を補完していきます。テーブルには、ホバー時の列の強調表示;、各セルにアイコンの配列を追加する機能とそれらを切り替えるメソッド、 実行時にセルテキストを設定または変更する機能などが含まれます。

グラフィカルインターフェイスX:ソート、テーブル再構築とセル内のコントロール(ビルド11) グラフィカルインターフェイスX:ソート、テーブル再構築とセル内のコントロール(ビルド11)

レンダーテーブルにデータソート、列と行の数の管理、コントロールを配置するためのテーブルのセルタイプの設定といった新しい機能を追加し続けます。