MQL4 お金の健康

FX自動売買プログラムの開発トーク:自動決済機能をつけて相場の急変に備えよう!

相場の急変への対応

  • レンジ相場に強いFX自動売買プログラムは、相場の急変に弱い。
  • 対策として、自動決済を入れることにした。保有ポジションを少なくすることで、リスクを抑える戦略。
  • スタンダード商品を使ってFXの自動売買を楽しもう!

こんにちは、ウチダです。

いま誰でもほったらかしで資産形成ができる時代を目指して

FXの自動売買プログラムの開発に取り組んでいます。

先日、スタンダード商品を発売しました。

これはボリンジャーバンドを使った逆張り戦略をとっています。

為替が下がりすぎたときに買い注文を入れる。

安いときに買って、高いときに売るイメージです。

この戦略はレンジ相場に強いのですが、

相場の急変には弱いという欠点も持ち合わせています。

そこで、スタンダード商品には改善策を入れているので、紹介します。

ボリンジャーバンドの逆張りは相場の急変に弱い!

ボリンジャーバンドの逆張りは相場の急変に弱い!

上図がまさしく弱点が出たケースです。

為替レートが下がったときに買い注文を出しています。

利益を出すにはレートが上がる必要があります。

しかし、ずるずると下がりつづけ、損失が大きくなった状態です。

含み損が大きくなりすぎると強制決済されるので

元金を失うことになります。

これをどう防ぐかがFX自動売買プログラムの肝になります。

ここでは自動決済機能を紹介します。

利益が出ているならすぐに決済してしまおう!自動決済をコーディングする

利益が出ているならすぐに決済してしまおう!自動決済をコーディングする

例えば含み益が1万円あるとします。

含み益はまだ決済していないので、お金は増えていません。

いま決済したら利益になるよって状態です。

あなたならどうしますか?

すぐに決済して、利益を確定させますか?

それとも、まだ利益が大きくなるかもしれないので

まだ待ち続けますか?

多くの人は決済しないんですよね、後者です。

そして相場が急変して含み益が小さくなり、

いずれ含み損になります。

いつか回復するかなと待ち続けたら

さらに悪化してロスカットされることがまちまちです。

そこで、プログラムでは自動決済をつけました。

具体的には、1000円の利益があって

含み損が500円以下なら決済します。

MQL4のプログラムで書くとこうなります。

#define MAGICMA  2021102901
int reset = 1;

//-----------------------------------------------  
double CalculateRieki()
{
    double rieki = 0;
    for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false) break;   
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderMagicNumber()==MAGICMA) continue;
      
          rieki += OrderProfit();
   }
   
   return(rieki);
}

//-----------------------------------------------
double CalculateHukumi()
{   
    double hukumi = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderMagicNumber()==MAGICMA) continue;
          hukumi += OrderProfit();
   }
   
   return(hukumi);
}

int CheckForClose()
  {
       for(int i=OrdersTotal()-1;i>=0;i--)
       {
           if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
           {
               Closed = OrderClose(OrderTicket(), 
                                                         OrderLots(),
                                                        OrderClosePrice(),
                                                        Adjusted_Slippage,
                                                        clrNONE);
           }
       }
  return(0);
  }
  

void OnTick()
 {
//--- check for history and trading
   
   double rieki = CalculateRieki(); //決済した注文の利益を計算
   double hukumi = CalculateHukumi(); //未決済の利益を計算

   if(rieki > reset *1000 && hukumi> -500 * reset) 
   {
   CheckForClose();
   reset +=1;
   }
}

決済した注文の利益はriekiに入れており、CalculateRieki関数で計算しています。

未決済の利益はhukumiで、CalculateHukumi関数で計算しています。

自動決済はCheckForClose関数で行っています。

自動決済の条件はrieki > reset * 1000、かつhukumi > -500 * resetとしています。

resetが1回目のとき、1000円の利益がある状態で、

かつ含み損が500円より小さいときに自動決済をします。

自動決済が終わったらresetに1を足します。

これは、CalculateRieki関数で計算される決済した注文の利益が

すべての注文の総額になるためです。

決済のたびに利益の設定額を大きくしないと

500円ほどの利益ですぐに決済を繰り返すプログラムになってしまいます。

FXの自動売買プログラムの考え方

こちらのプログラムをテストした結果がこちらです。

EURUSDペア、1時間足で2020年10月〜2021年10月の期間で

バックテストしています。

元手は4万円です。

FX自動売買プログラムのバックテストの結果

青が残高で、預け入れたお金です。

緑が有効証拠金で、これが少なすぎるとロスカットされます。

元手が2倍に増えたあと、有効証拠金が下がり

最後はロスカットされています。

しかし、バックテストでは自動決済機能が使えないらしく、

今回の結果はあくまで参考です。

実際のトレード結果とバックテストの結果は全く異なります。

本番では自動決済機能が働いて、強いプログラムになると確信しています。

収入源をつくるきっかけとして、FXの自動売買を始めてみませんか?

自分でFXの自動売買プログラムを作りたい方はこちらの本がおすすめです。

セットもあります。

ここまで読んでくださりありがとうございました。^^

-MQL4, お金の健康
-,