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);  
  
}
//+------------------------------------------------------------------+

글쎄요, 솔직히 말해서 아예 확인도 안하고 - MT4 거래 이력도 손에 없어요 - 그냥 드미트리의 대본을 보고 "무릎 꿇고"라고 썼는데...

#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);  
}
//+------------------------------------------------------------------+
 

설명 감사합니다, Artem!

하지만 질문이 하나 더 있습니다.

때때로 고문은 SL이 실행된 직후에 주문을 엽니다. 따라서 그는 하나의 양초에 전체 저장소를 비울 수 있습니다.

현재 주문을 마감한 후 다음 주문을 열 때 지연을 설정하는 방법은 무엇입니까? 지연 시간은 캔들 시간과 같아야 하며 자동으로 계산됩니다.

고맙습니다!

 
Viachaslau Baiko :

설명 감사합니다, Artem!

하지만 질문이 하나 더 있습니다.

때때로 고문은 SL이 실행된 직후에 주문을 엽니다. 따라서 그는 하나의 양초에 전체 저장소를 비울 수 있습니다.

현재 주문을 마감한 후 다음 주문을 열 때 지연을 설정하는 방법은 무엇입니까? 지연 시간은 캔들 시간과 같아야 하며 자동으로 계산됩니다.

고맙습니다!

논리는 이렇습니다.

  1. 유형 및 마감 시간별로 마지막 마감 주문을 찾습니다.
  2. 이 주문을 마감할 때까지 마감된 바를 찾습니다.
  3. 결과 막대 값이 0보다 크면 새 위치를 열 수 있습니다. 그렇지 않으면 아니요.
 
Artyom Trishkin :

글쎄요, 솔직히 말해서 아예 확인도 안하고 - MT4 거래 이력도 손에 없어요 - 그냥 드미트리의 대본을 보고 "무릎 꿇고"라고 썼는데...

공장. 언뜻 보기엔 다 정상인 것 같고, 여는/닫는 날짜만 다른데 쓰는 방법은 제가 알고 있습니다. 정말 감사합니다.
 
kosmo13 :
공장. 언뜻 보기엔 다 정상인 것 같고, 여는/닫는 날짜만 다른데 쓰는 방법은 제가 알고 있습니다. 정말 감사합니다.
 
세 번째 빌드에서 이 어드바이저를 도와주세요. 작동했지만 지금은 아닙니다!!!!
파일:
 
zhas89 :
세 번째 빌드에서 이 어드바이저를 도와주세요. 작동했지만 지금은 아닙니다!!!!

어떤 도움이 필요합니까? 스스로 뭔가를 할 수 없습니까?

여기에 도움과 토론이 있지만 욕망의 무상 충족은 아닙니다.

 
Artyom Trishkin :

어떤 도움이 필요합니까? 스스로 뭔가를 할 수 없습니까?

여기에 도움과 토론이 있지만 욕망의 무상 충족은 아닙니다.

나는 무엇이 잘못되었는지 이해하지 못한다?
 
zhas89 :
나는 무엇이 잘못되었는지 이해하지 못한다?
어디에서 무엇을 했으며 무엇을 얻었습니까?