【無料】メールマガジン配布します!

真実!しか流さないメールマガジン《不定期》

メルマガのお申し込みはコチラ

CheckForOpen(); の中身  EAを作ろう!!

 

さてさて、前々回からの続きをやっていきます。

 

//+——————————————————————+
//| Start function                                                   |
//+——————————————————————+
void start()
  {
//—- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//—- calculate open orders by current symbol
   if(OrdersTotal()==0) CheckForOpen();
   else CheckForClose();
//—-
  }

 

if(OrdersTotal()==0) CheckForOpen();

ポジションを持っていなかったら CheckForOpen() を呼び出すよいうコードですね。

 

前回触れていなかったようなので、ちょいとつけ加えると、

OrdersTotal()

これは、MT4で内で現在保有中のポジション数を全て返します。

最近のEAではさすがにこんな荒い処理をしてないと思いますが、まったく別のEAを一緒に稼働していたとしたらそのEAのポジション数まで影響してしまいます。

もちろん、裁量でいれたポジションも反映します。

 

#define MAGICMA  20081109

ソースの頭に、マジックナンバーを設定してますよね。

本当なら

int MyEA_Position=0;

for (int pos = OrdersTotal() – 1; pos >= 0; pos–)
    {

     OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol() == Symbol() && OrderMagicNumber() ==MAGICMA )MyEA_Position +=1;

if(MyEA_Position==0) CheckForOpen(); else CheckForClose();

こんな感じでしょうか

自分のEAのポジション数だけカウントして、調べるベキのような気がします。

海外でぽっと拾ったEAなんかは、こんな基本的コードが抜けていることもあるので自分で修正して使うようになれることは大事です。

 

CheckForOpen();

から見ていきます。

 

//—————————————————————————        
int CheckForOpen()
{
  double L = Low[iLowest(NULL,0,MODE_LOW,PeriodX,0)];
  double H = High[iHighest(NULL,0,MODE_HIGH,PeriodX,0)];
  double Lots = MathRound(AccountBalance()/100)/1000;
  if((H-Bid>Limit*Point))
    {OrderSend(Symbol(),OP_BUY,Lots,Ask,1,0,0,"",MAGICMA,0,CLR_NONE);
     for(int i=1; i<5; i++){OrderSend(Symbol(),OP_BUYLIMIT,MathPow(2,i)*Lots,Ask-i*Grid*Point,1,0,0,"",MAGICMA,0,CLR_NONE);}
    }
  if((Bid-L>Limit*Point))
    {OrderSend(Symbol(),OP_SELL,Lots,Bid,1,0,0,"",MAGICMA,0,CLR_NONE);
     for(int j=1; j<5; j++){OrderSend(Symbol(),OP_SELLLIMIT,MathPow(2,j)*Lots,Bid+j*Grid*Point,1,0,0,"",MAGICMA,0,CLR_NONE);}
    }

ばらばらに簡単に説明すると

  double L = Low[iLowest(NULL,0,MODE_LOW,PeriodX,0)];
  double H = High[iHighest(NULL,0,MODE_HIGH,PeriodX,0)];

PeriodX分のローソク足のHigh、Lowを求めているコードです。

それぞれHとLに代入してますね。

  double Lots = MathRound(AccountBalance()/100)/1000;

これは、AccountBalance() はMT4の口座残高を表す関数です。そしてMathRoundは、たしか四捨五入だったと思いますw

気になる方は、リファレンスを見てください。

 

次がちょっと何やってるのか分かり難いですが、、、

 

if((H-Bid>Limit*Point))
    {OrderSend(Symbol(),OP_BUY,Lots,Ask,1,0,0,"",MAGICMA,0,CLR_NONE);
     for(int i=1; i<5; i++){OrderSend(Symbol(),OP_BUYLIMIT,MathPow(2,i)*Lots,Ask-i*Grid*Point,1,0,0,"",MAGICMA,0,CLR_NONE);}
    }

一見複雑そうな式も順番に見ていけば簡単です。このくらいならですが^^;

((H-Bid>Limit*Point))
    {OrderSend(Symbol(),OP_BUY,Lots,Ask,1,0,0,"",MAGICMA,0,CLR_NONE);

 

Hは、PeriodX分の一番高い値ですから、そこからBid現在値を引いたGap値がLimit*Pointよりも大きければ、Ordersend 注文を入れるってことですね。

 

Pointは、利用しているブローカーの最小単位になります。Limitが初期値は、20となっているのでFXDDで検証しているので2Pips以上のGapがあれば、注文が入るということです。

 

コード的に何をしたいのかも理解する必要がありますが、あわせてトレード的な狙いがどこにあるのかも理解する必要があります。

ここがとっても重要なところです。MQL事態は、結構簡単なプログラムなのでSEなどプロにかかればあっというまにEAを作ってしまうでしょう。勝てるEAがつくれるのかは、別問題ですね。

けど、難しいのは、相場の理解です。

  • プログラムのスキル
  • 統計的知識
  • トレードとしての相場の理解

 

tomoは、この3つが必要だと思っております。

20140509163141

図にするとこんな感じでしょうか^^;

指定したローソク足の高さと現価格のGapは、直近のボラティリティを計っているのではないかと思います。それもパラメーターで自分で指定出来るのでいいですね。

 

これを見ると使う通貨に合わせてボラティリティがある時にエントリーするようなシステムとして作られたのかもしれないですね。

あくまで推測ですが

 

for(int i=1; i<5; i++){OrderSend(Symbol(),OP_BUYLIMIT,MathPow(2,i)*Lots,Ask-i*Grid*Point,1,0,0,"",MAGICMA,0,CLR_NONE);}

その後、for分で繰り返し指値を入れています。

MathPowは、i 値の累乗を返しますからロットがだんだんと増えていっているのが分かります。

 

for(int i=1; i<5; i++){ } これは、i が1、2,3,4,5と順番に増えていくんですが、FOR文は基本的な命令文なので分からないからは、ぐぐってみてください。

 

ショート側の反対コードは、Longの逆になっています。

 

では、今回はここまで^^;

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

tomoよりのお願い

参考になったちょっと役に立ったお疲れさんって
少しでもおもったかた(*゜▽゜ノノ゛☆

 

ポッチっとお願いします。その1ポチ!ありがとう

にほんブログ村 為替ブログ FX初心者本人(1年目)へ
にほんブログ村

 

このエントリーをはてなブックマークに追加 はてなで広めてください。この記事が役に立つ人がいると思います。
←左のボタンをクリックして共有してください。

 

 

関連記事

タグ

2014年5月9日 | コメント/トラックバック(0) |

カテゴリー:MQL講座

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