Скачать MetaTrader 5

Записать данные в файл надо как-то по-другому? Помогите, пожалуйста.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey Pototskiy
198
Andrey Pototskiy 2016.06.19 11:55 

Друзья, помогите, плз. Никак не могу разобраться. Хочу, чтобы робот в тестере стратегий записывал в файл csv для статистической обработки информацию по совершенным сделкам: тип ордеров (покупка, продажа), цены открытия, цены закрытия, минимумы цены с открытия до закрытия, максимумы цены с открытия до закрытия.

Но файл не создается.

Что неправильно в коде? Или я не там ищу файл (каталог данных/ MQL4/ эксперты/) ? Вообще-то и поиском его искали везде - нигде  не нашли.

input double   lot                  = 0.2;
input double   TakeProfitPips       = 50;
input double   StopLossPips         = 200;

int bar=0;
int shift=1;
int tiket;
int Handle;
 
datetime          curbar;
datetime          lastbar;
datetime          T=iTime(Symbol(),PERIOD_M1,1);
double   price;
   

bool              New_Bar=false;  

double            Minimum=1.60000,                          
                  Maximum=0.60000,
                  _OrderClosePrice,
                  _OrderOpenPrice;
                  
                        
string            File_Name="excel.xls";                  
                  
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+



int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()

{

   
//+------------------------------------------------------------------+   
   for ( int z = OrdersTotal()-1; z >= 0; z -- )
        {
        
           if (!OrderSelect( z, SELECT_BY_POS, MODE_TRADES )) continue;
      {
               if ( OrderType() == OP_BUY || OrderType() == OP_SELL )
                
                
      if (Low[0]< Minimum)                      // Если < известного
         Minimum = Low[0];                      // то оно и будет мин
      if (High[0]> Maximum)                     // Если > известного
         Maximum = High[0];                     // то оно и будет макс
      
  

      if ( (OrderType() == OP_BUY && OrderClosePrice() - OrderTakeProfit() > - Point/2.0) || (OrderType() == OP_SELL && OrderTakeProfit() - OrderClosePrice() > - Point/2.0) 
        || (OrderType() == OP_BUY && OrderStopLoss () - OrderClosePrice()  > - Point/2.0) || (OrderType() == OP_SELL && OrderClosePrice() - OrderStopLoss ()> - Point/2.0))
                {               
                                                                                
                  Handle=FileOpen(File_Name,FILE_CSV|FILE_READ|FILE_WRITE,";");  // Открытие файла
         		if(Handle>0)                                                   
       
                        {
                        
                           FileSeek(Handle,0,SEEK_END);
                           FileWrite(Handle,OrderType(),OrderOpenPrice(), OrderClosePrice(), Minimum, Maximum);                       //Запись в файл
           		   FileClose(Handle);
                   	}    
                }
 	  }    
   
}                               
//+------------------------------------------------------------------+                                  
 if(new_bar(_Symbol,PERIOD_M1))
 
     {
      if(iTime(Symbol(),PERIOD_M1,1)==D'20.01.2016 10:30')


     
        {
         price=Open[shift];

         tiket=OrderSend(Symbol(),OP_BUYLIMIT,lot,price,3,price-StopLossPips*Point,price+TakeProfitPips*Point);
         if(tiket<0)
           {
            Print("Ошибка OrderSend № - ",GetLastError());
           }
        }

     
     }
    

 } 

//+------------------------------------------------------------------+
bool new_bar(string symbol,ENUM_TIMEFRAMES period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }

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

void OnTick()
  {
//---
    {
   int handle=FileOpen("firstfile.xls",FILE_CSV|FILE_READ|FILE_WRITE,'\t');
   if (handle>0)
   {
    FileSeek(handle, 0, SEEK_END);
    FileWrite(handle,Open[0],High[0],Low[0],Close[0]);
    FileClose(handle);
   }
   else
    Print("Ошибка 1");
   return;
  }
  }

 Как правильно написать код, записывающий в файл нужные данные?

