Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5
Universal Expert Advisor scheme - biblioteca para MetaTrader 4
- Visualizações:
- 902
- Avaliação:
- Publicado:
- 2016.05.23 10:09
- Atualizado:
- 2016.11.22 07:33
- Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance
De vez em quando tenho uma ideia sobre o desenvolvimento de qualquer nova estratégia e sobre como validar seus resultados no testador de estratégias. Anteriormente, copiava um conselheiro existente, excluía tudo o desnecessário para mim e acrescentava novas coisas, e eventualmente tinha um novo conselheiro. Há algum tempo encontrei uma maneira melhor. Desenvolvi um modelo ou esquema para a maioria dos meus futuros conselheiros. Isso aconteceu quando pensava, por um lado, em aumentar o número de estratégias num conselheiro e, por outro, em alternar entre eles dependendo do período (tendência, instável...). Eu precisava de um esquema que me permitisse combinar todo o "código válido" e todo o "código de estratégias". Assim, eu encontrei este esquema para compartilhar com vocês hoje.
Estrutura básica do conselheiro:
ActionCode - contém um código independente da estratégia que foi implementada no conselheiro
StrategyCode - contém todo o código da estratégia
Todo o que a parte ActionCode deve fazer, é solicito pela parte StrategyCode, que retorna o resultado, que pode ser mais uma vez executado pela parte universal ActionCode.
Parte ActionCode
int _STRATEGY_NUMBER = 1; #define _OPEN_LONG 1 #define _OPEN_SHORT 2 #define _CLOSE_LONG 3 #define _CLOSE_SHORT 4 #define _GET_LONG_STOPLOSS_PRICE 5 #define _GET_SHORT_STOPLOSS_PRICE 6 #define _GET_LONG_TAKEPROFIT_PRICE 7 #define _GET_SHORT_TAKEPROFIT_PRICE 8 #define _GET_LOTS 9 #define _GET_TRAILED_STOPLOSS_PRICE 10 #define _GET_TRAILED_TAKEPROFIT_PRICE 11 #define _GET_TRADED_TIMEFRAME 12 #define _OPEN_PENDING_BUY_STOP 13 #define _OPEN_PENDING_SELL_STOP 14 #define _OPEN_PENDING_BUY_LIMIT 15 #define _OPEN_PENDING_SELL_LIMIT 16 #define _GET_PENDING_BUY_STOP_PRICE 17 #define _GET_PENDING_SELL_STOP_PRICE 18 #define _GET_PENDING_ORDER_EXPIRATION 19 int start() { double Stoploss = 0; double TakeProfit = 0; if(LastBarTraded()) return(0); if(OrdersTotal() > 0) { Stoploss = Strategy(_STRATEGY_NUMBER, _GET_TRAILED_STOPLOSS_PRICE); TakeProfit = Strategy(_STRATEGY_NUMBER, _GET_TRAILED_TAKEPROFIT_PRICE); if(Stoploss != 0 || TakeProfit != 0) ModifyAllPositions(_MAGICNUMBER, Stoploss, TakeProfit); if(Strategy(_STRATEGY_NUMBER, _CLOSE_LONG) == 1) CloseAllLongPositions(_MAGICNUMBER); if(Strategy(_STRATEGY_NUMBER, _CLOSE_SHORT) == 1) CloseAllShortPositions(_MAGICNUMBER); } if(!TradeAllowed(1)) return(0); if(Strategy(_STRATEGY_NUMBER, _OPEN_LONG) == 1) OpenPosition(false, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_LONG_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_TAKEPROFIT_PRICE), 3, _MAGICNUMBER); if(Strategy(_STRATEGY_NUMBER, _OPEN_SHORT) == 1) OpenPosition(true, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_SHORT_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_TAKEPROFIT_PRICE), 3, _MAGICNUMBER); if(Strategy(_STRATEGY_NUMBER, _OPEN_PENDING_BUY_STOP) == 1) OpenPendingPosition(false, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_PENDING_BUY_STOP_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_TAKEPROFIT_PRICE), 3, _MAGICNUMBER, Strategy(_STRATEGY_NUMBER, _GET_PENDING_ORDER_EXPIRATION)); if(Strategy(_STRATEGY_NUMBER, _OPEN_PENDING_SELL_STOP) == 1) OpenPendingPosition(true, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_PENDING_SELL_STOP_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_TAKEPROFIT_PRICE), 3, _MAGICNUMBER, Strategy(_STRATEGY_NUMBER, _GET_PENDING_ORDER_EXPIRATION)); return(0); }
Parte StrategyCode
double Strategy(int STRATEGY, int COMMAND) { switch(STRATEGY) { // pequena descrição da estratégia case 1: { return(Strategy_001(COMMAND)); } // pequena descrição da estratégia case 2: { return(Strategy_002(COMMAND)); } //... // pequena descrição da estratégia case 99: { return(Strategy_099(COMMAND)); } } return(0); } double Strategy_001(int COMMAND) { string _SYMBOL = Symbol(); int _TIMEFRAME = getStrategyTimeframeByNumber(_STRATEGY_TIMEFRAME); double result = 0; int i; switch(COMMAND) { case _OPEN_LONG: { // break; // if(!OpenNewBar()) // break; if(Open long condition is true) result = 1; break; } case _OPEN_SHORT: { // break; // if(!OpenNewBar()) // break; if(Open short condition is true) result = 1; break; } case _CLOSE_LONG: { // break; if(Close long condition is true) result = 1; break; } case _CLOSE_SHORT: { // break; if(Close short condition is true) result = 1; break; } case _GET_LONG_STOPLOSS_PRICE: { // break; result = Long SL price break; } case _GET_SHORT_STOPLOSS_PRICE: { // break; result = Short SL price break; } case _OPEN_PENDING_BUY_STOP: { break; } case _OPEN_PENDING_SELL_STOP: { break; } case _GET_PENDING_BUY_STOP_PRICE: { break; } case _GET_PENDING_SELL_STOP_PRICE: { break; } case _GET_LONG_TAKEPROFIT_PRICE: { break; } case _GET_SHORT_TAKEPROFIT_PRICE: { break; } case _GET_TRAILED_STOPLOSS_PRICE: { break; } case _GET_TRAILED_TAKEPROFIT_PRICE: { break; } case _GET_LOTS: { result = Lot amount; break; } case _GET_TRADED_TIMEFRAME: { result = _TIMEFRAME; break; } case _GET_PENDING_ORDER_EXPIRATION: { break; } } return(result); }
Como podem ver, implementar uma nova estratégia nesse esquema é bem simples. Simplesmente adicione a nova função CASE in Strategy() e a nova função Strategy_NNN()com as regras da estratégia.
Este esquema não é adequado para todas as estratégias, você pode usar somente aqueles que abrem apenas uma posição de cada vez, e tenham um "fluxo de operações" padrão.
Como exemplo, anexei o código pronto com algumas estratégias internas (ver o código anexado).
Espero que muitos de vocês sejam inspirados e, talvez, cheguem a vocês ideias novas para melhorar este conceito.
Traduzido do inglês pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/en/code/8625
outra de peru, que mostra o gráfico de ticks, será útil para os cambistas. há peculiaridades.
Interface do usuário MySQLInterface do usuário para ler e escrever em MySQL.
Outro indicador Fibo.
Ryan_Jones_SMAs setas indicam onde fugir e onde colocar. Se houver uma tendência, esta irá produzir um lucro, se não houver uma tendência, não haverá lucro.