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

 
klycko #:

Добрый день!

В скрипте осуществляется запись данных в  в песочницу Files:

   string NameSettings = "abc.set"; // Формируется имя для Settings

   int file_handle=FileOpen("//"+NameSettings,FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI);

   FileWriteString(file_handle,Settings+"\r\n");      // Записывается строка Settings в песочницу Files


Подскажите, пожалуйста, как осуществить эту запись непосредственно в папку тестера (она же не песочница?):

C:\Users\lizak\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F\MQL5\Profiles\Tester


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

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

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

 
klycko #:

Добрый день!

...

Подскажите, пожалуйста, как осуществить эту запись непосредственно в папку тестера (она же не песочница?)

Здравствуйте, похоже, вам нужно пользоваться директивой
#property tester_file "abc.set"
В этом случае файл с этим именем будет автоматически копироваться в папку тестера. Более подробно почитайте в справке и учебнике 
 

нашел походу баг в МЕ - в такой конструкции из - за break прерывается не только ближний (вложенный) цикл for ... но и внешний - перебора ордеров - этого быть не должно - т.е.  он

все позы не переводит по модификации СЛ - но выходит из цикла перебора всех поз сразу после модификации крайней позы. Это делаю проверки для реал торгов:

(возможно надо оформлять проверки в виде ф-ии - отдельно - что модификация текущей позиции прошла успешно)

   // модификация СЛ позиций селл
         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(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; // переходим на следующий селл для перевода в безубыток
                           }  
                         }  
                       }
                    }
            }    
 
Roman Shiredchenko #:

нашел походу баг в МЕ - в такой конструкции из - за break прерывается не только ближний (вложенный) цикл for ... но и внешний - перебора ордеров - этого быть не должно - т.е.  он

все позы не переводит по модификации СЛ - но выходит из цикла перебора всех поз сразу после модификации крайней позы. Это делаю проверки для реал торгов:

(возможно надо оформлять проверки в виде ф-ии - отдельно - что модификация текущей позиции прошла успешно)

   // модификация СЛ позиций селл
         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(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; // переходим на следующий селл для перевода в безубыток
                           }  
                         }  
                       }
                    }
            }    

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

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

 
Roman Shiredchenko #:

нашел походу баг в МЕ - в такой конструкции из - за break прерывается не только ближний (вложенный) цикл for ... но и внешний - перебора ордеров - этого быть не должно - т.е.  он

все позы не переводит по модификации СЛ - но выходит из цикла перебора всех поз сразу после модификации крайней позы. Это делаю проверки для реал торгов:

(возможно надо оформлять проверки в виде ф-ии - отдельно - что модификация текущей позиции прошла успешно)

Раньше компилятор выдавал предупреждение при повторном объявлении переменной внутри цикла.

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

Теперь, что бы отловить ошибку приходится тратить кучу времени.

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


ЗЫ. говорят в четвёрке так было всегда.

 
Aleksandr Slavskii #:

Раньше компилятор выдавал предупреждение при повторном объявлении переменной внутри цикла.

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

Теперь, что бы отловить ошибку приходится тратить кучу времени.

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


ЗЫ. говорят в четвёрке так было всегда.

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

Документация по MQL5: Основы языка / Переменные / Область видимости и время жизни переменных
Документация по MQL5: Основы языка / Переменные / Область видимости и время жизни переменных
  • www.mql5.com
Существует два основных вида области видимости: локальная область видимости и глобальная область видимости. Переменная, объявленная вне всех...
 
Artyom Trishkin #:

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

 Вы батенька повторяетесь.

Повторюсь и я. Было нормально. Сделали плохо. 
 
Aleksandr Slavskii #:

Раньше компилятор выдавал предупреждение при повторном объявлении переменной внутри цикла.

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

 
Yuriy Bykov #:
Здравствуйте, похоже, вам нужно пользоваться директивой
#property tester_file "abc.set"
В этом случае файл с этим именем будет автоматически копироваться в папку тестера. Более подробно почитайте в справке и учебнике 

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

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

#property strict

#property script_show_inputs

//#property tester_no_cache

#property tester_file "NameSettings"

#property link "https://www.mql5.com/ru/code/26132&nbsp;   MultiTester - библиотека"

#property link "https://www.mql5.com/ru/code/26223&nbsp;   TesterCache - библиотека"

#property link "https://www.mql5.com/ru/code/16280&nbsp;   TypeToBytes - библиотека"


На этапе компиляции Компилятор запишет в настройках выполняемого модуля объявленные значения.


Строка string NameSettings является переменной и формируется следующим образом:


   Now = TimeLocal();                         // Момент формирования имени для Settings

   TimeToStruct(Now,dt_struct);               // Разложение момента формирования

   string mnth = dt_struct.mon;               // Месяц, день

   string dy = dt_struct.day;


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

   int file_handle=FileOpen("//"+NameSettings,FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI);

   FileWriteString(file_handle,Settings+"\r\n");    / Записывается строка Settings в песочницу Files


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

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

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

 

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

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

//----ФУНКЦИЯ ЗАКРЫТИЯ ОРДЕРА БАЙ НА СЕРЕДИНЕ КАНАЛА НАЧАЛО---------------------------------------------------------------------------------------------+
void f___close_na_centre_buy()
{
double lokal_ma= iMA(Symbol(),
Period_for_work_ma,
 Period_ma,
 0,Metod_ma,
 Price_ma,
 1
     );
     if(Ask== lokal_ma)
     {
    
     for(int i= OrdersTotal(); i >=0;i--)
     {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
     Print("ВЫБРАЛИ ОРДЕР");
     if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magik_number && OrderComment()== Order_comment && OrderType()== OP_BUY)
     {
     Print("ПРОВЕРИЛИ ЧТО ОРДЕР НАШ");
     if(OrderLots()-Close_lot> 0 && OrderLots()-Close_lot>min_lot )
     {
    Print("ПРОВЕРИЛИ ЧТО МОЖНО ЗАКРЫТЬ ЧАСТЬ ОРДЕРА БАЙ");
     if(OrderClose(OrderTicket(), Close_lot,Ask,Slippage,clrBlack))
     {
     Print("\n\nЗАКРЫЛИ НА СЕРЕДИНЕ КАНАЛА ПО ОРЕДУ БАЙ №"+ string(OrderTicket())+ (string)Close_lot+" ЛОТА"+ "В РЫНКЕ ОСТАЛОСЬ "+ (string)OrderLots());
     }
     }
     }
     }
     
     }
     
     
     
     }
     

}
//-----ФУНКЦИЯ ЗАКРЫТИЯ ОРДЕРА БАЙ НА СЕРЕДИНЕ КАНАЛА КОНЕЦ--------------------------------------------------------------------------------------------+


//----ФУНКЦИЯ ЗАКРЫТИЯ ОРДЕРА СЕЛЛ НА СЕРЕДИНЕ КАНАЛА НАЧАЛО---------------------------------------------------------------------------------------------+
void f___close_na_centre_sell()
{
double lokal_ma= iMA(Symbol(),
Period_for_work_ma,
 Period_ma,
 0,Metod_ma,
 Price_ma,
 1
     );
     
      if(Bid== lokal_ma)
     {
    
     for(int i= OrdersTotal(); i >=0;i--)
     {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {Print("ВЫБРАЛИ ОРДЕР");

     if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magik_number && OrderComment()== Order_comment && OrderType()== OP_SELL)
     {
       Print("ПРОВЕРИЛИ ЧТО ОРДЕР СЕЛЛ НАШ");

     if(OrderLots()-Close_lot> 0 && OrderLots()-Close_lot>min_lot ) // ПРОВЕРКА ЧТО МОЖНО ЗАКРЫТЬ ЧАСТЬ ЛОТА ОРДЕРА
     {
       Print("ПРОВЕРИЛИ ЧТО МОЖНО ЗАКРЫТЬ ЧАСТЬ ОРДЕРА СЕЛЛ");

      if(OrderClose(OrderTicket(), Close_lot,Bid,Slippage,clrBlack))
     {
     Print("\n\nЗАКРЫЛИ НА СЕРЕДИНЕ КАНАЛА ПО ОРЕДУ СЕЛЛ №"+ (string)OrderTicket()+(string)Close_lot+" ЛОТА"+ "В РЫНКЕ ОСТАЛОСЬ "+ (string)OrderLots());
     }
     }
     }
     }
     
     }
     
     
     
     }
}
//-----ФУНКЦИЯ ЗАКРЫТИЯ ОРДЕРА СЕЛЛ НА СЕРЕДИНЕ КАНАЛА КОНЕЦ--------------------------------------------------------------------------------------------+

В журнале принтов нету- и не могу понять почему. Подскажите пожалуйста, что делаю не правильно и как это добро поправить чтобы функции начали закрывать часть лота ордера? p/s сами функции я вызвал в он тике- в этом проблемы не должно быть…