Советники: VR---MUVING - страница 3

 

Стиль написания эксперта - отлично!

Не претендуя на полное знание ООП предлагаю несколько правок к нему для соответствия:

1. В объявлении класса:

   void              info();                        //Функция для получения цен и лотов

заменить на

   re                info(int typ);                 //Функция для получения цен и лотов (модифицирована)

и соответственно модифицировать метод

//+------------------------------------------------------------------+ 
re  muving:: info(int typ)                                                              // Метод сбора информации о ордерах (модифицирован)
  {
   re arr;                                                                              // Объявим екземпляр стуктуры для сбора информации (модифицирован)
   arr.max_price=arr.min_price=arr.max_lot=arr.min_lot=0;                                   // Обнулим переменные структуры (Применена новая возможность языка)
   for(int i=OrdersTotal()-1; i>=0; i--)                                                // Перебор ордеров
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))                                      // Разбор ордера на составные части
         if(OrderMagicNumber()==Magic)                                                  // если по нашему меджику
            if(OrderSymbol()==_Symbol)                                                  // если по нашему символу
              {
               if(OrderType()==typ)                                                     // если ордер SELL
                 {
                  if(OrderOpenPrice()>arr.max_price || arr.max_price==0){arr.max_price=OrderOpenPrice();arr.max_lot=OrderLots();} // Получим цены и лоты максимального ордера
                  if(OrderOpenPrice()<arr.min_price || arr.min_price==0){arr.min_price=OrderOpenPrice();arr.min_lot=OrderLots();} // Получим цены и лоты минимального ордера
                 }
              }
   return arr; 
  }

2. Слегка модифицировать функцию OnTick()

В этом месте

   lot();                                                                                                                   // Если ордеров нет перерасчитаем лот

непонятно почему изменились переменные worklotbuy и worklotsel т.к. они были изменены в вызванной функции.

Предлагаю модифицировать начало функции следующим образом:

   double worklotbuy=0;                             //Переменная для хранения лота для баев (модифицировано)
   double worklotsel=0;                             //Переменная для хранения лота для селов (модифицировано)
   if(WindowExpertName()!="VR---MOVING"){ Comment("Не правильное имя системы ! Переименуйте систему в VR---MOVING");return;} // Проверим не изменено ли имя советника
  
   if(go.counter(BUY)==0 && go.counter(SEL)==0)                                                                             // Зопросим колличество ордеров из методов класса
   worklotbuy=worklotsel=lot();                                                                                             // Если ордеров нет перерасчитаем лот (модифицировано)

убрав объявление переменных worklotbuy и worklotsel на глобальном уровне и изменив функцию lot()

double lot()                                                                                                                // обычная функция для перерасчетов лотов (модифицировано)
{  
   double worklot=0;                                                                                                        // Создадим и обнулим локальные переменные
   if(Startlot>0 && Risk==0 )                                                                                               // Проверим если лоты выставлены и риск равен 0
   worklot=Startlot;                                                                                                        // присвоим переменной стартовый лот
   
   if(Startlot==0 && Risk>0)                                                                                                // Проверим если лоты равны 0 и риск больше 0
   worklot=NormalizeDouble(AccountBalance()*Risk/100/MarketInfo(_Symbol,MODE_MARGINREQUIRED),2);                            // Расчитаем лот от процента от депозита
   if(worklot<MarketInfo(_Symbol,MODE_MINLOT))                                                                              // Проверим не меньше ли наш лот допустимого брокером 
   worklot=MarketInfo(_Symbol,MODE_MINLOT);                                                                                 // Если меньше то установим минимально допустимый лот
   
   /*if(worklot>0)     */                                                                                                       // Если все расчеты удались (модифицировано)
   return worklot;                                                                                                          // Сохраним значения в переменных  (модифицировано)
}

Извините за пространную статью, но в таком виде, по моему мнению, программный код будет больше соответствовать хорошему стилю программирования и будет более понятен.

 
NickSam:

Стиль написания эксперта - отлично!

Не претендуя на полное знание ООП предлагаю несколько правок к нему для соответствия:

1. В объявлении класса:

   void              info();                        //Функция для получения цен и лотов

заменить на

   re                info(int typ);                 //Функция для получения цен и лотов (модифицирована)

и соответственно модифицировать метод

//+------------------------------------------------------------------+ 
re  muving:: info(int typ)                                                              // Метод сбора информации о ордерах (модифицирован)
  {
   re arr;                                                                              // Объявим екземпляр стуктуры для сбора информации (модифицирован)
   arr.max_price=arr.min_price=arr.max_lot=arr.min_lot=0;                                   // Обнулим переменные структуры (Применена новая возможность языка)
   for(int i=OrdersTotal()-1; i>=0; i--)                                                // Перебор ордеров
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))                                      // Разбор ордера на составные части
         if(OrderMagicNumber()==Magic)                                                  // если по нашему меджику
            if(OrderSymbol()==_Symbol)                                                  // если по нашему символу
              {
               if(OrderType()==typ)                                                     // если ордер SELL
                 {
                  if(OrderOpenPrice()>arr.max_price || arr.max_price==0){arr.max_price=OrderOpenPrice();arr.max_lot=OrderLots();} // Получим цены и лоты максимального ордера
                  if(OrderOpenPrice()<arr.min_price || arr.min_price==0){arr.min_price=OrderOpenPrice();arr.min_lot=OrderLots();} // Получим цены и лоты минимального ордера
                 }
              }
   return arr; 
  }

