Top Page



MQLプログラミングの書籍を見ながら、見よう見まねで作成してみました。
簡単な解説をしてみたいと思います。


①パラメーター、定数、グローバル変数の定義
パラメーターには、1ショットのロット数を設定しました。
定数では、発注に使用するマジックナンバーやコメント、移動平均線の期間などを設定しました。
グローバル変数では、発注するチケット番号を定義しました。

◎以下、プログラム
// パラメータ
extern double P_Lot = 0.1;

// 定数
#define D_MagicNumber 1001
#define D_BuyComment "BUY ORDER"
#define D_SellComment "SELL ORDER"
#define D_BuyColor Green
#define D_SellColor Red
#define D_CloseColor Yellow
#define D_MAPeriod 20

// グローバル変数
int G_BuyTicketNum;
int G_SellTicketNum;

②初期処理関数
init関数でチケット番号変数を初期化しました。

◎以下、プログラム
// 関数Init
int init()
{
  G_BuyTicketNum = 0;
  G_SellTicketNum = 0;
}

③メイン処理
ついに自動売買のプログラムのメイン処理です。
今回は、判定して、手仕舞いして発注するだけのプログラムです。
異常時の処理は特に考えていません。
まずは、とにかく作成してみて、そしてテストするところまで動作確認も含め、やってみたいので今回はこれでよいと思っています。

移動平均線の作成やローソク足の判定処理などはインジケーター作成と同じ感じです。
買い注文の発注処理と売り注文の発注処理になっていますが、基本は同じなので買い注文の発注処理を見て見ようと思います。
(1)すでに買い注文済みかどうかの判定
 if(G_BuyTicketNum == 0) 
 変数にチケット番号が設定されていないことを判定しています。
(2)ローソク足と移動平均線のクロス判定
 if(SlowMA > Open[1] && SlowMA < Close[1])
 1つ前のローソク足の始値が移動平均線より下で、終値が移動平均線より上にある場合、買い条件です。
(3)買い条件を満たしている場合、売り注文を決済して買い注文をオーダー
 OrderSelect(G_SellTicketNum,SELECT_BY_TICKET);
 売り注文のチケット番号を設定して、売り注文の情報を取得するための準備をします。
 if(OrderCloseTime() == 0 && G_SellTicketNum > 0)
 オーダーがクローズされていない、かつ売り注文のチケット番号が設定されている場合
 つまり、売り注文が存在していてクローズされていない場合の判定です。
 OderLots = OrderLots();
 ClosePrice = Ask;
 売り注文をクローズする処理のために、注文情報からロット数を設定し、市場のAsk値をクローズ値に設定します。
 Ret_Closed = OrderClose(G_SellTicketNum,OderLots,ClosePrice,0,D_CloseColor);
 関数を使用して注文をクローズします。
 G_BuyTicketNum = OrderSend(Symbol(),OP_BUY,P_Lot,OderPrice,0,0,0,D_BuyComment,D_MagicNumber,0,D_BuyColor);
 関数を使用して買い注文を発注します。
 G_SellTicketNum = 0;
 そして、最後に売り注文のチケット番号を0に設定します。

 以上です。
 自動売買プログラムとしては、問題はたくさんあるかもしれません。
 ですが、これをコンパイルしてテストしてみたいと思います。

◎以下、プログラム
// 関数Start
int start()
{
  double SlowMA; //MA
  double OderLots; //ロット数
  double OderPrice; //発注価格
  double ClosePrice; //決済価格
  bool Ret_Closed; //決済処理戻り値

  // 移動平均線
  SlowMA = iMA(NULL,0,D_MAPeriod,0,0,0,0);

  // 買い注文
  if(G_BuyTicketNum == 0)
  {
    if(SlowMA > Open[1] && SlowMA < Close[1])
    {
      OrderSelect(G_SellTicketNum,SELECT_BY_TICKET);

      // 決済注文
      if(OrderCloseTime() == 0 && G_SellTicketNum > 0)
      {
        OderLots = OrderLots();
        ClosePrice = Ask;

        Ret_Closed = OrderClose(G_SellTicketNum,OderLots,ClosePrice,0,D_CloseColor);
      }

      OderPrice = Ask;

      // 買い注文の発注
      G_BuyTicketNum = OrderSend(Symbol(),OP_BUY,P_Lot,OderPrice,0,0,0,D_BuyComment,D_MagicNumber,0,D_BuyColor);

      G_SellTicketNum = 0;
    }
  }

  // 売り注文
  if(G_SellTicketNum == 0)
  {
    if(SlowMA < Open[1] && SlowMA > Close[1])
    {
      OrderSelect(G_BuyTicketNum,SELECT_BY_TICKET);

      // 決済注文
      if(OrderCloseTime() == 0 && G_BuyTicketNum > 0)
      {
        OderLots = OrderLots();
        ClosePrice = Bid;

        Ret_Closed = OrderClose(G_BuyTicketNum,OderLots,ClosePrice,0,D_CloseColor);
      }

      OderPrice = Bid;

      // 売り注文の発注
      G_SellTicketNum = OrderSend(Symbol(),OP_SELL,P_Lot,OderPrice,0,0,0,D_SellComment,D_MagicNumber,0,D_SellColor);

      G_BuyTicketNum = 0;
    }
  }











FX投資家のためのMetaTrader4逆引きハンドブック [ FXPG ]