[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 962

 
Stellarspace:
Помогите "оживить" индикатор. По историческим данным работает, по новым нет. Укажите хотя бы причину.


Лучше идею словами написать.

Да и спамить не хорошо. Достаточно вопрос в одном месте задавать, а не во множестве

 
Techno:
проблема не в процессоре, а в коде советника, где-то есть тормозящие места, но диагностировать их и исправить на словах нельзя, нужен код

Вот кусок кода, отвечающий за каждый тик.

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

Простите, что на двух сообщениях - в одно не влезает.

Может, видно,что тормозит скорость счёта в тестере ?

 
volshebnik:

Простите, что на двух сообщениях - в одно не влезает.

Может, видно,что тормозит скорость счёта в тестере ?

ну можно точно сказать что все обработки ошибок, и текстовые функции(нахождения, создания) лишние, а также Алерты. Без них все быстрее будет работать. Про этот кусок кода все.
 
volshebnik:

Простите, что на двух сообщениях - в одно не влезает.

Может, видно,что тормозит скорость счёта в тестере ?


графика точно тормозит

и не забывайте в mql4 идет полный расчет условий в if(), т.е. если у Вас несколько && то будут расчитаны все значения и сравнены, хотя достаточно одного false, чтобы конструкция с && была false

 

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:
Можно вытащить всю графику в отдельную функцию и вызывать ее с условием. Хотя я считал, что при оптимизации графические функции и алерты не работают, и не снижают скорость тестирования.

речь не о оптимизации, а простом тестировании. Месяц теста длится 7 минут.