MetaTraderを使ってFXの完全自動売買をしています。FX業者はBroco。
スポンサーサイト

一定期間更新がないため広告を表示しています

| スポンサードリンク | - | | - | - | pookmark |
[EA Tip 8] 常に資金の2%で注文する
StopLossを固定しておいて,lotSizeを計算させる方法です。複利でロット数を変化させたい場合です。

  int StopLoss = 100;  // Pips
  double Risk = 2.0;  // %
  double tickValue = MarketInfo(Symbol(),MODE_TICKVALUE);  // pip value ( example: USD per 1 pip per 1 lot)
  double lotSize = NormalizeDouble(AccountFreeMargin()*Risk/100/(StopLoss*tickValue),2);

ここでのポイントは,MODE_TICKVALUEを使うことです。
tickValueは,1ロットで取引するとき,1 pipが何USDの変動に相当するかを表しています。
私の場合はInstaforexでUSDで決済していますので「USD」と書きましたが,円で決済している口座でも基本的な考え方は同じです。

tickValueは取引業者,決済通貨,レバレッジでも変わりますので,実際にご自分のMetaTraderで確かめてみてください。
ちなみに私の場合,下のような結果でした。Brocoで計算すると,全てのtickValueは10倍になっていると思います(レバレッジ1:100)。

  tickValue  通貨ペア (Instaforex,レバレッジ1:100)

   1.0000    EURUSD
      1.0000    GBPUSD
      1.0000    AUDUSD
      1.0505    USDJPY    (USDJPY=95.19のとき。実際,1/95.19=0.010505)
      1.6522    EURGBP   (EURGBP=0.8506のとき。説明は省略。)
      0.9232    USDCHF   (USDCHF=1.0832のとき。実際,1/1.0832=0.9232)

で,最初に書いた方法を使うと,リスクに応じたロット数を自動的に計算してくれます。根底にあるのは次の基本式です。

 (ストップ幅pip数)×(1ロット,1 pip当たりの決済通貨変動値)×(ロット数)=(余裕資金)×((リスク%)/100)

説明は特に要りませんよね。

逆に,ロット数を固定しておいて,StopLossを変える方法もあります。やりかたはどうあれ,2%のリスクを取るという観点からみればどちらも同じです。



 ↓よろしければ是非クリックをお願いします
にほんブログ村 為替ブログ FX初心者本人へ 


| ☆のんき☆ | EA作成Tips | 12:20 | comments(0) | trackbacks(1) | pookmark |
[EA Tip 7] きちんと乱数を初期化する
EAで乱数を使いたいとき、乱数を初期化するにはMathSrand()関数を使います。

乱数を初期化するには、init()関数の中に以下の文を入れます。

  MathSrand(GetTickCount());

ここで注意すべき点は、MathSrand()関数のseedにはTimeCurrent()やTimeLocal()は使わないことです。
リアルではどうなるか分かりませんが、バックテストのときにTimeCurrent()やTimeLocal()をseed値として使うと、その後MathRand()で生成される乱数は常に同じパターンになってしまいます。これでは乱数になりません(実際にEAを走らせてみると分かりますが、実証済みです)。

逆に、GetTickCount()関数こそ、システムを起動してからの経過時間なんて何のために使うのか、まさにMathSrand()のためにあるようなものです。


 ↓よろしければ是非クリックをお願いします
にほんブログ村 為替ブログ FX システムトレード派へ 
| ☆のんき☆ | EA作成Tips | 22:30 | comments(0) | trackbacks(0) | pookmark |
[EA Tip 6] AccountProfit()関数を使う
トータルで一定以上の利益が出たら手仕舞いして,利益を確定する方法を紹介します。AccountProfit()関数を使った一例です。

(1)以下のEAを作成する。


#property copyright "nonki"
#property link "http://nonki777.jugem.jp/"
 
extern bool enableTP = true;
extern double tp = 100.0;
extern int Slippage = 5;
 
datetime bartime=0;
 
int init() { return(0); }
int deinit() { return(0); }
 
int start()
{
 
  // Go straight, only if bars are changed
  if (bartime == Time[0])
  {
    return(0);
  }
  bartime=Time[0];
 
  int i,total;
  double sum;

  if (enableTP == true)
  {
    total=OrdersTotal();
    sum = AccountProfit();
    if (sum >= tp)
    {
      for (i=total-1; i>=0; i--)
      {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
          continue;
 
        switch (OrderType())
        {
          case OP_BUY:
            OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red);
            break;
          case OP_SELL:
            OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
            break;
          case OP_BUYLIMIT:
          case OP_BUYSTOP:
          case OP_SELLLIMIT:
          case OP_SELLSTOP:
            OrderDelete(OrderTicket());
            break;
          default:
            break;
        }
      }
    }
  }
  return(0);
}
 

(2)例えばUSDJPY15分チャートを作成して,ここで作ったEAを貼り付け稼動させる。

ここで決済通貨に注意してください。私は100<USD>で損益を判定していますが,決済通貨が円であるならばAccountProfit()関数は円で返してくるはずなので,このままtp変数が100<円>のままだと大変です。利益がたった100円乗っただけで全部手仕舞いしてしまいます(笑)。トータル1万円で利確するラインを作るならtp変数を10000.0にするなど,自分で好きな値に変えてください。
(この方法を応用して,例えば一定ラインの損切りラインを超えたら自動的に損切りを確定させることも出来ます。プログラム変更が必要ですけど,簡単ですよね。)

但し,この方法を使うときは注意してください。せっかく利を伸ばそうとしているEAの途中で頭を切っちゃうわけですから。


↓よろしければ是非クリックをお願いします
にほんブログ村 為替ブログ FX システムトレード派へ にほんブログ村 為替ブログ FX初心者本人へ
にほんブログ村 トラコミュ FXブログへ

FXランキング

人気ブログランキングへ

| ☆のんき☆ | EA作成Tips | 12:18 | comments(0) | trackbacks(0) | pookmark |
[EA Tip 5] スプレッドが大きいときは注文しないようにする
指標前後やマーケットが閑散なときなど,スプレッドが変動するときがあります。スキャル系EAにとってスプの大きさはとても重要。
そこで,スプレッドが特定の値以上になってしまったときには,注文を行わないようにする方法を紹介します。

(1)EAの最初のほうで,extern変数MaxSpreadを定義しておく。

extern int MaxSpread = 4; // in pips

(2)OrderSend直前あたりに,以下のif文を追加する。

if (Ask-Bid < MaxSpread*Point)
{
  // Please make an order.
  OrderSend(...)
}

これで,スプレッドがMaxSpread以上になったとき,注文しないようになります。


↓よろしければ是非クリックをお願いします
にほんブログ村 為替ブログ FX システムトレード派へ にほんブログ村 為替ブログ FX初心者本人へ
にほんブログ村 トラコミュ FXブログへ

FXランキング

人気ブログランキングへ

| ☆のんき☆ | EA作成Tips | 11:43 | comments(0) | trackbacks(0) | pookmark |
[EA Tip 4] 携帯からMT4取引を閲覧する

5/4の記事にも書きましたが、携帯電話のブラウザからMetaTraderの取引経過を見たいとき、Publisherで出力するstatement.htmだと重すぎて、全体像が分からなかったりすることがあります。私の場合、statementDetailed.htmの名前を書き換えてstatement.htmにしていますから、特に重くなります(だって、たまにはあのstatementDetailed.htmのグラフを見たいじゃないですか。「あれ」だと分かりませんか?(笑))。

そこで、必要な取引情報だけを一定時間毎に更新させ、ブラウザーで閲覧するためのEAを作りましたので公開します。アイデアはガマウシさんのブログから頂きました。

/*
  NL0 Sample.mq4

  Writes an HTML file that describes daily closed and open positions to browse via cell phones

*/

#property copyright "nonki"
#property link      "http://nonki777.jugem.jp/"

extern bool showDetailedHeader = true;
extern string filename = "now.html";

datetime bartime=0;

int init() { return(0); }
int deinit() { return(0); }

int start()
{
  int i, total;
  double sum;

  // Calls only when bars are updated

  if (bartime==Time[0])
  {
    return(0);
  }
  bartime=Time[0];

  int fp;

  fp=FileOpen(filename, FILE_CSV|FILE_WRITE);
  if (fp<=0)
  {
    Print("cannot open"+filename);
    return(0);
  }

  FileWrite(fp,"<HTML>");
  FileWrite(fp,"<HEAD>");
  FileWrite(fp,"<META http-equiv=¥"Content-Type¥" content=¥"text/html; charset=SHIFT_JIS¥">");
  FileWrite(fp,"<title>MT4 Update</title>");
  FileWrite(fp,"</HEAD>");
  FileWrite(fp,"<BODY>");
  FileWrite(fp,"<font size=1>");  // as small font size as possible

  datetime now = TimeCurrent();

  FileWrite(fp,TimeToStr(now));
  FileWrite(fp,"<BR>");

  FileWrite(fp,"Num of Open Orders: "+DoubleToStr(OrdersTotal(),0));
  FileWrite(fp,"<BR>");
  FileWrite(fp,"Floating P/L: "+DoubleToStr(AccountProfit(),2));

  if (showDetailedHeader == true)
  {
    FileWrite(fp,"<BR>");
    FileWrite(fp,"Account Equity: "+DoubleToStr(AccountEquity(),2));

    double spread = MarketInfo("EURGBP", MODE_SPREAD);

    FileWrite(fp,"<BR>");
    FileWrite(fp,"EURGBP Spread: "+DoubleToStr(spread,0));

  }
  FileWrite(fp,"<BR><BR>");
  FileWrite(fp,"Closed Transactions:<BR>");

  string s,sy,c,bs,z,ba,st;
  string op,cp;
  double co,sw,pr;
  datetime oct;
  int t,m,dg;

  total=HistoryTotal();
  for (i=0; i<total; i++)
  {
    if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
    {
      oct = OrderCloseTime();
      if (TimeYear(oct)  != TimeYear(now) ||
          TimeMonth(oct) != TimeMonth(now) ||
          TimeDay(oct)   != TimeDay(now))
        continue;

      co = OrderCommission();
      sw = OrderSwap();
      pr = OrderProfit();
      if (co == 0.0 && sw == 0.0 && pr == 0.0)
      {
        continue;
      }

      t = OrderTicket();
      m = OrderMagicNumber();
      z = StringSubstr(DoubleToStr(m,0),2,2);

      sy = OrderSymbol();
      s = StringSubstr(sy,0,1)+StringSubstr(sy,3,1);
      dg = MarketInfo(sy,MODE_DIGITS);
      op = DoubleToStr(OrderOpenPrice(),dg);
      cp = DoubleToStr(OrderClosePrice(),dg);

      c = StringSubstr(TimeToStr(oct,TIME_DATE|TIME_MINUTES),11,5);

      if (OrderType()==OP_BUY) bs="B"; else if (OrderType()==OP_SELL) bs="S"; else bs=".";
     
      st = StringConcatenate(bs," ",DoubleToStr(OrderLots(),2)," ",s," ",z," ",c," ",op," ",cp," ",DoubleToStr(co+sw+pr,2));
      FileWrite(fp, st);
      FileWrite(fp,"<BR>");
    }
  }

  FileWrite(fp,"<BR>");
  FileWrite(fp,"Open Trades:<BR>");

  total=OrdersTotal();
  for (i=0; i<total; i++)
  {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
    {
      co = OrderCommission();
      sw = OrderSwap();
      pr = OrderProfit();
      if (co == 0.0 && sw == 0.0 && pr == 0.0)
      {
        continue;
      }

      t = OrderTicket();
      m = OrderMagicNumber();
      z = StringSubstr(DoubleToStr(m,0),2,2);

      sy = OrderSymbol();
      s = StringSubstr(sy,0,1)+StringSubstr(sy,3,1);
      dg = MarketInfo(sy,MODE_DIGITS);
      op = DoubleToStr(OrderOpenPrice(),dg);

      if (OrderType()==OP_BUY) { bs="B"; ba=DoubleToStr(MarketInfo(sy,MODE_BID),dg); }
      else if (OrderType()==OP_SELL) { bs="S"; ba=DoubleToStr(MarketInfo(sy,MODE_ASK),dg); }
      else { bs="."; ba="N/A"; }
     
      st = StringConcatenate(bs," ",DoubleToStr(OrderLots(),2)," ",s," ",z," ",op," ",ba," ",DoubleToStr(co+sw+pr,2));
      FileWrite(fp, st);
      FileWrite(fp,"<BR>");
    }
  }

  FileWrite(fp,"</font>");
  FileWrite(fp,"</BODY>");
  FileWrite(fp,"</HTML>");

  FileClose(fp);

  if (!SendFTP(filename))
  {
    int lasterror=GetLastError();
  }
}


Publisherでftpの設定をしてからこのEAを実行すると、下のようなページが出てきます。EAを張り付けたチャートが更新されるたびにこの画面の情報も変わりますので、便利です。グラフは見えませんけれど、なんか工夫すれば見れそうな気がしますね。今回はそこまでしませんでした。

なお、携帯で見たいので、文字はわざと小さくしていますし、最低限の情報しか表示しません。

あ、これはバナーではありませんので。now.htmlという名のhtmlファイルです。←ん、バナーのバージョンも作りたい気分になってきた(笑)。
NL 0 画面サンプル


 ↓よろしければ是非クリックをお願いします
にほんブログ村 為替ブログ FX システムトレード派へ にほんブログ村 為替ブログ FX初心者本人へ
にほんブログ村 トラコミュ FXブログへ

FXランキング

人気ブログランキングへ

| ☆のんき☆ | EA作成Tips | 06:28 | comments(1) | trackbacks(0) | pookmark |
[EA Tip 3] トレイリングストップを追加する

 「トレイリングストップ(Trailing Stop)とは?」についてはgoogleで検索してもらうとして…。

EAにトレイリングストップ機能を手作業で追加したいときは、ここはもう深く考えず、先人が作ったものをコピー&ペーストするのが安全です。

一口にトレイリングストップといってもTSDやFFを見るとたくさんのパターンがありますが、ここでは最もポピュラーな手法をご紹介します。私もこれを使うことが多いです(スキャル系EAにはあまり使わないので、最近は本機能を使っていません^^;)。

(1) extern変数に次の2つを用意して、好きな値で初期化する。

extern int TrailingStop=50; // if 0, MoveTrailingStop() will not be called
extern int MagicNumber=123456;


(2) EAファイルの後ろのほうにMoveTrailingStop()関数を追加しておく。もちろん関数名は何でもいいですが、start()関数で呼ぶときに名前を合わせなければなりません。

void MoveTrailingStop()
{
   int cnt,total=OrdersTotal();
   for(cnt=0;cnt<total;cnt++)
   {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false) continue;
      if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
      {
         if(OrderType()==OP_BUY)
         {
            if(TrailingStop>0) 
            {                
               if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-Point*TrailingStop,Digits))||(OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
                  return;
               }
            }
         }
         else if(OrderType()==OP_SELL)
         {
            if(TrailingStop>0) 
            {                
               if((NormalizeDouble(OrderStopLoss(),Digits)>(NormalizeDouble(Ask+Point*TrailingStop,Digits)))||(OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),OrderTakeProfit(),0,Red);
                  return(0);
               }
            }
         }
      }
   }
}

なんか、ここまでやるかというくらいNormalizeDouble()関数を多用していますが、念のためです。また、次の項で示すようにTrailingStop変数がゼロのときは呼ばないようにしていますが、将来コピペしたときうっかりこの関数を常時呼んでしまっても正常に動くよう、TrailingStop変数がプラスかどうか内部で再チェックしています。

(3) start()関数の最初のほうで、次の命令を追加する。タイムフィルターの後ろに置くのが妥当でしょう。

   if(TrailingStop>0)
     MoveTrailingStop();


以上です。

見るとおわかりの通り、extern int TrailingStop=0;とゼロに指定すると、トレイリングストップ機能を呼ばなくなります。

トレイリングストップを本当に使うかどうか、EAを最適化する段階で結構考えますもんね。


 にほんブログ村 為替ブログ FX システムトレード派へ
にほんブログ村

FXランキング
FXランキング

人気ブログランキングへ
人気ブログランキング

| ☆のんき☆ | EA作成Tips | 11:39 | comments(2) | trackbacks(0) | pookmark |
[EA Tip 2] バーが更新するときだけ1回実行する

EAをチャートに張り付けると、MetaTraderは、AskやBidの値が変動するたびにそのEAを呼ぼうとします。そして、他のEAが稼働していなければ、そのEAは実行されます。

でも、例えば1hr足のチャートで、バーが変わったときだけ計算すれば充分なときなんかは、普段は余計なことをせずさっさとそのEAを終わらせ、PCに他の処理をさせたほうが有利です。

そんなときは、以下のようにします。

(1) start()関数の外側でdatetime型変数を定義しておく

(2) start()関数の最初の部分で、さっきのdatetime型変数とTime[0]を比較する

(3) もしTime[0]と同じなら、何もしないでreturn(0)

(4) さきほどのdatetime型変数に、Time[0]を代入する

サンプルを見たほうが分かりやすいです。ここではdatetime型変数の名前をbartimeとしました。
 

datetime bartime=0;


int start()
{
  if (bartime==Time[0])
  {
    return(0);
  }
  bartime=Time[0];

  // あとは通常処理

  //
}


これで、バーが変わった直後だけ(例えば30分チャートならば、×時00分、×時30分だけ)通常処理をしてくれます。現在の始値を使いたいとか、1本前の終値を使うときなども、この方法は有効です。

但し、この方法では、バーが変わったときしか仕事をしません。当たり前ですが。
スキャルピングやブレイクアウト等、シフト0のバー(つまり現在変動中のバー)を常にAsk/Bidを監視していたいときは、この方法は使えません。
儲けるチャンスをみすみす逃してしまいます。


にほんブログ村 為替ブログ FX システムトレード派へ
にほんブログ村

FXランキング
FXランキング

人気ブログランキングへ
人気ブログランキング

| ☆のんき☆ | EA作成Tips | 22:24 | comments(0) | trackbacks(0) | pookmark |
[EA Tip 1] 資金管理EA関数・ロット数を計算する
 Forex TSDのMetarader Programmingに行くと、dose it posible to creat any function of "mql code" posting in this forum?というスレッドがあります。

このスレッドには、EAを作成するときに、ちょっとした疑問を解決するのに必要なTipsが詰まっています。
ここでは面白そうなTipsを紹介していきたいと思います。
最初は、資金管理の方法など。いわゆる「「ロット数」を何ロットに決めたらよい?」を計算する関数で、無料サンプルEAを見ればたくさんあるんですが、ロット数を固定して運用している人でも、知識は持ってて損はありません。

簡単な資金管理(Money Management)のソースコード
some simple MM codes

3通りのロット数計算方法があります。その中身は見れば大体分かるので省略してしまいますが、一番上のシンプルな式がよく使われてますよね。もっとも、ここの管理人newdigital氏がいうとおり、資金管理は千差万別で、EAによってどう調節するか自分で判断すべきだと言っています。

ちなみに私が最近よく使っているロット数計算関数は、無料EA”Your_Lucky"内蔵のGetLots関数です。上の3通りのうち1番目の改良版ですが、スキャル用に少々工夫してあるのと、FX業者で最小ロット数が0.01だったり0.1だったりしますが、関数内部で自動的に考慮してくれていて、たいへん優れモノです。


にほんブログ村 為替ブログ FX システムトレード派へ
にほんブログ村

FXランキング
FXランキング

人気ブログランキングへ
人気ブログランキング
| ☆のんき☆ | EA作成Tips | 06:46 | comments(0) | trackbacks(0) | pookmark |
CATEGORIES
CALENDAR
SMTWTFS
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< August 2017 >>
おすすめリンク
PROFILE
SELECTED ENTRIES
ARCHIVES
RECENT COMMENTS
RECENT TRACKBACK
クリックお願いします
カウンター
SPONSORED LINKS
MOBILE
qrcode
RECOMMEND
このページの先頭へ