世の中たくさんMT4向けのツールが出ていますが、スクリプトで作ってみます。自分でコードを触れると少しだけ変えたい!といったときに便利です。
と、その前にこのスクリプトを実行するためには、オプションのエキスパートアドバイザーにて自動売買を許可するにチェックが付いている必要があります。
この部分にチェックが付いているかどうか確認してください。
まずは、デモ口座で適当に通貨の違う3ポジションをとってみました。
早速スクリプトを実行してみます。
メッセージボックスが表示されますので「はい」を選択。一応間違い防止にメッセージボックスを入れてあります。
なお、スクリプトですが、何かしらチャートを表示していないと実行できないため注意してください。
見事全部クローズされました。
今回のスクリプトは、保有中ポジションのみを決済するプログラムとなっています。
未確定の指値注文をまとめてキャンセルするスクリプトも少し変更すると作成可能です。次回は未約定の注文をすべてキャンセルするスクリプトを作成します。
ブログランキングにご協力よろしくお願いいたしますm(_ _ )m
にほんブログ村
プログラムはこちらから
//------------------------------------------------------------------
// すべてのポジションを閉じる
#property copyright "Copyright 2015, Daisuke"
#property link "http://mt4program.blogspot.jp/"
#property version "1.00"
#property strict
//------------------------------------------------------------------
// スクリプト本体
void OnStart()
{
if( !IsTradeAllowed() )
{
MessageBox("オフライン状態もしくはオプションにて自動売買が許可されていません。","CloseAllOrder", MB_OK);
return ;
}
int result = MessageBox("すべてのポジションを終了します。よろしいですか?","CloseAllOrder", MB_YESNO);
if( result != IDYES ) return ;
int total = OrdersTotal();
for( int i = total - 1; i >= 0; i--)
{
if( !IsTradeAllowed() ) return ;
uint startTime = GetTickCount();
while(!IsStopped())
{
//5秒でタイムアウト
if( (GetTickCount() - startTime ) > 5000 ) break;
// オーダーが選択できない状態(すでに存在しない)場合は、リストから削除して終了する。
if( !OrderSelect(i, SELECT_BY_POS) )
{
break ;
}
// オーダータイプが注文中の場合無視
int orderType = OrderType();
if( orderType != OP_BUY && orderType !=OP_SELL ) break ;
if( OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10) )
{
break ;
}
else
{
int errorCode = GetLastError();
// リトライしても仕方がないエラーの時は終了してしまう。
if( errorCode == ERR_INVALID_TICKET)
{
break ;
}
}
Sleep(100);
}
}
}