コーディングの方法は? - ページ 322

 

こんにちは。

私のリクエストは、今のところ情報提供のみです。

過去のデータを計算せず、ライブデータのみでオフラインチャートを作成するインジケータがあれば、それをストラテジーテスターの テンプレートに貼り付けて、履歴のデータでオフラインチャートを作成することは可能でしょうか?

ありがとうございます。

 
mladen:
jayjonbeach,

trendCurrの値を変更せずにループ内で何度もテストしている(だから常にNONEを返す)。

iCustom()をループの中に入れてから、その値をテストしてみてください。このようなもの:

if (trendCurr>0)

{

for(int i=1; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

拝啓。私はこのことについて2つの言葉しか持っていませんが、それらは繰り返しに耐えます...

ありがとう、ありがとう、そしてありがとう!!!

あなたのコードは完璧に動作し、あなたが投稿したものに最終的に行き着くまで、他の「for」ループを調べたり、試行錯誤したりする、もう12 時間以上もの時間を節約してくれたことに賭けます。

私は、ループの中で何度も何度もtrendCurrをテストしたかったのですが、あなたのおかげでその間違いが わかりました。

あなたのコードは意図したとおりに動きましたが、私のブロック全体はそうではありません。このループをLONG基準の中で実行させると、非常に興味深い意図しない結果になります。

if(TwentyOneEMA > FiftyFiveEMA)

{

if (trendCurr>0) // ステップフィルター電流をチェック する。

{

if (Bid > TwentyOneEMA)

{

for(int i=0; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

}

}

今何が起こっているかというと、ifが満たされたときにループがテストされ、trueなら購入し、そうでなければ何もしない、素晴らしいことです。しかし、コードの全体のブロックは、限りif(TwentyOneEMA > FiftyFiveEMA)が真であるように、それ以下のコードの残りの部分は、実行を維持し、他の条件はすべて真になった場合、吸盤が購入するので、 "しばらく "ループのように動作しています!私はここで私のコード構造の明らかな間違いを参照してください。私のコード構造の明らかな誤りをここに見ることができます....(私は、EMAのクロスが新しいものであることを確認するために、別の同様のforループがEMAをテストすることができると考えています)

しかし、これは必ずしも悪いことではありません(ある分析が示唆するように)。実際、これは私の次の目標のようなもので、別の意味で、もっとテストが必要です。

過去を見てから何をするつもりだったかというと、もし過去のループが偽になったら、次の10バーのステップシグナルをチェックして、それが真になったら取引をするつもりでした(このためにwhileループを使おうと思っていたのですが)。これはすでに起こっているようなものですが、そのルックフォワードには10バーの制限がなく、全体をどのように構成すれば正しく動作するのかがわかりません。(私はステップ信号をチェックし、真の場合、最後の10バーで新しいMAクロスを探すことができると思うが、私はこのためのすべてのブロックを繰り返す必要があり、より良いより効率的/エレガントな方法があるに違いないと思う)。

これは今後のコーディングで非常に役に立つと思います。

 

こんにちは。

添付のインジケーターを改造しようと思っています。移動平均線が価格に触れるとアラームが鳴り、触れた時間枠が変更されます。アラームに遅延時間を設定したのですが、アラームの後、時間枠を変更すると無視されます。

それは固定することができますか?

ありがとうございますmedie_mobili.mq4

ファイル:
 

ダシオ

インジケータでは、そのような変更はできません。インジケータは、グローバルスコープとスタティック変数をデフォルト値にリセットするので、タイムフレームやシンボルを変更しても、いくつかの値を維持することができません。グローバル変数("GlobalVariable... "関数で管理されるもの)を使用することもできますが、それはあなたのコードが非常に複雑になり(複数のインスタンス、複数のシンボル、...)、私の意見では、その努力に見合うものではありません。

dasio:
こんにちは。

私は添付のインジケータを修正しようとします。基本的には、移動平均が価格に触れるとアラームが鳴り、触れた時間枠が変更されます。私は尊敬されているアラームに遅延を置くが、私はタイムフレームを変更した場合、アラームの後に彼はそれを無視します。

それは修正することができますか?

ありがとうございますmedie_mobili.mq4
 

...

EAはこれらの変数(グローバルスコープとスタティック変数)を異なる方法で扱っており、タイムフレームやシンボルが変更されてもリセットされません。ここに、非常にシンプルなEAがありますので、興味のある方は、これらの値がEAではインジケータのようにリセットされないことを確認してみてください。

int counter = 0;

int init()

{

return(0);

}

int start()

{

static int counterStart = 0;

counterStart++;

counter++;

Comment("counter from start : "+counterStart," counter using global scope : "+counter);

return(0);

}

これは、EAによってはエラーの原因にさえなります(EAが、タイムフレームやシンボルが変更されたときに変数がリセットされないことを考慮に入れていない場合、EA作業において非常に奇妙なエラーが発生する可能性があります)。

 
mladen:
dasio コードを見る限りでは、何が意図されているのかわかりません。とにかく、インジケータの「基本」値として真の範囲を使用するか(あなたのコードの最初の部分です)、またはあなたのコードの2番目の部分を「基本」値として使用するかを選択できるコードは以下のとおりです。

またまた、mladenさんありがとうございます。

この条件に基づいて、もう一本線を追加することは可能でしょうか?

日数を基準に常にAvg[]以上のWork[]のeverageに水平線=を引く?

ありがとうございます。

 

信号の修正について

こんにちは、Mladenです。

このコードにストップ売り、ストップ買いのシグナルを追加したいのですが...例えばストキャスティクスのシグナルラインがメインを超えたらストップ売りなど...コードに追加したのですがうまくいきません...教えてください。

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0).double ist_signal=iStochastic(NULL);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0); double ist_signal=iStochastic(NULL,240,8,3,0,MODE_SMA,0)

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0)。

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0); double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1); double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0); double b4trCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1); double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0); double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// 警告

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0])))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()));

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&nowenCCI<b4enCCI)&&(nowtrCCI<0&nowtrCCI<b4trCCI)&&&(lastAlerted!=Time[0])))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n",Symbol()));

}

}

 

このようなことを試すことができます。

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MOD E_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,M ODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alerts

alertType = "do nothing";

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="buy";

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="sell";

}

if (alertType=="do nothing")

{

lastAlerted=Time[0]; Alert("Stop previous action","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}
Mastercash:
Mladenさん、こんにちは。

このコードにストップセールやストップバイイングシグナルを追加したいのですが...例えばストキャスティックのシグナルラインがメインを超えたらストップセールなど...コードに追加しましたがうまくいきません...pls help

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0).double ist_signal=iStochastic(NULL);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0); double ist_signal=iStochastic(NULL,240,8,3,0,MODE_SMA,0)

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0)。

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0); double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1); double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0); double b4trCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1); double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0); double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// 警告

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0])))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n",Symbol()));

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&nowenCCI<b4enCCI)&&(nowtrCCI<0&nowtrCCI<b4trCCI)&&&(lastAlerted!=Time[0])))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n",Symbol()));

}

}
 

さて、またまた行き詰ってしまいました。私は、私のコードが構成されている方法のために、EAが未来を見ることを修正しようとしています。

私のシグナルコードは "if "で始まり、それが真である限り、それに続くコードの残りの部分は実行され続けます(これは最初のforループを挿入する前は問題ではありませんでしたが、今はそうなっています)。この問題を解決するために、いろいろと試してみましたが、うまくいきません。 マニュアルも確認 しましたが、特に目立ったものはありませんでした。もしかしたら、同じブロックに2つの "for" ループは許されないのでしょうか?

以下は私のベストエフォートと思われるものです(簡潔にするためにLONGを表示しただけです)。エラーはありませんが、EAは取引を行わないので、おそらく私は再びループを台無しにしたのでしょう。

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i)です。

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i); int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 < testValue2-Separation2)

{

if (Bid TwentyOneEMA) // ニュースフィルター

{

for(i=0; i<=ルックバック; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

}

==========

注 if (testValue1 < testValue2-Separation2) continue; を試しましたが、「continue」をエラーと判定されました もし2ループがダメなら、次にやるループをもう一つ追加するのは見当違いかもしれませんね.........。

 
jayjonbeach:
さて、またまた行き詰ってしまいました。 私のコードの構成方法のために、EAが未来を見ることを修正しようとしています。

私のシグナルコードは "if "で始まり、それが真である限り、それに続く残りのコードが実行され続けます(これは最初のforループを挿入する前は問題ではありませんでしたが、今はそうなっています)。この問題を解決するために、いろいろと試してみましたが、うまくいきません。 マニュアルも確認しましたが、特に目立ったものはありませんでした。もしかしたら、同じブロックに2つの "for" ループは許されないのでしょうか?

以下は私のベストエフォートと思われるものです(簡潔にするためにLONGを表示しただけです)。エラーはありませんが、EAは取引を行わないので、おそらく私は再びループを台無しにしたのでしょう。

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i)です。

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i); int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 < testValue2-Separation2)

{

if (Bid TwentyOneEMA) // ニュースフィルター

{

for(i=0; i<=ルックバック; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

}

==========

注 if (testValue1 < testValue2-Separation2) continue; を試しましたが、'continue' it をエラーとしてフラグが立ちました 2ループがダメなら、次にやるループをもう一つ増やす作業は見当違いかもしれませんね.........。

少なくとも、他のボットを見ていてそう思ったのですが、forループを構成する方法が原因でした。 簡単なテストでは、以下のように動作しています。

NumOrders = CalculateCurrentOrders()。

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

{

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i)。

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i); int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 <! testValue2-Separation2)

{

Print("取引なし");

ブレーク

}

if (Bid TwentyOneEMA) continue; // ニュースフィルター

for(int j=0; j<=ルックバック; j++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+j);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

理由: