Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 442

 

Всем добрый вечер, 

1.

стратегия - бар появился, установка отложенного ордера со стоплоссом и тейкпрофитом (sl, tp), больше ничего.

Допустим, что в текущем баре, спустя время, появится  цена, чтобы ордер сработал, позже наступит цена sl, а потом цена tp .

Проясните, пожалуйста, - при тесте по ценам открытия:  допустим,что цена открытия нового бара = где-нибудь далеко от границ sl и tp. Как происходит расчет?

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

Но: при прогоне в тестере сделки каким-то образом совершаются, срабатывают стопы. Каким же образом? 

 

2.

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

 
Подскажите, пожалуйста, для отработки init() советнику нужен тик?
 
-Aleks-:
Подскажите, пожалуйста, для отработки init() советнику нужен тик?

Нет. Не нужен. Вот код, который поможет увидеть это:

//+------------------------------------------------------------------+
//|                                                  test_expert.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright  "Copyright 2015, MetaQuotes Software Corp."
#property link       "http://www.mql5.com"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 
   Print(__FUNCTION__);
   return(INIT_FAILED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Print(__FUNCTION__);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Print(__FUNCTION__);
  }
//+------------------------------------------------------------------+
Присоедините его на график и увидите какие функции отрабатывают в выходные.
 
-Aleks-:
Подскажите, пожалуйста, для отработки init() советнику нужен тик?
Вроде нет.
 
Karputov Vladimir:

Нет. Не нужен. Вот код, который поможет увидеть это:

Присоедините его на график и увидите какие функции отрабатывают в выходные.
Tapochun:
Вроде нет.
Спасибо за  оперативный ответ. Тогда не пойму, почему не отрабатывает - принта нужного нет..
 
-Aleks-:
Спасибо за  оперативный ответ. Тогда не пойму, почему не отрабатывает - принта нужного нет..
А где стоит у Вас принт? Можно код, для воспроизведения?
 
Karputov Vladimir:
А где стоит у Вас принт? Можно код, для воспроизведения?

Оказалось, что инициализация не происходит при загрузки терминала, но происходит при смене тайм фрейма.

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

Использую класс.

int init()
  {
//Автоматическая настройка
   if(Use_SetupLoad==true)
     {
      CSVReader FileLoads(FileLoadSetup);
      FileLoads.SetDelimiter(';');
      FileLoads.SetCommon(true);
      int StrokaSetup=0;
      if(FileLoads.Load(1))
        {
         PrintFormat("File %s loaded. Total rows=%d, Total columns=%d",FileLoads.FileName(),FileLoads.TotalRows(),FileLoads.TotalColumns());
         
         for (int i=1;i<30; i++)
         //for (int i=1; i<100 || StrokaSetup!=0; i++)
         {
           if (Magic==FileLoads.GetIntValue(i,13))
           {
            StrokaSetup=i ;
            Print ("StrokaSetup=",StrokaSetup);
            break;
            }
         //   if (i==100) i=1;
         //  Print (FileLoads.GetIntValue(i,13));
         }
         /*
         for (int i=1; i<30; i++)
         {
         Print (FileLoads.GetIntValue(i,13));         
         }
         */
         if(StrokaSetup!=0)
           {
            pipsXH=FileLoads.GetIntValue(StrokaSetup,4)/10;
            if (pipsXH>0)
            {
            pMAH=FileLoads.GetIntValue(StrokaSetup,3);
   //         typeMAH=FileLoads.GetIntValue(StrokaSetup,3);
   //         priceMAH=FileLoads.GetIntValue(StrokaSetup,2);
            
  //          if (pipsXH<0)
  //          PrintFormat("pMAH=%d",pMAH,"typeMAH=%d",typeMAH,"priceMAH=%d",priceMAH,"pipsXH=%d",pipsXH);
            }
            else pipsXH=(-1);
            
            pipsXL=FileLoads.GetIntValue(StrokaSetup,7)/10*(-1);
            if (pipsXL>0)
            {
            pMAL=FileLoads.GetIntValue(StrokaSetup,6);
     //       typeMAL=FileLoads.GetIntValue(StrokaSetup,3);
     //       priceMAL=FileLoads.GetIntValue(StrokaSetup,2);
            
      //      PrintFormat("pMAL=%d",pMAL,"typeMAL=%d",typeMAL,"priceMAL=%d",priceMAL,"pipsXL=%d",pipsXL);
            }
            else pipsXL=(-1);
                        
            pMAT=FileLoads.GetIntValue(StrokaSetup,9);
      //      typeMAT=FileLoads.GetIntValue(StrokaSetup,3);
      //      priceMAT=FileLoads.GetIntValue(StrokaSetup,2);
      //      PrintFormat("pMAT=%d",pMAT,"typeMAT=%d",typeMAT,"priceMAT=%d",priceMAT);
            
            lot=FileLoads.GetDoubleValue(StrokaSetup,11);
      //    PrintFormat("pMAH=%d",pMAH,"pipsXH=%d",pipsXH,"pMAL=%d",pMAL,"pipsXL=%d",pipsXL,"lot=%d",lot);            
            Print("Magic=",Magic," pMAH=",pMAH," pipsXH=",pipsXH," pMAL=",pMAL," pipsXL=",pipsXL," lot=",lot);            
            
           }

        }
      else PrintFormat("Error in loading data from %s",FileLoads.FileName());
     }
///Конец автоматической настройки///  
   return(INIT_SUCCEEDED);
  } 

 

кусок класса, отвечающий за чтение файла

//+------------------------------------------------------------------+
//| Load                                                             |
//+------------------------------------------------------------------+
bool CSVReader::Load(int start_line)
  {
   int filehandle=FileOpen(m_filename,FILE_CSV|FILE_READ|FILE_ANSI|FILE_SHARE_READ,'\n');
   if(filehandle==INVALID_HANDLE)
     {
      Alert("Error in open of file ",m_filename,", error",GetLastError());
      return(false);
     }
//---
   int line_index=0;
   while(!FileIsEnding(filehandle))
     {
      string str=FileReadString(filehandle);
      //--- skip 0th row
      if(line_index>=start_line)
         if(str!="")
           {
            if(line_index==1) AddData(str,true);
            else AddData(str,false);
           }
      line_index++;
     }
//---
   FileClose(filehandle);
   return(true);
  } 
 
-Aleks-:

Оказалось, что инициализация не происходит при загрузки терминала, но происходит при смене тайм фрейма.

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

Использую класс.

 

кусок класса, отвечающий за чтение файла

Так в Вашем коде перед принтом очень много проверок и условий. Пройдитесь в режиме отладки и проверьте, что именно не работает.
 
Karputov Vladimir:
Так в Вашем коде перед принтом очень много проверок и условий. Пройдитесь в режиме отладки и проверьте, что именно не работает.
В тестере все работает - но при загрузке терминала принтов нет - это и смутило.
 
-Aleks-:
В тестере все работает - но при загрузке терминала принтов нет - это и смутило.
Значит стоит ещё добавить принтов и проследить куда движется алгоритм.