[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 284

 
hoz:
そんなことはどうでもいいんです。MathAbsを通してmoduloという絶対値を返しているのですが...


入力点を探すならMathAbs()スマホを導入して います。私としては、最初から最後まで、いつ、どのような許容範囲で、ということが明確になるように指定すべきです
 
borilunad:

入力点を探す場合MathAbs()で不鮮明に する。私にとっては、最初から最後まで指定されるべきで、いつ、どのような寛容さをもって いるのかが明確なのです


修正されました...とにかくどの条件も満たしていない。

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на указанном баре                                             |
//+-------------------------------------------------------------------------------------+
double GetMA(int index, int maPeriod)
{
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, index));
}
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок?                                                              |
//+-------------------------------------------------------------------------------------+
void IsRebound(int crossDir[], bool& returnSign[])
{
   for (int i = 0; i < 4; i++)
   {
      if (crossDir[i] == CROSS_NO)
         continue;

      returnSign[i] = false;
      double ema = GetMA(1, g_maPeriod[i]);

 //     VrPr (ND(MathAbs(ema - Ask)));
   //   VrPr (i_thresholdFromMa * pt);
      if (crossDir[i] == CROSS_UP)
      {
         if (ND(Ask - ema) <= i_thresholdFromMa * pt) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
         {
         //   VrPr (ND(MathAbs(ema - Ask)) <= i_thresholdFromMa * pt);
            returnSign[i] = true;
            VrPr (" returnSign["+0+"]"+" = "+ returnSign[0]);
            VrPr (" returnSign["+1+"]"+" = "+ returnSign[1]);
            VrPr (" returnSign["+2+"]"+" = "+ returnSign[2]);
            VrPr (" returnSign["+3+"]"+" = "+ returnSign[3]);
         }
      }
      if (crossDir[i] == CROSS_DN)
      {
         if (ND(ema - Bid) <= i_thresholdFromMa * pt) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
         {
            returnSign[i] = true;
            VrPr (" returnSign["+0+"]"+" = "+ returnSign[0]);
            VrPr (" returnSign["+1+"]"+" = "+ returnSign[1]);
            VrPr (" returnSign["+2+"]"+" = "+ returnSign[2]);
            VrPr (" returnSign["+3+"]"+" = "+ returnSign[3]);
         }
      }
   }
}

returnSign[i] = true に変更し、その結果VrPr 関数(私がモニターしているデータを出力する関数)は使用さ れません。とはいえ、すでにクロスダウンは始まっているのですが。スクリーンショット です。高速マシンが低速マシンを横切るたびに配列crossDir[]が埋め尽くされて いくのがわかります。

2つの車輪が一番太い車輪を横切り、配列の2つの要素にすでに値1が割り当てられて いることに注意してください。 つまり、それらの値はCROSS_DN です。

ということは、その条件は

 if (crossDir[i] == CROSS_DN)

そして

 
borilunad:

もし、エントリーポイントを探しているのであれば、MathAbs()はファジーさを導入 します。いつ、どのような許容範囲 なのかが明確になるように、最初から最後まで明記するべきだと思います

また、誰と、なぜ。
 
tara:

他に誰がいて、なぜ。

視覚的にはMathAbc()を使わない方が習慣的に知覚しやすいことを除けば、...違いはありません。しかし、話題は逸れました。私のコードに何か指摘はありますか?結局、問題はまだ解決していない...。
 
コードに不安はない。
 
では、なぜ条件が満たされないのでしょうか?ロジックについて、何かコメントはありますか?
 

いいえ。

 
明日の朝には良くなっているはずだ。
 

皆さん、こんにちは。

AlpariのMT-4でUSD/JPYをテストしています。

USD/JPYの1分足の履歴をダウンロードしました。

注)分史のアーカイブを読み込んだ後、「1分」をダブルクリックしてください。

DatabaseのQuote Archiveウィンドウに、1分間のQuoteのリストがなぜか表示されない。


1時間 TF

全てのダニ

期間 2000年01月01日- 01.01.2013.

テスト終了後、REPORTSタブに赤いバーが表示され、モデリング品質が25%であると表示される

同じ期間に同じパラメータでテストしました......ただし、各月で別々に テストしました。

そして、毎月、緑のバーと90%の シミュレーション品質が表示されます。

次に、同じ期間を2000~2006年と2006~2013年に2等分してテストしてみました。

各パーツのバーが緑色で、シミュレーションの品質が90%であることを示しています。


質問

一般的な13年間のテストの品質も90%だったのですが、どうすればいいのでしょうか?

ありがとうございました。

 

そうですね。終わったと思います。これは、第二のキャンドルにそれらをパックすることで、再構築されたティックコレクターです。

