English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
MQL5におけるインディケータemissionの描写

MQL5におけるインディケータemissionの描写

MetaTrader 5 | 5 10月 2015, 11:58
813 0
Sergey Pavlov
Sergey Pavlov

はじめに

トレーダーやトレーディング戦略開発者の多くが以下のような質問に関心があるのは事実です。

それに対する答えは、新しいマーケット リサーチへの取り組みに導びいてくれます。すなわちインディケータ エミッションの構築と分析です。それを明確にするため、次の図を見ていきます。

図1 DCMVインディケータのエミッション

図1 DCMVエミッション インディケータ

図2 iMAエンベロープを基にしたインディケータ エミッション

図2 iMAエンベロープを基にしたインディケータ エミッション

これは異なるインディケータ エミッションを示すものですが、コンストラクションの原理は同じです。ティックのあとに異なる色や形のポイントが多数表示されます。それらは星雲、雲、軌道、線、アーチなど様々なクラスターを形成します。こういった形は市場価格を左右する見えないバネや力を検出するのに役立ちます。こういったエミッションの検索と分析は手相見と似ています。


エミッションとプロパティ

エミッションとはインディケータの指定された点が交わる場所にあるポイントのセットです。

エミッションのプロパティはまだ明らかではありませんが、研究が待たれるところです。以下はすでに知られているプロパティのリストです。

  • クラスタの同じタイプの傾向を示すポイント
  • エミッションには方向があります。それは現時点から将来、あるいは過去という方向です。
  • クラスタは重要なものです。密度の高いクラスタは魅力があり、逆は価格を反発させる可能性があります。


インディケータエミッションの計算

例を使って、エミッション計算の基本について考察していきます。インディケータを2つ取ります。 - iBandsiMAです。これら直線の交点を見つけます。それを使ってエミッションのポイントを描きます。そのためにはグラフィックオブジェクトが必要です。Expert Advisorsにアルゴリズムが実装されますが、それはインディケータによって可能となります。

初期インディケータは図3に示されています。

図3 iBands (グリーン)とiMA (赤)インディケータ

図3 iBands (グリーン)とiMA (赤)インディケータ

エミッションポイントを作成するのにはExpert Advisorが必要です。Expert Advisorテンプレートを作成するには、MQL5ウィザードを使用するのがよいでしょう。

図4 MQL5ウィザードを使用したExpert Advisorテンプレートの作成

図4 MQL5ウィザードを使用したExpert Advisorテンプレートの作成

//+------------------------------------------------------------------+
//|                                      Emission of Bands && MA.mq5 |
//|                                                 Copyright DC2008 |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "DC2008"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

最初に、予備プロッティングがいくらか必要です。波線を使ってインディケータラインを続けます。(図5)それにより、計算の正確性とエミッションポイントの可視化ができます。その後、チャートからこういった線を取り除きます。

図5 予備プロッティング波線を使ってインディケータラインを続行

図5 予備プロッティング波線を使ってインディケータラインを続行

そうして、Expert Advisorのコードにグラフィックオブジェクト(水平の傾向線)を追加します。

input bool     H_line=true;   // flag to enable drawing of the horizontal lines
input bool     I_line=true;   // flag to enable drawing of the indicator's lines
//---
string         name;
//---- indicator buffers
double      MA[];    // array for iMA indicator 
double      BBH[];   // array for iBands indicator  - UPPER_BAND 
double      BBL[];   // array for iBands indicator - LOWER_BAND
double      BBM[];   // array for iBands indicator - BASE_LINE
datetime    T[];     // array for time coordinates
//---- handles for indicators
int         MAHandle;   // iMA indicator handle
int         BBHandle;   // iBands indicator handle
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MAHandle=iMA(Symbol(),0,21,0,MODE_EMA,PRICE_CLOSE);
   BBHandle=iBands(Symbol(),0,144,0,2,PRICE_CLOSE);
