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; } } } |