システムトレード研究所 〜FXで完全自動売買〜

このサイトでは、FXで完全自動売買を行うために必要な情報を書いていこうと思っています。システムを自分で作りたい方、システムトレードをやってみたい方は御覧になっていって下さい。
二次元配列について
 こんばんは、小松です。FOREX.com メタトレーダーの情報サイト シストレナビゲーター様のHPにインタビューが掲載されました。宜しければご覧ください。

 今回の記事ですが、「二次元配列について」です。以前、配列の紹介をさせて頂きましたが、今回はその次のステップになります。

 以前、配列とは、その変数という箱がまとまったタンスのようなものと説明しましたが、二次元配列はタンスの同じ高さに複数の引き戸があるようなものです。

 配列はaaa[2]のような感じでしたが、二次元配列はaaa[2][2]のような感じになります。

int aaa[2][2] = {1,2,3,4};

 このように宣言します。上記の数値ですが、下記のように収納されています。

aaa[0][0] = 1
aaa[0][1] = 2
aaa[1][0] = 3
aaa[1][1] = 4


 少し難しいように感じますが、タンスの1段目の1個目、2個目に先に収納して、2段目の1段目の1個目、2個目に後に収納する、という感じになります。

 さて、二次元を何に使うかですが、関連付けされたデータを扱うのが得意です。例えば、ポジションデータを入れるときにaaa[0][0] にはチケットナンバー、aaa[0][1]にはレートの数値を入れるなどです。この場合、aaaの左側の[]の数値が変わるまでは同じ関連のデータとして使います。別のポジションの場合は、 aaa[1][0] 、aaa[1][1]にデータを入れます。

 このようにデータを収納していくと、チケットナンバーだけでソートをかけて左側の[]の数値さえ見つけ出せれば、残りの関連の情報をまとめて引き出すことが可能になります。

 他にも便利な使い方が二次元配列にはありますので、また次回以降で紹介させて頂きます。




システムトレード研究所〜FXで完全自動売買〜INDEXへ
MT4用オリジナルEAの制作・作成『オーダーシステム』 


--------------注意----------------


内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。

JUGEMテーマ:ビジネス


| 小松 | MetaTrader4 プログラム初級編 | 14:37 | comments(0) | - |
配列について
 こんばんは、小松です。

 今回の記事は、「配列について」という内容になります。

 以前、変数とは数値を入れる箱のようなものですと説明させて頂きました。配列とは、その変数という箱がまとまったタンスのようなものです。

int aaa[2];

aaa[0] = 10;
aaa[1] = 20;


 上記が配列の宣言と、配列に数値を入れる方法です。基本的に変数がまとまったものと考えて頂ければ大丈夫です。

 宣言の[]内の数値が変数の数となります。最初が0ですので、2と宣言した場合は使えるのは0と1になります。

 使い方はほとんど変数と同じですので、aaa[2]と宣言したら、aaa[0]とaaa[1]という2つの変数が使えると思って頂ければいいです。

 宣言時に数値を入れる方法は下記になります。


int aaa[2] = {10,20};


 {}で囲って、順に数値を入れていき、間に,を入れます。



 配列を何に使うかですが、同種の複数の情報をまとめて扱いたい場合に便利です。特にfor文との相性がいいので色々と使い方を模索してみて下さい。

 MT4MQL言語には、配列用の便利な関数が色々とありますので、また近いうちに紹介させて頂きます。




システムトレード研究所〜FXで完全自動売買〜INDEXへ
自動売買システム制作のオーダーシステム|FXでオリジナルのシステムトレード

--------------注意----------------


内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。


JUGEMテーマ:ビジネス

| 小松 | MetaTrader4 プログラム初級編 | 17:39 | comments(0) | - |
テクニカル分析

こんばんは、DCです。長期間ブログを更新出来なくて申し訳有りませんでした。





何件かご質問のメールも送って頂いていたのですがご返信できずに申し訳有りません。全てのメールにご返信させて頂くことは出来ないのですが、ご質問の内容はそのうち記事でご説明させて頂きたいと思います。



 今回は意外と質問の多い、MetaTrader4で使える簡単なテクニカル分析を紹介していきたいと思います。



一言でテクニカル分析と言っても、沢山種類があります。今回はその中でもメジャーなテクニカル分析の紹介に絞らせていただきます。


 

◇移動平均線(MA)◇



 英語でMoving Averageと呼ばれ、一般的に「MA」と略されます。一定期間のレートの平均を線として表します。
一般的な使い方として、短期間と長期間の移動平均線を利用し、短期が長期を下から上に抜けたときをゴールデンクロスと言い、買いシグナル。
短期が長期を上から下に抜けたときをデッドクロスと呼び、売りシグナルとして用いられます。


 移動平均線は、トレンドを把握する為に使われることが多いです。


 以前こちらのページで簡単なプログラムを紹介させて頂きました。



 

◇移動平均収束拡散法(MACD)◇


 英語でMoving Average Convergence and Divergenceと呼ばれ、一般的に「MACD」と略されます。
移動平均線を応用したテクニカル分析で、指数平滑移動(EMA)の短期と長期とシグナル線を用いて分析を行います。MACD線がシグナル線を下から上に抜けたときをゴールデンクロス
と言い、買いシグナル。その逆がデッドクロスで売りシグナルになります。


 特徴としては、トレンド相場を読み取りやすい反面、ボックス相場で脆くなります。


 以前こちらのページで簡単なプログラムを紹介させて頂きました。





◇ボリンジャーバンド◇


 英語表記でBollinger Bandsと書かれます。


 移動平均線と標準偏差を用いたテクニカル分析で、移動平均線の上下に引かれたバンドを用いて分析を行います。


 バンドは中央の移動平均線に対して上下で一対になってます。


