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 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);
}
今回は詳しい説明は、省略です^^;
ソースファイルもアップしますので、いろいろと改良してみてくださいね!
でわ、今回はこのへんでm(..)m
VQの関連記事
カスタムインジケータをEAにする方法の関連記事
タグ
2009年8月29日|コメント (1)|トラックバック (0)
カテゴリー:EAの作成方法
トラックバック(0)
http://www.dr-ea.com/base/mt-tb.cgi/90
コメント (1)
慶次さん、こんにちは。
早速ダウンロードさせてもらいました(^0^)/
今回のファイルは、私にとってとても有益なEAです!
貴重なコードの公開ありがとうございます!
投稿者:jpyuser |2009年8月30日 08:20
コメントを投稿する
Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「<」、「>」は「>」と入力してください。



