トップ  >  自作してみる >  エキスパートアドバイザー(EA)作成の基本  >  es1.EAの新規エントリー
スポンサーリンク
検索

↑の検索エンジンが表示されない人は、
↓の古い検索エンジンを使用して下さい。
カスタム検索
MQL4リファレンスツリー
es1.EAの新規エントリー



注意事項:
このページにあるサンプルソースは、実際に売買を行う処理が含まれているので、絶対にライブ口座では実行しないで下さい。 念の為、デモ口座でしか処理しない対策処理を施しています。
これはあくまで勉強用のソースコードです。

プログラムを使ってトレードする

よく問い合わせられる内容で、
「クローズされません」「起動したら勝手にエントリーしてしまいます」「ストップが設定出来ません」といったような事があります。 まぁ殆どがどこかのサイトに掲載されているソースコードをコピペして「上手く動作しません」という内容なのですが・・・

EAを作成する前に、プログラムを使った基本的なトレードを出来るようになる必要があります。
EAはインジケータにトレードプログラムを追加しただけのようなものなので、
インジケータ作成とトレードプログラムの両方を理解していないと基本的には作れません。
プログラミング経験者なら勘で最初からEAを作成出来ると思いますが、プログラミング未経験者で最初からEA作成するのはまず無理です。

プログラミング未経験者で「インジケータ作成なんて出来ません」という人は 「MQL4未経験者向け(インジケータ作成の基本)」ページに 戻ってインジケータ作成を勉強して下さい。


新規エントリーオーダーについて

今まで解説してきたページを見てきた人なら
「プログラミングは一から十まで全て指示しなければ何も出来ない」という事をもう理解できていると思います。
決して「プログラムは自動で勝手に何かをいい感じにやってくれる魔法の言語」では無いという事を。

当然、プログラムで新規エントリーオーダーする時も同じです。
人間が手動で行っていた事をプログラムにやらせるという事は一から十まで全て指示する必要があるので、
人間が手動で新規エントリーオーダーする時に何をやっていたかを確認しましょう。

エントリーオーダー

・通貨ペアの指定
・数量(lot)の指定
・ストップレートの指定
・リミットレートの指定
・コメントの設定
・注文種別(成行注文か指値注文)
・売りか買いの指定(成行の場合はBid価格で成行売り、Ask価格で成行買い)

指値注文の場合は更に
エントリーオーダー

色々増えますが、EAでエントリー時に指値注文する必要性を感じませんし、 EAのエントリーの指値注文は面倒なのでこれは割愛します。 面倒な理由は注文種別の設定を間違えないようにしないといけないからです。
エントリーオーダー

詳細は「H3.板情報と指値について」のページ を見て下さい。


プログラムで新規エントリーする時はこれらの設定を全てプログラムで指定する必要があります。


スクリプト作成

実はプログラムで新規エントリーする事自体は特別難しい事ではありません。
テクニカルインジケータ関数の引数設定とやっている事は大差ありません。
テクニカルインジケータ関数と違って難しいのは、ブローカーのサーバーに対して発注するので下手な事が出来ないだけです。

慣れないうちはスクリプトを使ってトレード関連の関数のプログラムを作成します。
MQL4のスクリプトはカスタムインジケータやEAと違って、一回だけ処理されて終わるプログラムです。
なので特定の関数について検証したい場合等にも活用出来ます。

さっそくスクリプトを新規作成しましょう。
まずはM1-1.トレンド系インジケータ作成(終値ライン)準備編の時と同様にメタエディターを起動してMQL4ウィザードを開きます。

エントリーオーダー

「スクリプト」を選択して「次へ」ボタンを押します。

エントリーオーダー

名前に「Test_TradeOrderSend」と入力して「完了」ボタンを押します。
インジケータ作成の時と同様に、パラメータとかは後でソースコードに直接追記する事が出来るのでここでは何もしません。

ソースコード:
//+------------------------------------------------------------------+
//|                                          Test_TradeOrderSend.mq4 |
//|                                                             yuki |
//|                                      https://yukifx.web.fc2.com/ |
//+------------------------------------------------------------------+
#property copyright "yuki"
#property link      "https://yukifx.web.fc2.com/"
#property version   "1.00"
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| スクリプトプログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{
   
}


