売買システムを作る2

売買システムを作る2


 さて、いよいよ注文の命令文です。

今回は、
ポジションを持ってなくて、1本前の終値が移動平均より上ならば買いポジションを持つ。
ポジションをもっていて、1本前の終値が移動平均より下ならば決済する。

という戦術で、命令文を書いていきましょう。

   // ポジション無しの場合
   if(OrdersTotal() < 1)
   {
      //もし1本前の終値が移動平均より上ならば
      if(Close[1] > ma )
      {                          
         //買いポジションを取る。
         OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Buy", 10, 0, Blue);
      }
   }

上から順に見ていきましょう。
//の行はコメントメモでしたね。後から見てわかりやすいように書いたりします。

ここで
if(・・・){***}という形を覚えましょう。
これは、
もし・・・ならば***しなさいという条件文です。
{ } が改行されているのは見やすくするためです。
} の後には ; はつけないようにしてください。

if(OrdersTotal() < 1)
{
}

は、もしポジションや注文中のものが 1 未満(一つも無い)ならば
{ } の中を実行するという意味です。

{ } の中にまた条件文の if文がでてきました。条件を通過した中で更に条件を付け加えています。

if(Close[1] > ma)

は、もし1本前の終値が ma (←1本前の移動平均値が代入されている)よりも大きいならば
{ } の中を実行するという意味です。

ここで、
Close[**] は、
このチャートの**本前の終値という便利な言葉です。
他にも、
Open[] High[] Low[] も同様に使えます。

さあ、ついにきました。注文の命令文です。

OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Buy", 10, 0, Blue);

OrderSend(・・・) は()の内容を送信するといった感じです。1行で書いてもよいし、カンマの前後の隙間で改行してもよいです。最後に ; を忘れないようにしましょう。

OrderSend(・・・)
のカッコの中の決まりごとを見ていきましょう。

(通貨ペア,注文方法,量,値段,スリッページ,損切り値,利食い値,コメント,マジックナンバー,有効期限,色)
といった感じです。

通貨ペアには、
"USDJPY" や "EURUSD" などを入力します。Symbol() と入力するとこのチャートの通貨ペアという意味になります。

注文方法には、
OP_BUY 成り行き買い、
OP_SELL 成り行き売り、
などを入力します。指値、逆指値注文の設定することができます。
買いオペ、売りオペといった感じですが、コンピュータは 0 や 1 というように整数で認識しているということも覚えておいてあげましょう。

量には、
ロットという単位で入力します。1ロットが10万通貨で通常0.1ロット(1万通貨)単位で入力します。

値段には、
買値、売値を入力します。このチャートの買値は Ask 、売値は Bid と入力すればコンピュータが調べてくれます。

スリッページには、
注文時の価格と約定時の価格の差の許容範囲をピプス(pips)という単位で入力します。ピプスとは、表示価格の下一桁のことで、スリップページは3程度が無難かと思います。

損切り値には、
損切りするときの価格を入力します。逆指値決済ですね。0 と入力すると指定無しということになります。

利食い値には、
利食いするときの価格を入力します。指値決済です。0 と入力すると指定無しとなります。

コメントには、
約定したときに操作履歴に残しておきたい言葉を入力します。複数の売買システムを使用している場合、後から見てわかるようにしたりします。

マジックナンバーには、
注文に番号を貼ってあげて、注文を識別するための数字を入力します。複数の売買システムを使用している場合、コンピュータにマジックナンバーで識別させたりします。

有効期限には、
注文の有効期限を入力します。指値注文や逆指値注文などのときに使いますが、特に必要ないときは 0 としておきましょう。

色には、
注文約定時、チャートにつけられる矢印の色を設定します。
色の種類は、Tools → Options → Colors のところで見ることができます。
個人的には、買いは Blue 売りは Red にしています。

さあ、これでポジションを持っていないときの注文は完了です。
続いては、ポジションを持っているときの注文です。

   // ポジション有りの場合
   else 
   {
      //ポジションのデータを取得
      OrderSelect(0, SELECT_BY_POS);
      //もし1本前の終値が移動平均より下ならば
      if(Close[1] < ma)
      {
         //ポジション決済
         OrderClose(OrderTicket(), OrderLots(), Bid, 3, Green);
      }
   }

