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

 
Stellarspace:
インジケーターの "復活 "に貢献する過去のデータによればうまくいくが、新しいデータによればうまくいかない。どうしたらいいのか迷っています。


むしろ、その考えを言葉にしてほしい。

スパムはよくないし。一箇所で質問すれば十分であり、何箇所も質問する必要はない

 
Techno:
問題はプロセッサではなく、EAのコードにある。どこかにボトルネックがあるのだが、口コミでは診断も修正もできない、コードが必要だ

以下は、それぞれのティックを 担当するコードの一部です。

//***********************************************************************     
    BarTime=Time[0];
    }else                                                                  // На каждый тик
      {
        Количество = OrdersTotal();                                        // Количество ордеров на данный момент      
        for(i=Количество-1; i>=0;i--)                                      // Цикл перебора ордер
        {
          if (OrderSelect(i,SELECT_BY_POS)==true)                          // Если есть следующий
            {
              Tip=OrderType();                                             // Определения типа ордера
              Alert("Tip ордера=",Tip,", количество по счёту = ",i);
//--------------------------------------------------------------------                
              switch(Tip)                                                  // Переключатель на типы ордеров
                {
                   case 0:  Alert("Ордер BUY",", i = ",i);                 // Если ордер BUY
                            A=OrderMagicNumber();
                            Alert("ТЛ_ТP вверх =",ТЛ_ТPвверх[A],", Bid = ",Bid,", МодифBuy = ",МодифBuy[A],", A = ",A);
                           string Номер_ордера = OrderTicket();            // Имя для создания надписи ордера на терминале
                           string текст = Номер_ордера + Пусто + С1;       // Прибавление к надписи С1
                            Alert("Номер_ордера вверх = ",Номер_ордера);   // Сообщение
                           ObjectFind(Номер_ордера);
                           ObjectCreate(Номер_ордера,OBJ_TEXT,0,Время1 Син_вверх[A],O1C[A]); // Создание надписи номера ордера
                           ObjectSetText(Номер_ордера,текст,13,"Arial",вверх);// Задание свойств надписи
                           double Выше = O1C[A]+4*Point;                   // Координата стрелки вверх
                           string Значок = Время1 Син_вверх[A]+1;           // Имя для создания рисунка стрелки
                           ObjectFind(Значок);
                           ObjectCreate(Значок,OBJ_ARROW,0,Время1 Син_вверх[A],Выше);// Создание обьекта стрелки
                           ObjectSet(Значок,OBJPROP_ARROWCODE,241);        // Создание стрелки
                           ObjectSet(Значок,OBJPROP_COLOR,вверх);          // Создание цвета стрелки
                            Alert ("Значок = ",ObjectSet(Значок,OBJPROP_ARROWCODE,241));
                           Error=GetLastError();                           // Назначение имени функции проверки ошибок
                           switch(Error)                                   // Указатель ошибки
                             {   
                               case 4200 : Alert("Объект уже существует");
                           break;                                          // Выход из switch
                               default: Alert("Другая ошибка ",Error);     //Другие варианты   
                             }
                           
 if (NormalizeDouble(Bid,Digits)>=NormalizeDouble(ТЛ_ТPвверх[A],Digits) && МодифBuy[A]==false && ТЛ_ТPвверх[A] != 0) // Если цена = или > туннельной линии
    {
      МодифBuy[A]=OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice(),Digits),OrderOpenPrice()+1*Point,OrderTakeProfit(),0);//Модифи
                               Alert("МодифBuy=",МодифBuy);
                               if (МодифBuy[A]==true)                      // Получилось :)
                                 {
                                   Alert ("Ордер ",OrderTicket()," модифицирован:)");
                                    break;                                 // Из цикла модифи.
                                 }
                               //--------------------------------------------------- 7 --
                               Error=GetLastError();                       // Не получилось :(
                               switch(Error)                               // Преодолимые ошибки
                                 {
                                   case 130:Alert("Неправильные стопы");
                                   break; 
                                                    
                               // Критические ошибки
                                 case 2 : Alert("Общая ошибка.");
                                   break;                                  // Выход из switch
                                 case 133:Alert("Торговля запрещена");
                                   break;                                  // Выход из switch
                                 default: Alert("Возникла ошибка ",Error);//Др. ошибки
                                 }
                                break;                                     // Из цикла модифи.
                             }                                    
                break;                                                     // Выход из switch
                   case 1:  Alert("Ордер Sell , i = ",i);                  // Если ордер Sell
                           B=OrderMagicNumber();
                           Номер_ордера = OrderTicket();                   // Имя для создания надписи ордера на терминале
                           текст = Номер_ордера + Пусто + С1;              // Прибавление к надписи С1
                            Alert("Номер_ордера вниз =  ",Номер_ордера);   // Сообщение
                           ObjectFind(Номер_ордера); 
                           ObjectCreate(Номер_ордера,OBJ_TEXT,0,Время1 Син_вниз[B],O1C[B]); // Создание надписи номера ордера
                           ObjectSetText(Номер_ордера,текст,13,"Arial",вниз); // Задание свойств надписи
                           double Ниже = O1C[B]-4*Point;                   // Координата стрелки вверх
                           Значок = Время1 Син_вниз[B]+1;                   // Имя для создания рисунка стрелки
                           ObjectFind(Значок);
                           ObjectCreate(Значок,OBJ_ARROW,0,Время1 Син_вниз[B],Ниже); // Создание обьекта стрелки
                           ObjectSet(Значок,OBJPROP_ARROWCODE,242);        // Создание стрелки
                           ObjectSet(Значок,OBJPROP_COLOR,вниз);           // Создание цвета стрелки
                            Alert ("Значок = ",ObjectSet(Значок,OBJPROP_ARROWCODE,242));
                           Error=GetLastError();                           // Назначение имени функции проверки ошибок
                           switch(Error)                                   // Указатель ошибки
                             {   
                               case 4200 : Alert("Объект уже существует");
                           break;                                          // Выход из switch
                               default: Alert("Другая ошибка ",Error);     //Другие варианты   
                             }     
                            Alert("ТЛ_ТP вниз =",ТЛ_ТPвниз[B],", Bid = ",Bid,", МодифSell = ",МодифSell[B], ", B = ",B);
 
  if (NormalizeDouble(Bid,Digits)<=NormalizeDouble(ТЛ_ТPвниз[B],Digits) && МодифSell[B]==false && ТЛ_ТPвниз[B] != 0) // Если цена = или > туннельной линии
    {
      МодифSell[B]=OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice(),Digits),OrderOpenPrice()-1*Point,OrderTakeProfit(),0);//Модифи
                               Alert("МодифSell=",МодифSell[B]);
                               if (МодифSell[B]==true)                     // Получилось :)
                                 {
                                   Alert ("Ордер ",OrderTicket()," модифицирован:)");
                                   
                                   break;                                  // Из цикла модифи.
                                 }
                               //--------------------------------------------------- 7 --
                               Error=GetLastError();                       // Не получилось :(
                               switch(Error)                               // Преодолимые ошибки
                                 {
                                   case 130:Alert("Неправильные стопы");
                                   break; 
                                                    
                               // Критические ошибки
                                 case 2 : Alert("Общая ошибка.");
                                   break;                                  // Выход из switch
                                 case 133:Alert("Торговля запрещена");
                                   break;                                  // Выход из switch
                                 default: Alert("Возникла ошибка ",Error); //Др. ошибки
                                 }
                                break;                                     // Из цикла модифи.
                             }                                    
                break;                                                     // Выход из switch
                   default: Alert("Другие ордера",", i = ",i);    
                }
            }
        }                                                                  //Конец перебора орд.
      }                                                                    // Конец условия есть новая свеча или нет 
       Alert("ТЛ_ТP вниз[",B,"] = ",ТЛ_ТPвниз[B],", ТЛ_ТP вверх[",A,"] = ",ТЛ_ТPвверх[A]);
           
return(0);                                                                 // Выход из start()
  }
//+------------------------------------------------------------------+

2回の投稿ですみません。1回では収まりません。

もしかしたら、テスターのカウントスピードが遅くなっているのがわかるかもしれませんよ?

 
volshebnik:

2回の投稿ですみません。1回では収まりません。

もしかしたら、テスターの採点スピードが遅くなっているのがわかるかもしれませんよ?

まあエラー処理、テキスト機能(検索、作成)はアラートと同様、すべて冗長であると言ってよいでしょう。それがなければ、すべての作業が速くなります。このコードの一部分は以上です。
 
volshebnik:

2つのメッセージで申し訳ありません - 1つに収まらないので。

テスターでカウント速度が遅くなるのがわかるかも?


グラフィックは確実に遅くなっている。

mql4では、if()の中で条件の完全な計算が行われます。つまり、いくつかの&&がある場合、すべての値が計算され比較されます。

if (NormalizeDouble(Bid,Digits)<=NormalizeDouble(ТЛ_ТPвниз[B],Digits) && МодифSell[B]==false && ТЛ_ТPвниз[B] != 0) // Если цена = или > туннельной линии
    

のように、いくつかの if() に分割することが可能です。

if (МодифSell[B]==false) // Если цена = или > туннельной линии
    { if(NormalizeDouble(Bid,Digits)<=NormalizeDouble(ТЛ_ТPвниз[B],Digits) && ТЛ_ТPвниз[B] != 0)
          {
...........

この場合、最初の if() が考慮されなかった後、以下の構成全体が考慮されないことになります。

 
要するに、このコードは2つの注文の修正を行うだけで、それ以外は明らかに不要なのです...。
 
Techno:
実際には、このコードは2つのオーダーの変更のみを行い、他のすべては明らかに余分なものです...
ニコライさん、ありがとうございます。アラートとエラー 処理を削除しました。視覚的な速度向上は実感できない。はい、ここで注文が変更され、成行注文の番号とその開始条件の場所がグラフで表示されます。テキスト機能は、どの注文がオープンされたかをチャート上にマークするものなので、そのままにしています(今後の分析に必要です)。
 
volshebnik:
ニコライ ありがとうございます。アラートとエラー処理をすべて削除しました。目に見えて速度が上がるということはありません。 はい、注文はここで変更され、注文番号と開始条件の場所がグラフィカルに表示されます。テキスト機能は、どの注文がオープンされたかをチャート上にマークするために残しています(さらなる分析に必要です)。
グラフィカルな関数は非常に遅いので、別の分析方法を見つけなければなりません。
 
Techno:
グラフィカルな関数は非常に遅いので、他の分析方法を見つける必要があります。
すべてのグラフィックを別の関数に引き込み、条件付きで呼び出すことができます。グラフィカルな関数やアラートは、最適化しても動作しないし、テスト速度も下がらないと思っていましたが。
 
granit77:
すべてのグラフィックを別の関数に引き込み、条件付きで呼び出すことができます。最適化するとグラフィック機能やアラートが効かなくなり、テスト速度が落ちないのではと思ったが。

最適化の話ではなく、単純なテストの話です。1ヶ月のテストは7分です。