//---
   if(H_line)     // Horizontal lines of iBands indicator
      {
         //--- iBands - UPPER_BAND
         name="Hi";
         ObjectCreate(0,name,OBJ_HLINE,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         //--- iBands - LOWER_BAND
         name="Lo";
         ObjectCreate(0,name,OBJ_HLINE,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,Blue);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         //--- iBands - BASE_LINE
         name="MIDI";
         ObjectCreate(0,name,OBJ_HLINE,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,DarkOrange);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
      }
//---
   if(I_line)     // Indicator lines
      {
         //--- iMA
         name="MA";
         ObjectCreate(0,name,OBJ_TREND,0,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,2);
         ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1);
         //--- iBands - UPPER_BAND
         name="BH";
         ObjectCreate(0,name,OBJ_TREND,0,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1);
         //--- iBands - LOWER_BAND
         name="BL";
         ObjectCreate(0,name,OBJ_TREND,0,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1);
         //--- iBands - BASE_LINE
         name="BM";
         ObjectCreate(0,name,OBJ_TREND,0,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1);
      }
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- filling the arrays with current values
   CopyBuffer(MAHandle,0,0,2,MA);
   ArraySetAsSeries(MA,true);  
   CopyBuffer(BBHandle,0,0,2,BBM);
   ArraySetAsSeries(BBM,true);  
   CopyBuffer(BBHandle,1,0,2,BBH);
   ArraySetAsSeries(BBH,true);  
   CopyBuffer(BBHandle,2,0,2,BBL);
   ArraySetAsSeries(BBL,true);
   CopyTime(Symbol(),0,0,10,T);
   ArraySetAsSeries(T,true);
     
   //--- Horizontal lines of iBands indicator (correction)
   if(H_line)
      {
      name="Hi";
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBH[0]);
      name="Lo";
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBL[0]);
      name="MIDI";
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBM[0]);
      }
   //--- Indicator's lines (correction)
   if(I_line)
      {
      name="MA";  //--- iMA
      ObjectSetInteger(0,name,OBJPROP_TIME,T[1]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,MA[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,MA[0]);
      name="BH";  //--- iBands - UPPER_BAND
      ObjectSetInteger(0,name,OBJPROP_TIME,T[1]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBH[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBH[0]);
      name="BL";  //--- iBands - LOWER_BAND
      ObjectSetInteger(0,name,OBJPROP_TIME,T[1]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBL[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBL[0]);
      name="BM";  //--- iBands - BASE_LINE
      ObjectSetInteger(0,name,OBJPROP_TIME,T[1]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBM[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBM[0]);
      }
  }
//+------------------------------------------------------------------+
エミッションは将来あるいは過去に向かう線なので、傾向線であるプロパティ は以下のようなものです。
  • OBJPROP_RAY_LEFT = 1, (Ray goes left);
  • OBJPROP_RAY_RIGHT = 1, (Ray goes right).

結果として、線を追加したチャートは図6のように表示されます。

準備段階は完了しました。これからエミッション処理に進んでいきます。以下の線の交点にある最初の連続点を作成します。

  • "MA" (iMA)線と"BH"線(iBands = UPPER_BAND)間
  • "MA" (iMA)線と"BL"線(iBands = LOWER_BAND)間
  • "MA" (iMA)線と"BM"線(iBands = BASE_BAND)間

図6 予備プロッティング直線を使ったインディケータラインの続行

図6 予備プロッティング直線を使ったインディケータラインの続行

それでは、エミッションポイントを描くために交点の座標を計算します。関数を作成します。

void Draw_Point(
                string   P_name,     // Object name (OBJ_ARROW)
                double   P_y1,       // Y-coordinate of the 1st line at the [1] bar
                double   P_y0,       // Y-coordinate of the 1st line at the [0] bar
                double   P_yy1,      // Y-coordinate of the 2nd line at the [1] bar 
                double   P_yy0,      // Y-coordinate of the 2nd line at the [0] bar
                char     P_code1,    // Char at the right side of the [0] bar
                char     P_code2,    // Char at the left side of the [0] bar
                color    P_color1,   // Color of point at the right side of the [0] bar
                color    P_color2    // color of point at the left side of the [0] bar
                )
  {
   double   P,X;
   datetime P_time;
   if(MathAbs((P_yy0-P_yy1)-(P_y0-P_y1))>0)
     {
      P=P_y1+(P_y0-P_y1)*(P_y1-P_yy1)/((P_yy0-P_yy1)-(P_y0-P_y1));
      X=(P_y1-P_yy1)/((P_yy0-P_yy1)-(P_y0-P_y1));
      if(X>draw_period)
        {
         P_time=T[0]+(int)(X*PeriodSeconds());
         ObjectCreate(0,P_name,OBJ_ARROW,0,0,0);
         ObjectSetDouble(0,P_name,OBJPROP_PRICE,P);
         ObjectSetInteger(0,P_name,OBJPROP_TIME,P_time);
         ObjectSetInteger(0,P_name,OBJPROP_WIDTH,0);
         ObjectSetInteger(0,P_name,OBJPROP_ARROWCODE,P_code1);
         ObjectSetInteger(0,P_name,OBJPROP_COLOR,P_color1);
         if(X<0)
           {
            ObjectSetInteger(0,P_name,OBJPROP_ARROWCODE,P_code2);
            ObjectSetInteger(0,P_name,OBJPROP_COLOR,P_color2);
           }
        }
     }
  }

そして、OnTick関数に以下のようなコード行を追加します。

//+------------------------------------------------------------------+
   int GTC=GetTickCount();                                                    
//+------------------------------------------------------------------+
   name="H"+(string)GTC;
   Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],170,178,Red,Red);
   name="L"+(string)GTC;
   Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],170,178,Blue,Blue);
   name="M"+(string)GTC;
   Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],170,178,Green,Green);
