コーディングヘルプ...アラートの代わりにインジケータをフィルタリングする方法を教えてください。 - ページ 6

 
elihayun:
今のところ問題はないようです。

しかし、論理的には、次のようになります。

if(isCrossed == 1 && Ask < upLevel)

あなたは、それらが近いことをチェックしているのではなく、価格がラインより低いことをチェックしているのです。

これが、私が欲しかったのは・・・フィルタリングするために・・・このラインを利用してトレードを不許可にしたい。という意図でした。線の幅を変えれば、線に近いかどうかを確認する方法を作らなくても、線そのものをリミッターにすればいいんです。帯の幅を変えることで、線にどれだけ近づいたかをチェックする別の要素があるのと同じになります。これをエントリー条件とすることで、上のラインより下でなければ買い注文が、下の ラインより上であれば売り注文が開かないようにする、あるいはフィルタリングするはずです。

なぜこのようなことをすると注文エラーが発生するのか、よくわかりません。

 

このエラーは、MMパラメータに 関係する不適切なロットサイズに起因しているようです。

私はフォーカスを変えています...元のフォーカスに戻って...

トレンドバンドインジケータは、私が望むようなフィルタリング効果をもたらさないという結論に達しました。ただ、そうではないのです。

元々は、'ang_AutoCh_HL-v1' チャンネル・インジケータを見ていました。それは、私が望むフィルター効果を与えてくれることはわかりますが、呼び出すためのバッファを持っていません...それで....

オブジェクト1とオブジェクト2のライン値に対してバッファを作ることはできますか? そうすれば、EAでサポートとレジスタンスとして使うことができますか?

これがそのインジケータです。

#property copyright "ANG3110@latchess.com"

//----------------------------------

#property indicator_chart_window

//----------------------------------

extern int Hours=24;

extern color col=SkyBlue;

//------------------

double lr,lr0,lrp;

double sx,sy,sxy,sx2,aa,bb;

int p,sName,fs;

int f,f0,f1;

double dh,dl,dh_1,dl_1,dh_2,dl_2;

int ai_1,ai_2,bi_1,bi_2;

double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;

double price_p1,price_p0,price_p2,price_01,price_00,price_02;

int p1,p0,p2,fp;

//*****************************************

int init() {

p=Hours*60/Period();

if (fs==0) {sName=CurTime(); fs=1;}

return(0);}

//*******************************

int deinit() {

ObjectDelete("1"+sName);

ObjectDelete("0"+sName);

ObjectDelete("2"+sName); }

//*******************************

int start() {

int i,n;

//------------------------------------------------------------------------------

if (f==1) {

p1=iBarShift(Symbol(),Period(),ObjectGet("1"+sName,OBJPROP_TIME1));

p0=iBarShift(Symbol(),Period(),ObjectGet("0"+sName,OBJPROP_TIME1));

p2=iBarShift(Symbol(),Period(),ObjectGet("2"+sName,OBJPROP_TIME1));

if (fp==0 && p!=p1) {p=p1; fp=1;}

if (fp==0 && p!=p0) {p=p0; fp=1;}

if (fp==0 && p!=p2) {p=p2; fp=1;}

}

//====================================================

sx=0; sy=0; sxy=0; sx2=0;

for (n=0; n<=p; n++) {sx+=n; sy+=Close[n]; sxy+=n*Close[n]; sx2+=MathPow(n,2);}

aa=(sx*sy-(p+1)*sxy)/(MathPow(sx,2)-(p+1)*sx2); bb=(sy-aa*sx)/(p+1);

//----------------------------------------------------

for (i=0; i<=p; i++) {

lr=bb+aa*i;

dh=High-lr; dl=Low-lr;

//----------------------------------------------------

if (i<p/2) {if (i==0) {dh_1=0.0; dl_1=0.0; ai_1=i; bi_1=i;}

if (dh>=dh_1) {dh_1=dh; ai_1=i;}

if (dl<=dl_1) {dl_1=dl; bi_1=i;}}

//----------------------------------------------------

if (i>=p/2) {if (i==p/2) {dh_2=0.0; dl_2=0.0; ai_2=i; bi_2=i;}

if (dh>=dh_2) {dh_2=dh; ai_2=i;}

if (dl<=dl_2) {dl_2=dl; bi_2=i;}}}

//-------------------------------------

lr0=bb; lrp=bb+aa*(i+p);

//===================================================

if (MathAbs(ai_1-ai_2)>MathAbs(bi_1-bi_2)) f=1;

if (MathAbs(ai_1-ai_2)<MathAbs(bi_1-bi_2)) f=2;

if (MathAbs(ai_1-ai_2)==MathAbs(bi_1-bi_2)) {if (MathAbs(dh_1-dh_2)=MathAbs(dl_1-dl_2)) f=2;}

//=================================================

if (f==1) {

for (n=0; n<=20; n++) { f1=0;

for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);

if (i==0 || i==p/2) dhm=0.0;

if (High-hai>dhm && i<p/2) {ai_1=i; f1=1;}

if (High-hai>dhm && i>=p/2) {ai_2=i; f1=1;} }

if (f==0) break;}

//----------------------------

for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);

dli=Low-hai;

if (i==0) dlm=0.0; if (dli<dlm) dlm=dli;}

ha0=High[ai_1]*(0-ai_2)/(ai_1-ai_2)+High[ai_2]*(0-ai_1)/(ai_2-ai_1);

hap=High[ai_1]*(p-ai_2)/(ai_1-ai_2)+High[ai_2]*(p-ai_1)/(ai_2-ai_1);

//----------------------------

price_p1=hap;

price_p0=hap+dlm/2;

price_p2=hap+dlm;

price_01=ha0;

price_00=ha0+dlm/2;

price_02=ha0+dlm;

}

//=================================================

if (f==2) {

for (n=0; n<=20; n++) { f1=0;

for (i=0; i<=p; i++) {lai=Low*(i-bi_2)/(bi_1-bi_2)+Low*(i-bi_1)/(bi_2-bi_1);

if (i==0 || i==p/2) dlm=0.0;

if (Low-lai<dlm && i<p/2) {bi_1=i; f1=1;}

if (Low-lai=p/2) {bi_2=i; f1=1;}}

if (f==0) break;}

//----------------------------

for (i=0; i<=p; i++) {lai=Low*(i-bi_2)/(bi_1-bi_2)+Low*(i-bi_1)/(bi_2-bi_1);

dhi=High-lai;

if (i==0) dhm=0.0; if (dhi>dhm) dhm=dhi;}

la0=Low*(0-bi_2)/(bi_1-bi_2)+Low*(0-bi_1)/(bi_2-bi_1);

lap=Low*(p-bi_2)/(bi_1-bi_2)+Low*(p-bi_1)/(bi_2-bi_1);

//----------------------------------------------------------------

price_p1=lap;

price_p0=lap+dhm/2;

price_p2=lap+dhm;

price_01=la0;

price_00=la0+dhm/2;

price_02=la0+dhm;

}

//===================================================================================

ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);

ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);

ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);

//-----------------------------------------------------------------

ObjectSet("1"+sName,OBJPROP_COLOR,col);

ObjectSet("0"+sName,OBJPROP_COLOR,col);

ObjectSet("0"+sName,OBJPROP_STYLE,STYLE_DOT);

ObjectSet("2"+sName,OBJPROP_COLOR,col);

//---------------------------------------------

ObjectSet("1"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("1"+sName,OBJPROP_PRICE1,price_p1);

ObjectSet("1"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("1"+sName,OBJPROP_PRICE2,price_01);

ObjectSet("0"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("0"+sName,OBJPROP_PRICE1,price_p0);

ObjectSet("0"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("0"+sName,OBJPROP_PRICE2,price_00);

ObjectSet("2"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("2"+sName,OBJPROP_PRICE1,price_p2);

ObjectSet("2"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("2"+sName,OBJPROP_PRICE2,price_02);

//==================================================================

f=1; p1=p; p0=p; p2=p; fp=0;

//*************************************************************************************

return(0);}

//=====================================================================================[/PHP]

here is what I'm trying to add a buffer so I can extract the values I need...

#property copyright "ANG3110@latchess.com"

//----------------------------------

#property indicator_chart_window

//----------------------------------

extern int Hours=24;

extern color col=SkyBlue;

//------------------

double ExtBufferResistance[];

double ExtBufferMiddle[];

double ExtBufferSupport[];

double lr,lr0,lrp;

double sx,sy,sxy,sx2,aa,bb;

int p,sName,fs;

int f,f0,f1;

double dh,dl,dh_1,dl_1,dh_2,dl_2;

int ai_1,ai_2,bi_1,bi_2;

double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;

double price_p1,price_p0,price_p2,price_01,price_00,price_02;

int p1,p0,p2,fp;

//*****************************************

int init() {

p=Hours*60/Period();

if (fs==0) {sName=CurTime(); fs=1;}

SetIndexBuffer (4, ExtBufferResistance); //--resistance line

SetIndexBuffer (5, ExtBufferMiddle); //--middle line

SetIndexBuffer (6, ExtBufferSupport); //--support line

return(0);}

//*******************************

//===================================================================================

ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);

ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);

ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);

//------------------make indicator buffer for EA-------------------------------------

somehow get object 1 to put it's value into buffer 4

somehow get object 0 to put it's value into buffer 5

somehow get object 2 to put it's value into buffer 6

//------------------------draw chart-------------------------------------------------

[/php]

and then upgrade this EA....

[PHP]#property copyright "Copyright 2005, Chris Battles."

#property link "cbattles@neo.rr.com"

extern double TrailingStop = 5;

extern double TrailingStopTrigger = 19;

extern double StopLoss = 186;

extern double TakeProfit = 250;

extern double Lots = 0.4;

//---- ang_AutoCh_HL-v1 and Filter Parameters

extern int Hours=24;

extern color col=SkyBlue;

extern double TF = 30; //--which bar period for the custom indicator to use

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int start(){

int cnt, ticket;

if(Bars<100){

Print("bars less than 100");

return(0);

}

double ema1a=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);

double ema2a=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,0);

double ema3a=iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0);

double ema1b=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);

double ema2b=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);

double ema3b=iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,1);

//----------channel filter

double resistance = iCustom(NULL,TF, "ang_AutoCh_HL-v1", Hours, col, 4, 0);

double support = iCustom(NULL,TF, "ang_AutoCh_HL-v1", Hours, col, 6, 0);

//--- end channel filter

and then make the order logic have second condition for entry...

[PHP]if (ema3bema1a && Ask < resistance){

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point, NULL,16384,0,Green);

if(ticket>0){

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

}

if (ema3b>ema1b && ema3a support){

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point, NULL,16384,0,Red);

if(ticket>0) {

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

return(0);

このインジケータをEAで使用するために、インジケータから値を取り出すことが、私の大きな課題です。

 

私はバッファについて何をやっているのか本当にわかりません。setbufferの行を投げ込むのですが、それが必要なのか何なのかさえわかりません。

 
raff1410:
ハイ...

バッファを持つインジケータです。

以下のようにres && supを呼び出すことができます。

double resistance = iCustom(NULL,TF, "Channel",24,col,0,0); double support = iCustom(NULL,TF, "Channel",24,col,0,0);

double support = iCustom(NULL,TF, "Channel",24,col,2,0);

ラフ

これは、私が言っていることです...私はそれが動作するかどうかを確認するためにこれを試してみるのが待ち遠しいです。

このようなものをeaのトップに置く必要があるのでしょうか?

//---- チャンネルとフィルタのパラメータ

extern int Hours=24;

extern color col=SkyBlue;

extern double TF = 30; //--カスタムインジケータが どのバー期間を使用するか

そして

double resistance = iCustom(NULL,TF, "Channel",Hours,col,0,0);

double support = iCustom(NULL,TF, "Channel",Hours,col,2,0);

 

ok 私はまたこのエラー130を受け取っています それは何でしょうか?

ああ、そうだストップロスが 近すぎるんだ。

 

こんにちは...

バッファを持つインディケーター

チャネル.mq4

以下のようにres && supを呼び出すことができます。

double resistance = iCustom(NULL,TF, "Channel",24,col,0,0);

double support = iCustom(NULL,TF, "Channel",24,col,2,0);

ラフ

ファイル:
channel.mq4  6 kb
 

新しい問題...

トレーリングストップのトリガーが作動しないために、ドローダウンが発生しています。それが作動しない場合、フォールバックする「エクイティストップ」がポジションを閉じることになり、それが障害になっています...。

トレーリングストップが作動しても、口座にそれほど大きな損害を与えないことが、多くの小さなドローダウンからわかります。トレーリングストップが作動しても、口座に大きな損害を与えることはないのです。

というわけで....

オープン後のバーがトレーリングストップをかけるほど動かなかった場合、ポジションをクローズする方法はないでしょうか?

今、移動平均 線から今期だけでなく、過去3期分も呼び出すことで着手しています。基本的に私が考えたのは、シグナルと1本のバーによる確認は、現在の期間より3つ前の期間から行うことができ、現在の期間はトレーリングストップを発動するのに十分な動きをしたかどうかを確認するために使用することができるということです。この条件は、すべてのオープンオーダーをクローズするエクイティストップに||または条件として追加できると思っていました。

私が困惑しているのは、トレーリングストップのトリガーを引くために十分に動いたかどうかを判断する方法です。つまり、トレーリングストップのトリガーは、ロングポジションかショートポジションかに注目し、どちらに動けばトリガーがかかるかを知る必要があるのです。それをどのように検出させればいいのか、よくわかりません。

このレポートでは、大きなドローダウンが小さなドローダウンより大きくないように見えて、そうであれば利益が出るのではと想像しています。

ファイル:
whatever2.htm  292 kb
whatever2.gif  6 kb
 

もうひとつ、微調整が必要です。

これは負けたポジションが大きくなる前に決済するものです...勝ったポジションも大きくなる前に決済します

最初の10分間でトレーリングストップを発動させるのに十分な動きがない場合のみ、ポジションをクローズする必要があります...そのためには1ピップだけ動けばいいと思います...ですから、最初の10分間で多くのことを要求しているわけではありません。本当に、ポジションを持った直後に尻尾を巻いて戻ってしまうようなことがないようにしたいだけなんだ。そういうのは負けるから......。

だから...もしトレーリングストップが作動したかどうかを検知して、作動していたら走らせることができたら!!トレーリングストップは時間の関数として 閉じるのではなく、それを閉じるようにする。タイムクローズパラメーターは主要なクローズ戦略としてではなく、トレーリングストップが引き継ぐまでのクローズを処理するためのものです。

ファイル:
whatever3.htm  304 kb
whatever3.gif  6 kb
 

これでは意図したとおりにならない...この結果の意味がわからない...。

https://c.mql5.com/forextsd/forum/9/whatever3.htm

を見ると、ほとんどのものが10分以下しか開いていない(基準が満たされない場合は10分で閉じるように設定した)。ごく少数の例外は、#52の注文は19分開いており、#48は15分開いている。

この部分は機能していません...OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice()

これも機能していない...if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

チェックすべきは、トレーリング・ストップが作動したかどうかです。私はこれを価格に基づいて終了させたくありません。トレーリングストップが発動されないことに基づいてクローズさせたいのです。私はもともと、トレーリングストップが発動するほど上昇したかどうかを確認する必要があると言ったと理解しています。しかし、私はトレーリングストップのトリガーコードやそれがどの程度なのかを十分に理解していません。これがやっていることは、トレーリングストップが発動するまでの間、ストップギャップの基準ではなく、自分自身を支配的なクローズの基準にしている...そういうことだと思います...。

//+------------------------------------------------------------------+

void CloseOrder()

{

double Profit=ThresholdMove*Point;

int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)

{

OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if ((CurTime()-OrderOpenTime())>MonitorInMinutes*60*MinsMultiplier)

{

if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice() )

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);

}

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);

}

}

}

}

//+------------------------------------------------------------------+[/PHP]

Somewhere in this closing strategy there must be a way to detect if it's been triggered or not...

[PHP]//+------------------------------------------------------------------+

//| Variable End |

//+------------------------------------------------------------------+

//Check position

bool IsTrade = False;

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {

IsTrade = True;

if(OrderType() == OP_BUY) {

//Close

//+------------------------------------------------------------------+

//| Signal Begin(Exit Buy) |

//+------------------------------------------------------------------+

if (CloseBuy1_1 == CloseBuy1_2) Order = SIGNAL_CLOSEBUY;

//+------------------------------------------------------------------+

//| Signal End(Exit Buy) |

//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Trailing stop

if(TrailingStopMode && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

} else {

//Close

//+------------------------------------------------------------------+

//| Signal Begin(Exit Sell) |

//+------------------------------------------------------------------+

if (CloseSell1_1 == CloseSell1_2) Order = SIGNAL_CLOSESELL;

//+------------------------------------------------------------------+

//| Signal End(Exit Sell) |

//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Trailing stop

if(TrailingStopMode && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

}

}

}

要するに、timeclosing パラメータは、意図したとおりに動作するように修正されない限り、あまりに強引すぎるということです。

 

申し訳ありませんが、コード全体を検証する時間がないので、このスニペットだけ検証してみましょう。

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

例えば、OrderOpenPrice = 1.2100とします。

で、利益は0.0010です。

つまり、ビッドが1.2100-0.0010 = 1.2090以下であれば、ショートトレードを決済したいわけです。

ここで、ギャップダウンがあり、価格が1.2090を飛び越えて、現在の買値が1.2088になったと仮定します。あなたの計算式によると

ビッド + プロフィット = 1.2088 + 0.0010 = 1.2098.これは、システムが利益のしきい値を超えているにもかかわらず、OrderOpenPriceより大きいものではありません。したがって、注文は決済されません。私の意見では、クローズ条件のロジックを再検討し、再スクリプト化する必要があります。また、アスク価格でしか決済 できないため、ショートトレードを行う場合はアスク価格を扱うべきです。

もう一つアドバイスです。

for (int cnt = 0 ; cnt = 0; cnt--)などのカウントループがあります。

がんばってください。

理由: