インディケータ: YURAZ_MCCH計算指標

 

YURAZ_MCCH計算指標:

この指標は終値に向けた上昇/下降の%を計算します。オブジェクト指向プログラミングが使われており、任意のエキスパートアドバイザーや他の指標への統合は簡易です。

作者: Yuriy Zaytsev

削除済み  

申し訳ありません!2つほど警告を加えさせていただきます。

#property indicator_plots   0

そしてこちら

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
 
Alexsandr San:

申し訳ない! 2つほど警告を付け加えておく。

そしてこちら


このコードは2009年に書かれたもので、それ以来多くのことが変わっている。

このコードはFOREXと株式市場の両方で動作します。

//+------------------------------------------------------------------+
//|Yuraz_CH_moex.mq5
//|著作権について
//| https://www.mql5.com/ja/users/yuraz
//+------------------------------------------------------------------+
#property copyright "Copyright 2020,YuraZ"
#property link      "https://www.mql5.com/ja/users/yuraz"
#property version   "1.02"
#property indicator_chart_window
#property indicator_plots   1
#property indicator_buffers 1


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// クラス計算 CH
//
struct SymbolStruct
  {
   // bool work;
   string            sSymbol;
   int               y;
   int               x;
   double            CH;
   int               HandleInd; // 別のチャートから相場を取得するハンドルのインジケーター
   long              chart_id;
  };
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
class CChmcYZ
  {
public:
   SymbolStruct      sSymb[];
   color             lColorSym;
   color             lColorChPlus;
   color             lColorChMinus;
   color             lColorCH;

   int               indicatorWindow; // メイン・ウィンドウでの作業
   void              CChmcYZ()
     {
      indicatorWindow=0;
      lColorSym=Aqua;
      lColorCH=White;
      lColorChPlus  =LimeGreen;
      lColorChMinus =Red;
     } // コンストラクタ
   void              CreateSymbol(void);
   void              DeleteSymbolFromCrafic(void);
   void              MyOnCalculate(void);
   void              MyOnTimer();

private:
   void              RCH(int iPos, string sSymbol,datetime DATEBEG,datetime DATEEND);
   void              RCHsay(int iPos, string sSym,datetime db,datetime de,int X,int Y); // 1組の計算を完了し、表示する
   color             lColor;
   double            dClose[3];                    // 最高価格をコピーするための配列
   int               i_SymbolsTotal;
  };


//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void CChmcYZ::CreateSymbol(void)
  {
   i_SymbolsTotal =SymbolsTotal(true);    // false - すべてのシンボル、true - MarketWatchのシンボルのみ
   int i;
   int yPos=12;
   ArrayResize(sSymb,i_SymbolsTotal+1,i_SymbolsTotal+1);   // MarketWatchのシンボルで配列を埋める
   for(i=0; i<i_SymbolsTotal; i++)
     {
      sSymb[i].sSymbol = SymbolName(i, true);
      Sleep(1000);
      chmc.RCHsay(i, sSymb[i].sSymbol,TimeCurrent()-86400*5,TimeCurrent(),5,16+yPos); // CH%日を計算する
      yPos += 12;
     }
   long  id_ChartFirst = ChartFirst();
   long  idC = ChartFirst();
  }



//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void CChmcYZ::MyOnTimer(void)
  {
   MyOnCalculate();
  }

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void CChmcYZ::MyOnCalculate(void)
  {
   int yPos=12;
   for(int i=0; i<i_SymbolsTotal; i++)
     {
      chmc.RCHsay(i, sSymb[i].sSymbol,TimeCurrent()-86400*5,TimeCurrent(),5,16+yPos);    // CH%日を計算する
      yPos += 12;
     }
  }

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void CChmcYZ::DeleteSymbolFromCrafic(void)
  {
   int i=ObjectsTotal(0,-1,-1);
   while(i>0)
     {
      string sObjYZ = ObjectName(0,i);
      if(StringSubstr(sObjYZ,0,3)=="oYZ") // チャートからオブジェクトだけを削除する。
        {
         ObjectDelete(0,sObjYZ);
        }
      i--;
     }
   ChartRedraw();
  }


void CChmcYZ::RCH(int iPos, string sSymbol,datetime DATEBEG,datetime DATEEND)
  {
   sSymb[iPos].CH=0;
   int CountBar;
// DATEBEG = StringToTime( TimeToString(DATEBEG,TIME_DATE));
   DATEEND = StringToTime( TimeToString(DATEEND,TIME_DATE));
   CountBar= CopyClose(sSymb[iPos].sSymbol,PERIOD_D1,DATEEND,2,dClose);
   if(CountBar>=0)
     {
      if(NormalizeDouble(dClose[1],5)!=0.0 && NormalizeDouble(dClose[0],5)!=0.0)
        {
         sSymb[iPos].CH=(dClose[1]*100)/dClose[0]-100;
        }
     }
  }

//+------------------------------------------------------------------+
//|| 出力のある計算
//+------------------------------------------------------------------+
void CChmcYZ::RCHsay(int iPos, string sSym,datetime db,datetime de,int XD,int YD) // 1組のみの完全計算
  {
   RCH(iPos, sSym,db,de);

   if(ObjectFind(indicatorWindow,"oYZ"+sSym)==-1)
     {
      ObjectCreate(indicatorWindow,"oYZ"+sSym,OBJ_LABEL,indicatorWindow,0,0);
      ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_XDISTANCE,XD);
      ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_YDISTANCE,YD);
      ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetString(indicatorWindow,"oYZ"+sSym,OBJPROP_TEXT,sSym);
      ObjectSetString(indicatorWindow,"oYZ"+sSym,OBJPROP_FONT,"Arial");
      ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_FONTSIZE,7);
      ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_COLOR,lColorSym);
      ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_SELECTABLE,true);
     }
   if(ObjectFind(indicatorWindow,"oYZ_"+sSym)==-1)
     {
      ObjectCreate(indicatorWindow,"oYZ_"+sSym,OBJ_LABEL,indicatorWindow,0,0);
      ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_XDISTANCE,XD+45);
      ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_YDISTANCE,YD);
      ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetString(indicatorWindow,"oYZ_"+sSym,OBJPROP_TEXT,sSym);
      ObjectSetString(indicatorWindow,"oYZ_"+sSym,OBJPROP_FONT,"Arial");
      ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_FONTSIZE,7);
      ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_COLOR,lColorCH);
      ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_SELECTABLE,true);
     }
   YD=YD+11;
   lColor=lColorCH;
   if(sSymb[iPos].CH>=0)
     {
      lColor=lColorChPlus;
      ObjectSetString(indicatorWindow,"oYZ_"+sSym,OBJPROP_TEXT," "+DoubleToString(sSymb[iPos].CH,2));
      ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_XDISTANCE,XD+45);
     }
   if(sSymb[iPos].CH<0)
     {
      lColor=lColorChMinus;
      ObjectSetString(indicatorWindow,"oYZ_"+sSym,OBJPROP_TEXT,DoubleToString(sSymb[iPos].CH,2));
      ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_XDISTANCE,XD+46);
     }
   ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_COLOR,lColor);
  }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CChmcYZ chmc;

//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- インジケータ・バッファのマッピング
   chmc.CreateSymbol(); // 環境からシンボルを作成する
//---
   EventSetMillisecondTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnTimer()
  {
   chmc.MyOnTimer();
  }
//+------------------------------------------------------------------+
//| カスタム・インジケータ反復関数
//+------------------------------------------------------------------+
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[])
  {
   chmc.MyOnCalculate();
//--- 次の呼び出しのためにprev_calculatedの値を返す
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| チャートイベント機能|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   chmc.DeleteSymbolFromCrafic();
  }
//+------------------------------------------------------------------+