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

 
greeng2016:
Как определить из советника, что пришел алерт индикатора ?

Нужен обязательно алерт?

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

Но нужно видеть код, чтобы точнее сказать. Или окно данных ctrl+D со значениями индикатора на баре с алертом.

 
kosmo13:

В приложении к той статье он называеся sHistoryExport.mq5. Компилятор у меня не принимает функции названия которых начинаются с "HistoryDeal.." и идентификаторы начинающиеся с "DEAL_..". Вот код:

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property script_show_inputs

input bool     UseDateFrom = false; // Указывать дату начала
input datetime DateFrom=0; // Дата начала
input bool     UseDateTo=false; // Указывать дату окончания
input datetime DateTo=0; // Дата окончания



//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){

   datetime from,to;
  
   if(UseDateFrom){
      from=DateFrom;
   }
   else{
      from=0;
   }
  
   if(UseDateTo){
      to=DateTo;
   }
   else{
      to=TimeCurrent();
   }  
  
   if(!HistorySelect(from,to)){
      Alert("Ошибка выделение истории");
      return;
   }
  
   string FileName="history.csv";
  
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_CSV,";");
  
   if(h==INVALID_HANDLE){
      Alert("Ошибка открытия файла");
      return;
   }
  
   // первая строка, что бы знать, где что находится
  
   FileWrite(h,"Time","Deal","Order","Symbol","Type","Direction","Volume","Price","Comission","Swap","Profit","Comment");    
   // по всем сделкам

   for(int i=0;i<HistoryDealsTotal();i++){
      ulong ticket=HistoryDealGetTicket(i);
      if(ticket!=0){
        
         long type=HistoryDealGetInteger(ticket,DEAL_TYPE);
        
         if(type==DEAL_TYPE_BUY || type==DEAL_TYPE_SELL){
      
            long entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
      
            FileWrite(h,(datetime)HistoryDealGetInteger(ticket,DEAL_TIME),
                        ticket,
                        HistoryDealGetInteger(ticket,DEAL_ORDER),
                        HistoryDealGetString(ticket,DEAL_SYMBOL),
                        (type==DEAL_TYPE_BUY?"buy":"sell"),
                        (entry==DEAL_ENTRY_IN?"in":(entry==DEAL_ENTRY_OUT?"out":"in/out")),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_VOLUME),2),
                        HistoryDealGetDouble(ticket,DEAL_PRICE),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_COMMISSION),2),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_SWAP),2),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_PROFIT),2),
                        HistoryDealGetString(ticket,DEAL_COMMENT)                    
            );
         }
      }
      else{
         Alert("Ошибка выделения сделки, повторите попытку");
         FileClose(h);
         return;
      }
   }

   FileClose(h);

   Alert("Сохранение выполнено, см. файл "+FileName);  
  
}
//+------------------------------------------------------------------+

Ну, честно говоря, совсем не проверял - нет под рукой истории со сделками МТ4 - просто написал "на коленке" глядя в скрипт Дмитрия...

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property script_show_inputs

input bool     UseDateFrom = false; // Указывать дату начала
input datetime DateFrom=0; // Дата начала
input bool     UseDateTo=false; // Указывать дату окончания
input datetime DateTo=0; // Дата окончания

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){
   //---
   datetime from,to;
   if(UseDateFrom) from=DateFrom;
   else from=0;
   if(UseDateTo) to=DateTo;
   else to=TimeCurrent();
   //---
   string FileName="history.csv";
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_CSV,";");
   if(h==INVALID_HANDLE){
      Alert("Ошибка открытия файла");
      return;
      }
   //--- первая строка, что бы знать, где что находится
   FileWrite(h,"OpenTime","CloseTime","Ticket","Symbol","Type","Volume","OpenPrice","ClosePrice","Comission","Swap","Profit","Comment");    
   //--- по всем сделкам
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
         if(OrderOpenTime()<from)   continue;
         if(OrderOpenTime()>to)     break;
         int type=OrderType();
         if(type>OP_SELL)           continue;
         int dg=(int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
         int ticket=OrderTicket();
         FileWrite(h,(datetime)OrderOpenTime(),
                     (datetime)OrderCloseTime(),
                     ticket,
                     OrderSymbol(),
                     (type==OP_BUY?"buy":"sell"),
                     DoubleToString(OrderLots(),2),
                     DoubleToString(OrderOpenPrice(),dg),
                     DoubleToString(OrderClosePrice(),dg),
                     DoubleToString(OrderCommission(),2),
                     DoubleToString(OrderSwap(),2),
                     DoubleToString(OrderProfit(),2),
                     OrderComment()                  
                   );
         }
      else{
         Alert("Ошибка выделения сделки, повторите попытку");
         FileClose(h);
         return;
         }
      }
   //---
   FileClose(h);
   Alert("Сохранение выполнено, см. файл "+FileName);  
}
//+------------------------------------------------------------------+
 

Спасибо за разъяснения, Артем!

Но есть еще один вопрос.

Иногда советник открывает ордер, сразу после срабатывания СЛ. Таким образом он может слить весь депо на одной свече.

Как правильно прописать задержку открытия следующего ордера, после закрытия текущего ордера? Время задержки должно равняться времени свечи и рассчитываться автоматически.

Спасибо!

 
Viachaslau Baiko:

Спасибо за разъяснения, Артем!

Но есть еще один вопрос.

Иногда советник открывает ордер, сразу после срабатывания СЛ. Таким образом он может слить весь депо на одной свече.

Как правильно прописать задержку открытия следующего ордера, после закрытия текущего ордера? Время задержки должно равняться времени свечи и рассчитываться автоматически.

Спасибо!

Логика такая:

  1. находим последний закрытый ордер по его типу и времени его закрытия
  2. находим бар, на котором он был закрыт, по времени закрытия этого ордера
  3. если полученное значение бара больше ноля, то можно открывать новую позицию, иначе - нет.
 
Artyom Trishkin:

Ну, честно говоря, совсем не проверял - нет под рукой истории со сделками МТ4 - просто написал "на коленке" глядя в скрипт Дмитрия...

Работает. На первый взгляд все вроде нормально, открытие/закрытие только пишет не датой, но это я знаю как исправить. Спасибо огромное.
 
kosmo13:
Работает. На первый взгляд все вроде нормально, открытие/закрытие только пишет не датой, но это я знаю как исправить. Спасибо огромное.
 
Помогите с этим советником на стором билде работал а щас нет!!!!
Файлы:
 
zhas89:
Помогите с этим советником на стором билде работал а щас нет!!!!

В чём нужна помощь? У вас что-то не получается сделать самому?

Здесь помощь и обсуждение, но не безвозмездное исполнение желаний

 
Artyom Trishkin:

В чём нужна помощь? У вас что-то не получается сделать самому?

Здесь помощь и обсуждение, но не безвозмездное исполнение желаний

Я не пойму в чем ошибка?
 
zhas89:
Я не пойму в чем ошибка?
Где искали, что делали, и что у вас при этом получилось?
Причина обращения: