[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 335

 
borilunad:
Значит копай у себя! У тебя каждое слово кода функция, а надо обходится переменными. Вот и получается код тяжёлый. Функциями надо пользоваться, когда без них никак нельзя обойтись! У Кима я закомментировал всё, что мне не нужно, и всё работает очень быстро! Помнишь, я у всех спрашивал, как сделать, чтобы при многих условиях программа работала быстрее. Сейчас тестирование проходит за год на всех тиках за 5 минут! Прочесал все условия и функции, выкинул всё ненужное.

 Конечно, помню. Покапаю. На самом деле, мне нужно менять привычки. Уже не первый программист говорит, что мой код понять не просто. Видимо так и есть...
 
borilunad:
Значит копай у себя! У тебя каждое слово кода функция, а надо обходится переменными. Вот и получается код тяжёлый. Функциями надо пользоваться, когда без них никак нельзя обойтись! У Кима я закомментировал всё, что мне не нужно, и всё работает очень быстро! Помнишь, я у всех спрашивал, как сделать, чтобы при многих условиях программа работала быстрее. Сейчас тестирование проходит за год на всех тиках за 5 минут! Прочесал все условия и функции, выкинул всё ненужное.

Переменными можно обойтись только, если проверяем стратегию в тестере.

Для реала каждое необходимое значение для выполнения логики нужно рассчитывать в нужный момент времени, ведь значения этих переменных очень легко потерять, например при перезапуске.

 

Всем доброго времени суток.

С написанием индюков уже разобрался, а вот с первым роботом возникли проблемы. Вроде как все логично, компилятор не ругается, в журнале ошибок нет, но советник на тестере не работает - график открывает, но движений на этом графике никаких не происходит (не двигается именно график).

Замысел в следующем: Индикатор выдает точки(всегда на открытие свечи и по цене открытия свечи) от которых нужно купить или продать, задача робота при этом, получив такую точку на покупку или продажу, закрыть противоположный ордер, открыть новый или модифицировать старый ордер в том же направлении (стопы и ТП выдаются по другому индикатору)

Буду весьма признателен за подсказку что где не так.

Сам код (названия индюков изменил в соответствии с их функционалом, убрал раздел объявления переменных и обработки ошибок):

   // Предварит.обработка

   if(High[0]!=Low[0]) return; //если бар открылся до поступления текущей котировки, выход из start

       vverh = iCustom(NULL,0,"Индикатор дающий точку на покупку",Glubina,Pogreshnost,0,0);   //значение индикатора на покупку
       vniz  = iCustom(NULL,0,"Индикатор дающий точку на продажу",Glubina,Pogreshnost,1,0);   //значение индикатора на продажу
       
   if(vverh==0 && vniz==0)
     {
      Alert("Сигнала нет. Эксперт ждёт сигнал.");
      return;
     }
   if(Bars < Glubina)                       // Недостаточно баров
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;                                   // Выход из start()
     }
   if(Work==false)                              // Критическая ошибка
     {
      Alert("Критическая ошибка. Эксперт не работает.");
      return;                                   // Выход из start()
     }

//--------------------------------------------------------------- 4 --
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(i=1; i<=OrdersTotal(); i++)              // Цикл перебора ордеров
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderMagicNumber()!=MagicNumber)   // Попался ордер открытый не советником
            continue;
            
         Total++;                               // Счётчик ордеров открытых советником
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько ордеров одного советника. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
//--------------------------------------------------------------- 5 --
// торговые критерии
if(vverh>0)
  {
   Opn_B=true;
   Cls_S=true;
   Opn_S=false;
   Cls_B=false;
  }
if(vverh>0)
  {
   Opn_S=true;
   Cls_B=true;
   Opn_B=false;
   Cls_S=false;
  }
  
//--------------------------------------------------------------- 6 --
   
   //расчет стопов
   i_stop=0;
   while (stopov_for_S<2)                                                        //ищем 2 последних точки стопа в индикаторе, выбираем изз них самую дальнюю от текущей цены
         {
          for_S = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,0,i_stop);
          if (for_S>0)
             {
              stopov_for_S++;
              if(Stop_for_S<for_S) Stop_for_S=for_S;
             }
          i_stop++;
         }
   i_stop=0;
   while (stopov_for_B<2)
         {
          for_B = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,1,i_stop);
          if (for_B>0)
             {
              stopov_for_B++;
              if(Stop_for_B<for_B) Stop_for_B=for_B;
             }
          i_stop++;
         }