いきなり else と書いてあります。なんだかポジション無しの場合よりも言葉数が少ない感じですが^^;
これは、その他の場合といった感じの意味です。else のすぐ上には、ポジション無しの場合のif文の終わりの } があります。なので、この場合は、ポジション無し以外の場合といった意味になります。
この場合も、その条件で{}内を実行します。

OrderSelect(0, SELECT_BY_POS); で、
持っているポジションを選択しています。

じつは、()の中には、もう一つ3つ目に項目があるのですが今回は省略します。(省略した場合デフォルトの現在のものといった感じになります。)
()の中の意味は持っているポジションの中で、インデックス 0 のものといった感じです。手動で約定させるときにも約定させたい取引を選択するんですが、その作業と同じですね。

if(Close[1] < ma){・・・} は、ポジション無しの時の条件の大小が逆になったパターンですね。
もし1本前の終値が ma よりも小さいならば { } の中を実行するという意味です。

そして、最後。
OrderClose(OrderTicket(), OrderLots(), Bid, 3, Green);
OrderClose(・・・) は選択されたポジションを()内の内容で決済注文をするといった意味です。

()内の内容は、
(注文番号,量,価格,スリップページ,色)
という感じ。

注文番号とは、
注文ごとにつけられるそれぞれの番号のことです。
OrderTicket() と書くことで選択されたポジションのチケットナンバーを意味します。

量には、
決済する、ロット数を入力します。
OrderLots() と書くことで選択されたポジションのロット数を意味します。

価格は、決済する価格です。
今回は、買いポジションを売り払うので、Bid というこのチャートの現在の売値という意味の言葉を入力しておきましょう。

スリップページと色は、OrderSend の時と同じですね。

これで、全てが書き終わりました^_^;

今まで、書いてきたのはソースコードといういわゆる人間語みたいなものです。今度は、これをコンピュータが理解して実行できるようにコンピュータ語に変換してあげましょう。

やり方は、
Compile ボタンを押す
です。

Meta Editor のツールバーに、用紙にチェックマーク Compile と書いてあるボタンです。

Toolbox 内の2,3段目位に太い文字で
0 error(s), 0 warning(s)
と、表示されれば大成功ですv(^0^)

何かエラーが表示された場合は、
{} の数、 () の数、 ; のつけ忘れが無いか、大文字小文字は合っているか、変数の宣言はできているか、などを確認してみましょう。

もう一度、全部書きますね。

   double ma ;
   
   ma = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);
   
   // ポジション無し
   if(OrdersTotal() < 1)
   {
      //もし1本前の終値が移動平均より上ならば
      if(Close[1] > ma )
      {                          
         //ポジションを取る。
         OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Buy", 10, 0, Blue);
      }
   } 
   // ポジション有り
   else 
   {
      //ポジションのデータを取得。
      OrderSelect(0, SELECT_BY_POS);
      //もし1本前の終値が移動平均より下ならば
      if(Close[1] < ma)
      {
         //ポジション決済
         OrderClose(OrderTicket(), OrderLots(), Bid, 3, Green);
      }
   }

これを、int start() の
//----

//----
の間に書けばオッケーです。

今回は、できるだけシンプルにすることを心がけて作ったつもりです。なので、複数のポジションを持ったり、複数のシステムを起動させたりする場合は、もう少し複雑なプログラムになります。
それは、またの機会にしておきましょうか^^;

今回は、このへんで。

完全自動売買への道のり

タグ

2007年10月12日|コメント (11)

カテゴリー:完全自動売買

コメント (11)

こんにちは

ブログ見ました。MT4の各種機能及びプログラムのことを詳しく述べられているのを見てただただ凄いなと感心しています。私にはまだまだできません。。。私は、素人ながら今、メタエディターを使用してプログラムを書いています。内容はMACDのシグナルが上向きになったら買い、下向きになったら売りというのを作っています。ですが、今躓いています。売買シグナルが作れないのですし、エラーが出ます。そこで、できればアドバイスをお願いしたいのですが。よければ後ほど不完全なプログラムを送りたいと思います。よろしくお願いします。

投稿者:block |2008年6月24日 22:27

blockさん

こんにちわ。

慣れるまでは、分からないことがいっぱいで
意味不明なエラーが出てしまいますよね^^;

