No apêndice desse artigo, ele se chama sHistoryExport.mq5. Meu compilador não aceita funções cujos nomes começam com "HistoryDeal..." e identificadores que começam com "DEAL_...". Aqui está o código:
inputbool UseDateFrom = false; // Указывать дату начала inputdatetime DateFrom=0; // Дата начала inputbool UseDateTo=false; // Указывать дату окончания inputdatetime DateTo=0; // Дата окончания
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart(){
Para ser honesto, eu não verifiquei nada - não tenho o histórico do MT4 com o comércio à mão - apenas o escrevi "de joelhos" olhando o roteiro de Dmitry...
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); } //+------------------------------------------------------------------+
Às vezes, um EA abre um pedido imediatamente após o SL ter acionado. Assim, ele pode drenar todo o depósito em uma única vela.
Como especificar corretamente o atraso para abrir o próximo pedido após o fechamento do pedido atual? O tempo de atraso deve ser igual ao tempo do castiçal e ser calculado automaticamente.
Às vezes, um EA abre um pedido imediatamente após o acionamento do SL. Assim, podemos deixar que todo o depósito seja drenado em uma única vela.
Como especificar corretamente o atraso para a abertura do próximo pedido após o fechamento do pedido atual? O tempo de atraso deve ser igual ao tempo do castiçal e ser calculado automaticamente.
Obrigado!
A lógica é a seguinte:
encontrar a última ordem fechada por seu tipo e hora de fechamento
Encontramos o bar em que estava fechado quando esta ordem foi fechada
Se o valor obtido da barra for superior a zero, uma nova posição pode ser aberta, caso contrário, não.
Bem, para ser honesto, eu não verifiquei nada - não tenho o histórico do negócio MT4 à mão - apenas o escrevi "de joelhos" olhando para o roteiro de Dimitri...
Funciona. Parece estar tudo bem, mas a abertura/fecho tem data errada, mas eu sei como consertá-lo. Muito obrigado.
Como posso dizer da EA que chegou um alerta indicador?
Você precisa de um alerta?
Normalmente, com um alerta, algum sinal é escrito no buffer, se assim for, você precisa ler o valor do buffer.
Mas você precisa ver o código para dizer exatamente. Ou janela de dados ctrl+D com valores indicadores na barra com alerta.
No apêndice desse artigo, ele se chama sHistoryExport.mq5. Meu compilador não aceita funções cujos nomes começam com "HistoryDeal..." e identificadores que começam com "DEAL_...". Aqui está o código:
#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);
}
//+------------------------------------------------------------------+
Para ser honesto, eu não verifiquei nada - não tenho o histórico do MT4 com o comércio à mão - apenas o escrevi "de joelhos" olhando o roteiro de 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);
}
//+------------------------------------------------------------------+
Obrigado pelo esclarecimento, Artem!
Mas há mais uma pergunta.
Às vezes, um EA abre um pedido imediatamente após o SL ter acionado. Assim, ele pode drenar todo o depósito em uma única vela.
Como especificar corretamente o atraso para abrir o próximo pedido após o fechamento do pedido atual? O tempo de atraso deve ser igual ao tempo do castiçal e ser calculado automaticamente.
Obrigado!
Obrigado pelo esclarecimento, Artem!
Mas há mais uma pergunta.
Às vezes, um EA abre um pedido imediatamente após o acionamento do SL. Assim, podemos deixar que todo o depósito seja drenado em uma única vela.
Como especificar corretamente o atraso para a abertura do próximo pedido após o fechamento do pedido atual? O tempo de atraso deve ser igual ao tempo do castiçal e ser calculado automaticamente.
Obrigado!
A lógica é a seguinte:
Bem, para ser honesto, eu não verifiquei nada - não tenho o histórico do negócio MT4 à mão - apenas o escrevi "de joelhos" olhando para o roteiro de Dimitri...
Funciona. À primeira vista tudo parece bem, abrir/fechar apenas escreve não a data, mas eu sei como consertar isso. Muito obrigado.
Ajuda com este assessor na construção anterior funcionou e agora não!!!!
Com o que você precisa de ajuda? Há alguma coisa que você não possa fazer você mesmo?
Há ajuda e discussão aqui, mas não a satisfação de desejos gratuitos
Com o que você precisa de ajuda? Há alguma coisa que você não possa fazer você mesmo?
Ajuda e discussão aqui, mas não a satisfação de desejos gratuitos
Eu não entendo qual é o erro?