インジケータの時よりも遥かにシンプルなソースコードが生成されました。
スクリプトをチャートに適用すると、OnStart()関数のプログラムが一度だけ処理されます。
このOnStart()関数にプログラムを追加していきます。

#propertyの内容はM1-2.トレンド系インジケータ作成(終値ライン)初期コード解説編の時と同様ですので割愛します。

IsDemo()関数でデモ口座チェックをする

これから取引関数を使って、新規エントリーをするプログラムを作成するのですが、
その前に重要なプログラムを追加する必要があります。

実際にブローカーへ発注してしまうので、うっかりライブ口座でプログラムを走らせてしまうと色々とマズイです。
なのでデモ口座かどうかをチェックして、デモ口座以外だった場合は処理しないように制限する必要があります。


ソースコード:
//+------------------------------------------------------------------+
//| スクリプトプログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{
    if ( IsDemo() == false ) {            // デモ口座以外の場合
        Print("デモ口座でのみ動作します");
        return;                            // 処理終了
    }
}




OrderSend()関数で新規エントリーする[マジックナンバー設定]


注意事項:
このページにあるサンプルソースは、実際に売買を行う処理が含まれているので、絶対にライブ口座では実行しないで下さい。 これはあくまで勉強用のソースコードです。

さっそくOrderSend()関数を使って、成行注文で1,000通貨のロングエントリーをしてみましょう。


ソースコード:
    if ( IsDemo() == false ) {            // デモ口座以外の場合
        Print("デモ口座でのみ動作します");
        return;                            // 処理終了
    }

    int ea_ticket_res = -1; // チケットNo

    ea_ticket_res = OrderSend(                           // 新規エントリー注文
                                Symbol(),                // 通貨ペア
                                OP_BUY,                  // オーダータイプ[OP_BUY / OP_SELL]
                                0.01,                     // ロット[0.01単位]
                                Ask,                      // オーダープライスレート
                                20,                       // スリップ上限    (int)[分解能 0.1pips]
                                0,                        // ストップレート
                                0,                        // リミットレート
                                "テストオーダー",         // オーダーコメント
                                20200518                  // マジックナンバー(識別用)
                               );


うっかりここのソースコードだけをコピペしてしまった人が事故を起こさないように、念の為先程作成したデモ口座チェックのプログラムも表示しておきます。

詳細説明は後述しますので、とりあえずコンパイルして動作させてみましょう。

エントリーオーダー

MT4ターミナルの「自動売買オンオフ」ボタンをオンにしておかないと、エラーになるのでオンにして下さい。

スクリプトの適用方法はインジケータの時と同じです。

エントリーオーダー

ナビゲータのスクリプト下にあるTest_TradeOrderSend.ex4をチャート上にドラッグ&ドロップします。

状況にもよりますが、ロングポジションが取れたと思います。
EAによって注文約定した事がログを見ても分かります。

土日等の取引時間外の場合はエラーになるかもしれませんが、エラーだった場合の対応方法も後述します。

とりあえずスクリプトで取ったポジションを決済します。
今はエントリーのプログラムしか作成していないので、プログラムで決済する事が出来ません。
なので手動で決済します。
エントリーオーダー

手動でポジション決済する方法が分からない人はいないと思いますが(もしいたらEA作成は一旦止めて、MT4の使い方に慣れてからEA作成するようにして下さい)、 「取引」タブを選択して、決済したいポジションを右クリックして「決済注文」を選択します。

エントリーオーダー

オーダー発注画面が表示されたら「成行決済」ボタンを押します。

OrderSend()関数の戻り値と引数について

OrderSend()関数の戻り値と引数について説明します。

◆OrderSend()の戻り値
    int ea_ticket_res = -1; // チケットNo

    ea_ticket_res = OrderSend(                           // 新規エントリー注文

OrderSend()関数の戻り値は int型の値が返ってきます。
注文約定した場合はチケットNoが返ってきますが、エラー又は約定しなかった場合は-1を返します。
エラーだった場合の対応は長くなるので別途説明します。

◆OrderSend()の第1引数
    Symbol(),                // 通貨ペア

OrderSend()関数の第1引数は 取引する通貨ペアを設定します。
他関数と一緒なので特別説明しなければならない事はありません。
(他通貨ペアを指定する事も可能ですがオススメはしません)。

◆OrderSend()の第2引数
    OP_BUY,                  // オーダータイプ[OP_BUY / OP_SELL]

OrderSend()関数の第2引数は 注文タイプを設定します。

・成行買いならOP_BUY
・成行売りならOP_SELL
を設定します。

指値注文や逆指値注文については割愛しますが、指値と逆指値の違いはH3.板情報と指値についてを参照して下さい。

◆OrderSend()の第3引数
    0.01,                     // ロット[0.01単位]

OrderSend()関数の第3引数は ロットを設定します。

0.01が千通貨
0.10が1万通貨
1.00が10万通貨
です。

業者が指定した範囲外のロット指定した場合はエラーになります。
ロット範囲はMarketInfo()関数で調べる事が出来ます。

◆OrderSend()の第4引数
    Ask,                      // オーダープライスレート

OrderSend()関数の第4引数は 注文価格を設定します。
スリップページ非対応の業者なら、成行注文の時は適当な価格でも良いのですが、価格精度異常等のいい加減過ぎる価格はエラーになります。
基本的に買いならAsk,売りならBidを設定しましょう。
MT4で手動で成行注文する際に、AskかBidかなんて選んだ記憶は無いと思いますが、それはMT4が自動でやってくれていたからです。
AskとBidの詳細についてはH3.板情報と指値についてを参照して下さい。

(第1引数で他通貨ペアを選択した場合Ask/Bidは使えません。何故なら現在の通貨ペアの売値/買値だからです。 iClose()関数で通貨ペアの現在値を取得するか、MarketInfo()で指定した通貨ペアのAsk,Bidを取得して下さい)。

◆OrderSend()の第5引数
    20,                       // スリップ上限    (int)[分解能 0.1pips]

OrderSend()関数の第5引数は スリップページを設定します。
0.1pips単位なので、20を設定した場合はスリップページは2.0pipsになります。
スリップページは業者によって使えない(無限スリップ)場合がありますので注意してください。
FX業者のオリジナル取引ツールではスリップページが使えるのに、MT4口座ではスリップページが使えない場合もあります。

当然スリップページが使えない業者ではこの設定値は意味を成しません。

エントリーオーダー


◆OrderSend()の第6-7引数
    0,                        // ストップレート
    0,                        // リミットレート

OrderSend()関数の第6引数と第7引数は ストップレートとリミットレートです。
OrderSend()関数でストップレートとリミットレートを設定する事はお勧めしません。
業者によってはOrderSend()でのストップレートとリミットレートの設定を受け付けない場合があるからです。

その為、ストップレートとリミットレートは成行注文が約定した後にOrderModify()関数で設定するようにします。
OrderModify()関数の説明は別ページにて行います。
ちなみに0を設定する事は、ストップレートとリミットレートを設定しない事を意味します。

注意点としては、OrderSend()でのストップを受け付けない業者でもデモ口座やストラテジーテスターでは動作します。
ですがライブ口座で運用した時にエラーになります。

◆OrderSend()の第8引数
    "テストオーダー",         // オーダーコメント

OrderSend()関数の第8引数は コメントを設定します。

コメントはターミナルの「取引」や「口座履歴」で確認する事が出来ます。
エントリーオーダー

もしコメント列が無い場合は、右クリックして表示されたメニューから「コメント」を選択して下さい。


◆OrderSend()の第9引数
    20200518                  // マジックナンバー(識別用)

OrderSend()関数の第9引数は EAの識別用マジックナンバーになります。
この数値は他EAと被らない値を設定して下さい。何を設定したらいいか迷ったら今日の日付を設定するのも有りです。

この識別用マジックナンバーは何に使うかと言うと、現在保有しているポジションの選択する時に必要になります。
多分この説明だけではチンプンカンプンだと思います。

口座履歴を表示させた状態で右クリックをして、メニューから「詳細レポートの保存」を選択して下さい。
エントリーオーダー


取引レポートが表示されますが、下図の中でこのスクリプトによってエントリーしたポジションはどれか分かりますでしょうか?
エントリーオーダー

コメントに「テストオーダー」と表示されているのでバレバレですが、仮にコメントが無かった場合は分かりますでしょうか?
エントリーオーダー

コメントが無かったら、この識別用マジックナンバーで判断するしかありませんよね?
ちなみに一番上の識別用マジックナンバーの無い取引は、手動でエントリーした取引です。
識別用マジックナンバーはどのEAによってエントリーしたポジションかを区別する為のIDだと思って下さい。

例えば、「MACDを使ったEA」・「ボリンジャーバンドを使ったEA」・「手動」で取引した場合、3種類のポジションが存在する事になります。 手動で取引した場合は識別用マジックナンバーは0固定ですが、
MACDを使ったEAとボリンジャーバンドを使ったEAはそれぞれ違う識別用マジックナンバーを設定しなければなりません。

エントリーオーダー

この説明で理解出来なかった場合、実際にこの識別用マジックナンバーを使った処理の説明を見た方がいいかもしれません。
その処理の説明は別ページにて解説します。

関数の引数省略について

OrderSend()関数のリンク先のリファレンスをちゃんと見てくれた人なら気がついたと思いますが、 実は仮引数が11個あります。

関数書式:
int  OrderSend(
   string   symbol,               // 通貨ペア名
   int      cmd,                  // 注文タイプ
   double   volume,               // ロット数
   double   price,                // 注文価格
   int      slippage,             // スリップページ
   double   stoploss,             // ストップロス価格
   double   takeprofit,           // リミット価格
   string   comment     = NULL,   // コメント
   int      magic       = 0,      // マジックナンバー(識別用)
   datetime expiration  = 0,      // 有効期限
   color    arrow_color = clrNONE // 色
   );



最後の有効期限と色の引数は設定していません。
関数の仮引数にデフォルト値(初期値)がある場合、そのデフォルト値の引数設定は省略する事が出来ます。
引数設定を省略した場合は、そのデフォルト値が使用されます。

有効期限は指値注文用なので成行注文では不要です。
色設定も別に要らないので省略しました。

仮引数を省略出来る条件はありますが、知っておくと便利ですので覚えておいて下さい。

エントリーオーダー

あと引数省略した時に最後の引数にカンマ(,)を残してしまって、コンパイルエラーになってしまうニアミスには注意しましょう。

エントリーオーダー

まぁエラー内容に「syntax error, parameter missed(構文エラー、引数が間違っています)」と表示されているので直ぐに分かると思いますけど、 でもこういう簡単なコンパイルエラーについての問い合わせがよく・・・

完成したサンプルソースコード


ソースコード:
//+------------------------------------------------------------------+
//|                                          Test_TradeOrderSend.mq4 |
//|                                                             yuki |
//|                                      https://yukifx.web.fc2.com/ |
//+------------------------------------------------------------------+
#property copyright "yuki"
#property link      "https://yukifx.web.fc2.com/"
#property version   "1.00"
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| スクリプトプログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{
    if ( IsDemo() == false ) {            // デモ口座以外の場合
        Print("デモ口座でのみ動作します");
        return;                            // 処理終了
    }

    int ea_ticket_res = -1; // チケットNo

    ea_ticket_res = OrderSend(                           // 新規エントリー注文
                                Symbol(),                // 通貨ペア
                                OP_BUY,                  // オーダータイプ[OP_BUY / OP_SELL]
                                0.01,                     // ロット[0.01単位]
                                Ask,                      // オーダープライスレート
                                20,                       // スリップ上限    (int)[分解能 0.1pips]
                                0,                        // ストップレート
                                0,                        // リミットレート
                                "テストオーダー",         // オーダーコメント
                                20200518                  // マジックナンバー(識別用)
                               );   
}






スポンサーリンク


Copyright ©2015 MT4でEA自作しちゃお~ All Rights Reserved.


Top

inserted by FC2 system