説明5
if(!SymbolInfoTick(_Symbol,l_pr))
{
Print("the latest price error");
return;
}
if(CopyRates(_Symbol,_Period,0,2,mrate)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
return;
}
//--------------------------
if(CopyBuffer(maH,0,0,3,maV)<0) return;
//--------------------------
SymbolInfoTick(_Symbol,l_pr)関数のフォーマットは
bool SymbolInfoTick(
string symbol, //通貨ペア名
MqlTick& tick //MqlTick構造体データ
//現在の価格、アップデート時刻等)のアドレス
);
です。
パラメータのsymbolには、チャートの通貨ペア名の_Symbolを記入します。
パラメータのtickには、すでにMqlTick l_pr; でl_prは定義されていますので、
それを記入します。
戻り値は、関数が成功した場合trueを返し、そうでない場合はfalseを返します。
if(!SymbolInfoTick(_Symbol,l_pr))で、関数が成功しない場合、
そのときはthe latest price errorを操作ログに表示し、リターンします。
//-----------------------------
if(CopyRates(_Symbol,_Period,0,2,mrate)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
return;
}
CopyRates(_Symbol,_Period,0,2,mrate)関数のフォーマットは
int CopyRates(
string symbol_name, //通貨ペア名
ENUM_TIMEFRAMES timeframe, //期間
int start_pos, //開始位置
int count, //コピー数
MqlRates rates_array[] //コピー先配列
);
です。
開始位置は0ですので、現在のバーの0番からスタートします。
コピー個数は2で、バー0と1です。
sclose=mrate[0].close;のコードは2個の要素のみとなり、1つ前のバーの終値を今回使います。
配列mrate[]はif(CopyRates(_Symbol,_Period,0,2,mrate)!=2)
2個のコピーが成功したときは戻り値は2となり、
成功しないときは、CopyRates of 通貨ペア名 failed, no historyを操作ログに表示し、
リターンします。
//----------------------------------
if(CopyBuffer(maH,0,0,3,maV)< 0) return;
CopyBuffer(maH,0,0,3,maV)関数のフォーマットは
int CopyBuffer(
int indicator_handle, // インジケーターのハンドル
int buffer_num, // インジケーターのバッファ番号
int start_pos, // 開始位置
int count, // コピー数
double buffer[] // コピー先配列
);
//
OnInitで作成したインジケーターのハンドルは
maH=iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE);
のmaHを記入します。
インジケーターのバッファ番号は、移動平均インジケータのバッファーは1つで、
0 - MAIN_LINEとなりますので、0を記入します。
maVはグローバル変数としてdouble maV[3];と定義。
開始位置0で現在のバー(0)から、コピー数3、バー0、1、2をコピーします。
CopyRatesと同じでコピー元の時系列は右からインデックスが始まります。
コピー先配列のインデックスは左から始まります。
コピー元の0番の値はコピー先の2番になります。混同しないよう注意してください。
下の画像はMQL5のCopyBufferのリファレンスです。
コピー元とコピー先配列では順番が逆転しています。
後のコードで、maV[1]を使います。
bool Buy_S1 = (sclose > maV[1]);
しかし時間足のバーを3まで使うのであれば、
double maV[4];CopyBuffer(maH,0,0,3,maV)は
if(CopyBuffer(maH,0,0,4,maV)<0 data-blogger-escaped-pre="" data-blogger-escaped-return="">
説明7
if(Buy_S1)
{
if (Buy_sig) return;
mreq.action = TRADE_ACTION_DEAL;
mreq.price = NormalizeDouble(l_pr.ask,_Digits);
mreq.sl = NormalizeDouble(l_pr.bid - STP*_Point,_Digits);
mreq.tp = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits);
mreq.symbol = _Symbol;
mreq.volume = Lots;
mreq.magic = Magic;
mreq.type = ORDER_TYPE_BUY;
mreq.type_filling = ORDER_FILLING_FOK;
mreq.deviation= SL ;
// (slippage)
//--- send order
OrderSend(mreq,mresu);
}
if(Buy_S1 )は、
Buy_S1 が1のとき
{ }内のプログラムを実施します。
if (Buy_sig) return;は、Buy_sigがtrueのとき、
つまり買いポジションがあるとき、returnします。
mreqは、MqlTradeRequestの構造体として定義されてます。
struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action; // トレードタイプ
ulong magic; // マジックナンバー(Expert Advisor ID )
ulong order; // 注文チケット番号
string symbol; // トレード通貨
double volume; // 注文ロット数
double price; // 注文価格
double stoplimit;
// オーダのStoplimit(ストップ注文)レベル
double sl;
// オーダのストップロスレベル
double tp;
// オーダのTake Profit(利食い) レベル
ulong deviation;
// スリッページの最大値
ENUM_ORDER_TYPE type;
// 注文の種類
ENUM_ORDER_TYPE_FILLING type_filling;
// ファイリングの種類
ENUM_ORDER_TYPE_TIME type_time;
// 有効期限種類
datetime expiration;
// 有効期限
string comment;
// コメント
};
-----------------------------------------------------
ENUM_TRADE_REQUEST_ACTIONS
TRADE_ACTION_DEAL //成行注文
TRADE_ACTION_PENDING //指値注文
TRADE_ACTION_SLTP //ストップ値、テイクプロフィット値の修正
TRADE_ACTION_MODIFY //指値注文の修正
TRADE_ACTION_REMOVE //指値注文の取り消し
//----------------------------------------------------
mreq.action =TRADE_ACTION_DEAL は、成行注文を指示します。
次は、mreq.price = NormalizeDouble(l_pr.ask,_Digits); です。
l_prは、MqlTick l_pr;
構造体は下記のように定義されています。
struct MqlTick
{
datetime time; // 最新のアップデート時間
double bid; // Bid価格(売値)
double ask; // Ask価格(買値)
double last; // 最新の約定価格
ulong volume; // Volume
};
NormalizeDouble()関数は、l_pr.askで買値を取得し、
実数型の値に、_Digitsで取得した桁数に四捨五入します。
mreq.sl = NormalizeDouble(l_pr.bid - STP*_Point,_Digits); は、
オーダのストップロスレベルです。
mreq.tp = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits); は、
オーダのTake Profit(利食い)レベルです。
mreq.deviation= SL ; は、スリッページの最大値を入力します。
mreq.symbol = _Symbol; は、Expert Advisorのアタッチチャートの通貨ペア名です。
mreq.volume = Lots; は、注文ロット数です。
mreq.magic = Magic; は マジックナンバー です。
mreq.type = ORDER_TYPE_BUY; は買い注文を指示します。
mreq.type_filling = ORDER_FILLING_FOK;は
下記のENUM_ORDER_TYPE_FILLING(列挙型ファイリングオ-ダ-タイプ)から取得します。
ORDER_FILLING_FOK
ORDER_FILLING_IOC
ORDER_FILLING_RETURN
以上を入力して、OrderSend(mreq,mresu); というように買い注文を出します。
//
売り注文も同じ要領です。
bool Sell_S1 = (sclose <maV[1]);
if(Sell_S1)
{
if (Sell_sig) return;
mreq.action = TRADE_ACTION_DEAL;
mreq.price = NormalizeDouble(l_pr.bid,_Digits);
mreq.sl = NormalizeDouble(l_pr.ask + STP*_Point,_Digits);
mreq.tp = NormalizeDouble(l_pr.bid - TKP*_Point,_Digits);
mreq.symbol = _Symbol;
mreq.volume = Lots;
mreq.magic = Magic;
mreq.type= ORDER_TYPE_SELL;
mreq.type_filling = ORDER_FILLING_FOK;
mreq.deviation= SL ;
// (slippage)
//--- send order
OrderSend(mreq,mresu);
}
//
以下のプログラムで売りシグナルを計算します。
bool Sell_S1 = (sclose <maV[1]);
次のif(Sell_S1 ) では、Sell_S1 が1のとき、{ }内のプログラムを実施します。
if (Sell_sig) return; では、
Sell_sigがtrueのとき、(売りポジションがあるとき)、returnします。
mreq.action = TRADE_ACTION_DEAL; は買い注文と同じになります。
mreq.price = NormalizeDouble(l_pr.bid,_Digits); は
NormalizeDouble()関数で、l_pr.bidにより売値を取得し、
型の値に、_Digitsで取得した桁数に四捨五入します。
mreq.sl = NormalizeDouble(l_pr.ask + STP*_Point,_Digits); は、
オーダのストップロスレベルです。
mreq.tp = NormalizeDouble(l_pr.bid - TKP*_Point,_Digits); は、
オーダのTake Profit(利食い)レベルです。
売り注文ですから、ストップロスレベル、Take Profit(利食い)レベルは
+ STP*_Point、- TKP*_Pointと、買い注文とは逆の符号になります。
mreq.type= ORDER_TYPE_SELL;は売り注文の指示です。
他は買い注文と同じになります。
mreq.symbol = _Symbol;
mreq.volume = Lots;
mreq.magic = Magic;
mreq.deviation= SL;
//--- send order
OrderSend(mreq,mresu);
--------------------------------------------------