そうでした。

int start()
  {  
//----
if(flag == true)
  {
  if(tick.time.local == true)
    {
    time = TimeLocal();
    }
    else{
    time = TimeCurrent();
    }
  if(t < time)
    { 
         t = time; 
    }
    else{ 
         t ++;
    }   

  if(FileSeek(hand1e, fpos, SEEK_SET) == false)
           { 
           error = GetLastError();
           Print("out: error(",error,"): ",ErrorDescription(error));
           flag = false;
           return;
           }
           else{
           bid = MarketInfo(symbol, MODE_BID);
           ask = MarketInfo(symbol, MODE_ASK);
           
                FileWriteInteger(hand1e,    t,   LONG_VALUE);            
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);          
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);            
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);    
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);                            
                FileWriteDouble (hand1e, time, DOUBLE_VALUE);                   
      FileFlush       (hand1e);  

      fpos = FileTell (hand1e);

なった。

int i;//аналогично i=0
        while((TimeCurrent()-time)>1){//то заносим старые значения столько раз, сколько было пропущено секунд минус один
                if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                                error = GetLastError();//если ошибка
                                Print("out: error(",error,"): ",ErrorDescription(error));//записываем её в лог
                                flag = false;
                                return;//и выходим
                        }else{//выдумываем несуществующую свечу (т.к. тика в эту секунду не было)
                                time++;
                                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
//выбор выдуманной свечи (секунда, при которой тика не было):
//прочерк на Close[]
/*
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Open[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//High[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Low[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                                FileWriteDouble (hand1e,  0, DOUBLE_VALUE);//Volume[]
*/
//свеча без теней
/*
                                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//High[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Low[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                                FileWriteDouble (hand1e,  last.index+1, DOUBLE_VALUE);//Volume[]
*/
//такая же свеча, как и была (не прочерк и не без теней)
                                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                                FileWriteDouble (hand1e,  last.index+1, DOUBLE_VALUE);//Volume[]
//конец выбора
                                FileFlush       (hand1e);
                                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
                }
        }
ArrayResize(bid, 1);//урезаем и обнуляем использованные нмассивы
ArrayResize(ask, 1);
if(flag==true){
        if(tick.time.local==true){//если флаг работы с историей поднят
                        time = TimeLocal();//работаем с локальным временем
                        while(time==TimeLocal()){//пока секунда не прошла
                                bid[i]=MarketInfo(symbol, MODE_BID);//заносим в индикаторный массив данные тиков
                                ask[i]=MarketInfo(symbol, MODE_ASK);
                                i++;
                        }
                }else{//иначе
                        time = TimeCurrent();//работаем с временем сервера
                        while(time==TimeCurrent()){//пока секунда не прошла
                                bid[i]=MarketInfo(symbol, MODE_BID);//заносим в индикаторный массив данные тиков
                                ask[i]=MarketInfo(symbol, MODE_ASK);
                                i++;
                        }                       
        }
}
//Вышли из цикла, т.к. время изменилось. Заносим в файл:
if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                error = GetLastError();//если ошибка
                Print("out: error(",error,"): ",ErrorDescription(error));//записываем её в лог
                flag = false;
                return;//и выходим
        }else{
                int last.index=ArraySize(ask)-1;
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  last.index+1, DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
}

コードに対するコメント

1.CPU時間を節約するため、仮想ローソク足の選択でスイッチケースを作らず、代わりに選択のある部分をコメントアウトした(選択はコンパイル前に一度だけ特定のニーズで行われるため)。

2.現地時間(オフラインであること)が頭に浮かんでこない仕事中。while(time==TimeLocal()){//until one seconds has passed」のループの中に、FileWriteDoubleにMarketInfoが あるはずです(私には馬鹿の上塗りのように聞こえます)。そこで何がより論理的に見えるか教えていただければありがたいです。

3.著者の構成

if(flag == true)
  {
  if(tick.time.local == true)
    {
    time = TimeLocal();
    }
    else{
    time = TimeCurrent();
    }

init()の一番最後に宣言しています。

4.init()ダイナミックアレイの 冒頭で

   IndicatorBuffers(2);
   SetIndexBuffer(0, bid);
   SetIndexBuffer(1, ask);

の代わりに使用される変数です。

5.最適化のために、理論的にはWinAPIのファイル関数を使い、44バイトのブロック(MarketInfo構造体の長さ、.hstの長さ)で一気に履歴に書き込むことが可能です。

6.Time[]セルに書き込む時間の作者のモデリングを完全に削除しました。同じ理由で、head while loopでは、TimeLocal()のチェックは行わず、TimeCurrent()のチェックのみを行っています。

7.コードの最適化のために、他に何か提案はありますか?