[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 28

 
Сделайте дополнительную проверку на процентное соотношение.
 
TheXpert:
Сделайте дополнительную проверку на процентное соотношение.

на каком этапе и соотношение чего к чему?

поставил вот это в start()

if (Digits==5||Digits==3) {SL=SL*10;TP=TP*10;}

т.к. в init() не сработает,

может еще Point проверять?

посмотрю что даст...

 
OlegTs:

на каком этапе и соотношение чего к чему?

поставил вот это в start()

т.к. в init() не сработает,

может еще Point проверять?

посмотрю что даст...


вставил Digits с Point в print(), т.к. у меня работает один и тот же советник на четырех окнах, получил такую картинку:


т.е. на трех окнах пятизнак, а на одном четырехзнак, вот такой глюк,

позакрывал все окна, заново открыл, поставил советники, везде пятизнак...

Похоже ДЦ что-то химичило когда я окна открывал,

Вопрос закрыт...

 
подскажите как или куда вставлять саветников и скрипты???
 
Roman.:


Вы спрашивали о возможности программно проводить перебор и оптимизацию возможных ТФ для получения с них значений индикаторов в эксперте. Это возможно следующим образом - для примера -

кускочки кода, в файле - эксперт из журнала, где подобная операция проведена - там все подробно расписано с комментариями

Может кому еще подобная инфа пригодится.

Спасибо ! Я пока вручную меняю значения ТФ (оптимизация идёт долго и анализ по результатам каждого ТФ - отдельно).

А вот ещё вопрос всем, кто может помочь. Код для вариантов нестандартного фрактала и для определения потенциальных сигналов с любой свечи после излома МА (при такой конструкции я могу определить номер нужной мне свечи после излома.) Но....! Оптимизация идти "не хочет"...(( Если ставлю оптимизацию только ОДНОГО параметра Period_МА от 3 до 5 за один год, то идёт больше нескольких минут. Если поставить от 2 до 240 - то о компе можно забыть .... там вообще зависает и не выдаёт, сколько нужно времени... Я уже не говорю о включении в оптимизацию остальных параметров - SL, TP, MODE, PRICE_TYPE. Подскажите, если можно, что не так в коде...? Почему не идёт оптимизация..? Код рабочий - можете проверить. Собственно и сам код:

#include <stdlib.mqh>

extern int Period_MA = 5,                 // Период расчётной МА
           ПрибыльФр=10,                  // Не меньше 4
           HФр = 1,                       // Фильтр над фракталом
           Ограничение=52,
           PERIOD=1,                     // Период текущего графика (таймфрейм)
           MODE=3,                        // Метод усреднения из методов скользящего среднего
           PRICE_TYPE=0;                  // Используемая цена из ценовых констант
           
      bool Fact_вверх = false,            // Движения вверх нет
           Fact_вниз = false,             // Движения вниз нет
           Buy = false,                   // Инициализация buystop
           Sell = false,
           ПервФрвверх=false,
           ПервФрвниз=false;
           
     color вверх = SpringGreen,           // Цвет сделки вверх
           вниз = Red,                    // Цвет сделки вниз
           отмена = Yellow,               // Цвет отмены сделки
           Свеча1C=Blue;                  // Цвет номера 1С свечи
           
       int ticketup,                      // Ордер вверх
           ticketdown,                    // Ордер вниз
           BarTime,                       // Время текущего бара
           Tвверх,                        // Время сделки вверх
           Tвниз,                         // Время сделки вниз
           A,                             // Переменная массива вверх
           B;                             // Переменная массива вниз
           
          
   double SL,
          TP,
          PointX;
int init()
  {
   if(Digits==5 || Digits==3) PointX = Point * 10; // Корректировка Point под трёх- пятизнак
   if(Digits==4 || Digits==2) PointX = Point;
   
   return(0);
  }
//--------------------------------------------------------------------
int start()                      // Спец. функция start
  {
   double MAC1,                  // Значение МА на n баре
          MAC2,                  // Значение МА на следующей свече
          Разность,
          Lot=0.01;              // Лот
          
   string Symb=Symbol(),         // Финанс. инструмент
          С1 = "C1",             // Текст для обозначения ордера
          Пусто = " ";           // Текст для обозначения ордера
     
      int n=1,                   // Номер свечи, с которой начинается проверка
          Фр;
          
     bool Движ_вниз = false,
          Движ_вверх = false;
          
  if(BarTime!=Time[0])           // Условие для того, чтобы программа считала только на начале бара, а не на каждом тике
    {          
//--------------------------------------------------------------------
   while(true)                                                        // Цикл по перебору свечей вверх до изгиба МА Синей 
      {
                                                                      // Обращение к функции техн.инд. MA
     MAC1  = iMA(Symbol(),PERIOD,Period_MA,0,MODE,PRICE_TYPE,n);         // Первая сравниваемая свеча
      n++;                                                            // Переход на следующую свечу
     MAC2  = iMA(Symbol(),PERIOD,Period_MA,0,MODE,PRICE_TYPE,n);         // Последующая сравниваемая свеча
     Разность = (MAC1 - MAC2)/PointX;                              // Разница МА между соседними свечами
      
//--------------------------------------------------------------------
      if (NormalizeDouble(Разность,Digits) >= 1 )                  // Условие движения вверх
        {
          Движ_вверх = true;
          Движ_вниз = false;
          ПервФрвниз=false;
        } 
      if(NormalizeDouble(Разность,Digits)<-1)                      // Выход на противоположное движение  
        break;                                                        // Выход из цикла while (перебора свечей)
      }                                                               // Конец цикла while (перебора свечей)
//--------------------------------------------------------------------
  if (Движ_вверх == true)
    { 
      Print("Движ_вверх");
      int Количество = OrdersTotal();                               // Количество ордеров на данный момент      
      for(int i=Количество-1; i>=0;i--)                             // Цикл перебора ордер
          {
           if (OrderSelect(i,SELECT_BY_POS)==true)                    // Если есть следующий
            {
              int Tip=OrderType();                                    // Определения типа ордера
//--------------------------------------------------------------------                
              switch(Tip)                                             // Переключатель на типы ордеров
                {
                   case 5: int N = OrderTicket();                     // Метка удаляемого ордера SELLSTOP
                               Закрыть(N);                            // Вызов функции удаления отложенного ордера
                   continue;        
                }                                         
            } 
          }
   for(i=2;i<=n-2;i++)
       {
         if(NormalizeDouble(High[i],Digits)>NormalizeDouble(High[i+1],Digits)
         && NormalizeDouble(High[i],Digits)>NormalizeDouble(High[i-1],Digits))
           {
             if(ПервФрвверх==false)
               {
                 ПервФрвверх=true;
                 Фр=i;
               }else
                 {
                   Фр=i;
                 }
           }
         if(NormalizeDouble(High[i],Digits)==NormalizeDouble(High[i+1],Digits)
         && NormalizeDouble(High[i],Digits)>NormalizeDouble(High[i+2],Digits)
         && NormalizeDouble(High[i],Digits)>NormalizeDouble(High[i-1],Digits))
           {
             if(ПервФрвверх==false)
               {
                 ПервФрвверх=true;
                 Фр=i;
               }else
                 {
                   Фр=i;
                 }
           }  
       }
    if (ПервФрвверх==true)
      {   
         A++;
         Print("n = ",n);
         double ОткрФрвверх=High[Фр]+HФр*PointX;
             SL=Bid-Ограничение*PointX;
             TP=Bid+ПрибыльФр*PointX;                        // Заявленная цена TP
             int Ind_max =ArrayMaximum(High,n,0);                               // Индекс бара макс.ц. 
             double max = High[Ind_max];                                        // Искомая макс цена
             int Min_Dist=MarketInfo(Symbol(),MODE_STOPLEVEL);                  // Мин. дистанция
             int Время_фрактала=Time[Фр];
             double Цена_рисунка=Open[Фр];
             if (Tвверх!=Time[Фр])                                                           // Если цена ещё не достигла ТP(при включении сов.)
               {
                 Tвверх=Time[Фр];                                           // Определение времени для этого условия открытия
                 while(true)                                  // Цикл открытия орд.
                  {
                    ticketup=OrderSend(Symb, OP_BUY, Lot, Ask,0, SL, TP,NULL,A,0,вверх); // Ордер вверх
                        int Error=GetLastError();
                        Print("Error = ",Error);
                        switch(Error)                             // Преодолимые ошибки
                          {
                           case 6: Alert("Нет связи с торговым сервером. Пробуем ещё раз..");
                           RefreshRates();                     // Обновим данные
                           Sleep(1);                           // Задержка в цикле до нового тика
                         continue;                                   // На след. итерацию
                          }
                         break;                                    // Выход из цикла
                   }
               }
      }
    }        


Всё не влезло, добавлю дальше.

В чём загвоздка, может, подскажете, кто знает..?

 

Вот :

//*********************************************************************************************************                         
   n=1;

   while(true)                                                             // Цикл по перебору свечей вниз до изгиба МА Синей
    {
                                                                           // Обращение к функции техн.инд.
     MAC1  = iMA(Symbol(),PERIOD,Period_MA,0,MODE,PRICE_TYPE,n);              // Первая сравниваемая свеча
      n++;                                                                 // Переход на следующую свечу
     MAC2  = iMA(Symbol(),PERIOD,Period_MA,0,MODE,PRICE_TYPE,n);              // Последующая сравниваемая свеча
     Разность = (MAC1 - MAC2)/PointX;                                   // Разница МА между соседними свечами
//--------------------------------------------------------------------
      if (NormalizeDouble(Разность,Digits) <= -1 )                      // Условие движения вниз
       {
         Движ_вниз = true;
         Движ_вверх = false;
         ПервФрвверх=false; 
         continue;
       }
      if(NormalizeDouble(Разность,Digits)>1)                            // Выход на противоположное движение  
        break;                                                             //Выход из цикла while (перебора свечей)
    }                                                                      //Конец цикла while (перебора свечей)
//-------------------------------------------------------------------- 
    if (Движ_вниз == true)
      {
         Print("Движ_вниз");
         Количество = OrdersTotal();                                        // Количество ордеров на данный момент      
         for(i=Количество-1; i>=0;i--)                                      // Цикл перебора ордер
          {
           if (OrderSelect(i,SELECT_BY_POS)==true)                          // Если есть следующий
            {
              Tip=OrderType();                                             // Определения типа ордера
//--------------------------------------------------------------------                
              switch(Tip)                                                  // Переключатель на типы ордеров
                {
                   case 4: N = OrderTicket();                          // Метка удаляемого ордера BUYSTOP
                               Закрыть(N);                                 // Вызов функции удаления отложенного ордера
                   continue;        
                }                                         
            } 
          }
  for(i=2;i<=n-2;i++)
       {
         if(NormalizeDouble(Low[i],Digits)<NormalizeDouble(Low[i+1],Digits)
        &&  NormalizeDouble(Low[i],Digits)<NormalizeDouble(Low[i-1],Digits))
           {
             if(ПервФрвниз==false)
               {
                 ПервФрвниз=true;
                 Фр=i;
                 
               }else
                 {
                   Фр=i;
                 }
           }
         if(NormalizeDouble(Low[i],Digits)==NormalizeDouble(Low[i+1],Digits)
         && NormalizeDouble(Low[i],Digits)<NormalizeDouble(Low[i+2],Digits)
         && NormalizeDouble(Low[i],Digits)<NormalizeDouble(Low[i-1],Digits))
           {
             if(ПервФрвниз==false)
               {
                 ПервФрвниз=true;
                 Фр=i;
                 
               }else
                 {
                   Фр=i;
                 }
           }  
       }
       if (ПервФрвниз==true)
         {
           B++;
             Print("n = ",n);
             double ОткрФрвниз=Low[Фр]-HФр*PointX;
             SL=Bid+Ограничение*PointX-3*PointX;
             TP=Bid-ПрибыльФр*PointX-3*PointX;                        // Заявленная цена TP
             int Ind_min =ArrayMinimum(Low,n,0);                                   // Индекс бара мин.ц. 
             double min = Low[Ind_min];                                               // Искомая мин цена
             Время_фрактала=Time[Фр];
             Цена_рисунка=Open[Фр];
             if (Tвниз!=Time[Фр])                                         // Если цена ещё не достигла ТP(при включении сов.)
               {
                 Tвниз=Time[Фр];                              // Определение времени для этого условия открытия
                 while(true)                                  // Цикл открытия орд.
                   {
                        Alert("Bid = ",Bid);
                        ticketdown=OrderSend(Symb, OP_SELL, Lot, Bid,0, SL,TP,NULL,B,0,вниз); // Ордер вверх
                        Error=GetLastError();
                        Print("Error = ",Error);
                        
                         switch(Error)                             // Преодолимые ошибки
                          {
                           case 6: Alert("Нет связи с торговым сервером. Пробуем ещё раз..");
                           RefreshRates();                     // Обновим данные
                           Sleep(1);                           // Задержка в цикле до нового тика
                         continue;                                   // На след. итерацию
                          }
                         break;                                    // Выход из цикла
                   }
               }
         }
      }  
 BarTime=Time[0];
    }
return(0);                                                                 // Выход из start()
  }

 

И окончание :

//+------------------------------------------------------------------+
int deinit()
  {
    int Количество = OrdersTotal();                                        // Количество ордеров на момент закрытия советника
     Alert("Количество ордеров перед циклом = ",Количество); 
    for(int i=Количество-1; i>=0;i--)                                      // Цикл перебора ордеров
     {
     Alert("Количество ордеров в цикле = ",Количество, ", i=",i);
       if (OrderSelect(i,SELECT_BY_POS)==true)                             // Если есть следующий
         {                                                                 // Анализ ордеров:
           bool Ордер = OrderSelect(i,SELECT_BY_POS);                      // Присвоение имени
//------------------------------------------------------ 
            Alert("Количество ордеров в цикле внутри if= ",Количество,", OrderSelect = ",Ордер);
           int Tip=OrderType();                                            // Тип ордера
           if (Tip<2) continue;                                            // Рыночный ордер
           int N = OrderTicket();                                          // Присвоение имени
            Alert("Попытка удалить ордер",Tip,", Номер ",N);
           bool Ans=OrderDelete(N);                                        // Удаление ордера
//--------------------------------------------------------- 
            if (Ans==true)                                                 // Получилось :)
             {
              Alert ("Удалён ордер ",Tip," ",N);
              continue;                                                    // Продолжение удаления оставшихся ордеров 
             }
      //--------------------------------------------------------- 
             int Error=GetLastError();                                     // Не получилось :(
             switch(Error)                                                 // Преодолимые ошибки
              {
              case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");
                Sleep(3000);                                               // Простое решение
                continue;                                                  // На след. итерацию
              case 137:Alert("Брокер занят. Пробуем ещё раз..");
                Sleep(3000);                                               // Простое решение
                continue;                                                  // На след. итерацию
              case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
                continue;                                                  // На след. итерацию
              case 145:Alert("Модификация запрещена. ",
                              "Ордер слишком близок к рынку");
                      Sleep(3000);                                         // Простое решение
                      continue;                                            // На след. итерацию  
              }
             switch(Error)                                                 // Критические ошибки
              {
               case 2 : Alert("Общая ошибка.");
                break;                                                     // Выход из switch
               case 64: Alert("Счет заблокирован.");
                break;                                                     // Выход из switch
               case 133:Alert("Торговля запрещена");
                break;                                                     // Выход из switch
               case 139:Alert("Ордер заблокирован и уже обрабатывается");
                break;                                                     // Выход из switch
               case 145:Alert("Модификация запрещена. ",
                              "Ордер слишком близок к рынку");
              break;                                                       // Выход из switch
              default: Alert("Возникла ошибка ",Error);//Другие варианты   
              }
         }else
         {
          Alert("Количество ордеров в цикле после if= ",Количество,", OrderSelect = ",Ордер, ", i=",i);
         }
        
     }
//----
   return(0);
  }
//***************************************************************************
      // Описание пользоват. ф-ии закрытия ордеров
      
             void Закрыть(int N)                                   
              {
                bool Ans=OrderDelete(N,отмена);                         // Удаление ордера
 
подскажите как или куда вставлять саветников и скрипты???
 
DKD1000:

подскажите как или куда вставлять саветников и скрипты???

https://docs.mql4.com/ru/ написаны директории, где что хранится
 
abolk:

https://docs.mql4.com/ru/ написаны директории, где что хранится

спс
Причина обращения: