MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1207

 

ってなわけで(ループが無限であることに気づき、i < 2000の2番目の条件を追加しました)MQL4

cv * tvp * (double)stop < ml


double tvp  = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE_PROFIT),
          vm   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
          vs   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP),
          ml   = AccountEquity() * (risk / 100.0),
          cv   = -1.0;
   
   for(int i = 0; cv * tvp * (double)stop < ml && i < 2000; i++)
     {
      if( (vm + vs * (double)i) * tvp * (double)stop < ml ) { cv = vm + vs * (double)i; Print(i," ",cv,"/",ml); };
     };


 
Alexandr Sokolov:

ってなわけで(ループが無限大になることに気づき、i < 2000の2つ目の条件を追加しました)



までループを終了しない。

cv * tvp * (double)stop < ml

この条件を満たしたときにループが終了するようにするには、ループの本文に次のように書けばよい。

for(int i = 0; i < 2000; i++)
{
  if(cv * tvp * (double)stop < ml)
    break
  ...
}

または

for(int i = 0; cv * tvp * (double)stop >= ml; i++)
{
  if(i >= 2000)
    break;
  ...
}
 
Mihail Matkovskij:

MQL4ではこの方法のみ。

結果


また、お世話になります。以下の方法も教えていただけるとありがたいのですが...。
ソート前にインデックスを持っていた配列 要素のインデックス値を計算するために使用できる関数または言語構成は何ですか?

ここでは、ソート前(上の行)の配列A[]とソート後の同じ配列があります。ソート前の値5の要素はインデックス9
にあり、ソート後の値5の要素はインデックス3にある。

ソートされた配列の中から値 5 のセルを見つけると,この関数がそのセルのインデックス番号を W に保存し,それはインデックス 3 と等しく なります.

ArraySort(А,10,0,MODE_ASCEND)です。

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

質問:ArrayBsearch()の後、値5のセルのindexの値を、ソートされていない 配列を持つ変数に格納するにはどうしたらよいですか?

つまり、9の値を保存します。
よろしくお願いします。

 
 

皆さん、こんにちは。カスタムインジケータに 負の値を設定して動作させる方法を知っている人はいますか? つまり、"価格チャートに対してインジケータを相対的にシフトさせる "ということです。

例:Moving Averageのインジケーターに-4の値を入れると、チャートに対して左に相対的に移動し、機能します。

しかし、この値をインジケーターのコードに入れると、インジケーターは動かなくなります。 そして、すべてのTF値が赤く表示されます。

ファイル:
 
ANDREY:

また、お世話になります。以下の方法も教えていただけるとありがたいのですが...。
配列要素の インデックス値(ソート前の値)を計算する関数や言語構成を教えてください.

ここでは、ソート前(上の行)の配列A[]とソート後の同じ配列があります。ソート前の値5の要素はインデックス9
にあり、ソート後の値5の要素はインデックス3にある。

ソートされた配列の中から値 5 のセルを見つけると,この関数がそのセルのインデックス番号を W に保存し,それはインデックス 3 と等しく なります.

ArraySort(А,10,0,MODE_ASCEND)です。

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

質問:ArrayBsearch()の後、値5のセルのindexの値を、ソートされていない 配列を持つ変数に格納するにはどうしたらよいですか?

つまり、9の値を保存します。
お世話になりました。

しかし、グローバルな目的もなく、ただ無作為にデータをソートするのはやめましょう。

現在のプロジェクトより:(短い)配列を取ると、正しい順序で要素のインデックスが出力されます。

void BubleSortIndex5(double &data[5],int &index[5])
{
   for(int i=0;i<5;i++)
      index[i]=i;
   for(int i=0;i<4;i++) {
      for(int j=1;j<5;j++) {
         if (data[index[i]]>data[index[j]]) {
            int tmp=index[i];
            index[i]=index[j];
            index[j]=tmp;
         }
      }
   }
}


大きな配列の場合、ソートアルゴリズムを変更する必要がある(バブリングは大きな配列では機能しない) - 変更する。

メインメッセージは、「ソースデータに手を出すな」です。参照で操作するか、配列のインデックスで操作するのが良い。そうしないと、後でとても必要となる情報が失われてしまうのです。

 
ANDREY:

また、お世話になります。以下の方法も教えていただけるとありがたいのですが...。
配列要素の インデックス値(ソート前の値)を計算する関数や言語構成を教えてください.

ここでは、ソート前(上の行)の配列A[]とソート後の同じ配列があります。ソート前の値5の要素はインデックス9
にあり、ソート後の値5の要素はインデックス3にある。