少しずつ、勉強して慣れていきましょうね!

投稿者:慶次 |2008年6月25日 08:10

はじめまして こんにちわ 自動売買システムを作りたくて、こちらのサイトにたどり着いた初心者です。
質問です。
// ポジション無しの場合
if(OrdersTotal()<1)という記述になっていますが、&l(エル?)t1というのは、1未満を指すお決まりの記号?みたいなものなのでしょうか?
宜しくお願いします

投稿者:ぽんすけ |2009年2月18日 19:17

ぽんすけさん

こんにちわ!
&ltと表示されている場合は、『<』に置き換えて読んでください。
ブラウザの環境などで『<』に変換されないままになってしまってう場合があります。

投稿者:慶次 |2009年2月18日 19:47

Best Site Good Work

投稿者:Yzaloqsv |2009年12月25日 19:06

はじめまして
以前からこちらのサイトを参考に勉強させていただいています。
プログラミングのど素人の私でも理解できるよう書かれており
非常に感謝しております。
ただ、プログラムを作成していく中でどうしても思い通りに動いてくれず四苦八苦して
アドバイスをいただければと思いコメントさせていただきました。
内容は
 Forceを使って目標値(judga)を一旦上回った後、目標値(judga-blank)を下回れば  売り。 といったものです。
プログラムは
  if( iForce >= judga)
{
sig_a = 1;
}
if( sig_a == 1 && iForce < judga-blank)
{
sig_a = 2;
}
if( sig_a == 2 && CurrentPosition != -1)
{
sig_a = 0;
}
といった判別式の後sig_a==2の時に売りといった内容ですが
目標値を上回った段階で売りのサインが出てしまいます。
どうしてでしょうか?
突然の質問で申し訳ありませんがよろしくお願いします。

投稿者:ぜんごん |2010年12月27日 08:40

ぜんごんさん

こんにちわ!

適所に
Print(sig_a, ", ", iForce, ", ", judga, ", ", blank);

を入れて変数の値を調べると原因が判るかもです^^

投稿者:慶次 |2010年12月27日 10:37

はじめまして、素人の私のバイブルとして利用させてもらっています。
分かりやすい内容は、とても助かってます。
逆指値を移動平均線と同じ値で設定する事って出来ますでしょうか?
アドバイス下さい。

投稿者:みん |2011年10月20日 20:24

みんさん

こんにちわ^^

買い注文の時に、ストップをmaの値で設定する場合、

OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, NormalizeDouble(ma, Digits), 0, "Buy", 10, 0, Blue);

とします。
注文時にTP・SLを設定できないブローカーの場合は、
ポジションを選択してから、OrderModifyでSLを設定します^^

投稿者:慶次 |2011年10月21日 11:49

慶次さん、はじめまして。
とってもわかりやすく説明してあり、とても勉強になります。
さて早速ですが、
下記のような変数の宣言を書いてみたのですが、
コンパイルすると、ものすごくエラーが出てしまいます。???…

void OnTick()

//変数の宣言---
 double SIG2,SIG1,SIG0,SIG_1,SIG_2;

SIG2 = iBands(NULL,0,21,2,0,PRICE_CLOSE,MODE_UPPER,1);
SIG1 = iBands(NULL,0,21,1,0,PRICE_CLOSE,MODE_UPPER,1):
SIG0 = iBands(NULL,0,21,0,0,PRICE_CLOSE,MODE_MAIN,1);
SIG_1 = iBands(NULL,0,21,1,0,PRICE_CLOSE,MODE_LOWER,1);
SIG_2 = iBands(NULL,0,21,2,0,PRICE_CLOSE,MODE_LOWER,1);

真ん中を
 SIG0 = iMA(NULL, 0, 21, 0, MODE_SMA, PRICE_CLOSE, 1);
                      に代えたりもしてみたのですが…

ボリンジャーバンドの2σ、1σ、移動平均線、-1σ、-2σの5本線で、
ひとつ前の終値での数値を得たい…と考えているのですが…。
う~ん?さっぱり

 

投稿者:kamezou |2016年2月11日 23:56

問題は解決しました。
エラーが出なくなりました。
ありがとうございました。

投稿者:kamezou |2016年2月12日 01:00

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。