Maxim Dmitrievsky
14798
Maxim Dmitrievsky 2016.06.19 12:12  

ну а расширение файла-то почему .xls, раз .csv создаете

и разделитель не обязательно устанавливать. по умолчанию ; будет 

Alexey Volchanskiy
17140
Alexey Volchanskiy 2016.06.19 12:25  
Andrey Pototskiy:

Друзья, помогите, плз. Никак не могу разобраться. Хочу, чтобы робот в тестере стратегий записывал в файл csv для статистической обработки информацию по совершенным сделкам: тип ордеров (покупка, продажа), цены открытия, цены закрытия, минимумы цены с открытия до закрытия, максимумы цены с открытия до закрытия.

Но файл не создается.

Что неправильно в коде? Или я не там ищу файл (каталог данных/ MQL4/ эксперты/) ? Вообще-то и поиском его искали везде - нигде  не нашли.

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

 Как правильно написать код, записывающий в файл нужные данные?

Не там, он в MQL4\files

Как сказал Максим, расширение должно быть .csv. Вообще говоря, оно может быть любым, но потом Exel не сможет импортировать.

Вот мой код для создания и записи

int LogFileAllOrders = -1;                       // пишет ордера по всем символам

bool OpenLogFiles()
{
    string LogFileName;    
    if(EnableLogAllOrders)
    {
        if(LogFileAllOrders > 0)
             FileClose(LogFileAllOrders);
        if(IsRunOnTester()) // если работаем в тестере
        {
            LogFileName = MQLInfoString(MQL_PROGRAM_NAME) + "_AllOrders" + "_Testing.ord";
            LogFileAllOrders = FileOpen(LogFileName, FILE_CSV | FILE_WRITE, ',');
        }
        else
        {
            LogFileName = MQLInfoString(MQL_PROGRAM_NAME) + "_AllOrders" + ".ord";
            LogFileAllOrders = FileOpen(LogFileName, FILE_CSV | FILE_READ | FILE_WRITE | FILE_SHARE_READ | FILE_SHARE_WRITE, ',');
        }
        
        if(LogFileAllOrders == INVALID_HANDLE)
            Alert("Не могу открыть лог-файл " + LogFileName);
        else    
        {
            Print(LogFileName + " is opened");
            FileSeek(LogFileAllOrders, 0, SEEK_END);
        }    
    }
}

    /*
    write message to log-file
    */
    void WriteMsg(string msg0, int cmd, int orderTicket, string orderSymbol, string msg1)
    {
        string dts = TimeToStr(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
        string op;
        switch (cmd)
        {
        case OP_BUY:        op = "BUY"; break;
        case OP_SELL:       op = "SELL"; break;
        case OP_BUYLIMIT:   op = "BUYLIMIT"; break;
        case OP_BUYSTOP:    op = "BUYSTOP"; break;
        case OP_SELLLIMIT:  op = "SELLLIMIT"; break;
        case OP_SELLSTOP:   op = "SELLSTOP"; break;
        default:            op = "NONE"; break;
        }
        if (LogFileAllOrders> 0)
            FileWrite(LogFileAllOrders, dts, "  " + msg0, "  Ticket= " + IntegerToString(orderTicket), "  " + op, "  " + orderSymbol, "  " + msg1);
    }

Andrey Pototskiy
198
Andrey Pototskiy 2016.06.19 21:50  
Alexey Volchanskiy:

Не там, он в MQL4\files

Как сказал Максим, расширение должно быть .csv. Вообще говоря, оно может быть любым, но потом Exel не сможет импортировать.

Вот мой код для создания и записи

Спасибо. Буду разбираться дальше.
Andrey Pototskiy
198
Andrey Pototskiy 2016.06.19 22:23  

Да, файлы пишет, нашлись они в тестере/файлах.

ЛОгика только у меня неправильная была. Поэтому файл и не создавался )) 

Всем спасибо за поддержку. Буду логику дорабатывать 

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий