[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 656

 
artmedia70:
スタックオーバーフローの原因となるものは何ですか?大きなテイク(テイクはボラティリティから計算し100倍したもの、サイズは41*100)でポジションを開くと、スタックオーバーフローがログに書き込まれ、.........ただ、それを取る。このポジションが閉じるまで、これ以上ポジションを建てない、そしてこのポジションはもちろん巨大なTPのため閉じない...。そして、EAは全く正しく動作しません。なぜなら、あらかじめ定義されたオープンポジションの合計利益に達したときに、すべてのポジションをクローズする必要があるからです...。でも、この1つのポジションがずっと2,000ポイントくらいの大きな利益を出しているのに、そうはならない...。どう戦えばいいのか?すべてのオープンポジションがスタックから溢れ出し、すべてがひっくり返るという事態を防ぐことはできませんが...


型範囲外の数値でスタックをオーバーフローさせることはできません - 別のエラーが発生します。

関数に渡されたデータや、終了せずに関数を再帰的に呼び出すと、スタックがオーバーフローすることがあります。

start() も関数です。たぶん、そこにはたくさんの変数があります。

スタックとは、関数の中間値(ローカル変数)を格納するメモリ領域のことです。動的配列を使用していて、配列のスコープを正しくチェックしていない場合、つまり、配列ではなく、配列の直後のメモリ領域にデータを書き込んでいる場合、自分でスタックを壊している可能性があります。

配列のいくつかをグローバル変数に 移動して、ボードの一番上に置いてみてください。

ZS: 少なくとも、どのプログラミング言語でも同じだと思います。

 
IgorM:


型範囲外の数値でスタックをオーバーフローさせることはできません - 別のエラーが発生します。

関数に渡されたデータや、終了せずに関数を再帰的に呼び出すと、スタックがオーバーフローすることがあります。

start() も関数です。たぶん、そこにはたくさんの変数があります。

スタックとは、関数の中間値(ローカル変数)を格納するメモリ領域のことです。動的配列を使用していて、配列のスコープを正しくチェックしていない場合、つまり、配列ではなく、配列の直後のメモリ領域にデータを書き込んでいる場合は、スタックを自分で壊している可能性があります。

配列のいくつかをグローバル変数に移動して、ボードの一番上に置いてみてください。

Lf: 少なくとも、どのプログラミング言語でも同じだと思います。

イゴール 私がこれまで配列の使用を避けてきたことはご存じでしょうが......。私のコードには、ティック前の注文の配列とティック後の注文の配列という2つの配列しかありません。グローバル変数のところに定義してあるんです。面白いのは、これらのポジションを開くコードをEA内の別の場所に移動させたら、エラーが消えたことです。特に気にしていなかったのですが、オープンオーダーの再帰的な呼び出しの ようです。単純に、トータルで利益が出たかどうかを確認するコードで、全てのポジションを決済した後、すぐにオープニングを置くのは適切ではないと判断し、全てのポジションを決済してしまいました...。散々な目に遭わせてしまった...。:)
 
artmedia70:
イゴール 私がこれまで配列の使用を避けてきたことはご存じでしょうが......。私のコードには、ティック前の注文の配列とティック後の注文の配列という2つの配列しかありません。グローバル変数のところに定義してあるんです。面白いのは、これらのポジションを開くコードをEA内の別の場所に移動させたら、エラーが消えたことです。オープンオーダーの再帰的な呼び出しがあったようですが、特に気にしていませんでした。単純に、トータルで利益が出たかどうかを確認するコードで、全てのポジションを決済した後、すぐにオープニングを置くのは適切ではないと判断し、全てのポジションを決済してしまいました...。散々な目に遭わせてしまった...。:)

私はEAを作成 するためのテンプレートを作成しました - 注文が発注されると、その注文のフラグが直ちに設定され、その後、このタイプの新しい注文を開く前に、私は常にフラグ - 注文が存在するかどうかをチェックしますが、私は1つだけの注文でEAを記述しています。
 
IgorM:

私はずいぶん前にEAを作成するためのテンプレートを作りました。注文を出すと、すぐにそのような注文が存在するというサイン(フラグ)を設定し、このタイプの新しい注文を開く前に必ずフラグをチェックします - そのような注文が存在するかどうか、しかし私は一つの注文でEAを書きます。
まあ、私も、そして皆さんも、それぞれの開発、テンプレート、その他のグッズをお持ちだと思います。これでは意味がない。まだドローダウンに悩んでいて、いろいろな手法や関数などを試しているところです。トレンドに忠実な場合、古いTFではトレンドが既に横ばいになっているのに、若いTFではトレンドが残っているのに終わりつつある場合、トレンドの枯渇をどう捉えるか理解できない。低次のポジションを建てる場合、ドローダウンを引き起こし、時間内に決済できない可能性が高くなります。今は、4時間足チャートを起点に、方向性を定めて、この方向性だけで仕事をするように、すべてのジュニアで心がけています。トレンドからフラットに移行する瞬間は、なんとなくわかったので、その結果を見ていきたいと思います。
 
Craft:


確かに "0 "になってしまいましたが、どうすればいいのでしょうか? 両方の方法でやるのは無理で(イコールピリオドも試しました)、両方試してみました Print("NormalizeDouble(c1b_1..."), しかしゼロになってしまいました(c1b[i]のみ値を表示、c1s[i]など他はゼロ)。どちらかを動く状態にするためのヘルプやヒント、何か欠陥がありましたら教えてください。

新品です。

古い。

全体。


Yuri、将来的には、もしコードが少なくとも2回繰り返されるなら、 、メソッドに割り当てられるべきで、コードを乱雑にする配列のヒープは必要ないでしょう。
その方法をご紹介します。

//+------------------------------------------------------------------+
double iCCIAverage(string cci_symbol, int cci_timeframe, int cci_period, int cci_applied_price, int ma_period, int ma_method, int ma_shift){
   double array[];
   int loop_array;
   ArrayResize(array,ma_period + ma_shift);
   for(int loop = ma_period + ma_shift - 1; loop >= 0; loop--, loop_array++)array[loop_array] = iCCI(cci_symbol, cci_timeframe, cci_period, cci_applied_price, loop);
   return(iMAOnArray(array, 0, ma_period, 0, ma_method, ma_shift));
}
//+------------------------------------------------------------------+

データを入力し、ma_shiftパラメータを変化させることで、必要なシフトを得ることができる、パラメータですべてが明らかになると思います。このメソッドはテンプレートとして使用することができます。これで、あなたの取引判断のブロックは、あるべき姿になりました。

//--------------------------------------------------------------- 5 --
   // Торговые критерии
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 1),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 3),4))
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 1),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 3),4))
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --

したがって、「古い」「新しい」バリエーションは必要なく、取引は与えられた基準に従って行われます(私の理解では、トップ/トラフの3本のバーパターンをiCCで平滑化したもの)。ファイルには修正されたバリアントがあります。

ファイル:
21_2.mq4  14 kb
 

こんにちは。

注文が開始 されてからの価格を配列に書き込むコードを教えてください。

新しい価格ごとに配列に追加されるようにする方法。

 
zelek:

こんにちは。

注文が開始されてからの価格を配列に書き込むコードを教えてください。

新しい価格ごとに配列に追加されるようにする方法。


ご質問の内容をもう少し具体的にご記入ください。

注文時の現在の価格に興味がある場合は、配列のインデックス カウンターを変更しながらグローバル配列に現在の価格を格納する役割を担うコードに呼び出しを追加し、後でコード内の任意の場所から表示できるようにすることができます。

 

EAのパフォーマンスを確認する方法 - コード実行時間をミリ秒で表示したいだけです。

MT5とMT4の性能の比較

 
IgorM:

EAのパフォーマンスを確認する方法 - コード実行時間をミリ秒で表示したいだけです。

MT5とMT4の性能の比較


GetTickCountがあれば、https://docs.mql4.com/ru/common/GetTickCount
 
DDFedor:

GetTickCountは、https://docs.mql4.com/ru/common/GetTickCount


ありがとうございます、そうです、私が探していたものです、どなたかmt4とmt5で同じタイプのコードの速度を測定された方はいらっしゃいますか?