2. Слегка модифицировать функцию OnTick()

В этом месте

   lot();                                                                                                                   // Если ордеров нет перерасчитаем лот

непонятно почему изменились переменные worklotbuy и worklotsel т.к. они были изменены в вызванной функции.

Предлагаю модифицировать начало функции следующим образом:

   double worklotbuy=0;                             //Переменная для хранения лота для баев (модифицировано)
   double worklotsel=0;                             //Переменная для хранения лота для селов (модифицировано)
   if(WindowExpertName()!="VR---MOVING"){ Comment("Не правильное имя системы ! Переименуйте систему в VR---MOVING");return;} // Проверим не изменено ли имя советника
  
   if(go.counter(BUY)==0 && go.counter(SEL)==0)                                                                             // Зопросим колличество ордеров из методов класса
   worklotbuy=worklotsel=lot();                                                                                             // Если ордеров нет перерасчитаем лот (модифицировано)

убрав объявление переменных worklotbuy и worklotsel на глобальном уровне и изменив функцию lot()

double lot()                                                                                                                // обычная функция для перерасчетов лотов (модифицировано)
{  
   double worklot=0;                                                                                                        // Создадим и обнулим локальные переменные
   if(Startlot>0 && Risk==0 )                                                                                               // Проверим если лоты выставлены и риск равен 0
   worklot=Startlot;                                                                                                        // присвоим переменной стартовый лот
   
   if(Startlot==0 && Risk>0)                                                                                                // Проверим если лоты равны 0 и риск больше 0
   worklot=NormalizeDouble(AccountBalance()*Risk/100/MarketInfo(_Symbol,MODE_MARGINREQUIRED),2);                            // Расчитаем лот от процента от депозита
   if(worklot<MarketInfo(_Symbol,MODE_MINLOT))                                                                              // Проверим не меньше ли наш лот допустимого брокером 
   worklot=MarketInfo(_Symbol,MODE_MINLOT);                                                                                 // Если меньше то установим минимально допустимый лот
   
   /*if(worklot>0)     */                                                                                                       // Если все расчеты удались (модифицировано)
   return worklot;                                                                                                          // Сохраним значения в переменных  (модифицировано)
}

Извините за пространную статью, но в таком виде, по моему мнению, программный код будет больше соответствовать хорошему стилю программирования и будет более понятен.


Спасибо за замечания, в будущем учту.
 
Подскажите, советник будет работать, открывать новые сделки, при выключенном терминале?
 
zilium:
Подскажите, советник будет работать, открывать новые сделки, при выключенном терминале?

Нет, все советники индикаторы и скрипты работают только при включенном терминале....
 
Выложите пожалуйста обновленный код советника, с теми правками, которые в комментариях написаны. Спасибо.
Кстати - кто уже на реале торговал им? Поделитесь результатами?
 
scaels:
Выложите пожалуйста обновленный код советника, с теми правками, которые в комментариях написаны. Спасибо.
Кстати - кто уже на реале торговал им? Поделитесь результатами?


Не советую ставить его на реал...

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

 
Интересный советник но здесь не хватает очень важной функции такой как установка максимальной дистанции от мовинга. Например я ставлю ставить баи выше мовинга 20 пипс так он сделок открывает и 20 штук  и получаются что первые сделки в + а последние в минусе. Нужно добавить максимальную дистанцию в пунктах и желательно максимальное количество ордеров. Да и дистанцию сделать лучше только от мовинга а не открывать через такое же расстояние новый ордер. Потому как если цена откатывает то мовинг должен ее оттолкнуть а просто открываться все ниже и ниже не очень разумно.
 
barto:
Интересный советник но здесь не хватает очень важной функции такой как установка максимальной дистанции от мовинга. Например я ставлю ставить баи выше мовинга 20 пипс так он сделок открывает и 20 штук  и получаются что первые сделки в + а последние в минусе. Нужно добавить максимальную дистанцию в пунктах и желательно максимальное количество ордеров. Да и дистанцию сделать лучше только от мовинга а не открывать через такое же расстояние новый ордер. Потому как если цена откатывает то мовинг должен ее оттолкнуть а просто открываться все ниже и ниже не очень разумно.
Этот советник был написан по просьбе знакомого, и опубликован с его разрешения. Сама стратегия и то о чем вы пишете денег не принесеет.