基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

2012年09月17日(月)

MT5で両建てシステム(9)〜仮想ポジションの売買のプログラム例 [MQL5]



前回、前々回と新規に成行オーダーを送信する関数と、オープンポジションを決済する関数を作成しました。今回は、それらの動作確認をするために簡単なプログラムを作ってみましょう。

売買を1回ずつ確認するために、ここではスクリプトプログラムとして作ってみます。

MessageBox()関数で確認画面を表示させて、OKボタンを押すと実際の売買オーダーが送信されるようにします。

買い注文、買いポジションの決済、売り注文、売りポジションの決済を一通り実行して終わりです。

以下にプログラムを示します。

#property script_show_inputs

input ulong MAGIC_B = 1000; // 買いポジションのマジックナンバー
input ulong MAGIC_S = 1001; // 売りポジションのマジックナンバー
input string COMMENT = "Script1"; // コメント
input double Lots = 0.1; // 売買ロット数
input ulong Slippage = 20; // スリッページ

// 仮想ポジションの構造体
struct MyPosition
{
ulong ticket;
double lots;
double price;
}
MyPos;

// スタート関数
void OnStart()
{
int ret = MessageBox("Buy at market", "TradeTest", MB_OKCANCEL);
if(ret == IDOK) OrderSendMarket(ORDER_TYPE_BUY, Lots, COMMENT+"-BuyOpen");

ret = MessageBox("Close at market", "TradeTest", MB_OKCANCEL);
if(ret == IDOK) OrderClose(COMMENT+"-BuyClose");

ret = MessageBox("Sell at market", "TradeTest", MB_OKCANCEL);
if(ret == IDOK) OrderSendMarket(ORDER_TYPE_SELL, Lots, COMMENT+"-SellOpen");

ret = MessageBox("Close at market", "TradeTest", MB_OKCANCEL);
if(ret == IDOK) OrderClose(COMMENT+"-SellClose");
}

// 新規成行注文
bool OrderSendMarket(ENUM_ORDER_TYPE type, double volume, string comment)
{
MqlTradeRequest request={0};
MqlTradeResult result={0};

MqlTick tick;
SymbolInfoTick(_Symbol, tick);

if(type == ORDER_TYPE_BUY)
{
request.magic = MAGIC_B;
request.price = tick.ask;
}
else if(type == ORDER_TYPE_SELL)
{
request.magic = MAGIC_S;
request.price = tick.bid;
}
else return(false);

request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = volume;
request.deviation = Slippage;
request.type = type;
request.type_filling = ORDER_FILLING_FOK;
request.comment = comment;

OrderSend(request,result);
if(result.retcode != TRADE_RETCODE_DONE)
{
Print("OrderSendRetCode=", result.retcode);
return(false);
}
MyPos.ticket = result.deal;
MyPos.lots = result.volume;
MyPos.price = result.price;
if(type == ORDER_TYPE_SELL) MyPos.lots = -MyPos.lots;
return(true);
}

// ポジションの決済
bool OrderClose(string comment)
{
MqlTradeRequest request={0};
MqlTradeResult result={0};

MqlTick tick;
SymbolInfoTick(_Symbol, tick);

double lots = MyPos.lots;
if(lots > 0)
{
request.type = ORDER_TYPE_SELL;
request.magic = MAGIC_B;
request.price = tick.bid;
}
else if(lots < 0)
{
request.type = ORDER_TYPE_BUY;
request.magic = MAGIC_S;
request.price = tick.ask;
}
else return(true);

request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.deviation = Slippage;
request.volume = MathAbs(lots);
request.type_filling = ORDER_FILLING_FOK;
request.comment = comment;

OrderSend(request,result);
if(result.retcode != TRADE_RETCODE_DONE)
{
Print("OrderCloseRetCode=", result.retcode);
return(false);
}
ZeroMemory(MyPos);
return(true);
}

簡単にプログラムの説明をしておきます。

構造体の宣言のところで、

struct MyPosition
{
ulong ticket;
double lots;
double price;
}MyPos;

と書いてある部分は、

struct MyPosition
{
ulong ticket;
double lots;
double price;
};

MyPosition MyPos;

と記述するのと同じです。構造体の定義と、変数の宣言を同時に行うことができます。

注文用の関数は若干、仕様を変えました。パラメータにあったsymbolは、チャート上のシンボルに限定したため、削除し、代わりにcommentをパラメータとして追加しました。

あと、オーダー執行の成否を判別するため、簡単なエラーチェックをつけました。以下の部分です。

OrderSend(request,result);
if(result.retcode != TRADE_RETCODE_DONE)
{
Print("OrderSendRetCode=", result.retcode);
return(false);
}

result.retcodeTRADE_RETCODE_DONEでなければ、何らかのエラーが発生しているので、そのコードを表示して終了します。

コードの種類についてはこちらをご参照ください。

よくあるエラーとして、エラーコード10027が出ることがあります。これは自動売買が許可されていないというエラーです。この場合、ツールバー上の自動売買のボタンを押して、自動売買が有効になるようにしてください。

このスクリプトプログラムを適当なチャートに挿入して実行すると、次のような画面が表示されます。変数の値はお使いのMT5に合わせて適宜変更してください。

画像(450x180)・拡大画像(719x288)

ここでOKを押すと、プログラムを実行し、まずは次のようなダイアログボックスが表示されます。

画像(241x168)

これは「買い注文」を送信するための確認画面です。ここで、OKボタンを押すと、実際にオーダーが送信されます。キャンセルボタンを押すと、このオーダーはスキップします。

特に問題なければ、買い、決済、売り、決済の4回の売買を繰り返して終わります。ちゃんと売買が行われたかどうかを履歴タブで確認してみてください。

画像(450x87)・拡大画像(800x156)

なお、このプログラムは実際に売買を実行します。必ずデモ口座で実行してください。


>>“基礎から学ぶシステムトレード”全記事バックナンバーはこちらから




Posted at 14時10分


ページのトップへ ページのトップへ

Sponsor AD

2012/9

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

PHOTO

ランダムウォークとランダムトレード(2)

ランダムウォークとランダムトレード(2)

カテゴリーリスト

最近の記事

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.