//---
   ChartRedraw(0);

ではExpert Advisorを実行し、結果を見てみましょう。(図7)

結果は良好ですね。しかしまだ他にも交点の例はあります。まだ考察していない例です。たとえば、iBandsインディケータには互いに交わる直線が3本あり、それで全体像が完成します。

図7 iMAインディケータとiBandsインディケータのエミッション(3つの交点)

図7 iMAインディケータとiBands iインディケータのエミッション(3つの交点)

それでは、計算して得たエミッションにもうひとつづきのポイントを付け加えます。以下の直線の交点です。
  • "BH" (iBands = UPPER_BAND) 線と"BL"線(iBands = LOWER_BAND)間
  • "BH" (iBands = UPPER_BAND) 線と"BM"線(iBands = BASE_BAND)間
  • "BL"(iBands = LOWER_BAND) 線と"BM"線(iBands = BASE_BAND)間

上記交点により、3つの点を得ますが、それらはすべて同じ座標です。ゆえに、"BH"線と"BL"線間で得られる1交点を使用すれば十分です。

われわれのExpert Advisorにこれら直線を追加し結果を見てみましょう。(図8)

name="B"+(string)GTC;
   Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],170,178,Magenta,Magenta);

図8 iMAインディケータとiBandsインディケータのエミッション(4つの交点)

図8 iMAインディケータとiBands iインディケータのエミッション(4つの交点)

エミッションは取得しましたが、まだ何か重要な事柄が抜けているような気がします。何が足りないのでしょうか?

なぜそのような入力パラメータだけ使ったのでしょうか?パラメータを変更すると何が得られるのでしょうか?また、エミッションにおけるパラメータの役割とはなにでしょうか?

単一度数に対応して取得したエミッションはインディケータの入力パラメータから得られた結果でした。複数度数スペクトラムをフルに計算するには、他の度数についても同じ計算をする必要があります。私が考えうる限りのエミッションスペクトラムをここに例示します。

