Pessoal, eu gostaria de saber como eu faço um função que identifica se o meu Take Profit foi atingido. Eu quero que quando o meu take for atingido o meu robô trave as operações no dia.
Eu fiz dessa forma.
int OnInit(void) { CounterRestart(); return(INIT_SUCCEEDED); } void OnTick(void) { // não pode abir posições if(CounterRead()>=limite) { return; } // pode abrir posições } void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { if(trans.type==TRADE_TRANSACTION_DEAL_ADD) { if(HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_IN || HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_INOUT) { CounterIncrement(); } } } bool CounterIsNewDay(void) { if(!FileIsExist(file_name)) { return true; } int file = FileOpen(file_name,FILE_READ); if(StringFind(FileReadString(file),TimeToString(TimeTradeServer(),TIME_DATE))>=0) { FileClose(file); return false; } FileClose(file); return true; } void CounterCreate(void) { if(FileIsExist(file_name)) { FileDelete(file_name); } int file = FileOpen(file_name,FILE_WRITE|FILE_BIN); FileWriteString(file,TimeToString(TimeTradeServer(),TIME_DATE)); FileClose(file); file = FileOpen(file_count,FILE_WRITE|FILE_BIN); FileWriteInteger(file,0); FileClose(file); } int CounterRead(void) { int file = FileOpen(file_count,FILE_READ|FILE_BIN); int count = FileReadInteger(file); FileClose(file); return count; } int CounterIncrement(void) { CounterRestart(); int count = CounterRead(); FileDelete(file_count); count ++; int file = FileOpen(file_count,FILE_WRITE|FILE_BIN); FileWriteInteger(file,count); FileClose(file); return count; } bool CounterRestart(void) { if(CounterIsNewDay()) { report.Add("é um novo dia! Contador de operações reiniciado! ",TimeToString(TimeTradeServer(),TIME_DATE)); CounterCreate(); return true; } return false; }
No meu caso é pra contar as entradas. Se quiser contar as saídas da operação é só trocar DEAL_ENTRY_IN por DEAL_ENTRY_OUT
Também pode fazer de uma forma mais simples. Somente iterando sobre o histórico de negócios, pegando o negócios na mesma data. Fiz da forma acima por que no meu caso, cada negócio tem que ser avaliado o motivo da realização do negócio. Aí nem todos ENTRY_IN ou INOUT são contados.
Bom dia!
Para testes:
bool TakeProfitActivated() { // datetime time_start = (datetime) (86400*(((ulong)TimeCurrent())/86400)); datetime time_start = iTime(_Symbol, PERIOD_D1, 0); ulong ticket; int cnt; if(HistorySelect(time_start, TimeCurrent())) { for(cnt = HistoryDealsTotal() - 1; cnt >= 0; cnt --) { ticket = HistoryDealGetTicket(cnt); if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(ticket, DEAL_MAGIC) == EA_MAGIC && HistoryDealGetInteger(ticket, DEAL_REASON) == DEAL_REASON_TP) { return(true); } } } else { Print(_Symbol, " - Error getting operations history..."); } return(false); }
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se