SL_for_B = Stop_for_B-pogreshnostSL;
SL_for_S = Stop_for_S+pogreshnostSL;
TP_for_B=vverh+(vverh-Stop_for_B)*koeff_dvizheniya;
TP_for_S=vniz-(Stop_for_S-vniz)*koeff_dvizheniya;


   // Закрытие и модификация ордеров
   while(true)                                  // Цикл закрытия и модификации орд.
     {
      if (Tip==0 && Opn_B==true)                // Если открыт ордер БАЙ и индикатор дает сигнал на покупку
             {
              OrderModify(Ticket,SL_for_B,TP_for_B,0,CLR_NONE); //меняем стопы текущего ордера бай
              break;
             }
      if (Tip==0 && Opn_S==true)                // Если открыт ордер БАЙ и индикатор дает сигнал на продажу
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Bid,50);        // закрываем БАЙ
                 if (Ans==true)                         // Получилось :)
                    {
                     Alert ("Закрыт ордер Buy ",Ticket);
                     break;                             // Выход из цикла закр
                    }
                 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                     continue;                          // Повторная попытка
             }
      
      if (Tip==1 && Opn_S==true)
             {
              OrderModify(Ticket,SL_for_S,TP_for_S,0,CLR_NONE);
              break;
             }
      if (Tip==1 && Opn_B==true)
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Ask,50);
                 if (Ans==true)                         // Получилось :)
                    {
                     Alert ("Закрыт ордер Sell ",Ticket);
                     break;                             // Выход из цикла закр
                    }
                 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                     continue;                          // Повторная попытка
             }
     }
//--------------------------------------------------------------- 7 --
   // Стоимость ордеров
   RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера

   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step )*Step;// Для открытия

   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Не хватает денег на ", Lts," лотов");
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------- 8 --
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      Ticket=0;
      if (Opn_B==true)                          // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,50,SL_for_B,TP_for_B,"My order #",MagicNumber,0,CLR_NONE);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                            // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
        
      if (Opn_S==true)                          // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,50,SL_for_S,TP_for_S,"My order #",MagicNumber,0,CLR_NONE);//Открытие Sell
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                            // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
     }
//--------------------------------------------------------------- 9 --
   return;                                      // Выход из start()
  }

 
If (торговые условия сигнал №1)
  {
  }//   Какой код нужен, чтобы тело оператора №1 в случае соответствия, передало управление к оператору  «торговых       условий №2»    

If (торговые условия сигнал №2)
  {
  }// Какой код нужен, чтобы тело оператора №2 в случае соответствия, передало управление к оператору «торговых       условий №3 и №4»    

If (торговые условия сигнал №3)
  {                                          
   Opn_B=true;                            
   }
   else
If (торговые условия сигнал №4)
  {                                          
   Opn_S=true;                            
   }
     else
         return(0);

Суть проблеммы следующая:  не понятно, что вписать в фигурные скобки тела операторов №1,2 по сути там проверяется соответствие торговых условий и больше никаких действий не происходит.

(Есть четыре торговых сигнала, срабатывает №1, передаем управление в обработку сигнала №2, срабатывает №2 передаем в обработку сигналов №3 и 4 и там уже производим торговые операции.) 

 

  else
         return(0);

  Стоит ли в конце вписать? По логике вещей, если сигналы № 3,4 не срабатывают, то мне необходимо, чтобы советник начал снова. 

 
artmedia70:

Переменными можно обойтись только, если проверяем стратегию в тестере.

Для реала каждое необходимое значение для выполнения логики нужно рассчитывать в нужный момент времени, ведь значения этих переменных очень легко потерять, например при перезапуске.

А разве теряются переменные, записанные в экстерне? Этого ни разу не случалось! Зато все условия перед глазами и под руками в старте(), а функциям, которые за пределами старта(), поручаю проверки и конечные неменящиеся действия! Очень может быть, что по большому счёту я и неправ, но пока мне удобно так, и на Реале ещё не получил ни одной ошибки, ни рэквота! Я всегда внимательно прочитываю, именно ваши посты, Артём, и других опытных программистов, как alsu, Meat и других, как и ув. модераторов! Но не всё ещё в моих возможностях, поэтому не могу применять то, что мне ещё неясно до малейших деталей. Спасибо за всё!
 
barma:

Всем доброго времени суток.

С написанием индюков уже разобрался, а вот с первым роботом возникли проблемы. Вроде как все логично, компилятор не ругается, в журнале ошибок нет, но советник на тестере не работает - график открывает, но движений на этом графике никаких не происходит (не двигается именно график).

Замысел в следующем: Индикатор выдает точки(всегда на открытие свечи и по цене открытия свечи) от которых нужно купить или продать, задача робота при этом, получив такую точку на покупку или продажу, закрыть противоположный ордер, открыть новый или модифицировать старый ордер в том же направлении (стопы и ТП выдаются по другому индикатору)

Буду весьма признателен за подсказку что где не так.

Сам код (названия индюков изменил в соответствии с их функционалом, убрал раздел объявления переменных и обработки ошибок):

Если Вы заменили названия индикаторов только в советнике, а не также в самих кодах индикаторов, которых вывели в соответствующие окна на графиках, тогда советник не получит от них ничего, а ошибку не даёт, т.к. в советнике всё представлено, но сигналов от индикаторов не получает. Проверьте, так же ли прописаны названия индикаторов в них самих!
 
borilunad:
Если Вы заменили названия индикаторов только в советнике, а не также в самих кодах индикаторов, которых вывели в соответствующие окна на графиках, тогда советник не получит от них ничего, а ошибку не даёт, т.к. в советнике всё представлено, но сигналов от индикаторов не получает. Проверьте, так же ли прописаны названия индикаторов в них самих!

Спасибо за совет, еще раз все перепроверил, ошибок в написании нет. Названия индикаторов я заменил только в тексте первого сообщения на форуме, для того чтоб было понятна их задача ,в текстах советника названия индюков написано ровно так как они названы в папке "indicators". Например: "3.0_figuri_2.3_rasshirenie".

Кроме того, для контроля выбрал другой советник  (из учебника) и ввел в функцию iCustom названия несуществующих индикаторов. Произхошло следующее - торговать советник действительно перестал (что в прочем понятно), но при запуске тестера график двигался от заданных начальной до конечной даты, у меня, напомню проблема именно в том что график не двигается.

Может кто то еще с такой проблемой сталкивался?

 
barma:

Спасибо за совет, еще раз все перепроверил, ошибок в написании нет. Названия индикаторов я заменил только в тексте первого сообщения на форуме, для того чтоб было понятна их задача ,в текстах советника названия индюков написано ровно так как они названы в папке "indicators". Например: "3.0_figuri_2.3_rasshirenie".

Кроме того, для контроля выбрал другой советник  (из учебника) и ввел в функцию iCustom названия несуществующих индикаторов. Произхошло следующее - торговать советник действительно перестал (что в прочем понятно), но при запуске тестера график двигался от заданных начальной до конечной даты, у меня, напомню проблема именно в том что график не двигается.

Может кто то еще с такой проблемой сталкивался.

Проверьте, как назван индикатор не в папке, а в коде его: "short name", т.к. по нему советник его признаёт, если ещё установлен на соответствующем графике и ТФ!
 
Чтобы индикатор рисовал что-то в тестере, его надо установить на график, сам советник линии рисовать не будет.
 
barma:

Спасибо за совет, еще раз все перепроверил, ошибок в написании нет. Названия индикаторов я заменил только в тексте первого сообщения на форуме, для того чтоб было понятна их задача ,в текстах советника названия индюков написано ровно так как они названы в папке "indicators". Например: "3.0_figuri_2.3_rasshirenie".

Кроме того, для контроля выбрал другой советник  (из учебника) и ввел в функцию iCustom названия несуществующих индикаторов. Произхошло следующее - торговать советник действительно перестал (что в прочем понятно), но при запуске тестера график двигался от заданных начальной до конечной даты, у меня, напомню проблема именно в том что график не двигается.

Может кто то еще с такой проблемой сталкивался?

Выходной в конторах, вот и не двигаются график.
Причина обращения: