inputbool UseDateFrom = false; // Указывать дату начала inputdatetime DateFrom=0; // Дата начала inputbool UseDateTo=false; // Указывать дату окончания inputdatetime DateTo=0; // Дата окончания
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart(){
inputbool UseDateFrom = false; // Указывать дату начала inputdatetime DateFrom=0; // Дата начала inputbool UseDateTo=false; // Указывать дату окончания inputdatetime DateTo=0; // Дата окончания
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart(){ //--- 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); } //+------------------------------------------------------------------+
インジケータの警告が来たことをEAから知るにはどうしたらいいですか?
アラートは必要ですか?
通常、アラートでは何らかのシグナルがバッファに書き込まれますが、その場合、バッファから値を読み出す必要があります。
しかし、正確に伝えるにはコードを見る必要があります。または、データウィンドウの ctrl+Dでバー上のインジケータの値をアラートで表示する。
その記事の付録では、sHistoryExport.mq5と呼ばれています。私のコンパイラは、名前が "HistoryDeal..." で始まる関数と "DEAL_..." で始まる識別子を受け付けない。以下はそのコードです。
#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 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本のロウソクで預金全額を流出させることができます。
現在の注文を閉じてから次の注文を開くまでの遅延時間を正しく指定するにはどうすればよいですか?遅延時間はローソク足の時間と同じで、自動的に計算されるはずです。
ありがとうございました。
アルテムさん、分かりやすい説明ありがとうございます。
しかし、もうひとつ疑問があります。
SLが発動した直後にEAが注文を出すことがあります。このように、1本のロウソクで預金全額を排出させることができます。
現在の注文の終了後、次の注文を開始するまでの遅延時間を正しく指定するにはどうすればよいですか?遅延時間はローソク足の時間と同じで、自動的に計算されるはずです。
ありがとうございました。
ロジックは以下の通りです。
まあ、正直なところ、全く確認していないのですが、MT4の取引履歴が手元にないので、Dimitriさんのスクリプトを見ながら「土下座」して書いただけなのですが......。
効くんです。一見、すべてがうまくいっているように見えますが、開閉は日付ではなく、書き込みのみです。ありがとうございました。
前のビルドで動作していたアドバイザーが、今は動作していません。
お困りのことは何ですか?自分でできないことはないですか?
ここでは、助けや議論はあっても、ありがたい願望実現はありません。
お困りのことは何ですか?自分でできないことはないですか?
このサイトでは、ヘルプやディスカッションを行いますが、無償の願望実現は行いません。
何が間違いなのか理解できないのですが?