[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 962

 
Stellarspace:
Aidez à "relancer" l'indicateur. Selon les données historiques, cela fonctionne, mais pas selon les nouvelles données. Je ne suis pas sûr de ce qu'il faut en faire.


Je préférerais que vous mettiez l'idée en mots.

Et ce n'est pas bon de spammer. Il suffit de poser une question à un endroit et pas à plusieurs.

 
Techno:
Le problème n'est pas dans le processeur, mais dans le code EA, quelque part il y a des goulots d'étranglement, mais vous ne pouvez pas les diagnostiquer et les réparer par des mots, vous avez besoin du code
.

Voici un morceau de code responsable de chaque tique.

//***********************************************************************     
    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()
  }
//+------------------------------------------------------------------+

Désolé pour les deux posts - impossible de tenir en un seul.

Peut-être pouvez-vous voir que la vitesse de notation du testeur ralentit ?

 
volshebnik:

Désolé pour les deux posts - impossible de tenir en un seul.

Peut-être pouvez-vous voir que la vitesse de notation du testeur ralentit ?

On peut dire que toutes les fonctions de gestion des erreurs et de texte (recherche, création) sont redondantes, de même que les alertes. Sans eux, tout fonctionnera plus vite. C'est tout pour ce bout de code.
 
volshebnik:

Désolé pour les deux messages - ça ne tient pas en un seul.

Peut-être pouvez-vous constater que cela ralentit la vitesse de comptage dans le testeur ?


Les graphiques sont définitivement en train de ralentir.

Et n'oubliez pas que dans mql4 il y a un calcul complet des conditions dans if(), c'est-à-dire que si vous avez plusieurs && alors toutes les valeurs seront calculées et comparées, bien qu'un seul faux soit suffisant pour que la construction avec && soit fausse.

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

il est possible de le diviser en plusieurs if()

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

dans ce cas, après que le premier if() ne soit pas pris en compte, toute la construction ci-dessous ne sera pas considérée

 
En substance, ce code n'effectue que 2 modifications de commande, tout le reste est clairement inutile...
 
Techno:
en fait ce code n'effectue que 2 modifications d'ordre, tout le reste est évidemment superflu...
Nikolay, merci. J'ai supprimé les alertes et la gestion des erreurs. Je ne constate aucune amélioration visuelle de la vitesse. Oui, les ordres sont modifiés ici et le numéro de l'ordre de marché et le lieu de sa condition d'ouverture sont indiqués graphiquement. J'ai laissé les fonctions de texte car elles marquent sur le graphique quel ordre a été ouvert (c'est nécessaire pour une analyse ultérieure).
 
volshebnik:
Nikolaï, merci. J'ai supprimé toutes les alertes et la gestion des erreurs. Il n'y a pas d'augmentation visible de la vitesse. Oui, les ordres sont modifiés ici et le numéro de l'ordre et le lieu de la condition ouverte sont indiqués graphiquement. J'ai laissé les fonctions de texte car elles indiquent sur le graphique quel ordre a été ouvert (nous en avons besoin pour une analyse ultérieure).
Nous devons trouver un autre moyen d'analyse, les fonctions graphiques sont très lentes.
 
Techno:
vous devez trouver un autre moyen d'analyse, les fonctions graphiques sont très lentes.
Vous pourriez rassembler tous les graphiques dans une fonction distincte et l'appeler avec une condition. Bien que je pensais que les fonctions graphiques et les alertes ne fonctionnent pas lors de l'optimisation, et ne réduisent pas la vitesse de test.
 
granit77:
Vous pourriez rassembler tous les graphiques dans une fonction distincte et l'appeler avec une condition. Bien que je pensais que les fonctions graphiques et les alertes ne fonctionnent pas lors de l'optimisation, et ne réduisent pas la vitesse des tests.

Je ne parle pas d'optimisation, je parle de simples tests. Un test mensuel dure 7 minutes.