[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 3. - ページ 367

 
LOA:


直近ではなく、期間中の最大値を3つ。というか、最後とは限りません。

見てください。値を持つ配列がありますね。この配列から3つの最大値を見つける必要があります。時系列配列の最後や最初である必要はありません。3つの最大値を求めればいいのです。

1.配列を一時的な配列にコピーしてみましょう(一時的な配列の中から探します)。

int ArrayCopy( object &dest [],object source[],int start_dest=0,int start_source=0,int count=WHOLE_ARRAY, int count=WHOLE_ARRAY)

ある配列を別の配列にコピーします。 配列は同じ型でなければならない。double[], int[], datetime[], color[], bool[] 型の配列は、同じ型の配列としてコピーすることができる。
コピーされた要素の数を返します。
パラメータ
dest[] - アレイレシーバー。
ソース[]の - ソース配列です。
スタート・デス - デスティネーション配列の開始インデックスを指定します.デフォルトでは、開始インデックスは0である。
スタートソース - ソース配列の開始インデックス.デフォルトの開始インデックスは0です。
カウント - コピーする要素数。デフォルトでは、配列全体(WHOLE_ARRAY)。


2. 一時的な配列の中から最大値を探す。

int ArrayMaximum( double array[],int count=WHOLE_ARRAY,int start=0)

最大値を持つ要素を検索する。 この関数は,配列中の最大要素の位置を返します.
パラメータ
array[] - 検索対象の数値配列。
カウント - 検索する要素数。
立ち上がり - Start - 検索用のインデックスを開始します。


3.検出されたインデックスを配列(例:MassIndexMaxValue[])に保存します。

4. 時間配列で見つかった最大値の値をゼロにする - そこにゼロを書き込むだけでよい

5.再び一時配列から次の最大値を探す(最初に見つけた最大値のインデックスが既にMassIndexMaxValue[] に格納されており、この最大値の値は 0 になっている)。

このループは、一時配列に必要な数の最大値を見つけるまで続けられます。

MassIndexMaxValue[] 配列は、配列内の最大値の必要数のインデックスを含むようになりました。
一時的な配列のサイズをゼロにリセットしてみましょう。

そういうことなんだ...。

ZS...その場で簡単にスケッチしただけですが...。間違っているかもしれません。書いている時は起きていて何も確認していませんが、関数にはこのような内容があります。

void FindMaxValue(double &ms[], int &ind[], int NumMaxValue) {   
   int i, IndMax;
   double tmp[];                       // создаём временный массив
   ArrayResize(ind,NumMaxValue);       // изменяем размер массива индексов максимальных значений под количество макс. значений
   ArrayResize(tmp,ArraySize(ms));     // размер временного массива = размеру вашего массива значений
   ArrayCopy(tmp, ms);                 // копируем ваш массив во временный
   for (i=0; i<NumMaxValue; i++) {     // цикл по количеству искомых максимумов
      IndMax=ArrayMaximum(tmp);        // ищем индекс максимального значения
      ind[i]=IndMax;                   // сохраняем индекс i-го максимального значения
      tmp[IndMax]=0;                   // обнуляем i-е найденное максимальное значение во временном массиве
      }
   ArrayResize(tmp,0);                 // обнуляем размер временного массива
   return;   
}

というとき。

FindMaxValue(Ваш_Массив_Значений, MassIndexMaxValue, 3);

...先に定義した配列int MassIndexMaxValue[] には、your_Array_Value[] で見つかった 3 つの最大値のインデックスを格納する必要があります。

 

1トレードあたりの利益率、1トレードあたりの損失率の計算方法がわからないのですが。教えてもらえますか?

http://www.assessor.ru/forum/index.php?t=822

 
artmedia70:

見てください。値を持つ配列がありますね。この配列から3つの最大値を見つける必要があります。時系列配列の最後や最初である必要はありません。3つの最大値を求めればいいのです。


アルテムさん、ありがとうございました。

配列の最大値をゼロにするという私の考えが正しくてよかったです。別の配列にコピーすることまで詳しく説明していただいたので、これからは細かいところを処理していきたいと思います

ウラジミールのアドバイスに従って、私はプログラムのアルゴリズムから始めようと思います。

特別感謝記事 https://www.mql5.com/ru/articles/1357

 

こんにちは。

カスタムインジケータから Expert Advisorにシグナルを取得する方法を教えてください。

iCustomを使用したが、フクロウはまだ受信できない

double Signal_I=iCustom(NULL,0,"FL",0,0);
 
skyjet:

こんにちは。

カスタムインジケータからExpert Advisorにシグナルを取得する方法を教えてください。

iCustomを使用したが、フクロウはまだ受信できない


おそらくiCustomのインジケーターコードは それに適していないのでしょう...。ご質問の内容が少なすぎて、お答えすることができません。
 
skyjet:

こんにちは。

カスタムインジケータからExpert Advisorにシグナルを取得する方法を教えてください。

iCustomを使用したが、フクロウはまだ受信できない


他の指標でも同じなのでしょうか?はい」の場合、iCustom()関数の使用は正しくありません。もしそうでなければ、インジケーターのコードをチェックしてみてください。あなたのインジケーターはインジケーターバッファを全く使っていない可能性があります。
 

こんにちは、関数があります。

bool Trade()
{
  if(!IsConnected())
  {
     Print("Связь отсутствует.");
     return(false);
  }

  if(!IsExpertEnabled())
  {
     Print("Торговля экспертами выключена.");
     return(false);
  }
  
  if(DayOfWeek()==0 || DayOfWeek()==6)
  {
     Print("В выходные не торгуем.");
     return(false);
  }
  
  if(!IsTradeAllowed())
  {
     Print("Торговля запрещена? WTF???.");
     return(false);
  }
  return(true);
}

でも、なぜかうまくいかない。EAでは、int start()の直後、以下のように呼び出されます。

  if(!Trade())
  {
    Sleep(5000);
    return;
  }

ログ] タブと [エキスパート] タブでエキスパートアドバイザーが正常にロードされ、他には何も表示されません。2011年11月26日は土曜日なので、「週末は取引していません」と書いてありますが。

どこでエラーが出ているのか、何が間違っているのか。

 
Roman.:

おそらく、iCustomのインジケーターコードは、それ自体には適していません...ご質問の内容が少なすぎて、お答えすることができません。
このインジケータは、サポートラインと レジスタンスラインを描画 し、視覚化の際にそれを実行します。このインジケータは、クロスしたときに LT_1 == 1 または -1 のシグナルを出します。
if((Close[i] > BuyLevel) 
         {
    
          LT_1=1;
               
         }                                 
       if((Close[i] < CloseLevel)
         {
           
           LT_1=-1;
               
         }
 
ivan2k2:

こんにちは、関数があります。

でも、なぜかうまくいかない。EAでは、int start()の直後、以下のように呼び出されます。

ログ] タブと [エキスパート] タブでエキスパートアドバイザーが正常にロードされ、他には何も表示されません。2011年11月26日は土曜日なので、「週末は取引していません」と書いてありますが。

どこでエラーが出ているのか、何が間違っているのか。


今日は土曜日、お休みの日です。Expert Advisor を起動すると、初期化が行われますが、デイ・オフでティックがないため、スタート関数は起動しません(つまり、Trade()が呼ばれません)。正しく動作するかどうかを確認するためには、この関数の呼び出しを初期化ブロックに張り付けるか、テスターでテストする必要があります。
 
skyjet:
このインジケータは、サポートラインとレジスタンスラインを描画し、視覚化の際にそれを実行します。このインジケータは、クロスしたときに LT_1 == 1 または -1 のシグナルを出します。

その後、全く気にしないでください - それは取引条件を満たすためにあるとして、単にExpert Advisorに指標のコードを移動し、それがすべてです - その後、ボードでは、この指標とこれらの転送取引条件に従って、あなたはExpert Advisorを介して位置を開き、それはそれだ...。