Bollinger Bands


 中央の黒い線が移動平均線です

 中央から上下に位置する黒い線が±1σのバンドで、間にレートが存在する確率は、68.27%

 中央から上下に位置する黄色線が±2σのバンドで、間にレートが存在する確率は、95.45%

 中央から上下に位置する紫線が±3σのバンドでn間にレートが存在する確率は、99.73%


 上記の確率ですが、所詮は確率です。±2σのバンドを抜ける確率が5%を切っているからと信じ込んでいては危険です。あくまで目安にしましょう。
事実、上のチャートでは、黄色線を出るロウソクが5%どころではないです


 これだけを聞くと使えないテクニカル分析の様に思えますが、ちゃんとした使い方を覚えれば応用性が高く、優れたテクニカル分析だと思います。


 詳しい使い方を書くと、かなり長くなってしまいますので、ボリンジャーバンドの詳しい使い方については、また別の機会にしたいと思います。


 プログラムでボリンジャーバンドを使うにはiBands関数を使います。



iBands( string symbol, int timeframe, int period, int deviation, int bands_shift,int applied_price, int mode, int shift)


 以前こちらのページで関数に頻繁に出てくる引数を説明させて頂いてます。


 以前紹介した引数に出ていなかったものは「period」「deviation」「bands_shift」辺りですね。


 int period


 これは、移動平均期間の設定です。ここに入力したバーの数で計算します。



 int deviation


 これは標準偏差の設定です。2を入力すれば、2σの値が出ます。



 int bands_shift

 これはバンドをシフトするバーの数の設定です。バーは右方向へシフトします。



 int mode

 これは以前「関数に頻繁に出てくる引数」の時に説明しましたが、以前の説明は「MACD」でした。今回はボリンジャーバンドですので、内容が変わっています


 「MODE_UPPER」が上のバンドを表します。

 「MODE_LOWER」が下のバンドを表します。




if(iClose(NULL,0,0) < iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,0))

{

 Ticket = OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-(200*Point),Ask+(200*Point),"Buy",0,0,Blue);

}


 仮に上記のプログラムを組み込んだ場合には移動平均期間が20で、終値が-2σのバンドを下回ったとき、買いポジションを取ることになります。





◇相対力指数(RSI)◇


 英語表記でRelative Strength Indexと書かれます。一般的に「RSI」と略して呼ばれています。


 RSIは%で表され一般的には70%を超えると買われすぎ、30%を下回ると売られすぎと言われています。そのため、逆張りの目安として使われる事が多いようです。
そのため、為替の転換点を示していると言われますので、ボックス相場で効果を発揮すると思います。逆にボックス相場からトレンドが発生したときには注意が必要です。80%以上や30%以下に張り付くことが有りますので、安易な逆張りでの損失が恐れられます。


 プログラムでRSIを使うにはiRSI関数を使います。



iRSI( string symbol, int timeframe, int period, int applied_price, int shift)

 以前こちらのページで関数に頻繁に出てくる引数を説明させて頂いてます。


 int period


 これは、移動平均期間の設定です。RSIでは、14を一般的に使います。




if(30 >= iRSI(NULL,0,14,PRICE_CLOSE,0))

{

 Ticket = OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-(200*Point),Ask+(200*Point),"Buy",0,0,Blue);

}


 仮に上記のプログラムを組み込んだ場合、RSI30を下回ったときに買いポジションを取ることになります。


今回の内容は以上になります。


また別の機会に、ほかのテクニカル分析を紹介をしたいと思います。






システムトレード研究所〜FXで完全自動売買〜INDEXへ


オーダーシステム


----------------------注意----------------------
内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。

| 小松 | MetaTrader4 プログラム初級編 | 17:29 | comments(3) | - |
関数に頻繁に出てくる引数
こんばんは、DCです。今日の記事は、「関数に頻繁に出てくる引数」という内容です。前回の「関数の使い方を調べる方法」の続きです。


今回は、関数を調べたときに頻繁に出てくる引数について説明します。大体の関数は引数が同じようなものが多いですので、今回説明する引数の使い方を覚えていれば、分からない引数を少し調べるだけでほとんどの関数が簡単に使えるようになります。インディケーター独自のパラメーターはiMACD関数を例に出して説明します。



string symbol

通貨ペアを選びます。大抵のインディケーターなどの関数はこれが一番最初にあります。現在そのシステムを動かしいているチャートの通貨ペアでいい場合は、NULLと入力します。基本的にNULLで問題ありません。


個別に通貨ペアを選びたい場合は、””を付けたあと中に通貨ペアを書きます。ドル円の場合は”USDJPY”、ユーロドルの場合は”EURUSD”と書きます。




int timeframe

時間足を決定します。大抵のインディケーターなどの関数はこれが二番目にあります。現在そのシステムを動かしいているチャートの時間足でよい場合は0と入力します。基本的に0で問題ありません。


個別に時間足を選びたい場合は、1分あしなら1を、15分足なら15を入力します。数字で入力する場合は、1時間足以上の場合も分で入力します。一時間足なら60、日足なら1440になります。


この引数には専用の変数のようなものを付いています。例えば、一時間足はPERIOD_H1と入力すれば60の代わりになります。これらはHelpの引数の詳細のところに青い文字のリンクが張られていますので、それを左クリックすれば説明が書いてあります。



int fast_ema_period,
int slow_ema_period
int signal_period


これはMACDの設定です。各インディケーター独自の設定は大体時間足を決定するtimeframeの後にあります。



int applied_price

これはインディケーターなどを時間足の始値、高値、安値、終値などのどれを使って計算するかを設定する引数です。これにも専用の変数のようなものが付いています。Helpの引数の詳細のところに青い文字のリンクが張られていますので、それを左クリックすれば説明が書いてあります。下記に内容を書いておきますので、参考にして下さい。


PRICE_CLOSE   終値
PRICE_OPEN   始値
PRICE_HIGH   高値
PRICE_LOW     安値
PRICE_MEDIAN  (高値 + 安値)/2
PRICE_TYPICAL (高値 + 安値 + 終値)/3
PRICE_WEIGHTED (高値 + 安値 + 終値 + 始値)/4



int mode

これはMACDの設定です。MACDのメインの線か、シグナルの線かを選びます。これにも専用の変数のようなものが付いているのですが、詳細のリンク先を調べた場合、似たような関数のものと一纏めにして紹介されています。場合によってはリンク先の表示された場所より少ししたに目的の変数のようなものが書かれている場合がありますので、それが自分の探している関数のものかどうかをよく確認して下さい。確認する方法は上に対応関数が書かれていますので、それで確認して下さい。



int shift

そのインディケーターの時間をシフトする数値です。0なら現在の値、1なら一つ前の足の値になります。1時間足なら、1と入力すれば一時間前の値になります。



大体のインディケーターなどの関数には、これらの引数が入っています。注意点としては、引数と引数の間には,(カンマ)を入れる、引数に変数を入れる場合は変数の型を同じにする、引数の順番を間違えない、というのがあります。これらに気をつけて関数を使用して下さい。


今回説明した引数の使い方を覚えていれば、大体の関数は問題なく使えるはずです。いまいち使い方がよく分からない場合は、Comment関数、Print関数などでその関数の戻り値を表示して、分からない引数のパラメーターを変更しながら確認するとよく分かると思います。



 

 宜しかったら、応援して下さい



システムトレード研究所〜FXで完全自動売買〜INDEXへ


----------------------注意----------------------
このブログは半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。

また、内容には注意を払っていますが、保障は出来ません。実際に運用する場合は、自己責任でお願いします。
| 小松 | MetaTrader4 プログラム初級編 | 23:48 | comments(3) | - |
関数の使い方を調べる方法
こんばんは、DCです。今日のブログは、「関数の使い方を調べる方法」という内容です。


今回はMetaTrader4で使用出来る関数の使い方を調べる方法を詳しく説明します。初級の内容ですが調べ方が分からないという内容のメールをたまに頂きますので、今回改めて説明させて頂きます。


関数の調べ方ですが、その関数にカーソルを合わせてキーボードのF1キーを押すと、ウィンドウの下の辺りに関数の内容を書いたものが出てきます。ただ、英文で出てきますので分からないという方が多いのだと思います。しかし、大体の関数は引数が同じようなものが多いですので、基本的な使い方さえ知っていれば、少し分からない内容のものが出てきてもなんとかなります。



HELP




iMACD関数を例に出して説明します。まず、iMACDに合わせてF1キーを押すと、上の画像のようなHelpがウィンドウの下の方に出てきます。一番上には下記のように引数の順番と引数がint型、double型のように何型なのかの詳細が出ます。

double iMACD( string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int mode, int shift)



HELP2




次に、少し下にズラすと、上の画像のように一つ一つの引数の詳しい詳細が書かれたものが出てきます。引数に特殊なものが使われている場合は文字が青くなってリンクが張られていますので、それを左クリックすれば確認出来ます。



HELP3




最後に、上の画像のようにその関数の使用例が出てきます。まずは、一番上を見て引数の順番と何型かを確認して、次にその下ので分からない引数を調べて、最後に使用例を見て確認という順番で調べれば大体の関数は使い方が分かるはずです。


今回はこれで終わりです。次回は今回の続きで頻繁に出てくる引数について説明します。



 

 宜しかったら、応援して下さい



システムトレード研究所〜FXで完全自動売買〜INDEXへ


----------------------注意----------------------
このブログは半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。

また、内容には注意を払っていますが、保障は出来ません。実際に運用する場合は、自己責任でお願いします。
| 小松 | MetaTrader4 プログラム初級編 | 20:35 | comments(5) | - |
不具合の説明
 今回は、複数のシステムによる自動売買の仕方だったのですが、前回のOpen prices onlyの時に起こる不具合について分からないとメールを頂きましたので、もう少し詳しく説明してみます。


 この不具合は、売買タイミングの条件が細かいシステムをOpen priceのモードでバックテストするとおきる不具合のようです。

 ゴールデンクロス、デッドクロスなどの売買条件を使ったシステムが当てはまることが多いです。

 かなりややこしいのであまり簡単に説明は出来ないのですが、なんとか例えを出しながら説明してみます。


 前回のMACDのシステムの売買ルールは、一時間前のMACDのメインがシグナルより低いのが条件で、現在のMACDのメインがシグナルより高いのが条件なのですが、Open priceにすると、条件が成立した時間によっては例え条件が成立していても売買されなくなります。

 何故かと言うと、start関数が呼び出される頻度に問題があります。

 例を出すと、1時に条件が不成立で、1時半に条件が成立したとします。

 1時の段階では、一時間前の足のMACDと現在の足のMACD両方ともメインの方が低いです。

 1時半の段階では、一時間前の足のMACDはメインの方が低くて、現在の足のMACDはクロスしてメインの方が高くなり、条件成立ですが、start関数が呼び出されないため、まだ売買処理はされません。

 2時になって足が変わってからstart関数が呼び出されましたが、その時点では一時間前の足のMACDと現在の足のMACDの両方ともメインの方が高くなっていて、条件不成立になります。


 ややこしいと思いますので、もう少し説明を付け加えると、start関数が呼び出された時点での現在の足はほとんど出来ていないので、start関数が呼び出された現在の足と一時間後から見た一時間前の足が異なるものになるのが原因です。

 売買ルールから一時間前にメインがシグナルより低いという条件を無くし、「メインがシグナルを上回ったら」だけにすれば問題がなくなるのですが、それだとストップロスとリミットをつけ、決済された場合にまだメインがシグナルを上回っていたら、決済したその場で買いポジションを持たされます。

 適当に何か条件をつけてこの状態を回避する方法もありますので、色々と試してみるのも経験になって良いと思いますよ。


 最後に、リアル売買や他の二つのバックテストのモードでは、この不具合は起きません。

 リアル売買とバックテストの他の二つのモードは頻繁にstart関数が呼び出されますので、クロスした瞬間に売買されるからです。

 インジケーターのクロスする系のシステムを作る場合は忘れずに覚えておいたほうが良いですね。


 

 宜しかったら、応援して下さい



システムトレード研究所〜FXで完全自動売買〜INDEXへ


----------------------注意----------------------
 内容には注意を払っていますが、保障は出来ません。
 実際に運用する場合は、自己責任でお願いします。
| 小松 | MetaTrader4 プログラム初級編 | 22:04 | comments(0) | - |
オリジナル関数の作り方
---------------------------------------------------------------------
 前回のサンプルプログラムに売りが行われないミスがありましたので、修正しました。

 前回のサンプルプログラムをダウンロードされた方は、もう一度ダウンロードして書き換えて置いてください。
 申し訳ありませんでした。
---------------------------------------------------------------------


 お久しぶりです。

 しばらく風邪で寝込んでいて、更新できませんでした。

 すみません。

 ここ数年ほとんど病気にはかからなかったのですが、こないだの病気で免疫力が落ちたのかもしれません。

 今回の件で、健康管理は大事だなとひしひしと感じました。

 皆さんも気をつけてください。



 ところで、風邪で寝込んでいる間に暇だったので以前から構想だけ練っていた新しいシステムを作ってみました。

 http://www.systectrade.com/indivsys.php?sid=161

 宜しかった御覧下さい。

 複数のシステムを組み合わせて、ポートフォリオのようにリスクを分散できないかと考え、成績が良かったシステムを複数組み合わせてみました。

 バックテストだけならなかなか良かったので、これから安定性があるかどうかリアル売買で確かめてみます。



 さて、本文です。

 今回は、オリジナル関数の作り方でしたね。

 サンプルプログラムはこちらです。

 http://jidoubaibai.com/Sample%20New%20Kannsuu.mq4

 サンプルプログラムの使い方は、こちらで説明しています。 

 http://jidoubaibai.com/burogu11.html

 
 では、MetaEditorを起動して下さい。

 NameはNewKannsuuにして置いて下さい。

 では、まとめてコードを書きますので、同じようにコードを半角英数で書いていってください。




int start()
{
   //変数の宣言
   int cnt, CurrentPosition;
   int Ticket;   

     
   // オーダーチェック(ポジションなどのデータ)
   CurrentPosition=-1;
   for(cnt=0;cnt < OrdersTotal();cnt++){
      OrderSelect(cnt,SELECT_BY_POS);
      if(OrderSymbol() == Symbol()) CurrentPosition=cnt;
   }

   


   // ポジションチェック ポジション無し
   if(CurrentPosition == -1)
   {   
      //もしメインがシグナルを下から上にクロスしたら
      if( CrossMACD(12,26,9) == 1 )      
      {
         //買いポジションを取る  
         Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Red);
      }  
      
      //もしメインがシグナルを上から下にクロスしたら
      if( CrossMACD(12,26,9) == 2)     
      {
         //売りポジションを取る  
         Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3,  Bid+(200*Point), Bid-(200*Point), "Sell", 0, 0, Blue);
      }  
         
           
   
   }
   // ポジション有り
   else 
   {
      
      //ポジションの選択
      OrderSelect(CurrentPosition,SELECT_BY_POS);
      
      //通貨ペアの確認
      if(Symbol() == OrderSymbol())
      {
         //もし買いポジションだったら
         if(OrderType()==OP_BUY)    
         {
            //もしメインがシグナルを上から下にクロスしたら
            if( CrossMACD(12,26,9) == 2)
            {
               //手仕舞い
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
            
               //ドテンで売りポジションを取る  
               Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3,  Bid+(200*Point), Bid-(200*Point), "Sell", 0, 0, Blue);
            }
      
         }
         //もし売りポジションだったら
         else if(OrderType()==OP_SELL)
         {
            //もしメインがシグナルを下から上にクロスしたら
            if( CrossMACD(12,26,9) == 1)      
            {
               //手仕舞い
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);
            
               //ドテンで買いポジションを取る  
               Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3,  Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Red);
            }
         }
      }      
   
      
   }
   return(0);
}



/*------------------------------------------------------
関数名   CrossMACD
内容     MACDのゴールデンクロスとデッドクロスを判断する関数

引数     int fast    短期EMA
        int slow    長期EMA
        int signal  シグナル
         
戻り値   0:何も出来ていない 1:ゴールデンクロス
         2:デッドクロス
-------------------------------------------------------*/
int CrossMACD(int fast,int slow,int signal)
{
   double kakoa,gennzaia;
   double kakob,gennzaib;
     

   //一つ前のMACDのメイン
   kakoa = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_MAIN,1);
   //一つ前のMACDのシグナル
   kakob = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_SIGNAL,1);

   //現在のMACDのメイン
   gennzaia = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_MAIN,0);
   //現在のMACDのシグナル
   gennzaib = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_SIGNAL,0);


   //もしメインがシグナルを下から上にクロスしたら
   if( kakoa < kakob && gennzaia >= gennzaib)      
   {
      return(1);
   }  
   
   //もしメインがシグナルを上から下にクロスしたら
   if( kakoa > kakob && gennzaia <= gennzaib)     
   {
      return(2);
   }  


   return(0);
}




 書けましたか?

 今回は、関数というものを新しく作り、その中でMACDのゴールデンクロスとデッドクロスを見分ける処理をさせています。

 関数というものは、呼び出すたびに関数の中の処理をまとめて行ってくれるものと覚えて置いてください。

 関数を作ってまとめることで、プログラムの中身が分かりやすくコンパクトになります。

 また、一度作ってしまえば、他のプログラムにコピーすることによって、作業が楽になります。


 では、内容の説明をして行きますね。

 前回と違うのは、 if( CrossMACD(12,26,9) == 1 ) このコードと、start関数より下の新しく作った関数ですね。

 まず、関数の作り方を説明して行きます。

 日本語に訳すと次のようになります。

