Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2421

 
Artyom Trishkin #:

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

Я помню, что на момент написания этого коммента, принт распечатывал 5

   int i = 1;
   if(true)
      int i = 5;
   Print(i);

Поэтому я сильно расстраивался по поводу отсутствия предупреждения компилятора.

Сейчас проверил ещё раз и теперь принт распечатывает правильно 1.


Учитывая, что справка про область видимости написана намного раньше моего коммента, получается у меня был глюк (это не точно).

Учитывая сколько глюков выявляется в новых версиях программы, то вполне возможно глюк был не у меня (и это не точно) .

Сейчас область видимости работает нормально, поэтому на какое то время,  оставлю жирафа в покое)

 
Grigori.S.B #:

А причем тут повторное объявление переменных и область видимости?
Переменная i объявлена за пределами (снаружи) обоих циклов, видна как во внешнем, так и во внутреннем.
Другое дело что она инициализируется в обоих циклах, а индексация в них встречная.

Точно, никто ведь её там повторно не объявляет!

Опять я пёрнул в лужу. Блиин :(

 
Andrey Dik #:

Стесняюсь спросить, а зачем?

Если прям очень надо, то можно линки на папки сделать где надо.

Добрый день, Андрей!

Мне это нужно для того, чтобы оптимизированный файл был непосредственно доступен для загрузки в робота.

Эта загрузка осуществляется по умолчанию из папки Tester.


А как сделать линки на папки?

Извините за не очень профессиональные вопросы.

С уважением, Александр

 
Grigori.S.B #:

В таком исполнении у тебя внешний цикл походу вообще работать не должен. В обоих циклах используется одна и та же переменная i, объявленная до циклов. 
Во внешнем она инициализируется кол-вом ордеров -1 и идет на декремент (уменьшение). А как дело доходит до внутреннего цикла так ее значение обнуляется.

У тебя перебор ордеров есть уже во внешнем цикле - зачем его дублировать еще и во внутреннем? Имхо мешанина какая-то. Бага не вижу.

а! ОК! Спс. Заменю на J

 
Artyom Trishkin #:

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

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

 
Grigori.S.B #:
встречная

спс б - я понял.

 
Roman Shiredchenko #:

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

Зачем плодить? Проще в цикле объявить int i = ... ... ...

 
Artyom Trishkin #:

Зачем плодить? Проще в цикле объявить int i = ... ... ...

я об этом 

 // модификация СЛ позиций селл
         for(int i=OrdersTotal()-1; i>=0; i--)
          {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
                  if(OrderType()==OP_SELL)
                  if(OrderStopLoss()==0)
                    {
                     tip = OrderType();
                     //OSL = NormalizeDouble(OrderStopLoss(),Digits);
                     //OTP = NormalizeDouble(OrderTakeProfit(),Digits);
                     OOP = NormalizeDouble(OrderOpenPrice(),Digits);
                     OSL = NormalizeDouble(SL_бу_S,Digits);
                       {
                        for(int j=0; j<100; j++)
                         {
                          if(!OrderModify(OrderTicket(),OOP,OSL,0,0,clrDeepPink))
                           { 
                            Alert(" Error SELL перевода в безубыток: tiket = ", OrderTicket(), " Error № ", GetLastError());
                            Sleep(1000);
                           }
                          else
                           {
                            Alert(" Успешно SELL переведена в безубыток: tiket = ", OrderTicket(), " Error № ", GetLastError());
                            break; // переходим на следующий селл для перевода в безубыток
                           }  
                         }  
                       }
                    }
            }    


а вот щас понял - i использовать: 

 // модификация СЛ позиций селл
         for(i=OrdersTotal()-1; i>=0; i--)
          {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
                  if(OrderType()==OP_SELL)
                  if(OrderStopLoss()==0)
                    {
                     tip = OrderType();
                     //OSL = NormalizeDouble(OrderStopLoss(),Digits);
                     //OTP = NormalizeDouble(OrderTakeProfit(),Digits);
                     OOP = NormalizeDouble(OrderOpenPrice(),Digits);
                     OSL = NormalizeDouble(SL_бу_S,Digits);
                       {
                        for(int i=0; i<100; i++) // тут он не даст возможно объявить переменную повторно 
                         {
                          if(!OrderModify(OrderTicket(),OOP,OSL,0,0,clrDeepPink))
                           { 
                            Alert(" Error SELL перевода в безубыток: tiket = ", OrderTicket(), " Error № ", GetLastError());
                            Sleep(1000);
                           }
                          else
                           {
                            Alert(" Успешно SELL переведена в безубыток: tiket = ", OrderTicket(), " Error № ", GetLastError());
                            break; // переходим на следующий селл для перевода в безубыток
                           }  
                         }  
                       }
                    }
            }    


спасибо за помощь. Сделаю, чтобы на оптималках работало....

 
klycko #:

Добрый день, Андрей!

Мне это нужно для того, чтобы оптимизированный файл был непосредственно доступен для загрузки в робота.

Эта загрузка осуществляется по умолчанию из папки Tester.


А как сделать линки на папки?

Извините за не очень профессиональные вопросы.

С уважением, Александр

День добрый.

Можно из командной строки делать линки, но я пользуюсь файловым менеджером MultiCommander для этих целей.

Делаете линк (Symlink) в нужном месте на реальную папку, где находятся файлы. К линку можно обращаться так, как будто эта та самая нужная папка.

В проге Инструменты->Ссылки->Создать ссылки.

 
klycko #:

Спасибо за совет!

Добавил в своем скрипте директиву:

#property tester_file "NameSettings"

...

   string NameSettings = mnth+dy+"-"+DoubleToString(ProfitNew,0)+".set"; // Формируется имя для Settings

   

В Files нужный файл записывается нормально, а в Tester никакого дубликата не появляется.

Не могли бы вы уточнить, что ещё может помочь для записи в папку Tester?

С уважением, Александр

Здравствуйте, Александр.

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

Это, конечно, большое неудобство, что нельзя менять имя, но так уж сделана реализация. Кстати, такой директивой можно передавать и несколько файлов (по одному в одной директиве)