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);
}
//+------------------------------------------------------------------+
谢谢你的澄清,Artem!
但还有一个问题。
有时EA会在SL触发后立即开出一个订单。因此,它可以在一支蜡烛上耗尽全部存款。
如何正确指定当前订单关闭后打开下一个订单的延迟?延迟时间应等于蜡烛图时间,并自动计算。
谢谢你!
谢谢你的澄清,Artem!
但还有一个问题。
有时EA会在SL触发后立即开出一个订单。因此,我们可以让整个存款在一支蜡烛上耗尽。
如何正确指定当前订单关闭后开启下一个订单的延迟?延迟时间应等于蜡烛图时间,并自动计算。
谢谢你!
其逻辑如下。
好吧,说实话,我根本没有检查过--我手头没有MT4交易记录--我只是 "跪着 "看着迪米特里的脚本写的......
它是有效的。乍一看,一切似乎都很好,打开/关闭只写不写日期,但我知道如何解决这个问题。非常感谢你。
帮助这个顾问在以前的构建中工作,现在不工作了!!!!
你需要什么帮助?有什么是你自己不能做的吗?
这里有帮助和讨论,但不是无偿的愿望实现。
你需要什么帮助?有什么是你自己不能做的吗?
在这里提供帮助和讨论,但不是无偿地满足愿望
我不明白有什么错误?