Не претендуя на полное знание ООП предлагаю несколько правок к нему для соответствия:
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; // Сохраним значения в переменных (модифицировано)
}
Извините за пространную статью, но в таком виде, по моему мнению, программный код будет больше соответствовать хорошему стилю программирования и будет более понятен.
Не претендуя на полное знание ООП предлагаю несколько правок к нему для соответствия:
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; // Сохраним значения в переменных (модифицировано)
}
Извините за пространную статью, но в таком виде, по моему мнению, программный код будет больше соответствовать хорошему стилю программирования и будет более понятен.
Выложите пожалуйста обновленный код советника, с теми правками, которые в комментариях написаны. Спасибо.
Кстати - кто уже на реале торговал им? Поделитесь результатами?
scaels:
Выложите пожалуйста обновленный код советника, с теми правками, которые в комментариях написаны. Спасибо.
Кстати - кто уже на реале торговал им? Поделитесь результатами?
Не советую ставить его на реал...
правки вносить не обязательно, результат будет один...
Интересный советник но здесь не хватает очень важной функции такой как установка максимальной дистанции от мовинга. Например я ставлю ставить баи выше мовинга 20 пипс так он сделок открывает и 20 штук и получаются что первые сделки в + а последние в минусе. Нужно добавить максимальную дистанцию в пунктах и желательно максимальное количество ордеров. Да и дистанцию сделать лучше только от мовинга а не открывать через такое же расстояние новый ордер. Потому как если цена откатывает то мовинг должен ее оттолкнуть а просто открываться все ниже и ниже не очень разумно.
barto: Интересный советник но здесь не хватает очень важной функции такой как установка максимальной дистанции от мовинга. Например я ставлю ставить баи выше мовинга 20 пипс так он сделок открывает и 20 штук и получаются что первые сделки в + а последние в минусе. Нужно добавить максимальную дистанцию в пунктах и желательно максимальное количество ордеров. Да и дистанцию сделать лучше только от мовинга а не открывать через такое же расстояние новый ордер. Потому как если цена откатывает то мовинг должен ее оттолкнуть а просто открываться все ниже и ниже не очень разумно.
Этот советник был написан по просьбе знакомого, и опубликован с его разрешения. Сама стратегия и то о чем вы пишете денег не принесеет.
Стиль написания эксперта - отлично!
Не претендуя на полное знание ООП предлагаю несколько правок к нему для соответствия:
1. В объявлении класса:
заменить на
и соответственно модифицировать метод
2. Слегка модифицировать функцию OnTick()
В этом месте
lot(); // Если ордеров нет перерасчитаем лотнепонятно почему изменились переменные worklotbuy и worklotsel т.к. они были изменены в вызванной функции.
Предлагаю модифицировать начало функции следующим образом:
убрав объявление переменных worklotbuy и worklotsel на глобальном уровне и изменив функцию lot()
Извините за пространную статью, но в таком виде, по моему мнению, программный код будет больше соответствовать хорошему стилю программирования и будет более понятен.
Стиль написания эксперта - отлично!
Не претендуя на полное знание ООП предлагаю несколько правок к нему для соответствия:
1. В объявлении класса:
заменить на
и соответственно модифицировать метод
2. Слегка модифицировать функцию OnTick()
В этом месте
lot(); // Если ордеров нет перерасчитаем лотнепонятно почему изменились переменные worklotbuy и worklotsel т.к. они были изменены в вызванной функции.
Предлагаю модифицировать начало функции следующим образом:
убрав объявление переменных worklotbuy и worklotsel на глобальном уровне и изменив функцию lot()
Извините за пространную статью, но в таком виде, по моему мнению, программный код будет больше соответствовать хорошему стилю программирования и будет более понятен.
Спасибо за замечания, в будущем учту.
Подскажите, советник будет работать, открывать новые сделки, при выключенном терминале?
Нет, все советники индикаторы и скрипты работают только при включенном терминале....
Кстати - кто уже на реале торговал им? Поделитесь результатами?
Выложите пожалуйста обновленный код советника, с теми правками, которые в комментариях написаны. Спасибо.
Кстати - кто уже на реале торговал им? Поделитесь результатами?
Не советую ставить его на реал...
правки вносить не обязательно, результат будет один...
Интересный советник но здесь не хватает очень важной функции такой как установка максимальной дистанции от мовинга. Например я ставлю ставить баи выше мовинга 20 пипс так он сделок открывает и 20 штук и получаются что первые сделки в + а последние в минусе. Нужно добавить максимальную дистанцию в пунктах и желательно максимальное количество ордеров. Да и дистанцию сделать лучше только от мовинга а не открывать через такое же расстояние новый ордер. Потому как если цена откатывает то мовинг должен ее оттолкнуть а просто открываться все ниже и ниже не очень разумно.