MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 11

 
greeng2016:
インジケータの警告が来たことをEAから知るにはどうしたらいいですか?

アラートは必要ですか?

通常、アラートでは何らかのシグナルがバッファに書き込まれますが、その場合、バッファから値を読み出す必要があります。

しかし、正確に伝えるにはコードを見る必要があります。または、データウィンドウの 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の取引履歴がないので、Dmitryさんのスクリプトを見ながら「膝の上で」書いただけです...。

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

アルテムさん、分かりやすい説明ありがとうございます。

しかし、もうひとつ疑問があります。

SLが発動した直後にEAが注文を出すことがあります。したがって、1本のロウソクで預金全額を流出させることができます。

現在の注文を閉じてから次の注文を開くまでの遅延時間を正しく指定するにはどうすればよいですか?遅延時間はローソク足の時間と同じで、自動的に計算されるはずです。

ありがとうございました。

 
Viachaslau Baiko:

アルテムさん、分かりやすい説明ありがとうございます。

しかし、もうひとつ疑問があります。

SLが発動した直後にEAが注文を出すことがあります。このように、1本のロウソクで預金全額を排出させることができます。

現在の注文の終了後、次の注文を開始するまでの遅延時間を正しく指定するにはどうすればよいですか?遅延時間はローソク足の時間と同じで、自動的に計算されるはずです。

ありがとうございました。

ロジックは以下の通りです。

  1. 最後に決済された注文を、その種類と決済時刻で検索します。
  2. この注文が締め切られるまでに、締め切られたバーが見つかります
  3. バーの取得値がゼロより大きい場合は、新しいポジションを開くことができ、そうでない場合は、ノー。
 
Artyom Trishkin:

まあ、正直なところ、全く確認していないのですが、MT4の取引履歴が手元にないので、Dimitriさんのスクリプトを見ながら「土下座」して書いただけなのですが......。

効くんです。OKのようですが、オープニング/クロージングが間違った日付になってしまいますが、修正方法はわかっています。ありがとうございました。
 
kosmo13:
効くんです。一見、すべてがうまくいっているように見えますが、開閉は日付ではなく、書き込みのみです。ありがとうございました。
 
前のビルドではこのアドバイザーのヘルプが機能したが、今は機能しない!!!!
ファイル:
 
zhas89:
前のビルドで動作していたアドバイザーが、今は動作していません。

お困りのことは何ですか?自分でできないことはないですか?

ここでは、助けや議論はあっても、ありがたい願望実現はありません。

 
Artyom Trishkin:

お困りのことは何ですか?自分でできないことはないですか?

このサイトでは、ヘルプやディスカッションを行いますが、無償の願望実現は行いません。

何が問題なのか理解できないのですが?
 
zhas89:
何が間違いなのか理解できないのですが?
どこを見て、何をし、何を得たのか。