ブログランキングに参加してます。皆様の応援が情報発信の励みになります(^^)

FX・サラリーマン投資家ランキング

全決済ボタンが欲しい!

FXでスキャルピングをしていると、複数通貨のポジションや

計画的なナンピンにより複数ポジションを持つ事がありますよね?

 

複数持ったポジションを一括で決済したい時ってないですか?

  • 指標発表で大きく動いた時
  • 注目している通貨が節目にタッチした時
  • ナンピンポジションと合算でプラスに転じた時

一つずつ決済してる間に、マイナスに転じてしまって悔しい思いをした事がある人も

いるのではないでしょうか?

 

そこで今回は、MT4で動作する保有ポジションを一括で決済するボタンをEAとして作ってみたいと思います。

こんなボタンを作ります。

 

Step1:まずはボタンを作成する

全決済ボタンを機能させるためには、インジケーターではなくEAとして作成します。

まず、ボタンを作成したいのでObjectCreateを使ってボタンを作成します

int OnInit()
{
   //全決済ボタン
    ObjectCreate("btnClose", OBJ_BUTTON, 0, 0, 0);
    ObjectSet("btnClose", OBJPROP_XDISTANCE, 90);
    ObjectSet("btnClose", OBJPROP_YDISTANCE, 90);
    ObjectSet("btnClose", OBJPROP_XSIZE, 80);
    ObjectSet("btnClose", OBJPROP_YSIZE, 25);
    ObjectSet("btnClose", OBJPROP_CORNER, 1);
    ObjectSet("btnClose", OBJPROP_FONTSIZE, 10);
    ObjectSet("btnClose", OBJPROP_COLOR, Black);
    ObjectSet("btnClose", OBJPROP_BGCOLOR, DarkGray);
    ObjectSetString(0, "btnClose", OBJPROP_TEXT, "全決済");
    ObjectSetString(0, "btnClose", OBJPROP_FONT, "MS ゴシック");
       
    return(INIT_SUCCEEDED);
}

 

ボタンを作成するためには、OnInit関数の中に記載します。

OnInit関数はEaの実行時に1回だけ実行されます。

そのため、今回のようなボタンを作成する処理などはココに記載する事になります。

 

btnCloseとしてる個所はオブジェクトの名前になりますので、好きな名前で大丈夫です。

今回画面の右側に表示したかったので、

OBJPROP_XDISTANCE、OBJPROP_YDISTANCEを90としています。

このあたりの数字を変更すると、表示位置を変更する事が出来ます。

 

Step2:OnChartEvent関数でボタンが押されたかどうかを判定する

ボタンが押されたかどうかを判定するために、OnChartEvent関数を使います。

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

    if(sparam == "btnClose")
    {
        for(int i = OrdersTotal() -1; i >= 0; i--)
        {
        
            OrderSelect(i, SELECT_BY_POS);
            if(OrderType() == OP_BUY)
            {
                RefreshRates();
                if(OrderClose(OrderTicket(), OrderLots(), SymbolInfoDouble(OrderSymbol(), SYMBOL_BID), 5, Yellow) == false)
                {
                    Print(GetLastError());
                    continue;
                }
            }
            else if(OrderType() == OP_SELL)
            {
                RefreshRates();
                if(OrderClose(OrderTicket(), OrderLots(), SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK), 5, Yellow) == false)
                {
                    Print(GetLastError());
                    continue;
                }
            } 
        }
    
        Sleep(100);
        ObjectSet("btnClose", OBJPROP_STATE, False);
    }
}

 

7行目:if(sparam == "btnClose")

ここでどのボタンが押されたかを判定します。

今回はボタンが一つしかないですが、複数ある場合は

このIF文を増やす事で複数のボタンを動作させることが出来ます。

 

9行目:for(int i = OrdersTotal() -1; i >= 0; i--)

今回はすべてのポジションを決済するボタンになりますので、

現在の保有ポジションの数だけ処理を行う必要があります。

OrdersTotal()関数で保有ポジション数を取得する事が出来ますので、

取得したポジション数だけ処理を行うようにします。

 

13,22行目:if(OrderType() == OP_BUY)

買いポジションか売りポジションかを判断している個所になります。

switch()を使ってもいいのですが、

売り・買いの2つしか存在しないので、今回はIF文を使って書いてます。

Elseだけで処理してもいいのですが、

念のためElseIFとして確認してます。

OP_BUYが買い、OP_SELLが売りのポジションを意味します。

16,25行目:if(OrderClose(OrderTicket(), OrderLots(), SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK), 5, Yellow) == false)

ここが実際に決済処理を行ってる個所になります。

5って数字は許容スリッページ数になります。

Yellowってのは決済された個所に表示される三角形のオブジェクトの色の指定になります。

何も表示したくない時は、clr_NONEとすれば出来ます。

 

33,34行目:ObjectSet("btnClose", OBJPROP_STATE, False);

ボタンを押すと、ボタンが凹んだ状態になります。

何も処理をしないと凹んだ状態のままの表示になりますので、

元の状態に戻してあげる必要があります。

ObjectSet関数を使って、OBJPROP_STATEを変更してあげましょう!

Falseにすると押されてない状態

Trueにすると押された状態になります。

今回は、押されてない状態に戻したいので、Falseを設定します。

 

34行目だけだとうまく機能しなかったので、

33行目でSleep(100)として、100ミリ秒待つ処理を入れてます。

私の環境ではこれでうまく動いています。

 

終わり

これで全決済ボタンの作り方は終わりになります。

MT4のEAとして作成してますので、チャートにセットしたら

「自動売買」を許可した状態にしないと動きませんので気を付けてくださいね。

この2か所ですね。

うまく動かなった方はココを確認してみてください。

 

この記事がお役にたてば幸いです。

※動作については自己責任でお願い致します。

免責事項」のページをご確認の上ご使用下さい

ブログランキングに参加してます。皆様の応援が情報発信の励みになります(^^)

FX・サラリーマン投資家ランキング