ソートされた配列の中から値 5 のセルを見つけると,この関数がそのセルのインデックス番号を W に保存し,それはインデックス 3 と等しく なります.

ArraySort(А,10,0,MODE_ASCEND)です。

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

質問:ArrayBsearch()の後、値5のセルのindexの値を、ソートされていない 配列を持つ変数に格納するにはどうしたらよいですか?

それは、9という値を保存することです。
よろしくお願いします。

そのためには、2つの質問に答える必要があります。

1.配列の異なるセルに、複数の5という値が存在することになります。

2.配列には値5が存在しないことになります。

ArrayBsearch 関数(ソート済みデータ用)は、最初のケースでは、セルの値が5である最初に見つかったインデックスを与え、2番目のケースでは、値 5に近い要素を与えるからです。ソートされていない配列をどのように処理したいのか、私にはよくわかりません。

 
sla100:

皆さん、こんにちは。カスタムインジケータに 負の値を設定して動作させる方法を知っている人はいますか? つまり、"価格チャートに対してインジケータを相対的にシフトさせる "ということです。

例:Moving Averageのインジケーターに-4の値を入れると、チャートに対して左に相対的に移動し、機能します。

しかし、この値をインジケーターのコードに入れると、インジケーターは動かなくなります。 そして、すべてのTFについて赤い値を表示します。

SetIndexShift.

シフトは iMAでも指定されています。

アイエムエー

Moving Averageテクニカルインディケーターの値を返します

doubleiMA(
stringsymbol,// シンボル名
inttimeframe,// timeframe
intma_period,// 期間
intma_shift,// 平均値をシフトする
intma_method,// 平均化手法
intapplied_price,//価格タイプ
intshift// shift
);

パラメータ

記号

[インジケータを計算するためにデータが使用されるシンボルのシンボル名。NULLは カレントシンボルを意味する。

タイムフレーム

[中】期間enumerationENUM_TIMEFRAMES の値のいずれかとすることができる。0は現在のチャートの期間を表します。

マ期間

[インジケータ算出のための平均化期間。

ma_shift

[価格チャートに対するインジケータの移動量。

ma_method

[中略)平均化法。ENUM_MA_METHOD 列挙のいずれかの値である。

適用価格

[中】 価格を適用した。ENUM_APPLIED_PRICE 列挙型の任意の値を指定できる。

シフト

[in] インジケータ・バッファから取得した値のインデックス(現在のバーから指定した期間だけ後ろに相対的にシフト)。

戻り値

テクニカル指標「Moving Average」の

AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);

https://docs.mql4.com/ru/indicators/ima

以下は既成の例ですが、MQL5では、https://www.mql5.com/ru/docs/indicators/ima ,

を簡単にMQL4に翻訳することができます。

SetIndexShift - Пользовательские индикаторы - Справочник MQL4
SetIndexShift - Пользовательские индикаторы - Справочник MQL4
  • docs.mql4.com
При положительном значении изображение линии смещается вправо, при отрицательном - влево. Значение, рассчитанное на текущем баре, рисуется с указанным смещением относительно текущего бара.
 

インジケーターの 設定にズレはありません。コードにシフト-4を入れたら、インジケータが動かなくなりました - すべてのTFが赤で表示されます。と思いながら座っています。

Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Среди программ для автоматического трейдинга можно выделить две большие категории: торговые роботы и индикаторы. Первые предназначены для совершения торговых операций на рынках, а вторые — для анализа котировок и выявления закономерностей в их изменении. При этом индикаторы могут использоваться непосредственно в роботах, образуя полноценную...
 
Mihail Matkovskij:

そのためには、次の2つの質問に答える必要があります。もしもの時にどう するか

1.配列の異なるセルには、5という値が複数存在することになります。

2.値 5 は配列に含まれません。

ArrayBsearch 関数(ソート済みデータ用)は、最初のケースでは、セルの値が5である最初に見つかったインデックスを与え、2番目のケースでは、値 5に近い要素を与えるからです。ソートされていない配列をどのように処理したいのか、私にはよくわかりません。

迅速な対応をしていただき、ありがとうございました。私の場合、配列要素の 各値は一意であり、単一のインスタンスに存在します。つまり、値5は、他の値と同様に、繰り返されることはないのです。

私の場合、値5はソートされていない配列の中に存在しないかもしれません。
しかし、値5がソートされていない配列にない場合、ArrayBsearch() 関数の第2パラメータに値5を指定することはできません。ソートされていない配列に必ず存在する値のみが、この関数に 取り込まれます。
ご協力ありがとうございました