Форум трейдеров » Торговые роботы, советники, индикаторы » Вопросы программирования
+ Подписаться
Страница 83 из 87 ПерваяПервая ... 33738182838485 ... ПоследняяПоследняя
  1. 2,682
    Комментарии
    28
    Темы
    2807
    Репутация Pro
    Аватар для sydiya  
    Сурововец

    6 Медалей
    Цитата Сообщение от EQU Посмотреть сообщение
    Понимаю, что всё пишем влёт - навскидку - сам тоже тем же страдаю..
    НО..
    И помочь человеку хочется и лень лишние телодвижения делать. Даже раскладку иногда лень переключать. Чесс слово.
    Бей нас бей, все правильно.
    Для D7D. Учебник есть у метаквотов. Нормальный такой, там много примеров и готовых кодов.
  2. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    да, и скажите зачем знак восклицания в строке: if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Red ))
    Восклицательный знак обозначает отрицание и в переводе на Русский язык эта строчка звучит так: - Едрён батон!!! Чё за фигня!!! Нам не удалось закрыть какой то ордер с тикектом OrderTicket() и объемом OrderLots() по цене Ask...:bow:
  3. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    И кстати, небольшие рекомендации (не расценивайте как совет) по оптимизации исполняемого кода:

    Рассмотрим хотя бы взятый выше пример с прокруткой ордеров в цикле.
    Казалось бы алгоритм выполнения настолько примитевен, что оптимизировать тут почти нечего.
    На самом деле есть.
    Во первых как и было замечено выше, что бы в цикле, при каждом шаге не пересчитывать количество всех ордеров функцией OrdersTotal(), до запуска цикла лучше поместить её в статическую переменную
    Код:
    int total = OrdersTotal();
    Далее, после того, когда цикл запущен, лучше всего избавить себя от многочисленных условий операторов IF, которые вкладывются друг в друга. Во первых это сделает код более читабельным, а в некоторых случаях (но не во всех) даже ускорит работу скрипта. Например после запуска цикла, самый лучше способ проверить все условия по которым можно либо прервать (break) либо продолжить его выполнение с возвратом в начало и инкрементом/декрементом счётчика циклов (continue). Например так:
    Код:
    if (...условия прекращения цикла...) break;
    if (...условия продолжения цикла...) continue;
    С этим разобрались, далее рассмотрим алгоритм обработки ордеров внутри самого цикла:
    На примере видно что нас интересуют только типы ордеров OP_SELL и OP_BUY и их всего два, а могло быть и больше. Для обработки этих условий используются операторы IF.
    Код:
    if (OrderType() == OP_SELL && OrderProfit() <= 0) {
    	//Обрабатываем ордера SELL если у них отрицательный или нулевой профит.
    }
    
    if (OrderType() == OP_BUY && OrderProfit() <= 0) {
    	// Обрабатываем ордера BUY если у них отрицательный или нулевой профит.
    }
    Как видно условие "если у них отрицательный или нулевой профит (OrderProfit() <= 0)" повторяется дважды, т.е. алгоритм два раза выполняет эту проверку. Лучшим решением будет вынести эту проверку выше (в условия рестарта цикла с уменьшением/увеличением счетчика), которая будет выполняться единоразово. Следуя логике: - Если у ордера есть профит, то и нечего дальше его обрабатывать, сразу continue.
    Код:
    if (OrderProfit() <= 0) continue;
    Далее, что еще можно оптимизировать? Оказывается можно.
    Следующим шагом в алгоритме делаются две проверки (два условия) типов ордеров (OP_SELL или OP_BUY) по которым определяются дальнейшие действия в цикле. При том обе проверки будут выполняться при каждом шаге цикла. А если мы будем обрабатывать большее количество типов, значит и проверок будет соответственно больше.
    В этом случае, гораздо рациональней использовать оператор switch() который передаст управление в тот блок, который будет найден в совпадении по типу. При каждом проходе цикла это будет выполняться единоразово, что уже экономит ресурсы выполнения программы и даже увеличивает её скорость.

    Как итог, даже такой маленький кусочек кода, я бы оптимизировал так:
    PHP код:
    int total OrdersTotal();
    for(
    int i total0i--) {
        if (!
    OrderSelect(iSELECT_BY_POS)) break;
        if (
    OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderProfit() <= 0) continue;
        switch(
    OrderType()) {
            case 
    OP_BUY:
                
    OrderClose(OrderTicket(), OrderLots(), Bid3Red);
                break;

            case 
    OP_SELL:
                
    OrderClose(OrderTicket(), OrderLots(), Ask3Red);
                break;

            
    // А так-же можем определить что делать с другими типами ордеров если они будут обнаружены в цикле.
            
    case OP_BUYSTOP:
                
    // Обработка ордера BUYSTOP
                
    break;

            case 
    OP_SELLSTOP:
                
    // Обработка ордера SELLSTOP
                
    break;

            case 
    OP_BUYLIMIT:
                
    // Обработка ордера BUYLIMIT
                
    break;

            case 
    OP_SELLLIMIT:
                
    // Обработка ордера SELLLIMIT
                
    break;
        }

  4. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    Исправьте, пожалуйста,
    Код:
    OrderProfit() <= 0
    на
    Код:
    OrderProfit() > 0
    во избежание недоразумений... ибо
    Цитата Сообщение от Владимир Гербатов Посмотреть сообщение
    ... Следуя логике: - Если у ордера есть профит, то и нечего дальше его обрабатывать, сразу continue.
  5. 19
    Комментарии
    0
    Темы
    19
    Репутация Pro
     
    Новичок

    2 Медалей
    Вот мне кучу насоветовали (включая учить мат часть)), НО я не хотел бы связываться с циклами. Мне требуетс код для закрытия ордера при условии что: я знаю что ордел SELL и что он открыт. Можно как то без цикла обойтись?

    По предоставленным определениям данной строки
    if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Red ))
    вообще не понимаю как это строка могла закрывать ордеры. Как я её понял: "Если ((закрыть ордер) не удалось)), то переходим на следующую строку скрипта"
  6. 3,168
    Комментарии
    1
    Темы
    3184
    Репутация Pro
    Аватар для SergP  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от Владимир Гербатов Посмотреть сообщение

    Как итог, даже такой маленький кусочек кода, я бы оптимизировал так:
    для МТ4 фиговая оптимизация.....
    "IF" не правильно в МТ организован.... он обязательно по всем условиям пробежится... даже если первое уже ложно....

    надо IF- ы дробить по мере важности....:D
  7. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    Цитата Сообщение от D7D Посмотреть сообщение
    Вот мне кучу насоветовали (включая учить мат часть)), НО я не хотел бы связываться с циклами. Мне требуетс код для закрытия ордера при условии что: я знаю что ордел SELL и что он открыт. Можно как то без цикла обойтись?

    По предоставленным определениям данной строки

    вообще не понимаю как это строка могла закрывать ордеры. Как я её понял: "Если ((закрыть ордер) не удалось)), то переходим на следующую строку скрипта"
    Да, в этой строчке Метатрейдер сначала вызывает функцию закрытия ордера, а потом проверяет возвращаемый функцией результат. Если он (результат) равен FALSE, то выполняется тело условия IF. иначе переходит на следующую инструкцию.
  8. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    для МТ4 фиговая оптимизация.....
    От чего же? Нормальная оптимизация!!!;)

    "IF" не правильно в МТ организован.... он обязательно по всем условиям пробежится... даже если первое уже ложно....
    Не понял при чем тут IF? Наверное имелось ввиду switch() оператор который так же претендует на группу внутренних условий IF в зависимости от количества операндов case?
    Ну тут фиг знает, честно говоря не знаю как организован компилятор в MT4 и как он будет выпонять такую инструкцию как:
    PHP код:
    switch(константа) {
        case 
    1:
            break;
        case 
    2:
            break;
        case 
    3:
            break;
        case 
    4:
            break;
        case 
    5:
            break;
        case 
    6:
            break;
        
    // и так далее

    Вполне возможно что он пробежится не по всем результатам истина/ложь, а по всем вышестоящим, пока не попадет по условию истина до первого блока обработки, в котором в конце стоит принудительный break;
    Тем не менее - это как бы просто "вежливость" програмирования!!!:D
    Так ведь удобней, тем более что в идеале, по условию в switch() программа должна сразу передавать управление в блок с условием истина, а как оно происходит на самом деле, фиг знает...

    Но лично я к этому привык не из-за МТ4, а вообще при написании программ, будь то хоть C++, хоть Javascript, хоть PHP, да хоть чего!!!:D
  9. 72
    Комментарии
    0
    Темы
    75
    Репутация Pro
     
    В начале пути

    2 Медалей
    Поможите люди добрые...

    Пишу:
    int start()
    {
    //----
    Alert(DoubleToStr(Bid,5));
    //----
    return(0);
    }

    И ничего не происходит... Даже это не запускается и не пойму в чём дело.
    Терминал Броко Трейдер (МТ4). Счёт Демо.

    Что я делаю не так? Какие особенности терминала Броко? Где почитать?
  10. 19,801
    Комментарии
    465
    Темы
    20570
    Репутация Pro
    Аватар для Евгений Ляпкин  
    Старожил

    9 Медалей
    Цитата Сообщение от Alex_Wilson Посмотреть сообщение
    Что я делаю не так? Какие особенности терминала Броко? Где почитать?
    На каком инструменте запускаете?
    И что означает пятерка здесь - (Bid,5)

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

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