Форум трейдеров » Торговые роботы, советники, индикаторы » Вопросы программирования
+ Подписаться
Страница 60 из 87 ПерваяПервая ... 1050585960616270 ... ПоследняяПоследняя
  1. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Сдается мне что открытые ордера вообще закрываться не будут.
    Я уже обращал внимание на строчки
    Код:
    OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0);
    При проскальзывании 0, ордер сто пудов не закроется на реале.

    Но видимо автора это устраивает, все сыты и довольны!:smartass:
  2. 4,164
    Комментарии
    7
    Темы
    4265
    Репутация Pro
    Аватар для Денис Давыдов  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    Сдается мне что открытые ордера вообще закрываться не будут.
    Я уже обращал внимание на строчки
    Код:
    OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0);
    При проскальзывании 0, ордер сто пудов не закроется на реале.

    Но видимо автора это устраивает, все сыты и довольны!:smartass:
    В Броко отклонение вообще не учитывается, насколько я знаю.
  3. 3,168
    Комментарии
    1
    Темы
    3184
    Репутация Pro
    Аватар для SergP  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    Сдается мне что открытые ордера вообще закрываться не будут.
    Я уже обращал внимание на строчки
    Код:
    OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0);
    При проскальзывании 0, ордер сто пудов не закроется на реале.

    Но видимо автора это устраивает, все сыты и довольны!:smartass:
    исчо одна глупость.....
    если символ дефолтовый, то зачем это нужно?
    можно просто Bid написать:smartass:
  4. 3,168
    Комментарии
    1
    Темы
    3184
    Репутация Pro
    Аватар для SergP  
    Мастер форумных наук

    4 Медалей
    и исчоодна апшибка

    case OP_BUY: OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0); LotsCount1--; break;

    а кто вам сказал, что ордер удалился?
    вы просто запрос посылаете... и тут же .... без подтверждения, свою переменную меняете
    :smartass:
  5. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от SergP Посмотреть сообщение
    а вообще.... для простоты я бы их разделил..... на del_sell(int magic) и del_buy(int magic)..... а чтобы корректно всё удалялось и в циклах while не долбило сервер- еще и пару функций на проверку... а удалилось ли оно
    По поводу разделения на BUY и SELL, ояобого смысла не вижу. Если удаляем пендинг, дык там вообще фиолетово какой, а если закрываем открытый ордер, то принципиальной разницей является только цена Ask или Bid. Это легко проверить если в качестве цены использовать вспомогательную переменную, например:

    Код:
    int Price;
    if (OrderType() == 0) Price = Bid; else if (OrderType() == 1) Price = Ask;
    if (Price > 0) OrderClose(OrderTicket(), OrderLots(), Price, 3); else OrderDelete(OrderTicket());
    Вот вообщем то и вся функция. Хотя вариант с switch(OrderType()) мне почему то больше нравится, тем более что разницы особой нет.


    А вот по поводу проверки "А удалилось ли?"... Вот тут полностью согласен, нужно проверять. Но тут уже вступает в силу ещё одно принятие решения в алгоритме.
    Предположим не удалилось. Что делать? Повторить?
    Повторили, опять не удалилось. Дальше что делать? Ещё раз 5 повторить?
    Ещё повторили 5 раз, опять не удалилось. Что делать?

    Вообщем в блок схему алгоритма нужно будет добавить ещё и такое условие как глобальная ошибка удаления и как на неё реагировать. Либо прервать работу советника, либо, либо, либо....:confused:
  6. 3,168
    Комментарии
    1
    Темы
    3184
    Репутация Pro
    Аватар для SergP  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    Вообщем в блок схему алгоритма нужно будет добавить ещё и такое условие как глобальная ошибка удаления и как на неё реагировать. Либо прервать работу советника, либо, либо, либо....:confused:
    в алгоритме нужно проверять почему не удалилось, а для этого возвращать код ошибки... а дальше уже или повтор... или сброс флага на удаление....
    хотя, если код грамотно написан- ошибок по удалению(критических) вообще не будет... только если робот будет пытаться удалить в дни выходных:D
  7. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от SergP Посмотреть сообщение
    в алгоритме нужно проверять почему не удалилось, а для этого возвращать код ошибки... а дальше уже или повтор... или сброс флага на удаление....
    Ну так то да, только кодов ошибок много и я репу чешу что делать в случае если например возвращается ошибка ERR_TOO_FREQUENT_REQUESTS (слижком частые запросы) и ERR_TOO_MANY_REQUESTS (слижком много запросов)? Сделать паузу? А может ваще плюнуть и не удалять?

    Или вот ещё ошибочка интересная ERR_NO_RESULT (Нет ошибки, но результат неизвестен). Как на неё реагировать?:confused:

    Мне кажется что в такой простой задаче как удаление ордера, достаточно просто проверить удалился он или нет, т.е. была ли ошибка или нет. А уж какая ошибка, вообщем-то пофиг. Цикл удаления сделает 5 пассов и пропустит удаление. ИМХО так проще, что бы не заморачиваться с расшифровкой всех ошибок.

    Ну например так:

    Код:
    #define MAGIC 20050610
    
    extern bool is_Magic = true;
    
    int init() {
    	for(int i = OrdersTotal(); i >= 0; i--) {
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false || OrderSymbol() != Symbol()) continue;
    		if (is_Magic == true && OrderMagicNumber() != MAGIC) continue;
    		if (OrderStopLoss() > 0 && OrderTakeProfit() > 0) continue;
    		if (LotsCount1 <= MaxBlocks) continue;
    		for(int pass = 5; pass > 0; pass--) {
    			switch(OrderType()) {
    				case OP_BUY: OrderClose(OrderTicket(), OrderLots(), Bid, 3); break;
    				case OP_SELL: OrderClose(OrderTicket(), OrderLots(), Ask, 3); break;
    				default: OrderDelete(OrderTicket());
    			}
    			if (GetLastError() == 0) {
    				LotsCount1--;
    				break;
    			}
    		}
    	}
    }
  8. 3,168
    Комментарии
    1
    Темы
    3184
    Репутация Pro
    Аватар для SergP  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    Ну так то да, только кодов ошибок много и я репу чешу что делать в случае если например возвращается ошибка ERR_TOO_FREQUENT_REQUESTS (слижком частые запросы) и ERR_TOO_MANY_REQUESTS (слижком много запросов)? Сделать паузу? А может ваще плюнуть и не удалять?
    for и while делать не надо..... нужно всё в потоке start реализовывать....:smartass:
  9. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от SergP Посмотреть сообщение
    for и while делать не надо..... нужно всё в потоке start реализовывать....:smartass:
    Гы-ы-ы-ы!!!:D
    А по этому поводу нужно просканировать мозг афтара, что бы выяснить общую блок схему всего советника. Как? Когда? Зачем? открывать или удалять те или иные ордера.

    Лично я, при написании эксперта, оцениваю весь его алгоритм, тем самым картинка всего процесса, наличие вспомогательных переменных и.т.д и.т.п... становится очевидной.

    В данном случае пока речь идет про функцию init(), т.е про удаление ордеров после запуска терминала единоразово. А как оно там в общем сценарии start() должно работать, фиг его знает. Зачем удалять ордера через каждый тик?:D
    Это уже нужно смотреть, что почем!:)
  10. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Спасибо всем за дельные советы!!!

    Цитата Сообщение от Vladiger Посмотреть сообщение
    Сдается мне что открытые ордера вообще закрываться не будут.
    Я уже обращал внимание на строчки
    Код:
    OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0);
    При проскальзывании 0, ордер сто пудов не закроется на реале.

    Но видимо автора это устраивает, все сыты и довольны!:smartass:
    Извините за невежество, но я думал, что 0 - не учитывает проскальзывание?! Именно при нуле и на реале в forex(четыре)you отрабатывает все отлично. 3 функции сделаны так. А что такое проскальзывание "3"? Не совсем адекватно. На евро - нормально, а на EURHKD или GOLD. У меня советник, не смотря на мои глупости работает на 9 валютных парах в реале. Можно, конечно, поставить "Slippage".
    Код:
    OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), Slippage);
    и исчоодна апшибка

    case OP_BUY: OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0); LotsCount1--; break;

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

    А вот ещё: - Функцию ты назвал прикольно UdaleniePoslednih()...
    Может быть RemoveLastOrders() симпотичнее будет?
    PS Еси уж на то пошло, то функцию вообще можно назвать кирилицей
    Было бы классно, но не получится! Я английский не знаю и мне нужно понимать, что происходит. Вы же не пишите "коменты" на китайском, потому что на нем говорит самая крупная нация. И я тоже пишу на языке, на котором думаю. Если уж на то пошло, поменяю на Ваш вариант. Мне главное, чтобы все работало согласно задуманного.


    Цитата:
    Сообщение от Vladiger Посмотреть сообщение
    Сдается мне что открытые ордера вообще закрываться не будут.
    Я уже обращал внимание на строчки
    Код:

    OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0);

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

    Но видимо автора это устраивает, все сыты и довольны!
    исчо одна глупость.....
    если символ дефолтовый, то зачем это нужно?
    можно просто Bid написать
    Мой маленький-малюсенький опыт показал, что просто написать Bid или Ask - работает не так, как надо - чаще не работает. И на тестере мой советник тоже уже не тестируется, не получается. Только на демо сразу проверяю. Он закачивает исторические данные, тестирует их сам, подсчитывает согласно тестов десятки параметров. Я ввожу ручками только количество допустимых открытых и отложенных ордеров, а остальные параметры для любой валютной пары он сам подсчитывает и пересчитывает каждый час.
    Еще раз спасибо за ценные советы, без них я бы, неуч, не сделал такой советник. Совершенно серьезно говорю!
     

Вверх
РегистрацияX

чтобы писать, читать, комментировать