2009年8月の記事一覧

VQをEA内で計算する方法


のやり方でいきますと、

extern   bool     Crash = false;
extern   int      TimeFrame = 0;
extern   int      Length = 5;
extern   int      Method = 3;
extern   int      Smoothing = 1;
extern   int      Filter = 5;
extern   int      SignShift = 1;

として、VQからコピペ&SignShiftというパラメータを追加。
そして、Start()関数内で

int sign;
sign = iCustom(NULL, TimeFrame, "VQ", Crash, 0, Length, Method, Smoothing, Filter, 6, SignShift );

とすれば、買い状態の時は、sign が1、売り状態の時は、sign が-1となり、あとは条件をいろいろと加えるだけですね^^

でも、VQ自体にいろいろな機能が付いているため、EA内で計算したほうが稼動がスムーズです。

VQを内部で計算したEAのコード

extern string  Entry_Setting  = "---------- Entry Setting";
extern double  Lots           = 0.1;
extern int     StopLoss       = 50;
extern int     TakeProfit     = 100;
extern int     Slippage       = 3;
extern int     MagicNumber    = 123456;

extern string Indicator_Setting = "---------- Indicator Setting";
extern int     TimeFrame      = 0;
extern int     Length         = 5;
extern int     Method         = 3;
extern int     Smoothing      = 1;
extern int     Filter         = 5;

extern int     EntryShift     = 1;
extern int     ExitShift      = 0;

//記憶用共通変数
int VQsign[2];    //VQのシグナル
int VQsignbar[2]; //VQのシグナルが出た場所(足の番号)
int bar;          //エントリした時の足の数(足の番号)

int init()
  {
//----
   ArrayInitialize(VQsign,0);
   ArrayInitialize(VQsignbar,0);
   bar=0;
//----
   return(0);
  }

int start()
  {
//----
   //VQ sign計算************
   FuncVQ(0);
   FuncVQ(1);
   
   //オーダーに関する部分******
   
   //現在のポジションの情報を取得
   int pos=-1;
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      OrderSelect(i,SELECT_BY_POS);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) pos=i;
   }
   
   /*
   この時点でポジションなしの場合 pos は -1
   ポジションありの場合 pos は、そのポジションのインデックスの値
   となります。
   */
   
   //ポジション有りの場合
   if(pos>=0)
   {
      //そのポジションを選択し情報を取得できるようにする
      OrderSelect(pos,SELECT_BY_POS);
      
      if((OrderType()==OP_BUY && VQsign[ExitShift]==-1) || (OrderType()==OP_SELL && VQsign[ExitShift]==1))
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Yellow);
   }
   
   int ticket=0;   //注文番号を代入する変数
   double sl,tp;   //ストップとリミットを代入する変数
   
   //まだエントリしていない足で ポジションなしの場合
   if(bar!=iBars(NULL,TimeFrame) && pos<0)
   {
      //エントリ条件を計算
      int sign;
      if(VQsignbar[EntryShift]==iBars(NULL,TimeFrame)-EntryShift)
      {
         if(VQsign[EntryShift]==1) sign=1;
         if(VQsign[EntryShift]==-1) sign=-1;
      }
      
      //sign が 1 の場合
      if(sign==1)
      {
         sl=Ask-StopLoss*Point;
         if(StopLoss<=0) sl=0;
         tp=Ask+TakeProfit*Point;
         if(TakeProfit<=0) tp=0;
         ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, sl, tp, NULL, MagicNumber, 0, Blue);
      }
      //sign が -1 の場合
      if(sign==-1)
      {
         sl=Bid+StopLoss*Point;
         if(StopLoss<=0) sl=0;
         tp=Bid-TakeProfit*Point;
         if(TakeProfit<=0) tp=0;
         ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, sl, tp, NULL, MagicNumber, 0, Red);
      }
      //エントリした時の足の数を代入
      if(ticket>0) bar=iBars(NULL,TimeFrame);
   }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

