データ構造体

MqlDateTime

このデータ型構造体は 9 個の int 型のフィールドを含みます。

struct MqlDateTime
{
int year;           // 年
int mon;           // 月
int day;           // 日
int hour;           // 時間
int min;           // 分
int sec;           // 秒
int day_of_week;   // 曜日(日曜が 0、月曜が 1、…土曜が 6 )
int day_of_year;   // 年の日番号(1月1日には、ゼロの数の値が割り当てられる)
};

注意事項

3 月以降の DAY_OF_YEAR は、うるう年と通常の年とでは異なります。

例:

void OnStart()
{
//—
datetime date1=D’2008.03.01′;
datetime date2=D’2009.03.01′;

MqlDateTime str1,str2;
TimeToStruct(date1,str1);
TimeToStruct(date2,str2);
printf(“%02d.%02d.%4d, day of year = %d”,str1.day,str1.mon,
str1.year,str1.day_of_year);
printf(“%02d.%02d.%4d, day of year = %d”,str2.day,str2.mon,
str2.year,str2.day_of_year);
}
/*  結果
01.03.2008, day of year = 60
01.03.2009, day of year = 59
*/

参照

TimeToStruct、構造体とクラス

指標入力パラメータの構造体(MqlParam)

MqlParam 構造体は IndicatorCreate() 関数を使用してテクニカル指標ハンドルを作成する際の入力パラメータを提供するためにデザインされています。

struct MqlParam
{
ENUM_DATATYPE   type;                   // 入力パラメータの型。値は ENUM_DATATYPE
long             integer_value;           // 整数型を格納するフィールド
double           double_value;           // double 型を格納するフィールド
string           string_value;           // string 型を格納するフィールド
};

全ての指標入力パラメータは、MqlParam 型の配列の形で送信され、この配列の各要素の type フィールドは、要素によって送信されるデータの型を指定します。指標値は、初めに、type フィールドに ENUM_DATATYPE のどちらの列挙値があるかによって各要素に適切なフィールドに配置する必要があります(integer_valuedouble_value 及び string_value)。

指標のタイプとして IND_CUSTOM 値が IndicatorCreate() 関数の第三パラメータで受け渡される場合、入力パラメータ配列の最初の要素の type フィールドは ENUM_DATATYPE 列挙の TYPE_STRING 値を含み、string_value フィールドはカスタム指標の名称を含まなければなりません。

MqlRates

この構造体は、価格、ボリュームとスプレッドの情報を提供します。

struct MqlRates
{
datetime time;         // 期間開始時間
double   open;         // 始値
double   high;         // 期間中の最高値
double   low;         // 期間中の最安値
double   close;       // 終値
long     tick_volume; // ティックボリューム
int     spread;       // スプレッド
long     real_volume; // 取引高
};

例:

void OnStart()
{
MqlRates rates[];
int copied=CopyRates(NULL,0,0,100,rates);
if(copied<=0)
Print(“Error copying price data “,GetLastError());
else Print(“Copied “,ArraySize(rates),” bars”);
}

参照

CopyRates、時系列へのアクセス

MqlBookInfo

板情報についての情報を提供します。

struct MqlBookInfo
{
ENUM_BOOK_TYPE   type;           // ENUM_BOOK_TYPE 列挙での注文の種類
double           price;           // 価格
long             volume;         // ボリューム
double           volume_real;     // より正確なボリューム
};

注意事項

MqlBookInfo  構造体は事前定義されているので、宣言と説明を必要としません。この構造体を使用するには、その型の変数を宣言するだけです。

DOM は一部のシンボルのみで使用出来ます。

例:

  MqlBookInfo priceArray[];
bool getBook=MarketBookGet(NULL,priceArray);
if(getBook)
{
int size=ArraySize(priceArray);
Print(“MarketBookInfo about “,Symbol());
}
else
{
Print(“Failed to receive DOM for the symbol “,Symbol());
}

参照

MarketBookAdd、MarketBookRelease、MarketBookGet、DOM での取引注文、データ型

取引リクエスト構造体 (MqlTradeRequest)

クライアント端末と注文確定操作を実行する取引サーバとの間の相互作用は、取引リクエストを用いて行われます。取引リクエストは取引を実行するために必要な全てのフィールドが含まれている MqlTradeRequest 構造体で表されます。リクエスト処理の結果は MqlTradeResult 型の構造体で表されます。

struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS   action;           // 取引の種類
ulong                         magic;           // エキスパートアドバイザー ID(マジックナンバー)
ulong                         order;           // 注文チケット
string                       symbol;           // 取引シンボル
double                       volume;           // 約定のための要求されたボリューム(ロット単位)
double                       price;           // 価格
double                       stoplimit;       // 注文のストップリミットレベル
double                       sl;               // 注文の決済逆指値レベル
double                       tp;               // 注文の決済指値レベル
ulong                         deviation;       // リクエストされた価格からの可能な最大偏差
ENUM_ORDER_TYPE               type;             // 注文の種類
ENUM_ORDER_TYPE_FILLING       type_filling;     // 注文実行の種類
ENUM_ORDER_TYPE_TIME       type_time;       // 注文期限切れの種類
datetime                     expiration;       // 注文期限切れの時刻 (ORDER_TIME_SPECIFIED 型の注文)
string                       comment;         // 注文コメント
ulong                         position;         // Position ticket
ulong                         position_by;     // The ticket of an opposite position
};

フィールドの説明

フィールド

説明

action

取引操作の種類値は ENUM_TRADE_REQUEST_ACTIONS 列挙値の 1 つです。

magic

エキスパートアドバイザー ID。取引注文の分析処理の整理を可能にします。取引リクエストを送信する際に、各エキスパートアドバイザーには、固有の ID を設定することが出来ます。

order

注文チケット。未決注文を変更するために使用されます。

symbol

注文シンボル。注文の変更とポジション決済操作には必要ありません。

volume

リクエストされた注文ボリューム(ロット単位)。約定の出来高は注文実行の種類によって異なります。

price

注文が実行されなければならない値に達している価格。「成行」実行タイプのシンボルの成行注文(TRADE_ACTION_DEALのSYMBOL_TRADE_EXECUTION_MARKET)では価格の指定は必要ありません。

stoplimit

Limit pending 注文が置かれる価格 (この条件は必須です)。それまで未決注文は出されません。

sl

不利な値動きの際の決済逆指値。

tp

有利な値動きの際の決済指値。

deviation

ポイントで指定された最大価格偏差。

type

注文の種類。ENUM_ORDER_TYPE 列挙値の 1 つ。

type_filling

注文実行の種類。ENUM_ORDER_TYPE_FILLING 列挙値の 1 つ。

type_time

注文期限切れの種類。ENUM_ORDER_TYPE_TIME 列挙値の 1 つ。

expiration

注文期限切れの時刻(ORDER_TIME_SPECIFIED 型)。

comment

注文コメント。

position

ポジションチケット。ポジションの決済や変更をするときに、ポジションの一意義の認証の為に埋める必要があります。原則として、その結果としてポジションを保有する、注文のチケットに対応します。

position_by

反対ポジションのチケット。反対ポジション(同じ商品であるが反対側に保有するポジション)の決済時に使用されます。

ヘッジシステムでのポジションの変更または決済の時には、そのチケット(MqlTradeRequest::position)を必ず指定してください。ネッティングシステムでもチケットを指定する必要がありますが、ポジションの識別はシンボル名で行われます。

取引操作を実行する注文を送信するには、OrderSend() 関数の使用が必要です。各取引操作のためには、必須項目を指定する必要があります。任意のフィールドを指定することも出来ます。取引注文を送信するには 7 つの可能なケースがあります。

Request Execution

これは、「リクエスト実行モード」で注文を出すための取引注文です(リクエストされた価格での取引)。以下の 9 のフィールドを指定する必要があります。

  • action
  • symbol
  • volume
  • price
  • sl
  • tp
  • deviation
  • type
  • type_filling

「magic」及び「comment」フィールドの指定も可能です。

即時実行

これは、「即時実行モード」で注文を出すための取引注文です(現在価格での取引)。以下の 9 のフィールドを指定する必要があります。

  • action
  • symbol
  • volume
  • price
  • sl
  • tp
  • deviation
  • type
  • type_filling

「magic」及び「comment」フィールドの指定も可能です。

マーケット実行

これは、「マーケット実行モード」で注文を出すための取引注文です。以下の 5 つのフィールドを指定する必要があります。

  • action
  • symbol
  • volume
  • type
  • type_filling

「magic」及び「comment」フィールドの指定も可能です。

エクスチェンジ実行

これは、「エクスチェンジ実行モード」で注文を出すための取引注文です。以下の 5 つのフィールドを指定する必要があります。

  • action
  • symbol
  • volume
  • type
  • type_filling

「magic」及び「comment」フィールドの指定も可能です。

買いポジションを持つ 取引操作TRADE_ACTION_DEALの例:

#define EXPERT_MAGIC 123456   // エキスパートアドバイザのMagicNumber
//+——————————————————————+
//| 買いポジションの発注                                                   |
//+——————————————————————+
void OnStart()
{
//— リクエストと結果の宣言と初期化
MqlTradeRequest request={0};
MqlTradeResult  result={0};
//— リクエストのパラメータ
request.action   =TRADE_ACTION_DEAL;                     // 取引操作タイプ
request.symbol   =Symbol();                             // シンボル
request.volume   =0.1;                                   // 0.1ロットのボリューム
request.type     =ORDER_TYPE_BUY;                       // 注文タイプ
request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // 発注価格
request.deviation=5;                                     // 価格からの許容偏差
request.magic    =EXPERT_MAGIC;                         // 注文のMagicNumber
//— リクエストの送信
if(!OrderSend(request,result))
PrintFormat(“OrderSend error %d”,GetLastError());     // リクエストの送信が失敗した場合、エラーコードを出力する
//— 操作に関する情報
PrintFormat(“retcode=%u  deal=%I64u  order=%I64u”,result.retcode,result.deal,result.order);
}
//+——————————————————————+

売りポジションを持つ 取引操作TRADE_ACTION_DEALの例:

#define EXPERT_MAGIC 123456   // エキスパートアドバイザのMagicNumber
//+——————————————————————+
//| 売りポジションを持つ                                                    |
//+——————————————————————+
void OnStart()
{
//— リクエストと結果の宣言と初期化
MqlTradeRequest request={0};
MqlTradeResult  result={0};
//— リクエストのパラメータ
request.action   =TRADE_ACTION_DEAL;                     // 取引操作タイプ
request.symbol   =Symbol();                             // シンボル
request.volume   =0.2;                                   // 0.2ロットのボリューム
request.type     =ORDER_TYPE_SELL;                       // 注文タイプ
request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID); // 発注価格
request.deviation=5;                                     // 価格からの許容偏差
request.magic    =EXPERT_MAGIC;                         // 注文のMagicNumber
//— リクエストの送信
if(!OrderSend(request,result))
PrintFormat(“OrderSend error %d”,GetLastError());     // リクエストの送信が失敗した場合、エラーコードを出力する
//— 操作についての情報
PrintFormat(“retcode=%u  deal=%I64u  order=%I64u”,result.retcode,result.deal,result.order);
}
//+——————————————————————+

ポジションを決済する 取引操作TRADE_ACTION_DEALの例:

#define EXPERT_MAGIC 123456   // エキスパートアドバイザのMagicNumber
//+——————————————————————+
//| 全てのポジションを決済                                                  |
//+——————————————————————+
void OnStart()
{
//— 結果とリクエストの宣言
MqlTradeRequest request;
MqlTradeResult  result;
int total=PositionsTotal(); // 保有ポジション数  
//— 全ての保有ポジションの取捨
for(int i=total-1; i>=0; i–)
{
//— 注文のパラメータ
ulong  position_ticket=PositionGetTicket(i);                                     // ポジションチケット
string position_symbol=PositionGetString(POSITION_SYMBOL);                       // シンボル
int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);             // 小数点以下の桁数
ulong  magic=PositionGetInteger(POSITION_MAGIC);                                 // ポジションのMagicNumber
double volume=PositionGetDouble(POSITION_VOLUME);                                 // ポジションボリューム
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);   // ポジションタイプ
//— ポジション情報の出力
PrintFormat(“#%I64u %s  %s  %.2f  %s [%I64d]”,
position_ticket,
position_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
magic);
//— MagicNumberが一致している場合
if(magic==EXPERT_MAGIC)
{
//— リクエストと結果の値のゼロ化
ZeroMemory(request);
ZeroMemory(result);
//— 操作パラメータの設定
request.action   =TRADE_ACTION_DEAL;       // 取引操作タイプ
request.position =position_ticket;         // ポジションチケット
request.symbol   =position_symbol;         // シンボル
request.volume   =volume;                   // ポジションボリューム
request.deviation=5;                       // 価格からの許容偏差
request.magic    =EXPERT_MAGIC;             // ポジションのMagicNumber
//— ポジションタイプによる注文タイプと価格の設定
if(type==POSITION_TYPE_BUY)
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
request.type =ORDER_TYPE_SELL;
}
else
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
request.type =ORDER_TYPE_BUY;
}
//— 決済情報の出力
PrintFormat(“Close #%I64d %s %s”,position_ticket,position_symbol,EnumToString(type));
//— リクエストの送信
if(!OrderSend(request,result))
PrintFormat(“OrderSend error %d”,GetLastError()); // リクエストの送信に失敗した場合、エラーコードを出力
//— 操作情報 
PrintFormat(“retcode=%u  deal=%I64u  order=%I64u”,result.retcode,result.deal,result.order);
//—
}
}
}
//+——————————————————————+

SL & TP 更新

決済逆指値及び/または決済指値のレベルを変更する取引注文です。以下の 4 つのフィールドを指定する必要があります。

  • action
  • symbol
  • sl
  • tp

保有ポジションのストップロスとテイクプロフィットの値を変更する 取引操作 TRADE_ACTION_SLTPの例:

#define EXPERT_MAGIC 123456 // エキスパートアドバイザのMagicNumber
//+——————————————————————+
//| ポジションのストップロスとテイクプロフィットを変更する                            |
//+——————————————————————+
void OnStart()
{
//— リクエストと結果の宣言
MqlTradeRequest request;
MqlTradeResult  result;
int total=PositionsTotal(); // 保有ポジション数  
//— 全ての保有ポジションを取捨
for(int i=0; i<total; i++)
{
//— 注文パラメータ
ulong  position_ticket=PositionGetTicket(i);// ポジションチケット
string position_symbol=PositionGetString(POSITION_SYMBOL); // シンボル
int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // 小数点以下の桁数
ulong  magic=PositionGetInteger(POSITION_MAGIC); // ポジションのMagicNumber
double volume=PositionGetDouble(POSITION_VOLUME);   // ポジションボリューム
double sl=PositionGetDouble(POSITION_SL); // ポジションのStop Loss
double tp=PositionGetDouble(POSITION_TP); // ポジションのTake Profit
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // ポジションタイプ
//— ポジション情報の出力
PrintFormat(“#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]”,
position_ticket,
position_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//— MagicNumberが一致し、ストップロスとテイクプロフィットが指定されていない場合
if(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
        //— 現在の価格レートの計算
double price=PositionGetDouble(POSITION_PRICE_OPEN);
double bid=SymbolInfoDouble(position_symbol,SYMBOL_BID);
double ask=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
int    stop_level=(int)SymbolInfoInteger(position_symbol,SYMBOL_TRADE_STOPS_LEVEL);
double price_level;
//— 現在の決済価格からの最小許容オフセットが指定されていない場合
if(stop_level<=0)
stop_level=150; // 現在の決済価格から150ポイントのオフセットを設定する
else
stop_level+=50; // 念の為オフセットレベルは(SYMBOL_TRADE_STOPS_LEVEL + 50)ポイントと同じにする
 
//— Stop LossとTake Profitの値の計算と四捨五入
price_level=stop_level*SymbolInfoDouble(position_symbol,SYMBOL_POINT);
if(type==POSITION_TYPE_BUY)
{
sl=NormalizeDouble(bid-price_level,digits);
tp=NormalizeDouble(bid+price_level,digits);
}
else
{
sl=NormalizeDouble(ask+price_level,digits);
tp=NormalizeDouble(ask-price_level,digits);
}
//— リクエストと結果の値のゼロ化
ZeroMemory(request);
ZeroMemory(result);
//— 操作パラメータの設定
request.action  =TRADE_ACTION_SLTP; // 取引操作タイプ
request.position=position_ticket;   // ポジションシンボル
request.symbol=position_symbol;     // シンボル
request.sl      =sl;               // ポジションのStop Loss
request.tp      =tp;               // ポジションのTake Profit
request.magic=EXPERT_MAGIC;         // MagicNumber позиции
//— 変更情報の出力
PrintFormat(“Modify #%I64d %s %s”,position_ticket,position_symbol,EnumToString(type));
//— リクエストの送信
if(!OrderSend(request,result))
PrintFormat(“OrderSend error %d”,GetLastError()); // リクエストの送信に失敗した場合、エラーコードを出力する
//— 操作情報 
PrintFormat(“retcode=%u  deal=%I64u  order=%I64u”,result.retcode,result.deal,result.order);
}
}
}
//+——————————————————————+

未決注文

未決注文をするための取引注文です。以下の 11 のフィールドを指定する必要があります。

  • action
  • symbol
  • volume
  • price
  • stoplimit
  • sl
  • tp
  • type
  • type_filling
  • type_time
  • expiration

「magic」及び「comment」フィールドの指定も可能です。

未決注文を設定する 取引操作TRADE_ACTION_PENDINGの例:

#property description “未決注文設定の例”
#property script_show_inputs
#define EXPERT_MAGIC 123456                             // エキスパートアドバイザのMagicNumber
input ENUM_ORDER_TYPE orderType=ORDER_TYPE_BUY_LIMIT;   // 注文タイプ
//+——————————————————————+
//| 未決注文の設定                                                      |
//+——————————————————————+
void OnStart()
{
//— リクエストと結果の宣言と初期化
MqlTradeRequest request={0};
MqlTradeResult  result={0};
//— 未決注文の設定の為のパラメータ
request.action   =TRADE_ACTION_PENDING;                             // 取引操作タイプ
request.symbol   =Symbol();                                         // シンボル
request.volume   =0.1;                                             // 0.1ロットのボリューム
request.deviation=2;                                               // 価格からの許容偏差
request.magic    =EXPERT_MAGIC;                                     // 注文のMagicNumber
int offset = 50;                                                   // 注文設定の為の現在の価格からのオフセット(ポイント)
double price;                                                      // 注文の発動価格
double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);               // ポイントサイズ
int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);              // 小数点以下の桁数(精度)
  //— 操作タイプのチェック
if(orderType==ORDER_TYPE_BUY_LIMIT)
{
request.type     =ORDER_TYPE_BUY_LIMIT;                         // 注文タイプ
price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;       // 発注価格
request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
}
else if(orderType==ORDER_TYPE_SELL_LIMIT)
{
request.type     =ORDER_TYPE_SELL_LIMIT;                         // 注文タイプ
price=SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;         // 発注価格
request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
}
else if(orderType==ORDER_TYPE_BUY_STOP)
{
request.type =ORDER_TYPE_BUY_STOP;                               // 注文タイプ
price        =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // 発注価格
request.price=NormalizeDouble(price,digits);                     // 正規化された発注価格
}
else if(orderType==ORDER_TYPE_SELL_STOP)
{
request.type     =ORDER_TYPE_SELL_STOP;                           // 注文タイプ
price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;         // 発注価格
request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
}
else Alert(“この例は未決注文の設定のみを対象にしています”);   // もし未決注文ではないものが選択されている場合
//— リクエストの送信
if(!OrderSend(request,result))
PrintFormat(“OrderSend error %d”,GetLastError());                 // もしリクエストの送信に失敗した場合、エラーコードを出力する
//— 操作情報
PrintFormat(“retcode=%u  deal=%I64u  order=%I64u”,result.retcode,result.deal,result.order);
}
//+——————————————————————+

未決注文の変更

未決注文を変更する取引注文です。以下の 7 つのフィールドを指定する必要があります

  • action
  • order
  • price
  • sl
  • tp
  • type_time
  • expiration

未決注文の価格レベルを変更する取引操作TRADE_ACTION_MODIFYの例:

#define EXPERT_MAGIC 123456 // エキスパートアドバイザのMagicNumber
//+——————————————————————+
//| 未決注文の変更                                                      |
//+——————————————————————+
void OnStart()
{
//— リクエストと結果の宣言と初期化
MqlTradeRequest request={0};
MqlTradeResult  result={0};
int total=OrdersTotal(); // 保有未決注文数
//— 全ての保有未決注文を取捨
for(int i=0; i<total; i++)
{
//— 注文パラメータ
ulong  order_ticket=OrderGetTicket(i);                             //注文チケット
string order_symbol=Symbol();                                     // シンボル
int    digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS); // 小数点以下の桁数
ulong  magic=OrderGetInteger(ORDER_MAGIC);                         // 注文のMagicNumber
double volume=OrderGetDouble(ORDER_VOLUME_CURRENT);               // 現在の注文量
double sl=OrderGetDouble(ORDER_SL);                               // 現在の注文のStop Loss
double tp=OrderGetDouble(ORDER_TP);                               // 現在の注文のTake Profit
ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // 注文タイプ
int offset = 50;                                                   // 発注の為の現在価格からのオフセット(ポイント)
double price;                                                     // 注文発動価格
double point=SymbolInfoDouble(order_symbol,SYMBOL_POINT);         // ポイントサイズ
//— 注文情報の出力
PrintFormat(“#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]”,
order_ticket,
order_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//— MagicNumberが一致し、Stop LossとTake Profitが設定されていない場合
if(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
request.action=TRADE_ACTION_MODIFY;                           // 取引操作タイプ
request.order = OrderGetTicket(i);                           // 注文チケット
request.symbol   =Symbol();                                   // シンボル
request.deviation=5;                                         // 価格からの許容オフセット
//— 価格レベルの設定、タイプに合わせた注文のTake ProfitとStop Loss
if(type==ORDER_TYPE_BUY_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price    =NormalizeDouble(price,digits);               // 正規化された発注価格
}
else if(type==ORDER_TYPE_SELL_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
}
else if(type==ORDER_TYPE_BUY_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
}
else if(type==ORDER_TYPE_SELL_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
}
//—リクエストの送信
if(!OrderSend(request,result))
PrintFormat(“OrderSend error %d”,GetLastError()); // リクエストの送信に失敗した場合、エラーコードを出力する
//— 操作情報  
PrintFormat(“retcode=%u  deal=%I64u  order=%I64u”,result.retcode,result.deal,result.order);
//— リクエストと結果の値のゼロ化
ZeroMemory(request);
ZeroMemory(result);
}
}
}
//+——————————————————————+

未決注文の削除

未決注文を削除するための取引注文です。以下の 2 つのフィールドを指定する必要があります。

  • action
  • order

未決注文の削除をする 取引操作TRADE_ACTION_REMOVEの例:

#define EXPERT_MAGIC 123456 // エキスパートアドバイザのMagicNumber
//+——————————————————————+
//| 未決注文の削除                                                      |
//+——————————————————————+
void OnStart()
{
//— リクエストと結果の宣言と初期化
MqlTradeRequest request={0};
MqlTradeResult  result={0};
int total=OrdersTotal(); // 保有未決注文数
//— 全ての保有未決注文を取捨
for(int i=total-1; i>=0; i–)
{
ulong  order_ticket=OrderGetTicket(i);                   // 注文チケット
ulong  magic=OrderGetInteger(ORDER_MAGIC);               // 注文のMagicNumber
//— MagicNumberが一致している場合
if(magic==EXPERT_MAGIC)
{
//— リクエストと結果の値のゼロ化
ZeroMemory(request);
ZeroMemory(result);
//— 操作パラメータの設定    
request.action=TRADE_ACTION_REMOVE;                   // 取引操作タイプ
request.order = order_ticket;                         // 注文チケット
//— リクエストの送信
if(!OrderSend(request,result))
PrintFormat(“OrderSend error %d”,GetLastError()); // リクエストの送信に失敗した場合、エラーコードを出力する
//— 操作情報  
PrintFormat(“retcode=%u  deal=%I64u  order=%I64u”,result.retcode,result.deal,result.order);
}
}
}
//+——————————————————————+

参照

構造体とクラス、取引の関数、注文プロパティ

小切手リクエストの結果の構造体( MqlTradeCheckResult )

取引操作リクエストを取引サーバに送信する前に、チェックすることが推奨されます。このチェックは OrderCheck() 関数に、チェックするリクエストと MqlTradeCheckResult 構造体型の変数を渡すことによってなされます。チェックの結果はこの変数に書かれます。

struct MqlTradeCheckResult
{
uint         retcode;             // 返信コード
double       balance;             // 約定実行後の残高
double       equity;             // 約定実行後の株式
double       profit;             // 変動利益
double       margin;             // 証拠金必要条件
double       margin_free;         // 余剰証拠金
double       margin_level;       // 証拠金レベル
string       comment;             // 返信コードコメント(エラーの説明)
};

フィールドの説明

フィールド

説明

retcode

リターンコード。

balance

取引操作実行後の残高値。

equity

取引操作実行後の株式値。

profit

取引操作実行後の変動利益。

margin

取引操作に必要な証拠金。

margin_free

取引操作実行後に残される余剰証拠金。

margin_level

取引操作実行後に設定される証拠金レベル。

comment

返信コードコメント(エラーの説明)。

参照

取引リクエスト構造体、現在価格の構造体、OrderSend、OrderCheck

取引リクエスト結果の構造体 (MqlTradeResult)

取引リクエストの結果として、取引サーバは MqlTradeResult 型の特殊な事前定義された構造と取引リクエストの処理結果のデータを返します。

struct MqlTradeResult
{
uint   retcode;         // 操作のリターンコード
ulong   deal;             // 実行された場合の 約定チケット
ulong   order;           // 注文された場合のチケット
double   volume;           // ブローカーによって確認された約定ボリューム
double   price;           // ブローカーによって確認された約定価格
double   bid;             // 現在の売値
double   ask;             // 現在の買値
string   comment;         // 操作に対するブローカーコメント(デフォルトは取引サーバの返したコードの記述)
uint   request_id;       // ディスパッチの際に、端末によって設定されたリクエストID
uint   retcode_external; // 外部取引システムのリターンコード
};

フィールドの説明

フィールド

説明

retcode

取引サーバのリターンコード。

deal

約定チケット(注文がなされた場合)。TRADE_ACTION_DEAL 型の取引操作で使用可能です。

order

注文チケット(注文された場合)。TRADE_ACTION_PENDING 型の取引操作で使用可能です。

volume

ブローカーによって確認された 約定ボリューム。注文充填タイプによって変化します。

price

ブローカーによって確認された 約定価格取引リクエストまたは取引操作の deviation フィールドに依存します。

bid

現在のマーケット売値(リクオート価格)。

ask

現在のマーケット買値 (リクオート価格)。

comment

操作に対するブローカーコメント(デフォルトは取引サーバの返したコードの記述)。

request_id

取引サーバへの送信時に端末によって設定されたリクエストID。

retcode_external

外部取引システムが返したエラーコード。これらのエラーの種類と使用は取引操作が送信される外部取引システムとブローカーに依存します。

取引操作の結果は取引操作を実行するためにOrderSend()に 2 番目のパラメータとして渡される MqlTradeResult type の変数に返されます。

端末は OrdersSend() または OrderSendAsync()関数を使用しての取引サーバへの送信時に request_id フィールドのリクエスト ID を変更します。端末は、取引サーバから実行されるトランザクションに関するメッセージを受信しOnTradeTransaction()関数による処理のためにパラメータとして以下の成分を含んで提出します。

  • MqlTradeTransaction 構造体内での取引トランザクションの記述。
  • OrderSend() または OrdersSendAsync() 関数から送信された取引リクエストの記述 。リクエスト ID は端末によって取引サーバに送信され、リクエストとその request_id は端末メモリに保存されます。
  • 取引リクエストの実行結果は、リクエストのIDを request_id フィールドに含む MqlTradeResult 構造になります。

OnTradeTransaction() 関数は、3 つの入力パラメータを受信しますが、最後の 2 つは TRADE_TRANSACTION_REQUEST 型のトランザクションのみで分析されるべきです。他の全ての場合では、取引リクエストとその実行結果のデータは満たされません。パラメータ分析の例は取引リクエスト構造体をご参照ください。

サーバ送信時の端末による request_id の設定は主に OrderSendAsync() 非同期関数を操作するために導入されました。この識別子は、アクション(OrderSend または OrderSendAsync 関数の呼び出し)と OnTradeTransaction()に送信されたアクションの結果を関連付けます。

例:

//+——————————————————————+
//| 結果処理と取引リクエストを送信する                                        |
//+——————————————————————+
bool MyOrderSend(MqlTradeRequest request,MqlTradeResult result)
{
//— 最後のエラーコードをゼロにリセットする
ResetLastError();
//— リクエストを送信する
bool success=OrderSend(request,result);
//— 失敗したら、理由を見つける
if(!success)
{
int answer=result.retcode;
Print(“TradeLog: Trade request failed. Error = “,GetLastError());
switch(answer)
{
//— リクオート
case 10004:
{
Print(“TRADE_RETCODE_REQUOTE”);
Print(“request.price = “,request.price,”   result.ask = “,
result.ask,” result.bid = “,result.bid);
break;
}
//— 注文がサーバに受け入れられない
case 10006:
{
Print(“TRADE_RETCODE_REJECT”);
Print(“request.price = “,request.price,”   result.ask = “,
result.ask,” result.bid = “,result.bid);
break;
}
//— 無効な価格
case 10015:
{
Print(“TRADE_RETCODE_INVALID_PRICE”);
Print(“request.price = “,request.price,”   result.ask = “,
result.ask,” result.bid = “,result.bid);
break;
}
//— 無効な SL 及び/または TP
case 10016:
{
Print(“TRADE_RETCODE_INVALID_STOPS”);
Print(“request.sl = “,request.sl,” request.tp = “,request.tp);
Print(“result.ask = “,result.ask,” result.bid = “,result.bid);
break;
}
//— 無効なボリューム
case 10014:
{
Print(“TRADE_RETCODE_INVALID_VOLUME”);
Print(“request.volume = “,request.volume,”   result.volume = “,
result.volume);
break;
}
//— 取引操作に不充分なメモリ
case 10019:
{
Print(“TRADE_RETCODE_NO_MONEY”);
Print(“request.volume = “,request.volume,”   result.volume = “,
result.volume,”   result.comment = “,result.comment);
break;
}
//— 他の理由。サーバ応答コードを出力する
default:
{
Print(“Other answer = “,answer);
}
}
//— false を返して、取引リクエストの失敗結果を通知する
return(false);
}
//— OrderSend() が true を返す。- 答えを繰り返す。
return(true);
}

取引処理構造体 (MqlTradeTransaction)

取引口座にいくつかの明確なアクションを実行すると、状態が変更されます。アクションの例は下記です。

  • クライアント端末内の任意の MQL5 アプリケーションから OrderSend と OrderSendAsync 関数を使用して取引リクエストを送信し、取引が実行される。
  • 端末のグラフィカルインターフェースを使用して取引リクエストを送信し、取引が実行される。
  • サーバ上で未決注文と逆指値注文が執行される。
  • 取引サーバ側で操作を行う。

これらのアクションの結果として以下の取引トランザクションが実行されます。

  • 取引リクエストの処理
  • 未執行注文の変更
  • 注文履歴の変更
  • 約定履歴の変更
  • ポジションの変更

例えば、市場の買い注文を送信する際に、注文が処理され、買い注文が口座に記録されます。その後注文が実行されオープン注文の表から削除されて注文履歴に追加されます。約定履歴に追加され新しいポジションが作成されます。これらのアクションは全て取引トランザクションです。

取引処理の口座への適応のために、MQL5 では特別な OnTradeTransaction() ハンドラ—が提供されています。ハンドラ—の1 番目のパラメータは取引処理を記述する MqlTradeTransaction 構造体を取得します。

struct MqlTradeTransaction
{
ulong                         deal;             // 約定チケット
ulong                         order;           // 注文チケット
string                       symbol;           // 取引銘柄名
ENUM_TRADE_TRANSACTION_TYPE   type;             // 取引トランザクションの種類
ENUM_ORDER_TYPE               order_type;       // 注文の種類
ENUM_ORDER_STATE             order_state;     // 注文状態
ENUM_DEAL_TYPE               deal_type;       // 約定の種類
ENUM_ORDER_TYPE_TIME       time_type;       // 作用時間の 注文種類
datetime                     time_expiration; // 注文の期限
double                       price;           // 価格
double                       price_trigger;   // ストップリミット注文アクティベーションの価格
double                       price_sl;         // 決済逆指値レベル
double                       price_tp;         // 決済指値レベル
double                       volume;           // ボリューム(ロット単位)
ulong                         position;         // ポジションチケット
ulong                         position_by;     // 反対ポジションのチケット
};

フィールドの説明

フィールド

説明

deal

約定チケット。

order

注文チケット。

symbol

トランザクションが実行される、取引シンボルの名称。

type

取引トランザクションの種類。値は ENUM_TRADE_TRANSACTION_TYPE 列挙値のいずれかです。

order_type

取引注文の種類。値は ENUM_ORDER_TYPE 列挙値のいずれかです。

order_state

取引注文の状態。値は ENUM_ORDER_STATE 列挙値のいずれかです。

deal_type

約定の種類。値は ENUM_DEAL_TYPE 列挙値のいずれかです。

type_time

期限切れ後の注文の種類。値は ENUM_ORDER_TYPE_TIME 列挙値のいずれかです。

time_expiration

未決注 文の期限切れ日時 (ORDER_TIME_SPECIFIED と ORDER_TIME_SPECIFIED_DAY 型の注文)。

price

価格。取引トランザクションの種類によって、注文価格、 約定またはポジションの価格。

price_trigger

指値つきストップ注文(活性化)価格(ORDER_TYPE_BUY_STOP_LIMIT と ORDER_TYPE_SELL_STOP_LIMIT)。

price_sl

決済逆指値。取引トランザクションの種類によって、注文、 約定、またはポジション。

price_tp

決済指値。取引トランザクションの種類によって、注文、 約定、またはポジション。

ボリューム

ロットでのボリューム。取引トランザクションの種類によって、注文、 約定、またはポジションの現在のボリューム。

position

トランザクションが影響を与えたポジションチケット。

position_by

反対ポジションのチケット。反対ポジション(同じ商品であるが反対側に保有するポジション)の決済時に使用されます。

受信したトランザクション分析の必須パラメータはtype フィールドで指定された型です。例えば、トランザクションが TRADE_TRANSACTION_REQUEST タイプ(サーバによる取引リクエスト処理の結果が受信された)の場合、構造体のtypeフィールド のみが書き入れられています。他のフィールドは分析されません。この場合、下記のように、OnTradeTransaction() ハンドラ—に渡されたrequest 及び result 追加パラメータの分析が可能です。

取引操作タイプのデータによってで、取引口座の注文、ポジションや 約定の現在の状態を分析することが出来ます。サーバに送信された 1 つの取引リクエストが複数の新しいトランザクションを生成することがあることは、留意されるべきです。端末におけるこれらのトランザクションの到着の優先順位は保証されません。

MqlTradeTransaction 構造は、取引トランザクションの種類に応じて異なる方法で書き入れられています(ENUM_TRADE_TRANSACTION_TYPE)。

TRADE_TRANSACTION_ORDER_* 及び TRADE_TRANSACTION_HISTORY_*

MqlTradeTransaction 構造内の次のフィールドは、オープン注文の処理に関連する取引(TRADE_TRANSACTION_ORDER_ADD、TRADE_TRANSACTION_ORDER_UPDATE 及び TRADE_TRANSACTION_ORDER_DELETE)と注文履歴(TRADE_TRANSACTION_HISTORY_ADD、TRADE_TRANSACTION_HISTORY_UPDATE、TRADE_TRANSACTION_HISTORY_DELETE)のために書き入れられています。

  • order – 注文チケット。
  • symbol – 注文銘柄名。
  • type – 取引トランザクションの種類。
  • order_type – 注文の種類。
  • orders_state – 注文の現状態。
  • time_type – 注文期限切れの種類。
  • time_expiration – 注文期限切れの時刻 ORDER_TIME_SPECIFIED 及び ORDER_TIME_SPECIFIED_DAY 期限切れ型を持つ注文)。
  • price – クライアントによって指定された注文価格。
  • price_trigger – 指値つきストップ注文のストップ価格(ORDER_TYPE_BUY_STOP_LIMIT 及び ORDER_TYPE_SELL_STOP_LIMIT のみ)。
  • price_sl – 決済逆指値(注文で指定されている場合)。
  • price_tp – 決済指値(注文で指定されている場合)。
  • volume – 現在の注文のボリューム。初回注文ボリュームは、HistoryOrders* 関数を使用して注文履歴で見つけることが出来ます。
  • position – 注文実行の結果として保有、変更、決済されたポジションのチケット。成行注文の為にのみ記入されます。TRADE_TRANSACTION_ORDER_ADDの為には記入されません。
  • position_by – 反対ポジションのチケット。反対ポジションを決済する注文(close by)の為にのみ記入されます。

TRADE_TRANSACTION_DEAL_*

MqlTradeTransaction 構造内の次のフィールドは取引ハンドルに関するトランザクションのために書き入れられています(TRADE_TRANSACTION_DEAL_ADD、TRADE_TRANSACTION_DEAL_UPDATE 及び TRADE_TRANSACTION_DEAL_DELETE)。

  • deal – 約定チケット
  • order – 約定が基づいている注文チケット
  • symbol – 約定銘柄名
  • type – 取引トランザクションの種類。
  • deal_type – 約定の種類
  • price – 約定価格
  • price_sl – 決済逆指値(約定が基づいている注文で指定された場合に書き入れられる)
  • price_tp – 決済指値(約定が基づいている注文で指定された場合に書き入れられる)
  • volume – 約定ボリューム(ロット単位)
  • position – 取引実行の結果、保有、変更、決済されたポジションのチケット。
  • position_by – 反対ポジションのチケット。反対ポジション決済の取引(out by)の為にのみ記入されます。

TRADE_TRANSACTION_POSITION

以下の MqlTradeTransaction 構造内の次のフィールドは、取引の実行に関連しないポジション変更に関連する取引トランザクションのために満たされています(TRADE_TRANSACTION_POSITION)

  • symbol – ポジション銘柄名
  • type – 取引トランザクションの種類。
  • deal_type – ポジションの種類(DEAL_TYPE_BUY または DEAL_TYPE_SELL
  • price – 加重平均ポジションの始値
  • price_sl – 決済逆指値
  • price_tp – 決済指値
  • volume – 変更された場合のポジションボリューム(ロット単位)
  • position – ポジションチケット。

約定実行の結果としてのポジション変更(追加、変更または閉鎖)は、TRADE_TRANSACTION_POSITION トランザクションの発生にはつながりません。

TRADE_TRANSACTION_REQUEST

取引トランザクションの場合、取引リクエストがサーバに処理され結果が受け取られたという事実を説明するために、MqlTradeTransaction の 1 つのフィールド (TRADE_TRANSACTION_REQUEST)のみが書き込まれます。

  • type – 取引トランザクションの種類。

この様なトランザクションでは type フィールド(取引トランザクションの種類)のみを分析する必要があります。OnTradeTransaction 関数の第 2 また第 3 パラメータ(request と result)も追加データのために分析する必要があります。

例:

input int MagicNumber=1234567;

//— CTrade 取引クラスを有効にしてクラス変数を宣言する
#include <Trade\Trade.mqh>
CTrade trade;
//— 未決注文インストールと削除のフラグ
bool pending_done=false;
bool pending_deleted=false;
//— 未決注文チケットはここに保存される
ulong order_ticket;
//+——————————————————————+
//| エキスパート初期化に使用される関数                                        |
//+——————————————————————+
int OnInit()
{
//— MagicNumber を設定して全ての注文をマークする
trade.SetExpertMagicNumber(MagicNumber);
//— 取引リクエストは OrderSendAsync() 関数を使用して非同期モードで送信される
trade.SetAsyncMode(true);
//— 変数をゼロで初期化する
order_ticket=0;
//—
return(INIT_SUCCEEDED);
}
//+——————————————————————+
//| エキスパートティック関数                                                 |
//+——————————————————————+
void OnTick()
{
//—未決注文のインストール
if(!pending_done)
{
double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double buy_stop_price=NormalizeDouble(ask+1000*_Point,(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
bool res=trade.BuyStop(0.1,buy_stop_price,_Symbol);
//— BuyStop() 関数が成功
if(res)
{
pending_done=true;
//— ctrade から送信リクエストした結果の取得
MqlTradeResult trade_result;
trade.Result(trade_result);
//— 送信されたリクエストの request_id を取得
uint request_id=trade_result.request_id;
Print(“Request has been sent to set a pending order. Request_ID=”,request_id);
//— 注文チケットを保存する(CTrade への送信に非同期モードを使用する場合はゼロ)
order_ticket=trade_result.order;
//— 完成。 OnTick() ハンドラ—を早期終了する。
return;
}
}
//— 未決注文の削除
if(!pending_deleted)
//— 追加のチェック
if(pending_done && (order_ticket!=0))
{
//— 未決注文の削除を試みる
bool res=trade.OrderDelete(order_ticket);
Print(“OrderDelete=”,res);
//— 削除リクエスト送信に成功
if(res)
{
pending_deleted=true;
//— リクエストの実行結果を取得
MqlTradeResult trade_result;
trade.Result(trade_result);
//— 結果から request ID と取得
uint request_id=trade_result.request_id;
//— 操作ログに表示
Print(“The request has been sent to delete a pending order #”,order_ticket,
“. Request_ID=”,request_id,
“\r\n”);
//— リクエスト結果から注文チケットを修正
order_ticket=trade_result.order;
}
}
//—        
}
//+——————————————————————+
//| TradeTransaction 関数                                             |
//+——————————————————————+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//— トランザクション型を列挙値として取得する
ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type;
//— トランザクションが結果処理のリクエストの場合は、名称のみを表示する
if(type==TRADE_TRANSACTION_REQUEST)
{
Print(EnumToString(type));
//— 取り扱つかわれたリクエストの文字列名を表示する
Print(“————RequestDescription\r\n”,RequestDescription(request));
//— リクエスト結果の記述を表示する
Print(“————ResultDescription\r\n”,TradeResultDescription(result));
//— OnTick() の次のハンドルで削除されるよう、チケットを保存する
if(result.order!=0)
{
//— 次の OnTick() の呼び出しでこの注文をチケットによって削除する
order_ticket=result.order;
Print(” Pending order ticket “,order_ticket,“\r\n”);
}
}
else // 別の種類のトランザクションの完全記述を表示する
//— 受け取ったトランザクションの記述を操作ログに表示する
Print(“————TransactionDescription\r\n”,TransactionDescription(trans));

//—    
}
//+——————————————————————+
//| トランザクションのテキスト形式の記述を返す                                    |
//+——————————————————————+
string TransactionDescription(const MqlTradeTransaction &trans)
{
//—
string desc=EnumToString(trans.type)+“\r\n”;
desc+=“Symbol: “+trans.symbol+“\r\n”;
desc+=“Deal ticket: “+(string)trans.deal+“\r\n”;
desc+=“Deal type: “+EnumToString(trans.deal_type)+“\r\n”;
desc+=“Order ticket: “+(string)trans.order+“\r\n”;
desc+=“Order type: “+EnumToString(trans.order_type)+“\r\n”;
desc+=“Order state: “+EnumToString(trans.order_state)+“\r\n”;
desc+=“Order time type: “+EnumToString(trans.time_type)+“\r\n”;
desc+=“Order expiration: “+TimeToString(trans.time_expiration)+“\r\n”;
desc+=“Price: “+StringFormat(“%G”,trans.price)+“\r\n”;
desc+=“Price trigger: “+StringFormat(“%G”,trans.price_trigger)+“\r\n”;
desc+=“Stop Loss: “+StringFormat(“%G”,trans.price_sl)+“\r\n”;
desc+=“Take Profit: “+StringFormat(“%G”,trans.price_tp)+“\r\n”;
desc+=“Volume: “+StringFormat(“%G”,trans.volume)+“\r\n”;
//— 取得した文字列を返す
return desc;
}
//+——————————————————————+
//| 取引リクエストのテキスト形式の記述を返す                                    |
//+——————————————————————+
string RequestDescription(const MqlTradeRequest &request)
{
//—
string desc=EnumToString(request.action)+“\r\n”;
desc+=“Symbol: “+request.symbol+“\r\n”;
desc+=“Magic Number: “+StringFormat(“%d”,request.magic)+“\r\n”;
desc+=“Order ticket: “+(string)request.order+“\r\n”;
desc+=“Order type: “+EnumToString(request.type)+“\r\n”;
desc+=“Order filling: “+EnumToString(request.type_filling)+“\r\n”;
desc+=“Order time type: “+EnumToString(request.type_time)+“\r\n”;
desc+=“Order expiration: “+TimeToString(request.expiration)+“\r\n”;
desc+=“Price: “+StringFormat(“%G”,request.price)+“\r\n”;
desc+=“Deviation points: “+StringFormat(“%G”,request.deviation)+“\r\n”;
desc+=“Stop Loss: “+StringFormat(“%G”,request.sl)+“\r\n”;
desc+=“Take Profit: “+StringFormat(“%G”,request.tp)+“\r\n”;
desc+=“Stop Limit: “+StringFormat(“%G”,request.stoplimit)+“\r\n”;
desc+=“Volume: “+StringFormat(“%G”,request.volume)+“\r\n”;
desc+=“Comment: “+request.comment+“\r\n”;
//— 取得した文字列を返す
return desc;
}
//+——————————————————————+
//| リクエスト処理結果の記述ををテキスト形式で返す                               |
//+——————————————————————+
string TradeResultDescription(const MqlTradeResult &result)
{
//—
string desc=“Retcode “+(string)result.retcode+“\r\n”;
desc+=“Request ID: “+StringFormat(“%d”,result.request_id)+“\r\n”;
desc+=“Order ticket: “+(string)result.order+“\r\n”;
desc+=“Deal ticket: “+(string)result.deal+“\r\n”;
desc+=“Volume: “+StringFormat(“%G”,result.volume)+“\r\n”;
desc+=“Price: “+StringFormat(“%G”,result.price)+“\r\n”;
desc+=“Ask: “+StringFormat(“%G”,result.ask)+“\r\n”;
desc+=“Bid: “+StringFormat(“%G”,result.bid)+“\r\n”;
desc+=“Comment: “+result.comment+“\r\n”;
//— 取得した文字列を返す
return desc;
}

参照

取引処理の種類、OnTradeTransaction()

現在の価格を取得する構造体(MqlTick)

銘柄ごとの最新価格を保存する構造体です。現在の価格についての最もニーズのある情報を取得する為のものです。

struct MqlTick
{
datetime   time;         // 最新の価格更新の時間
double       bid;           // 現在のBid価格
double       ask;           // 現在のAsk価格
double       last;         // 最後の取引の現在価格(Last)
ulong       volume;       // 現在のLast価格の数量
long         time_msc;     // ミリ秒単位の最新の価格更新の時間
uint       flags;         // ティックフラグ
double       volume_real;   // 現在のLast価格のより正確な数量
};

MqlTick型の変数によって一回のSymbolInfoTick()変数の呼び出しでAsk、Bid、Last、Volumeの値を取得することができます。

各ティックは、前回のティックと比べデータが変わったかどうかに関わらず、いつも全てのパラメータが埋められます。ティックヒストリーで前回の数値を検索することなく、あらゆる瞬間の現在の価格状態をいつも見ることができます。例えば、ティックと共にBid価格だけ変わったが、構造体の中では新しい価格の他に、前回のAsk価格や数量など、他のパラメータも表示されます。

現在のティックのデータとどう変わったかを知るには、そのフラグを分析してください。

  • TICK_FLAG_BID – ティックがBid価格を変更した
  • TICK_FLAG_ASK  – ティックがAsk価格を変更した
  • TICK_FLAG_LAST – ティックが最終取引価格を変更した
  • TICK_FLAG_VOLUME – ティックが数量を変更した
  • TICK_FLAG_BUY – 買い取引の結果ティックが発生した
  • TICK_FLAG_SELL – 売り取引の結果ティックが発生した

例:

void OnTick()
{
MqlTick last_tick;
//—
if(SymbolInfoTick(Symbol(),last_tick))
{
Print(last_tick.time,“: Bid = “,last_tick.bid,
” Ask = “,last_tick.ask,”  Volume = “,last_tick.volume);
}
else Print(“SymbolInfoTick() failed, error = “,GetLastError());
//—
}

こちらもご参照ください

構造体とクラス、CopyTicks()、SymbolInfoTick()

経済指標カレンダー構造体

このセクションでは、MetaTraderプラットフォームで直接利用可能な経済指標カレンダーを使用するための構造体について説明します。経済指標カレンダーは、マクロ経済指標、その発表日および重要度の説明を含む既製の「百科事典」です。関連するマクロ経済指標の値は、発行直後にメタトレーダープラットフォームに送信され、国、通貨、重要度ごとに必要な指標を視覚的に追跡できるタグとしてチャートに表示されます。

経済指標カレンダー関数を使用すると、必要な国/通貨ペアの観点から、カスタム重要度基準に従って、着信したイベントの自動分析を実行できます。

国の説明はMqlCalendarCountry構造体で設定されます。これはCalendarCountryById()およびCalendarCountries()関数で使用されます。

struct MqlCalendarCountry
{
ulong                               id;                   // 国ID(ISO 3166-1)
string                             name;                 // 国名(現在のターミナルエンコーディング)
string                             code;                 // 国コード名(ISO 3166-1 alpha-2)
string                             currency;             // 国の通貨コード
string                             currency_symbol;       // 国の通貨の銘柄
string                             url_name;             // mql5.comウェブサイトURLに使用される国名
};

 

イベントの説明はMqlCalendarEvent構造体で設定されます。これはCalendarEventById()、CalendarEventByCountry()、 CalendarEventByCurrency()関数で使用されます。

struct MqlCalendarEvent
{
ulong                               id;                   // イベントID
ENUM_CALENDAR_EVENT_TYPE           type;                 // ENUM_CALENDAR_EVENT_TYPE列挙対からのイベントタイプ
ENUM_CALENDAR_EVENT_SECTOR         sector;               // イベントが関連する部門
ENUM_CALENDAR_EVENT_FREQUENCY     frequency;             // イベントの頻度
ENUM_CALENDAR_EVENT_TIMEMODE       time_mode;             // イベント時間モード
ulong                               country_id;           // 国ID
ENUM_CALENDAR_EVENT_UNIT         unit;                 // 経済指標値の単位
ENUM_CALENDAR_EVENT_IMPORTANCE     importance;           // イベントの重要度
ENUM_CALENDAR_EVENT_MULTIPLIER     multiplier;           // 経済指標値の乗数
uint                               digits;               // 小数点以下の桁数
string                             source_url;           // イベント発表源のURL
string                             event_code;           // イベントコード
string                             name;                 // イベント名(現在のターミナルエンコーディング)
};

 

イベント値はMqlCalendarValue構造体で設定されます。これはCalendarValueById()、CalendarValueHistoryByEvent()、 CalendarValueHistory()、CalendarValueLastByEvent()、 CalendarValueLast()関数で使用されます。

struct MqlCalendarValue
{
ulong                               id;                   // 値ID
ulong                               event_id;             // イベントID
datetime                           time;                 // イベント日時
datetime                           period;               // イベント報告期間
int                                 revision;             // 報告期間に関連して発表された指標の改訂
long                               actual_value;         // 実際の指標値
long                               prev_value;           // 以前の指標値
long                               revised_prev_value;   // 改正された以前の指標値
long                               forecast_value;       // 指標の予測値
ENUM_CALENDAR_EVENT_IMPACT         impact_type;           // 為替レートへの潜在的影響
};

 

イベント頻度はMqlCalendarEvent構造体で設定されます。可能な値はリストで設定されます。ENUM_CALENDAR_EVENT_FREQUENCY

ID

説明

CALENDAR_FREQUENCY_NONE

Release frequency is not set

CALENDAR_FREQUENCY_WEEK

Released once a week

CALENDAR_FREQUENCY_MONTH

Released once a month

CALENDAR_FREQUENCY_QUARTER

Released once a quarter

CALENDAR_FREQUENCY_YEAR

Released once a year

CALENDAR_FREQUENCY_DAY

Released once a day

 

Event type is specified in the MqlCalendarEvent structure. 可能な値はリストで設定されます。ENUM_CALENDAR_EVENT_TYPE

ID

説明

CALENDAR_TYPE_EVENT

Event (meeting, speech, etc.)

CALENDAR_TYPE_INDICATOR

Indicator

CALENDAR_TYPE_HOLIDAY

Holiday

 

A sector of the economy an event is related to is specified in the MqlCalendarEvent structure. 可能な値はリストで設定されます。ENUM_CALENDAR_EVENT_SECTOR

ID

説明

CALENDAR_SECTOR_NONE

Sector is not set

CALENDAR_SECTOR_MARKET

Market, exchange

CALENDAR_SECTOR_GDP

国内総生産(Gross Domestic Product、GDP)

CALENDAR_SECTOR_JOBS

Labor market

CALENDAR_SECTOR_PRICES

Prices

CALENDAR_SECTOR_MONEY

Money

CALENDAR_SECTOR_TRADE

取引

CALENDAR_SECTOR_GOVERNMENT

Government

CALENDAR_SECTOR_BUSINESS

Business

CALENDAR_SECTOR_CONSUMER

Consumption

CALENDAR_SECTOR_HOUSING

Housing

CALENDAR_SECTOR_TAXES

Taxes

CALENDAR_SECTOR_HOLIDAYS

Holidays

 

Event importance is specified in the MqlCalendarEvent structure. 可能な値はリストで設定されます。ENUM_CALENDAR_EVENT_IMPORTANCE

ID

説明

CALENDAR_IMPORTANCE_NONE

Importance is not set

CALENDAR_IMPORTANCE_LOW

Low importance

CALENDAR_IMPORTANCE_MODERATE

Medium importance

CALENDAR_IMPORTANCE_HIGH

High importance

 

Measurement unit type used in displaying event values is specified in the MqlCalendarEvent structure. 可能な値はリストで設定されます。ENUM_CALENDAR_EVENT_UNIT

ID

説明

CALENDAR_UNIT_NONE

Measurement unit is not set

CALENDAR_UNIT_PERCENT

Percentage

CALENDAR_UNIT_CURRENCY

National currency

CALENDAR_UNIT_HOUR

Hours

CALENDAR_UNIT_JOB

Jobs

CALENDAR_UNIT_RIG

Drilling rigs

CALENDAR_UNIT_USD

USD

CALENDAR_UNIT_PEOPLE

People

CALENDAR_UNIT_MORTGAGE

Mortgage loans

CALENDAR_UNIT_VOTE

Votes

CALENDAR_UNIT_BARREL

Barrels

CALENDAR_UNIT_CUBICFEET

Cubic feet

CALENDAR_UNIT_POSITION

Non-commercial net positions

CALENDAR_UNIT_BUILDING

Buildings

 

In some cases, economic parameter values require a multiplier set in the MqlCalendarEvent structure. Possible multiplier values are set in the listing ENUM_CALENDAR_EVENT_MULTIPLIER

ID

説明

CALENDAR_MULTIPLIER_NONE

Multiplier is not set

CALENDAR_MULTIPLIER_THOUSANDS

Thousands

CALENDAR_MULTIPLIER_MILLIONS

Millions

CALENDAR_MULTIPLIER_BILLIONS

Billions

CALENDAR_MULTIPLIER_TRILLIONS

Trillions

 

Event’s potential impact on a national currency rate is indicated in the MqlCalendarValue structure. 可能な値はリストで設定されます。ENUM_CALENDAR_EVENT_IMPACT

ID

説明

CALENDAR_IMPACT_NA

Impact is not set

CALENDAR_IMPACT_POSITIVE

Positive impact

CALENDAR_IMPACT_NEGATIVE

Negative impact

 

Event time is specified in the MqlCalendarEvent structure. 可能な値はリストで設定されます。ENUM_CALENDAR_EVENT_TIMEMODE

ID

説明

CALENDAR_TIMEMODE_DATETIME

ソースはイベントの正確な時間を公開します

CALENDAR_TIMEMODE_DATE

終日イベント

CALENDAR_TIMEMODE_NOTIME

ソースはイベントの時間を公開しない

CALENDAR_TIMEMODE_TENTATIVE

ソースはイベントの日を公開するが時間を公開しません。時間はイベントの発生時に指定されます。

 

参照

経済指標カレンダー

Originally posted 2019-07-29 22:48:41.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">