型 関数名(引数)
{
  内容

  return(戻り値)
}

 見慣れない言葉があると思いますので、もう少しバラして説明して行きますね。

 
 まず、型 関数名()です。

 これは、変数の宣言とほとんど同じです。

 int型などの型を宣言して、次に好きな関数名を入れてください。

 型は、後で説明する戻り値の型になりますので、それを考慮して下さい。



 次に、引数です。

 int CrossMACD(int fast,int slow,int signal) の()の中にあるものが引数です。

 これは、関数を使うときにパラメーターなどを入力出来るようにするためのものです。

 今回はMACDを計算する時のパラメーターを入力出来るようにしています。

 引数は、変数と似たような使い方が出来ます。

 関数を呼び出すときに、CrossMACD(12,26,9)と入力していれば、fast,slow,signalにそれぞれ12,26,9が入っています。

 後は、変数と同じように下のコードのように使えます。

 kakoa = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_MAIN,1);

 
 引数の宣言の仕方も変数の宣言の仕方とほとんど同じです。

 ()の中に、型と好きな引数名を書くだけです。

 複数ある場合は、,(カンマ)を間に入れてください。

 また、引数が不要の場合は、()の中に何も書かなくても問題ありません。



 最後に、戻り値です。

 これは、関数から戻ってくる値です。

 return(戻り値); この()の中に戻り値を書けば、関数から値を渡すことが出来ます。

 計算結果の答えなどを返すのに使います。

 例を出すと、CrossMACD(12,26,9);と入力して、関数の最後がreturn(1);だった場合は、CrossMACD(12,26,9);の中には1が入っています。

 ですので、if(CrossMACD(12,26,9) == 1){}というような使い方が出来ます。

 また、このreturn();はこれが使われた時点でその関数は終了するので、次のようにも使えます。

if(条件1)
{
  return(1);
}
else if(条件 2)
{
  return(2);
}

return(0);


 このように、計算結果が条件に当てはまったら、その条件によって戻り値を変えて、どの条件にも当てはまらなかったら0を返しています。

 最後に注意点ですが、return();が無かったらその関数が終わりませんので、最後に絶対に一つは書いて置いてください。



 関数の作り方の説明はこれで終わりです。

 次に作った関数の使い方です。

 CrossMACD(12,26,9);

 先程作った関数名(引数に入力する値)で使用出来ます。

 また、戻り値が中にありますので、if(CrossMACD(12,26,9)==1){}という使い方も可能です。 



 これで今回のプログラムの説明は終了です。

 今回は関数を作っただけで、結果自体は前回と全く同じです。

 では、コンパイルをするためにcompileのボタンを押してください。

 エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。

 どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。

 エラーが出なかったら、MetaTrader4のバックテストでNewKannsuuを選んで、スタートして下さい。

 終わったら、結果、Graph、レポートを見てください。

---------------------------------------------------------------------
 popperさんに指摘されて気がついたのですが、リアル売買ではこのプログラムコードで正しいのですが、バックテストのOpen prices onlyの時だけ、このコードが間違いになります。(他の二つはこれで正しいです)

 start関数を呼び出すのがOpen prices onlyだけ始値の一度だけというのが原因なのですが、Open prices onlyだけは、変数の内容を下のようにしなければなりません。

   //一つ前のMACDのメイン
   kakoa = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_MAIN,2);
   //一つ前のMACDのシグナル
   kakob = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_SIGNAL,2);

   //現在のMACDのメイン
   gennzaia = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_MAIN,1);
   //現在のMACDのシグナル
   gennzaib = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_SIGNAL,1);


 最後のシフトを1つずつ増やさなければなりません。

 ややこしいと思いますが、宜しくお願いします。

---------------------------------------------------------------------



iMACD レポート ドル円一時間足




iMACD グラフ ドル円一時間足




 
 今回はこれで終了です。

 関数は一度作れば、次からのプログラムが楽になりますので、頑張って作ってみてください。 

 そろそろ内容が少し難しくなって来ましたので、次回から中級編にします。

 次回の内容は、複数のシステムによる自動売買の仕方です。




 

 宜しかったら、応援して下さい



システムトレード研究所〜FXで完全自動売買〜INDEXへ


----------------------注意----------------------
 このブログは半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。
 実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。

 また、内容には注意を払っていますが、保障は出来ません。
 実際に運用する場合は、自己責任でお願いします。
| 小松 | MetaTrader4 プログラム初級編 | 20:25 | comments(3) | - |
MACD関数の使い方
 新しく始めたオーダーメイドシステムのサービスですが、数人から問い合わせが来て、2人の方がサービスに申し込んでくれました。

 有難うございます。

 しかし、やはり値段が高いようです。

 システムを作るのは私だけなので、余り多く申し込まれても処理できないと思い値段を高めにつけていたのですが、まだ時間的に余裕がありそうなので、価格を3万円に下げることに決めました。

 先に申し込まれている2人の方も不公平なので、振り込まれる時の金額は3万円にさせて頂きます。

 ですが、一ヶ月に作れるシステムの数が10個ぐらいが限界なので、申し訳ありませんが一月10人の制限をさせて頂きます。

 ご了承のほどを宜しくお願い致します。

 http://jidoubaibai.com/Ordersystem.html



 さて、本文ですが、その前にちょっと訂正箇所があります。(過去の記事は訂正しておきましたので、この記事の日付より後に前回の記事を読んだ人は大丈夫ですので、読み飛ばしてください。)

 変数の宣言のときに、iMAの値を入れる変数の型をint型にしていましたが、double型の間違いでした。

 申し訳ありません。

 int kakoa,gennzaia;
 int kakob,gennzaib;
 
 以前作ったプログラムの中の上のコードを、下のコードに書き換えて置いてください。

 double kakoa,gennzaia;
 double kakob,gennzaib;

 宜しくお願いします。

 変数の型が違うだけで、バックテストの結果が物凄く変わってきますので、皆さんも気をつけてください。
 


 ここから本文です。

 今回はMACD関数の説明をします。

 サンプルプログラムはこちらです。

 http://jidoubaibai.com/Sample%20MACD.mq4

 サンプルプログラムの使い方は、こちらで説明しています。 

 http://jidoubaibai.com/burogu11.html


 では、MetaEditorを起動して下さい。

 NameはiMACDにして置いて下さい。

 内容はほとんどiMAと変わりません。

 変数に入れる内容が異なるだけです。

 では、まとめてコードを書きますので、同じようにコードを半角英数で書いていってください。




int start()
{
   //変数の宣言
   int cnt, CurrentPosition;
   int Ticket;
   double kakoa,gennzaia;
   double kakob,gennzaib;
     
   // オーダーチェック(ポジションなどのデータ)
   CurrentPosition=-1;
   for(cnt=0;cnt < OrdersTotal();cnt++){
      OrderSelect(cnt,SELECT_BY_POS);
      if(OrderSymbol() == Symbol()) CurrentPosition=cnt;
   }

   //一つ前のMACDのメイン
   kakoa = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   //一つ前のMACDのシグナル
   kakob = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);

   //現在のMACDのメイン
   gennzaia = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   //現在のMACDのシグナル
   gennzaib = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);


   // ポジションチェック ポジション無し
   if(CurrentPosition == -1)
   {   
      //もしメインがシグナルを下から上にクロスしたら
      if( kakoa < kakob && gennzaia >= gennzaib)      
      {
         //買いポジションを取る  
         Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Red);
               
      }  
      
      //もしメインがシグナルを上から下にクロスしたら
      if( kakoa > kakob && gennzaia <= gennzaib)     
      {
         //売りポジションを取る  
         Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3,  Bid+(200*Point), Bid-(200*Point), "Sell", 0, 0, Blue);
               
      }  
         
           
   
   }
   // ポジション有り
   else 
   {
      
      //ポジションの選択
      OrderSelect(Ticket,SELECT_BY_POS);
      
      //ポジションの確認
      if(OrderSymbol() == Symbol())
      {  
         //もし買いポジションだったら
         if(OrderType()==OP_BUY)    
         {
            //もしメインがシグナルを上から下にクロスしたら
            if( kakoa > kakob && gennzaia <= gennzaib)
            {
               //手仕舞い
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
               
               //ドテンで売りポジションを取る  
               Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3,  Bid+(200*Point), Bid-(200*Point), "Sell", 0, 0, Blue);
            }
         
         }
         //もし売りポジションだったら
         else if(OrderType()==OP_SELL)
         {
            //もしメインがシグナルを下から上にクロスしたら
            if( kakoa < kakob && gennzaia >= gennzaib)      
            {
               //手仕舞い
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);
               
               //ドテンで買いポジションを取る  
               Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3,  Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Red);
            }
         }
      }
   
      
   }
   return(0);
}


 書けましたか?

 前回と見比べて貰えれば分かると思いますが、下のコードが変わっただけです。

   //一つ前のMACDのメイン
   kakoa = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   //一つ前のMACDのシグナル
   kakob = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);

   //現在のMACDのメイン
   gennzaia = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   //現在のMACDのシグナル
   gennzaib = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);


 前回のプログラムは変数に入れていたのがiMA関数でした。

 今回は、このiMACD関数の説明です。

 まず、日本語で内容を書きますね。


 iMACD関数(通貨ペア、タイムフレーム(時間足)、短期EMA、長期EMA、シグナル、値を取る時間(始値、終値など)、モード、シフト)


 iMAと似ている部分がありますので、簡単に説明していきます。

 
 通貨ペアとタイムフレームはiMAと同じです。

 基本的にNULLと0と入力しておけば問題ありません。


  短期EMA、長期EMA、シグナルはMACDの使い方と同じです。

 
 値を取る時間は、今回は終値にします。

 PRICE_CLOSEと入れて置いてください。


 モードはMACDのメインの線かシグナルの線かを選択します。

 メインならMODE_MAIN、シグナルならMODE_SIGNALと入力します。


 シフトは数字を入れることによって、その数字分前の足のデータを入力出来ます。

 0は現在のデータ、1なら1つ前の足のデータです。

 今回も前回のiMAと同じゴールデンクロスとデッドクロスが売買条件ですので、0と1の両方を変数に入れています。


 これで、今回のプログラムの説明は終了です。

 今回のプログラムは、MACD(短期12,長期26,シグナル9)のメインとシグナルのゴールデンクロスとデッドクロスで仕掛けをして、手仕舞いはその逆のルール、手仕舞いと一緒にドテンするというものです。

 一応、ストップとリミットを200pipsつけています。

 では、コンパイルをするためにcompileのボタンを押してください。

 エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。

 どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。

 エラーが出なかったら、MetaTrader4のバックテストでiMACDを選んで、スタートして下さい。

 終わったら、結果、Graph、レポートを見てください。



iMACD レポート ドル円一時間足




iMACD グラフ ドル円一時間足




 今回はこれで終了です。

 次回はオリジナルの関数の作り方です。



 

 宜しかったら、応援して下さい



システムトレード研究所〜FXで完全自動売買〜INDEXへ


----------------------注意----------------------
 このブログは半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。
 実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。
| 小松 | MetaTrader4 プログラム初級編 | 19:42 | comments(4) | - |
ドテン売買の仕方
 本文に行く前に、新しいサービスを開始しましたので、お知らせをします。

 システムのオーダーメイドのサービスを始めました。

 以前から、有料でもいいからシステムを作ってほしいというメールが届いていましたので、今回試験的にサービスを実施してみました。

 興味がある方は、こちらを御覧下さい。


 さて、本文です。

 今回は、ドテン売買のシステムの説明です。

 サンプルプログラムはこちらです。

 http://jidoubaibai.com/Sample%20iMA3.mq4

 サンプルプログラムの使い方は、こちらで説明しています。

 
 では、MetaEditorを起動して下さい。

 NameはiMA3にして置いて下さい。

 内容はほとんど前回と同じです。

 仕掛けと手仕舞い後の処理が少し違っています。

 では、まとめて書きますね。


int start()
{
 //変数の宣言
 int cnt, CurrentPosition;
 int Ticket;
 double kakoa,gennzaia;
 double kakob,gennzaib;

 // オーダーチェック(ポジションなどのデータ)
 CurrentPosition=-1;
 for(cnt=0;cnt < OrdersTotal();cnt++){
  OrderSelect(cnt,SELECT_BY_POS);
  if(OrderSymbol() == Symbol()) CurrentPosition=cnt;
 }

 //一時間前の21日線
 kakoa = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
 //一時間前の90日線
 kakob = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);

 //現在の21日線
 gennzaia = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
 //現在の90日線
 gennzaib = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,0);


 // ポジションチェック ポジション無し
 if(CurrentPosition == -1)
 {
   //もし21日線が90日線を下から上にクロスしたら
   if( kakoa < kakob && gennzaia >= gennzaib)
   {
     //買いポジションを取る
     Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "Buy", 0, 0, Red);
   }

   //もし21日線が90日線を上から下にクロスしたら
   if( kakoa > kakob && gennzaia <= gennzaib)
   {
     //売りポジションを取る
     Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0, 0, "Sell", 0, 0, Blue);
   }



 }
 // ポジション有り
 else
 {
    //ポジションの選択
   OrderSelect(Ticket,SELECT_BY_POS);

    //ポジションの確認
    if(OrderSymbol() == Symbol())
    {
    //もし買いポジションだったら
    if(OrderType()==OP_BUY)
    {
      //もし21日線が90日線を上から下にクロスしたら
      if( kakoa > kakob && gennzaia <= gennzaib)
      {
        //手仕舞い
        OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);

        //ドテンで売りポジションを取る
        Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0, 0, "Sell", 0, 0, Blue);
      }
    }
    //もし売りポジションだったら
    else if(OrderType()==OP_SELL)
    {
      //もし21日線が90日線を下から上にクロスしたら
      if( kakoa < kakob && gennzaia >= gennzaib)
      {
        //手仕舞い
        OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);

        //ドテンで買いポジションを取る
        Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "Buy", 0, 0, Red);
      }
    }
   }

 }
  return(0);
}



 書けましたか?

 今回は、前回の応用みたいな感じなので、細かい説明は省きますね。

 変更点は、まず仕掛けに売りを追加しました。

 売りにする場合は、 OP_BUYを OP_SELLにして、AskをBidにして下さい。

 そして売りの手仕舞いを追加して、手仕舞いの後に、手仕舞いが売りなら買い、手仕舞いが買いなら売りのオーダーを追加しました。

 こうすることによってドテン売買をすることが出来ます。

 
 仕掛けに買いと売りの両方のオーダーが書いてあるから、いちいち手仕舞いの後に書かなくてもよいのでは?という疑問が浮かぶ人もいるかもしれませんが、手仕舞いのところに書かないとドテン売買出来ません。

 それは何故かというと、プログラムは基本的に上から下に命令を実行して行きますので、手仕舞いのところを通過すると、仕掛けのコードの方が上にありますので、仕掛けの命令は実行しません。

 仕掛けの命令を実行するのは、次の時間足になります。

 そして、次の時間足になった場合は、売買ルールの条件を満たしていませんので、オーダーは実行されません。

 例えば、買いの条件は移動平均の21日線が一つ前の足では90日線の下で、現在では90日線の上になっていることですが、次の時間足になった場合は、前回も現在も21日線のほうが上にありますので、オーダーが実行されません。

 プログラムはこういう細かいところを間違えるとシステムの内容が異なってきますので気をつけて下さい。


 これで、今回のプログラムは終了です。

 今回のシステムは移動平均の21日線と90日線のゴールデンクロスで買い、デッドクロスで売り、手仕舞いは仕掛けの逆のルールで行い、手仕舞いの後にドテン売買するというものです。

 では、コンパイルをするためにcompileのボタンを押してください。

 エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。

 どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。

 エラーが出なかったら、MetaTrader4のバックテストでiMA3を選んで、スタートして下さい。

 終わったら、結果、Graph、レポートを見てください。



iMA3 レポート ドル円日足




iMA3 グラフ ドル円日足


 

 今回はこれで終了です。

 次回はMACD関数の説明です。


 
 

 

 宜しかったら、応援して下さい



システムトレード研究所〜FXで完全自動売買〜INDEXへ


----------------------注意----------------------
 このブログは半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。
 実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。
| 小松 | MetaTrader4 プログラム初級編 | 21:39 | comments(2) | - |
手仕舞いの仕方
 最近、やっと暖かくなって来ましたね。

 春になったんだなと実感します。

 もうしばらくしたら桜も見頃になりますから、お花見も良いですね。


 さて、今回は手仕舞いの仕方です。

 今回は比較的簡単だと思いますので、頑張ってください。

 サンプルプログラムはこちらです。

 http://jidoubaibai.com/Sample%20iMA2.mq4

 サンプルプログラムの使い方は、こちらで説明しています。

 
 では、MetaEditorを起動して下さい。

 NameはiMA2にして置いて下さい。

 int start()の中のreturn(0);の上辺りに次のコードを書いてください。

 まとめて書きますね。

 途中までは、前回のiMAと同じ内容なので、前回のプログラムに後半を付け足してもらっても大丈夫です。
 

 //変数の宣言
 int cnt, CurrentPosition;
 int Ticket;
 double kakoa,gennzaia;
 double kakob,gennzaib;

 // オーダーチェック(ポジションなどのデータ)
 CurrentPosition=-1;
 for(cnt=0;cnt < OrdersTotal();cnt++){
   OrderSelect(cnt,SELECT_BY_POS);
   if(OrderSymbol() == Symbol()) CurrentPosition=cnt;
 }

 //一時間前の21日線
 kakoa = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
 //一時間前の90日線
 kakob = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);

 //現在の21日線
 gennzaia = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
 //現在の90日線
 gennzaib = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,0);


 // ポジションチェック ポジション無し
 if(CurrentPosition == -1)
 {
   //もし21日線が90日線を下から上にクロスしたら
   if( kakoa < kakob && gennzaia >= gennzaib)
   {
     //買いポジションを取る
     Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "Buy", 0, 0, Blue);

   }
 }
 // ポジション有り
 else
 {
   //ポジションの選択
   OrderSelect(Ticket,SELECT_BY_POS);

   //ポジションの確認
   if(OrderSymbol() == Symbol())
   {
    //もし買いポジションだったら
    if(OrderType()==OP_BUY)
    {
      //もし21日線が90日線を上から下にクロスしたら
      if( kakoa > kakob && gennzaia <= gennzaib)
      {
       //手仕舞い
       OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
      }
    }
   }
 }


 書けましたか?

 オーダー関数までは前回に説明しましたので、説明は飛ばします。

 ただ、今回は損切りと利食いの設定を無しにしていますので、そこだけ変更して置いてください。

 分からない場合は、オーダー関数のところだけコードを書き換えてください。


 では、説明して行きます。

  elseは以前if文の説明でやりましたね。

 先に使ったif以外という意味なので、今回は先のifがポジションを持っていない場合でしたので、elseはポジションを持っている場合になります。


 //ポジションの選択
 OrderSelect(Ticket,SELECT_BY_POS);

 これはポジションを選択する関数です。

 オーダー関数でチケット番号を入れた変数を使って、どのポジションを決済するか選択しています。



 //ポジションの確認
 if(OrderSymbol() == Symbol())

 これは、決済する通貨ペアが売買した通貨ペアと同じかどうかを調べています。

 念のためみたいなものなので、実際にはこのコードを書かなくてもほとんど問題ないです。



 //もし買いポジションだったら
 if(OrderType()==OP_BUY)

 ポジションが買いか売りかを調べています。

 売りを調べたいときは、 OP_BUYをOP_SELLに変えます。
 

 //もし21日線が90日線を上から下にクロスしたら
 if( kakoa > kakob && gennzaia <= gennzaib)

 今回のシステムの決済のルールです。

 移動平均線のゴールデンクロスで買って、デッドクロスで決済します。



 //手仕舞い
 OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);

 今回のメインの手仕舞いの関数です。

 日本語にすると次のようになります。

 手仕舞いの関数(ポジション番号、ロット数、レート、スリップページ、色)


 オーダー関数と似たような部分が多いので、簡単に説明して行きます。

 ポジション番号と、ロット数ですが、先程OrderSelectを使ったことによって、OrderTicket()とOrderLots()にポジションのデータが入っていますので、このまま書いてもらえれば問題ないです。

 レートは、買いのときがAskでしたので、決済時は売りになりますからBidにします。

 決済時に買いになる時は、Askと入力して下さい。

 スリップページは注文した時と同じ数字を入れてください。

 色は、注文した時と違う色にした方が分かりやすいです。



 これで、今回のプログラムは終了です。

  OrderClose()関数はOrderSelect()関数に次いで良く使いますので、頑張って使い方を習得して下さい。

 では、もう一度まとめてプログラムを書きます。


int start()
{
 //変数の宣言
 int cnt, CurrentPosition;
 int Ticket;
 double kakoa,gennzaia;
 double kakob,gennzaib;

 // オーダーチェック(ポジションなどのデータ)
 CurrentPosition=-1;
 for(cnt=0;cnt < OrdersTotal();cnt++){
   OrderSelect(cnt,SELECT_BY_POS);
   if(OrderSymbol() == Symbol()) CurrentPosition=cnt;
 }

 //一時間前の21日線
 kakoa = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
 //一時間前の90日線
 kakob = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);

 //現在の21日線
 gennzaia = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
 //現在の90日線
 gennzaib = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,0);


 // ポジションチェック ポジション無し
 if(CurrentPosition == -1)
 {
   //もし21日線が90日線を下から上にクロスしたら
   if( kakoa < kakob && gennzaia >= gennzaib)
   {
     //買いポジションを取る
     Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "Buy", 0, 0, Blue);

   }
 }
 // ポジション有り
 else
 {
   //ポジションの選択
   OrderSelect(Ticket,SELECT_BY_POS);

   //ポジションの確認
   if(OrderSymbol() == Symbol())
   {
    //もし買いポジションだったら
    if(OrderType()==OP_BUY)
    {
      //もし21日線が90日線を上から下にクロスしたら
      if( kakoa > kakob && gennzaia <= gennzaib)
      {
       //手仕舞い
       OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
      }
    }
   }
 }
 return(0);
}



 今回のプログラムは、移動平均線のゴールデンクロスで買い、デッドクロスで手仕舞いするというものです。


 では、コンパイルをするためにcompileのボタンを押してください。

 エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。

 どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。

 エラーが出なかったら、MetaTrader4のバックテストでiMA2を選んで、スタートして下さい。

 終わったら、結果、Graph、レポートを見てください。



iMA2 レポート




iMA2 グラフ




 今回はこれで終了です。

 後は応用だけでオリジナルのシステムを作ることが出来ると思いますので、オリジナルのシステムにチャレンジしてみるのも良いと思います。

 次回は、ドテン売買の仕方を説明して行きます。



 
 

 宜しかったら、応援して下さい



システムトレード研究所〜FXで完全自動売買〜INDEXへ


----------------------注意----------------------
 このブログは半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。
 実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。
| 小松 | MetaTrader4 プログラム初級編 | 17:04 | comments(0) | - |
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< August 2017 >>



このページの先頭へ