//VQ keisan
void FuncVQ(int VQshift)
{
   double MH1,ML1,MO1,MC1,MCS1,VQ1,SumVQ1,SumVQ2;
   HideTestIndicators(true);

   if(MathAbs(VQsign[VQshift])!=1)
   {
      for(int j=0;j<iBars(NULL,TimeFrame);j++)
      {
         MH1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_HIGH,VQshift+j);
         ML1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_LOW,VQshift+j);
         MO1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_OPEN,VQshift+j);
         MC1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,VQshift+j);
         MCS1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,VQshift + Smoothing+j);
         
         if(MathMax(MH1 - ML1,MathMax(MH1 - MCS1,MCS1 - ML1))==0 ||(MH1 - ML1)==0) return(0);
   
         VQ1 = MathAbs(((MC1 - MCS1) / MathMax(MH1 - ML1,MathMax(MH1 - MCS1,MCS1 - ML1))
                         + (MC1 - MO1) / (MH1 - ML1)) * 0.5)
                        * ((MC1 - MCS1 + (MC1 - MO1)) * 0.5);
         SumVQ2 = iClose(NULL,TimeFrame,2+j);
         SumVQ1 = SumVQ2 + VQ1;
         if (Filter > 0) if (MathAbs(SumVQ1 - SumVQ2) < Filter * Point) SumVQ1 = SumVQ2;

         if(SumVQ1 > SumVQ2)
         {
            if(VQsign[VQshift]==-1) break;
            
            VQsign[VQshift]=1;
            VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift-j;
         }
         if(SumVQ1 < SumVQ2)
         {
            if(VQsign[VQshift]==1) break;
            
            VQsign[VQshift]=-1;
            VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift-j;
         }
      }
   }
   
   MH1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_HIGH,VQshift);
   ML1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_LOW,VQshift);
   MO1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_OPEN,VQshift);
   MC1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,VQshift);
   MCS1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,VQshift + Smoothing);
   
   if(MathMax(MH1 - ML1,MathMax(MH1 - MCS1,MCS1 - ML1))==0 ||(MH1 - ML1)==0) return(0);
   
   VQ1 = MathAbs(((MC1 - MCS1) / MathMax(MH1 - ML1,MathMax(MH1 - MCS1,MCS1 - ML1)) + (MC1 - MO1) / (MH1 - ML1)) * 0.5) * ((MC1 - MCS1 + (MC1 - MO1)) * 0.5);
   SumVQ2 = iClose(NULL,TimeFrame,2);
   SumVQ1 = SumVQ2 + VQ1;
   if (Filter > 0) if (MathAbs(SumVQ1 - SumVQ2) < Filter * Point) SumVQ1 = SumVQ2;

   if(SumVQ1 > SumVQ2 && VQsign[VQshift]==-1)
   {
      VQsign[VQshift]=1;
      VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift;
   }
   if(SumVQ1 < SumVQ2 && VQsign[VQshift]==1)
   {
      VQsign[VQshift]=-1;
      VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift;
   }
   if(VQshift==0 && SumVQ1 == SumVQ2)
   {
      VQsign[0]=VQsign[1];
      VQsignbar[0]=VQsignbar[1];
   }
   HideTestIndicators(false);
}

今回は詳しい説明は、省略です^^;

ソースファイルもアップしますので、いろいろと改良してみてくださいね!

→VQsimple.mq4ダウンロード

でわ、今回はこのへんでm(..)m

VQの関連記事

カスタムインジケータをEAにする方法の関連記事

タグ

2009年8月29日|コメント (1)

カテゴリー:EAの作成方法

取引を有利にする方法 = CashBackForexのキャッシュバック


次のバックテストレポートを見てください。

Sample_break_rのバックテストレポート

トレードルール検証中によくある右肩下がりの失敗EAです^^;

すべて1ロット(10万通貨)で取引して、5ヶ月ちょっとで約-2582ドル。
動かせば動かすだけ資産が減っていきます。

ここで少し、コストを計算してみましょう。
通貨ペアは、ドル円(USDJPY)スプレッド2ピプスとします。
1ピプスあたりのコストが1000円(現在のレートで約10.7ドル)ですので、
1トレードあたり、21.4ドルのコストがかかります。
取引総数が、853回ですので、21.4ドル×853回で、

コスト総額:18254.2ドル

スプレッドがなければ、資産は約2.5倍に膨らんでました。

キャッシュバックでコスト削減

cbf_letters_logo11.gif

今度は、無料登録でキャッシュバックが受けられるCashBackForexに登録していた場合の計算をしてみましょう。

取引ブローカーによって、還元率が違いますが、
FXCM(1トレードあたり、0.7ピプス)の場合、
1トレードあたり、10.7ドル×0.7ピプス=7.49ドルのキャッシュバック。
取引総数が、853回ですので、7.49ドル×853回で、

キャッシュバック総額:約6389ドル

差し引き、約3807ドルの利益で、右肩上がり、
動かせば動かすだけ資産が増えていきます。

ごく単純計算で、100万円の資産から、5ヶ月で26万円の損失を出すEAが38万円の利益を出すEAになったということです^^
普通に利益を出すEAなら、更に利益増です。

まだ、登録されていない方は、すぐ登録されることを強くお勧めいたします。

CashBackForex無料登録方法

CashBackForexトップページ

上のページにジャンプ後、メニューバーの【Signup】をクリック。

  • First Name(名前)
  • Last Name(苗字)
  • Username(ニックネーム)
  • Password(パスワード)
  • Confirm Password(パスワード再入力)
  • Preferred Broker(使いたいブローカー)
  • Email Address(メールアドレス)

を入力し、Accept Terms of Use(利用規約への同意)にチェックします。

Registerボタンをクリックして登録完了です^^

日本語ページがないようですので、分からない部分はGoogle翻訳などで、しらべながら見てみましょう^^;

ブローカーによって既存の口座を登録できる場合や、新規で口座を開設する必要がある場合があります。
無料で将来の利益の増減が変わるのであれば、1回の手続きはそれほど手間ではないですよね^^

でわこのへんで。

cbf_letters_logo11.gif

2009年8月28日|コメント (0)

カテゴリー:その他

会社設立で税金対策


今回は、税金のことについてです^^;

通常のブローカーで、個人でFXをやっている場合、FXの利益は雑所得として納税しなければなりません。

去年マイナスで、今年その分を取り返してトントンとなったとしても、
今年の利益分に税金がかかり、結局マイナスになってしまいます--;

運用資金が大きくなってきたら、会社設立して税金対策をしたほうがお得のようです。

大変お世話になっている山田先生のページでFXの会社設立と税金の比較についての情報がありますので紹介します。

会社設立Web-FXを利用した資産運用会社を設立する

年間の利益が大きくなってきたら相談してみるといいかもですね^^

でわでわ^^

2009年8月 8日|コメント (0)

カテゴリー:その他