Logo

Вход

Войти с помощью соц. сетей
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
  • #1 Свернуть

    Надо усовершенствовать код

    Собственно требуется совет профи )) Занимаюсь написанием советника, решил забацать ему качественное определение своих ордеров, однако получившееся хоть и работает однако сильно тормозит тестер стратегии даже не смотря на то что у меня довольно шустрый комп, это сильно мешает тестить его на всех тиках , у кого какие идеи как его упростить при этом не потеряв функционала ?)
    на вход подаем переменную Magic_Number = 123456;
    на выходе имеем 2 массива Opened_Order (содержит данные по всем открытым своим ордерам) и Total_Order(содержит общее количество всех открытых баев селлов и т д )

    MQL код:
    //Определние своих ордеров 
    double Opened_Order [100][8];
    double Total_Order[7][1];
    for (int b=0;b<=1;b++){
    for (int rrr=0;rrr<100;rrr++){
    Total_Order[rrr][b]=0;
    }
    }
    for (int e=0;e<=100;e++){
    for (int f=0;f<=8;f++){
    Opened_Order [e][f]=0;
    }
    }
    for (int i=0;i<=Total;i++){
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (Magic_Number==OrderMagicNumber()){
    Opened_Order [i+1][0]=1;
    int c=1;
    Opened_Order [i+1][c]=OrderType()+1;
    c=c+1;
    Opened_Order [i+1][c]=OrderOpenPrice();
    c=c+1;
    Opened_Order [i+1][c]=OrderTakeProfit();
    c=c+1;
    Opened_Order [i+1][c]=OrderTicket();
    c=c+1;
    Opened_Order [i+1][c]=OrderLots();
    c=c+1;
    Opened_Order [i+1][c]=OrderMagicNumber();
    c=c+1;
    Opened_Order [i+1][c]=OrderStopLoss();

    }
    }
    double LOTSSB=0;
    double LOTSSS=0;
    for (int a=1;a<=100;a++){


    if (Opened_Order [a][1]==1){Total_Order [1][0]=Total_Order [1][0]+1;
    double df;
    df=LOTSSB+Opened_Order [a][5];
    LOTSSB=df;
    }
    if (Opened_Order [a][1]==2){Total_Order [2][0]=Total_Order [2][0]+1;
    double dfs;
    dfs=LOTSSS+Opened_Order [a][5];
    LOTSSS=dfs;

    }
    if (Opened_Order [a][1]==3){Total_Order [3][0]=Total_Order [3][0]+1;}
    if (Opened_Order [a][1]==4){Total_Order [4][0]=Total_Order [4][0]+1;}
    if (Opened_Order [a][1]==5){Total_Order [5][0]=Total_Order [5][0]+1;}
    if (Opened_Order [a][1]==6){Total_Order [6][0]=Total_Order [6][0]+1;}
    int All_Order=All_Order+Opened_Order [a][0];
    }
    Total_Order [0][0]=All_Order;
    All_Order=0;
    //Конец определения своих ордеров
    Последний раз редактировалось Gold; 01.10.2012, 15:05.

  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    скажите вам что в итоге получить надо общую лотность , тикеты сделок с определенным магик номером , количество сделок в одном направлении или еще что-то??
    отсортировать сделки по магическому ордеру просто и быстро , вопрос что вы сними сделать хотите??

    переписывать всю информацию о сделках в масивы не самый удачный подход, лучше все нужные вычисления делать внутри блока выбора ордеров


    MQL код:
     if(OrdersTotal()>0)
    {
    {TmpG = 0;
    while ( TmpG < OrdersTotal() )
    {
    if ( OrderSelect( TmpG, SELECT_BY_POS ) == true )
    { TmpG = TmpG + 1;
    if(magikt==magikt)
    {
    if(OrderSymbol()==Symbol())
    {
    //------например сдесь

    }
    }
    }
    }
    }
    }

    прошу прощения если скобки не все захватил (выдрал из кода)
     
    Последний раз редактировалось Gold; 01.10.2012, 15:06.

    Доверительное управление торговым роботом Digital_trader. Первый месяц бесплатно, обращаться в личку

    Комментарий

    • #3 Свернуть

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

      Комментарий

      • #4 Свернуть

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

        MQL код:
        double lotvv=0;//------лот вверх
        double lotvn=0;//------лот вниз
        if(OrdersTotal()>0)
        {
        {TmpG = 0;
        while ( TmpG < OrdersTotal() )
        {
        if ( OrderSelect( TmpG, SELECT_BY_POS ) == true )
        { TmpG = TmpG + 1;
        if(magikt==magikt)
        {
        if(OrderSymbol()==Symbol())
        {
        if(OrderType()==OP_BUY)
        {
        lotvv=lotvv+OrderLots();
        }
        if(OrderType()==OP_SELL)
        {
        lotvn=lotvn+OrderLots();
        }

        //сюда можно еще дописать условия ордера котрый подлежит модификации и запомнить его тикет

        }
        }
        }
        }
        }
        }
           
        Последний раз редактировалось Gold; 01.10.2012, 15:06.

        Доверительное управление торговым роботом Digital_trader. Первый месяц бесплатно, обращаться в личку

        Комментарий

        • #5 Свернуть

          Спасибо за подсказку, я и сам предполагал что тормоза в циклах, исходя из этого для начала попробую переделать так чтоб убрать их по максимуму,думаю сделать все в одном массиве для начала + еще вопрос будет ли массив обнулятся каждый раз при его объявлении в виде double Opened_Order [100][8]; , также как простая переменная например double a; в теле функции Start() ? Просто интересует возможность убрать первые два цикла в коде которые забивают массивы нулями , всунул их так как мне показалось что идут какие то ошибки как я предположил из за того что массив необнуляется и получается каша ...
             

          Комментарий

          • #6 Свернуть

            Сообщение от DGreen Посмотреть сообщение
            Спасибо за подсказку, я и сам предполагал что тормоза в циклах, исходя из этого для начала попробую переделать так чтоб убрать их по максимуму,думаю сделать все в одном массиве для начала + еще вопрос будет ли массив обнулятся каждый раз при его объявлении в виде double Opened_Order [100][8]; , также как простая переменная например double a; в теле функции Start() ? Просто интересует возможность убрать первые два цикла в коде которые забивают массивы нулями , всунул их так как мне показалось что идут какие то ошибки как я предположил из за того что массив необнуляется и получается каша ...
            спасибо на словах это конечно хорошо, а еще можно кнопочку "сказать спасибо " нажать )))), что касается обнуления , то тут точно сказать не смогу (сам уже давно перестал пользоваться массивами которые обнулять надо), а вообще в теории если мы обьявляем переменную после START() то переменная будет по умолчанию нулевой но вот с массивом не уверен . это можно проверить просто напишите проверочного робота в котором обьявляется массив, выводятся в коментарий несколько его ячеек потом он заполняется (просто любыми значениями), и return(0) если после пары тиков в коментарии будут нули то массив при обьявлении обнуляется если нет , то придется циклом)))
               

            Доверительное управление торговым роботом Digital_trader. Первый месяц бесплатно, обращаться в личку

            Комментарий

            • #7 Свернуть

              Спасибок наставил )) С массивом интересная идея вечером проверю и этот вопрос будет решен ) Еще раз спасибо ))
                 

              Комментарий

              • #8 Свернуть

                Сообщение от DGreen Посмотреть сообщение
                Спасибок наставил )) С массивом интересная идея вечером проверю и этот вопрос будет решен ) Еще раз спасибо ))
                да не зачто, если будут вопросы обращайтесь, я уже 2 года советников пишу
                   

                Доверительное управление торговым роботом Digital_trader. Первый месяц бесплатно, обращаться в личку

                Комментарий

                • #9 Свернуть

                  как у вас дела с программированием продвигаются???
                   

                  Доверительное управление торговым роботом Digital_trader. Первый месяц бесплатно, обращаться в личку

                  Комментарий

                  • #10 Свернуть

                    Сообщение от auto_fx Посмотреть сообщение
                    переписывать всю информацию о сделках в масивы не самый удачный подход, лучше все нужные вычисления делать внутри блока выбора ордеров
                    прошу прощения если скобки не все захватил (выдрал из кода)
                    С новым годом.
                    будте добры , объясните начинающему:
                    1. почему в масивы не удачный подход?
                    2.лучше все нужные вычисления делать внутри блока?
                    3.в чём разница?
                    Пишу и модернизирую | Ошибки в журнале терминала на русском языке

                    Комментарий

                    • #11 Свернуть

                      Сообщение от auto_fx Посмотреть сообщение
                      как у вас дела с программированием продвигаются???

                      Да пришлось пока забросить это дело в виду того что предполагавшаяся стратегия которая вначале казалась отличной на деле работать не захотела ))) Терь думаю что бы еще замутить ))
                         

                      Комментарий

                      • #12 Свернуть

                        Если делать то надо примерно так
                        MQL код:
                        #define DATA_COUNT         13
                        #define DATA_TICKET 0
                        #define DATA_LOT 1
                        #define DATA_OPENTIME 2
                        #define DATA_OPENPRICE 3
                        #define DATA_CLOSETIME 4
                        #define DATA_CLOSEPRICE 5
                        #define DATA_NUMBER 6
                        #define DATA_SL 7
                        #define DATA_TP 8
                        #define DATA_SWAP 9
                        #define DATA_PROFIT 10
                        #define DATA_TYPE 11
                        #define DATA_COMMISSION 12

                        double NotTradeData[][DATA_COUNT];
                        double TradeData[][DATA_COUNT];



                        в потом примерно так

                        MQL код:
                         if (OrdersTotal() > 0 )
                        for (TmpI=0; TmpI<OrdersTotal(); TmpI++)
                        if (OrderSelect(TmpI, SELECT_BY_POS, MODE_TRADES)
                        &&OrderMagicNumber()==myMagicNumber
                        &&OrderSymbol()==Symbol()
                        ){
                        TmpJ= StrToInteger(OrderComment());
                        if (TmpJ <= 0)
                        continue;

                        if (OrderType()==OP_SELL||OrderType()==OP_BUY)
                        {
                        TradeCount++;
                        ArrayResize(TradeData, TradeCount);
                        UpdateData(TradeData, TradeCount-1, TmpJ);

                        if (OrderType()==OP_BUY)
                        {
                        UpdateAverage(AVERAGES, AVERAGE_COLUMN_TREND_BUY, TradeData, TradeCount-1);
                        if (TmpJ == 1)
                        {
                        UpdateData(OrderDataFirstLast, DATA_FIRSTBUY, TmpJ);
                        UpdateData(OrderDataFirstLast, DATA_FIRST, TmpJ);
                        }else{
                        if (TmpJ > OrderDataFirstLast[DATA_LASTBUY][DATA_NUMBER])
                        UpdateData(OrderDataFirstLast, DATA_LASTBUY, TmpJ);
                        if (TmpJ > OrderDataFirstLast[DATA_LAST][DATA_NUMBER])
                        UpdateData(OrderDataFirstLast, DATA_LAST, TmpJ);
                        }
                        }else{
                        UpdateAverage(AVERAGES, AVERAGE_COLUMN_TREND_SELL, TradeData, TradeCount-1);
                        if (TmpJ == 1)
                        {
                        UpdateData(OrderDataFirstLast, DATA_FIRSTSELL, TmpJ);
                        UpdateData(OrderDataFirstLast, DATA_FIRST, TmpJ);
                        }else{
                        if (TmpJ > OrderDataFirstLast[DATA_LASTSELL][DATA_NUMBER])
                        UpdateData(OrderDataFirstLast, DATA_LAST, TmpJ);
                        if (TmpJ > OrderDataFirstLast[DATA_LAST][DATA_NUMBER])
                        UpdateData(OrderDataFirstLast, DATA_LAST, TmpJ);
                        }
                        }
                        }else{
                        NotTradeCount++;
                        ArrayResize(NotTradeData, NotTradeCount);
                        UpdateData(NotTradeData, NotTradeCount-1, TmpJ);
                        if (OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT)
                        UpdateAverage(AVERAGES, AVERAGE_COLUMN_NOTTREND_BUY, NotTradeData, NotTradeCount-1);
                        else
                        UpdateAverage(AVERAGES, AVERAGE_COLUMN_NOTTREND_SELL, NotTradeData, NotTradeCount-1);
                        }
                        }
                        Последний раз редактировалось Gold; 01.10.2012, 15:07.
                        Жизнь - это то, что происходит с нами, пока мы строим планы на будущее

                        Комментарий

                        • #13 Свернуть

                          Сообщение от Jeka2002 Посмотреть сообщение
                          С новым годом.
                          будте добры , объясните начинающему:
                          1. почему в масивы не удачный подход?
                          2.лучше все нужные вычисления делать внутри блока?
                          3.в чём разница?

                          Фишка в том что при использовании массива по назначению а не как набор из простых 3х -4х переменных , тебе полюбому придется использовать циклы а зачастую и не один которые довольно сильно тормозят советник, поэтому если нет большой необходимости в хранении большого количества однообразной информации их лучше не использовать.Хотя мне они нравятся в силу того что все храниться последовательно и не надо заморачиваться с кучей разных переменных.
                             

                          Комментарий

                          • #14 Свернуть

                            все хорошо на своем месте..

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

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

                            как правило ордера закрывают или удаляют перебирая открытые ордера с конца к началу, однако не факт, что ордер будет удален даже если в функции удаления заложено несколько попыток удаления..
                            я, например, формирую массив с инфой для удаления/закрытия и по этому массиву прохожусь.. в результате функция, имеющая несколько попыток на каждый ордер, рекурсивно вызывает сама себя 100% отрабатывает то, что ей положено делать..

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

                            в итоге одна функция заполняет один из массивов соответствующий отрытым ордерам или ордерам в истории, а прочие возвращают какое-либо свойство ордера по его номеру..

                            не могу сказать что массивы что-то тормозят, в тестере на тиках все пролетает мгновенно..

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

                            в общем функционал был заточен на работу настройками типа "Ключ=значение", и я был "приятно" удивлен, когда написав функцию, которая производила запись ключа, делала это некорректно, в случае когда переписывалось значение уже имеющегося ключа..
                            в функции имеет двумерный массив объявленный как string value[][2]; и по логике функция стартует и при объявлении массив должен быть пустым, однако это не так, затем в массив заносятся все ключи и их значения (в том числе и измененный), инфа в файле затирается и записывается из массива данные в файл.. все вроде бы просто, однако, из-за того что я не обнял массив, который только что объявил, то при повторном вызове функции в массиве оставался какой-то мусор, в результате чего данные некорректно писались, так что, вывод прост - ничто не оставляйте на волю случая - все инициализируйте.. в итоге ArrayResize(value,0); спасает от подобных казусов..

                            Комментарий

                            • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
                            • #15 Свернуть

                              MQL код:
                              for (int b=0;b<=1;b++){
                              for (int rrr=0;rrr<100;rrr++){
                              Total_Order[rrr][b]=0;
                              }
                              }
                              for (int e=0;e<=100;e++){
                              for (int f=0;f<=8;f++){
                              Opened_Order [e][f]=0;
                              }
                              }
                              for (int i=0;i<=Total;i++){
                              5 циклов! Вы только подумайте, сколько операций придется сделать советнику при каждом тике.
                              Зачем там столько циклов? Для поставленной задачи это совсем не нужно. Надо делать советник через нужное физиологическое отверстие!
                               
                              Последний раз редактировалось Gold; 01.10.2012, 15:07.

                              Комментарий

                              Сейчас онлайн

                              working...
                              X