//---- handles for indicators
int         MAHandle[5];   // handles array of iMA indicators
int         BBHandle[7];   // handles array of iBands indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MAHandle[0]=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE);
   MAHandle[1]=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE);
   MAHandle[2]=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE);
   MAHandle[3]=iMA(NULL,0,89,0,MODE_EMA,PRICE_CLOSE);
   MAHandle[4]=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE);
//---
   BBHandle[0]=iBands(NULL,0,55,0,2,PRICE_CLOSE);
   BBHandle[1]=iBands(NULL,0,89,0,2,PRICE_CLOSE);
   BBHandle[2]=iBands(NULL,0,144,0,2,PRICE_CLOSE);
   BBHandle[3]=iBands(NULL,0,233,0,2,PRICE_CLOSE);
   BBHandle[4]=iBands(NULL,0,377,0,2,PRICE_CLOSE);
   BBHandle[5]=iBands(NULL,0,610,0,2,PRICE_CLOSE);
   BBHandle[6]=iBands(NULL,0,987,0,2,PRICE_CLOSE);
//---
   return(0);
  }

可能な組合せを考察するため、Expert Advisorに以下のコードを追加します。

//+------------------------------------------------------------------+
   CopyTime(NULL,0,0,10,T);
   ArraySetAsSeries(T,true);
   int GTC=GetTickCount();
//+------------------------------------------------------------------+
   int iMax=ArraySize(BBHandle)-1;
   int jMax=ArraySize(MAHandle)-1;
   for(int i=0; i<iMax; i++)
     {
      for(int j=0; j<jMax; j++)
        {
         //--- filling the arrays with current values
         CopyBuffer(MAHandle[j],0,0,2,MA);
         ArraySetAsSeries(MA,true);
         CopyBuffer(BBHandle[i],0,0,2,BBM);
         ArraySetAsSeries(BBM,true);
         CopyBuffer(BBHandle[i],1,0,2,BBH);
         ArraySetAsSeries(BBH,true);
         CopyBuffer(BBHandle[i],2,0,2,BBL);
         ArraySetAsSeries(BBL,true);

         name="H"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],250,158,Aqua,Aqua);
         name="L"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],250,158,Blue,Blue);
         name="M"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],250,158,Green,Green);
         name="B"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],250,158,Magenta,Magenta);
        }
     }
//---
   ChartRedraw(0);

エミッションスペクトラムに多くの度数が含まれるほど、 チャート表示は良くなりますが、あまり多用しないことです。なぜならコンピュータのリソースを消費し、チャートに混乱を招く一番の原因になるからです。度数は実験的に判断可能です。 グラブをよりよく見せるには、描写スタイルに気を配る必要があります。

図9 複度数エミッションスペクトラム

図9 複度数エミッションスペクトラム


Ofエミッション描写スタイル

MQL5言語により、エミッション描写のための幅広いウェブカラー曲線キャラクタ が入手可能です。それについての考え方を共有したいと思います。
  1. グラフ画像については各々感じ方があることでしょう。なので、エミッションをカスタマイズするのに少々時間をかけることも必要です。
  2. 図9の『混乱』からは画像パターンになんの規則性も見出せません。これはひどい描写の一例です。
  3. 虹色スペクトラムの近くにある色を使ってみます。
  4. 過去に関するキャラクタ コード( [0] バーの左側から)と将来に関するキャラクタ コード( [0] バーの右側から)は異なるはずです。
  5. 色とポイント型の組合せがうまくいくと、エミッションは傑作になります。取引を行うのに役立つだけでなく見るのも楽しみになるでしょう。
私のエミッションの描写スタイル(図10~17参照)を例として掲示します。
name="H"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],250,158,Aqua,Aqua);
         name="L"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],250,158,Blue,Blue);
         name="M"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],250,158,Magenta,Magenta);
         name="B"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],250,158,DarkOrchid,DarkOrchid);


iMAとiBandsのエミッション ギャラリー

エミッション画像はチャプターに示されています。

図10

図10 

図11

図11

図12

図12

図13

図13 

図14

図14 

図15

図15 

図16

図16 

図17

図17 


エミッション分析

エミッション分析は別のタスクです。リアルタイムで動きを見るのがもっとも有用です。そしてそれは様々な効果とパターンを理解するのに最適な方法です。

価格修正に注意を払ってください。あたかもエミッションが目標価格を『知って』いるようです。また、サポート、レジスタンス、均衡価格レベルを見ることもできます。


おわりに

  1. インディケータのエミッションは、市場サーチや分析の新しい手法を探しているトレーダーやトレードシステム開発者にとって興味をひかれるものです。
  2. 初歩を紹介するのが目的の本稿としては、すぐに使えるソリューションは提供していません。ただ、ここで述べたエミッション計算技術は他のインディケータやその組合せにも適用することが可能です。
  3. 本稿を準備するにあたり、私は回答数に勝る質問を収集しました。そのいくつかをご紹介します。エミッション描写のアルゴリズムを最適化する方法は?エミッションのストラクチャにおけるエミッションスペクトラム特性の役割は?自動化されたトレーディングでエミッションを利用する方法は?

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/26

МetaTrader 5からWCFサービスを利用し.NETアプリケーションにクオートをエクスポートする方法 МetaTrader 5からWCFサービスを利用し.NETアプリケーションにクオートをエクスポートする方法
MetaTrader 5からご自身のアプリケーションにクオートをエクスポートしたくありませんか?MQL5-DLLジャンクションを使用するとそのソリューションの作成が可能です!本稿でMetaTrader 5から.NETに書かれたアプリケーションにクオートをエクスポートする方法の一つをお伝えします。私はまさにこのプラットフォームの使用により、クオートのエクスポート実装がおもしろく、根本的にやさしく行えました。残念ながらバージョン5はまだ.NETをサポートしていないので、かつてのように.NETサポート機能のあるwin32 dllを interlayerとして利用します。
インディケータ間のデータ交換:簡単です インディケータ間のデータ交換:簡単です
チャートに添付されるインディケータデータにアクセルする、次のようなプロパティを有する環境を作成したいと思います。:データコピーをしない。利用可能なメソッドを使用する必要がある場合、そのコードについて最小の修正だけ行う。必要な場合MQLコードの使用が好ましいと思います。(もちろんDLLを使う必要がありますが、C++コードのストリングをいくらか使うだけです。)本稿ではMetaTraderターミナルにプログラム環境を開発する簡単な手法について述べます。それにより、他のMQLプログラム からインディケータ バッファにアクセスする手段を得ることができます。
初心者のためのMQL5におけるデジタルフィルタの実践的実装 初心者のためのMQL5におけるデジタルフィルタの実践的実装
トレーディングシステムを構築するトピックを扱うフォーラムではデジタルシグナルのフィルタリングに関する考え方が広く議論されてきています。MQL5においてデジタルフィルタの標準コードを作成しないことは思慮が足りないかもしれません。本稿では、『初心者のためのMQL5におけるカスタムインディケータ』よりシンプルなSMAのインディケータ コードをより複雑で汎用なデジタルフィルタに変換することについて述べます。本稿は前稿からのロジカルな続編です。また、コード内テキストの置き換え方法、プログラムエラーの修正方法についても述べます。
データの交換方法:10分で書くMQL5のためのDLL データの交換方法:10分で書くMQL5のためのDLL
シンプルなDLLを書く方法や異なるシステム バインディングの特殊機能は何かを覚えている開発者はあまりいないと思います。いくつか例を挙げながら、10分でDLLを書く手順を網羅するとともに、バインディング実装の技術的詳細もいくらか説明していきたいと思います。異なるタイプの変数(数値、配列、ストリングなど)に置き換えた例を取り上げ、ビジュアル スタジオでDLLを作成する手順を段階的にお見せしていきます。それに加え、カスタムDLLのクラッシュからクライアント端末を保護する方法についてもご説明します。