Claro! Vamos explicar o código detalhadamente, com foco em cada parte e função para garantir que você compreenda como tudo funciona.
1. Importação de Bibliotecas
<span>import</span> <span>MetaTrader5</span> <span>as</span> <span>mt5</span><span>import</span> <span>time</span><span>from</span> <span>datetime</span> <span>import</span> <span>datetime</span><span>import</span> <span>signal</span><span>import</span> <span>sys</span><span>import</span> <span>MetaTrader5</span> <span>as</span> <span>mt5</span> <span>import</span> <span>time</span> <span>from</span> <span>datetime</span> <span>import</span> <span>datetime</span> <span>import</span> <span>signal</span> <span>import</span> <span>sys</span>import MetaTrader5 as mt5 import time from datetime import datetime import signal import sys
Enter fullscreen mode Exit fullscreen mode
- MetaTrader5 (mt5): A biblioteca
MetaTrader5
permite interagir com a plataforma MetaTrader 5 para automatizar operações de trading, como enviar ordens de compra e venda, obter cotações, etc. - time: Para realizar pausas no código, como aguardar até o momento de enviar uma ordem ou fazer verificações periódicas.
- datetime: Usada para trabalhar com datas e horários. Neste código, é essencial para controlar quando as ordens serão enviadas e quando o programa irá encerrar.
- signal: Permite capturar sinais do sistema operacional, como o
Ctrl+C
(usado para interromper a execução do programa). - sys: Usado para interagir com o sistema, como finalizar o programa caso algo dê errado (ex:
sys.exit()
).
2. Controle de Execução com o Sinal Ctrl+C
<span>running</span> <span>=</span> <span>True</span><span>def</span> <span>signal_handler</span><span>(</span><span>sig</span><span>,</span> <span>frame</span><span>):</span><span>global</span> <span>running</span><span>print</span><span>(</span><span>"</span><span>\n</span><span>Interrompendo o programa...</span><span>"</span><span>)</span><span>running</span> <span>=</span> <span>False</span><span>signal</span><span>.</span><span>signal</span><span>(</span><span>signal</span><span>.</span><span>SIGINT</span><span>,</span> <span>signal_handler</span><span>)</span><span>running</span> <span>=</span> <span>True</span> <span>def</span> <span>signal_handler</span><span>(</span><span>sig</span><span>,</span> <span>frame</span><span>):</span> <span>global</span> <span>running</span> <span>print</span><span>(</span><span>"</span><span>\n</span><span>Interrompendo o programa...</span><span>"</span><span>)</span> <span>running</span> <span>=</span> <span>False</span> <span>signal</span><span>.</span><span>signal</span><span>(</span><span>signal</span><span>.</span><span>SIGINT</span><span>,</span> <span>signal_handler</span><span>)</span>running = True def signal_handler(sig, frame): global running print("\nInterrompendo o programa...") running = False signal.signal(signal.SIGINT, signal_handler)
Enter fullscreen mode Exit fullscreen mode
- A variável
running
é usada para controlar se o programa deve continuar executando ou não. - O manipulador
signal_handler
captura o sinalSIGINT
(gerado peloCtrl+C
) e altera o valor derunning
paraFalse
, o que interrompe o loop principal do programa.
3. Configuração de Conexão com o MetaTrader 5
<span>login</span> <span>=</span> <span>101108</span><span>password</span> <span>=</span> <span>"</span><span>Jesuse10!</span><span>"</span><span>server</span> <span>=</span> <span>"</span><span>EquitiBrokerageSC-Demo</span><span>"</span><span>mt5_path</span> <span>=</span> <span>r</span><span>"</span><span>C:\Program Files\Equiti Group MetaTrader 5 Terminal\terminal64.exe</span><span>"</span><span>login</span> <span>=</span> <span>101108</span> <span>password</span> <span>=</span> <span>"</span><span>Jesuse10!</span><span>"</span> <span>server</span> <span>=</span> <span>"</span><span>EquitiBrokerageSC-Demo</span><span>"</span> <span>mt5_path</span> <span>=</span> <span>r</span><span>"</span><span>C:\Program Files\Equiti Group MetaTrader 5 Terminal\terminal64.exe</span><span>"</span>login = 101108 password = "Jesuse10!" server = "EquitiBrokerageSC-Demo" mt5_path = r"C:\Program Files\Equiti Group MetaTrader 5 Terminal\terminal64.exe"
Enter fullscreen mode Exit fullscreen mode
Essas variáveis contêm as credenciais e o caminho do MetaTrader 5. Elas são usadas para conectar o script à sua conta no MetaTrader:
- login: O número de login da sua conta no MetaTrader.
- password: A senha associada ao login.
- server: O servidor da corretora.
- mt5_path: O caminho para o arquivo executável do MetaTrader 5, necessário para inicializar a conexão.
4. Função get_symbol_info
<span>def</span> <span>get_symbol_info</span><span>(</span><span>symbol</span><span>):</span><span>info</span> <span>=</span> <span>mt5</span><span>.</span><span>symbol_info</span><span>(</span><span>symbol</span><span>)</span><span>if</span> <span>info</span> <span>is</span> <span>None</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Falha ao obter informações do símbolo </span><span>{</span><span>symbol</span><span>}</span><span>"</span><span>)</span><span>return</span> <span>None</span><span>return</span> <span>info</span><span>def</span> <span>get_symbol_info</span><span>(</span><span>symbol</span><span>):</span> <span>info</span> <span>=</span> <span>mt5</span><span>.</span><span>symbol_info</span><span>(</span><span>symbol</span><span>)</span> <span>if</span> <span>info</span> <span>is</span> <span>None</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Falha ao obter informações do símbolo </span><span>{</span><span>symbol</span><span>}</span><span>"</span><span>)</span> <span>return</span> <span>None</span> <span>return</span> <span>info</span>def get_symbol_info(symbol): info = mt5.symbol_info(symbol) if info is None: print(f"Falha ao obter informações do símbolo {symbol}") return None return info
Enter fullscreen mode Exit fullscreen mode
Esta função busca informações sobre o símbolo (ativo) que você quer negociar, como:
- Preço atual, preço de abertura, pontos, etc.
- Se não conseguir obter as informações, retorna
None
.
5. Funções para Ajustar Preço
<span>def</span> <span>round_price</span><span>(</span><span>price</span><span>,</span> <span>digits</span><span>):</span><span>return</span> <span>round</span><span>(</span><span>price</span><span>,</span> <span>digits</span><span>)</span><span>def</span> <span>align_price_to_tick</span><span>(</span><span>price</span><span>,</span> <span>tick_size</span><span>):</span><span>return</span> <span>round</span><span>(</span><span>price</span> <span>/</span> <span>tick_size</span><span>)</span> <span>*</span> <span>tick_size</span><span>def</span> <span>round_price</span><span>(</span><span>price</span><span>,</span> <span>digits</span><span>):</span> <span>return</span> <span>round</span><span>(</span><span>price</span><span>,</span> <span>digits</span><span>)</span> <span>def</span> <span>align_price_to_tick</span><span>(</span><span>price</span><span>,</span> <span>tick_size</span><span>):</span> <span>return</span> <span>round</span><span>(</span><span>price</span> <span>/</span> <span>tick_size</span><span>)</span> <span>*</span> <span>tick_size</span>def round_price(price, digits): return round(price, digits) def align_price_to_tick(price, tick_size): return round(price / tick_size) * tick_size
Enter fullscreen mode Exit fullscreen mode
- round_price: Arredonda o preço para um número de casas decimais específico (dependendo do ativo).
- align_price_to_tick: Alinha o preço ao tamanho do tick (o menor movimento possível do preço). Isso é necessário para garantir que o preço esteja de acordo com o formato aceito pela corretora.
6. Função send_order
<span>def</span> <span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>order_type</span><span>,</span> <span>lot</span><span>,</span> <span>price</span><span>,</span> <span>sl</span><span>,</span> <span>tp</span><span>):</span><span>...</span><span>result</span> <span>=</span> <span>mt5</span><span>.</span><span>order_send</span><span>(</span><span>request</span><span>)</span><span>...</span><span>return</span> <span>result</span><span>def</span> <span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>order_type</span><span>,</span> <span>lot</span><span>,</span> <span>price</span><span>,</span> <span>sl</span><span>,</span> <span>tp</span><span>):</span> <span>...</span> <span>result</span> <span>=</span> <span>mt5</span><span>.</span><span>order_send</span><span>(</span><span>request</span><span>)</span> <span>...</span> <span>return</span> <span>result</span>def send_order(symbol, order_type, lot, price, sl, tp): ... result = mt5.order_send(request) ... return result
Enter fullscreen mode Exit fullscreen mode
Essa função envia a ordem de compra ou venda para o MetaTrader. Ela aceita:
- symbol: O símbolo (ativo) que você deseja negociar.
- order_type: O tipo de ordem (exemplo: compra ou venda pendente).
- lot: O tamanho do lote (quantidade de ativos a serem comprados ou vendidos).
- price: O preço da ordem.
- sl: O nível de stop loss.
- tp: O nível de take profit.
A função cria uma solicitação (request
) com todas as configurações necessárias para enviar a ordem, e então chama mt5.order_send(request)
para efetivamente enviar a ordem para a plataforma MetaTrader 5.
7. Função get_current_candle
<span>def</span> <span>get_current_candle</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>):</span><span>rates</span> <span>=</span> <span>mt5</span><span>.</span><span>copy_rates_from_pos</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>,</span> <span>0</span><span>,</span> <span>1</span><span>)</span><span>if</span> <span>rates</span> <span>is</span> <span>None</span> <span>or</span> <span>len</span><span>(</span><span>rates</span><span>)</span> <span>==</span> <span>0</span><span>:</span><span>return</span> <span>None</span><span>return</span> <span>rates</span><span>[</span><span>0</span><span>]</span><span>def</span> <span>get_current_candle</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>):</span> <span>rates</span> <span>=</span> <span>mt5</span><span>.</span><span>copy_rates_from_pos</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>,</span> <span>0</span><span>,</span> <span>1</span><span>)</span> <span>if</span> <span>rates</span> <span>is</span> <span>None</span> <span>or</span> <span>len</span><span>(</span><span>rates</span><span>)</span> <span>==</span> <span>0</span><span>:</span> <span>return</span> <span>None</span> <span>return</span> <span>rates</span><span>[</span><span>0</span><span>]</span>def get_current_candle(symbol, timeframe): rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, 1) if rates is None or len(rates) == 0: return None return rates[0]
Enter fullscreen mode Exit fullscreen mode
Essa função busca a última vela (candle) de um determinado ativo. Ela usa o timeframe para determinar o intervalo de tempo entre cada vela (por exemplo, 5 minutos). A função retorna a última vela (com dados como preço de abertura, fechamento, máxima, mínima).
8. Função cancel_pending_orders
<span>def</span> <span>cancel_pending_orders</span><span>():</span><span>orders</span> <span>=</span> <span>mt5</span><span>.</span><span>orders_get</span><span>(</span><span>symbol</span><span>=</span><span>symbol</span><span>)</span><span>...</span><span>result</span> <span>=</span> <span>mt5</span><span>.</span><span>order_send</span><span>(</span><span>request</span><span>)</span> <span># Enviar o pedido para cancelar a ordem </span><span>def</span> <span>cancel_pending_orders</span><span>():</span> <span>orders</span> <span>=</span> <span>mt5</span><span>.</span><span>orders_get</span><span>(</span><span>symbol</span><span>=</span><span>symbol</span><span>)</span> <span>...</span> <span>result</span> <span>=</span> <span>mt5</span><span>.</span><span>order_send</span><span>(</span><span>request</span><span>)</span> <span># Enviar o pedido para cancelar a ordem </span>def cancel_pending_orders(): orders = mt5.orders_get(symbol=symbol) ... result = mt5.order_send(request) # Enviar o pedido para cancelar a ordem
Enter fullscreen mode Exit fullscreen mode
Essa função cancela todas as ordens pendentes de tipo BUY_STOP ou SELL_STOP para o símbolo especificado. A função verifica se há ordens pendentes e, caso existam, envia uma solicitação para cancelá-las.
9. Função main_loop
(Loop Principal)
<span>def</span> <span>main_loop</span><span>():</span><span>global</span> <span>running</span><span>ordem_executada</span> <span>=</span> <span>False</span><span>while</span> <span>running</span> <span>and</span> <span>not</span> <span>ordem_executada</span><span>:</span><span>try</span><span>:</span><span>current_time</span> <span>=</span> <span>datetime</span><span>.</span><span>now</span><span>()</span><span># Define o horário alvo para as ordens </span> <span>target_time</span> <span>=</span> <span>current_time</span><span>.</span><span>replace</span><span>(</span><span>hour</span><span>=</span><span>execution_hour</span><span>,</span> <span>minute</span><span>=</span><span>execution_minute</span><span>,</span> <span>second</span><span>=</span><span>execution_second</span><span>,</span> <span>microsecond</span><span>=</span><span>0</span><span>)</span><span>if</span> <span>current_time</span> <span><</span> <span>target_time</span><span>:</span><span>sleep_time</span> <span>=</span> <span>(</span><span>target_time</span> <span>-</span> <span>current_time</span><span>).</span><span>total_seconds</span><span>()</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Aguardando até </span><span>{</span><span>target_time</span><span>.</span><span>strftime</span><span>(</span><span>'</span><span>%H</span><span>:</span><span>%</span><span>M</span><span>:</span><span>%</span><span>S</span><span>'</span><span>)</span><span>}</span><span> para enviar ordens...</span><span>"</span><span>)</span><span>time</span><span>.</span><span>sleep</span><span>(</span><span>sleep_time</span><span>)</span><span>current_candle</span> <span>=</span> <span>get_current_candle</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>)</span><span>if</span> <span>current_candle</span> <span>is</span> <span>None</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Erro ao obter candle atual.</span><span>"</span><span>)</span><span>continue</span><span>symbol_info</span> <span>=</span> <span>get_symbol_info</span><span>(</span><span>symbol</span><span>)</span><span>if</span> <span>symbol_info</span> <span>is</span> <span>None</span><span>:</span><span>continue</span><span>point</span> <span>=</span> <span>symbol_info</span><span>.</span><span>point</span><span>digits</span> <span>=</span> <span>symbol_info</span><span>.</span><span>digits</span><span>tick_size</span> <span>=</span> <span>symbol_info</span><span>.</span><span>trade_tick_size</span><span>buy_price</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>current_candle</span><span>[</span><span>'</span><span>high</span><span>'</span><span>]</span> <span>+</span> <span>offset_pips_buy</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>sell_price</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>current_candle</span><span>[</span><span>'</span><span>low</span><span>'</span><span>]</span> <span>-</span> <span>offset_pips_sell</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>sl_buy</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>buy_price</span> <span>-</span> <span>sl_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>tp_buy</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>buy_price</span> <span>+</span> <span>tp_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>sl_sell</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>sell_price</span> <span>+</span> <span>sl_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>tp_sell</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>sell_price</span> <span>-</span> <span>tp_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_BUY_STOP</span><span>,</span> <span>lot</span><span>,</span> <span>buy_price</span><span>,</span> <span>sl_buy</span><span>,</span> <span>tp_buy</span><span>)</span><span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_SELL_STOP</span><span>,</span> <span>lot</span><span>,</span> <span>sell_price</span><span>,</span> <span>sl_sell</span><span>,</span> <span>tp_sell</span><span>)</span><span>ordem_executada</span> <span>=</span> <span>True</span><span>shutdown_time</span> <span>=</span> <span>current_time</span><span>.</span><span>replace</span><span>(</span><span>hour</span><span>=</span><span>shutdown_hour</span><span>,</span> <span>minute</span><span>=</span><span>shutdown_minute</span><span>,</span> <span>second</span><span>=</span><span>shutdown_second</span><span>,</span> <span>microsecond</span><span>=</span><span>0</span><span>)</span><span>while</span> <span>running</span> <span>and</span> <span>datetime</span><span>.</span><span>now</span><span>()</span> <span><</span> <span>shutdown_time</span><span>:</span><span>time</span><span>.</span><span>sleep</span><span>(</span><span>1</span><span>)</span><span>cancel_pending_orders</span><span>()</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Todas as ordens pendentes foram canceladas.</span><span>"</span><span>)</span><span>time</span><span>.</span><span>sleep</span><span>(</span><span>60</span><span>)</span><span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Erro no loop principal: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span><span>time</span><span>.</span><span>sleep</span><span>(</span><span>1</span><span>)</span><span>def</span> <span>main_loop</span><span>():</span> <span>global</span> <span>running</span> <span>ordem_executada</span> <span>=</span> <span>False</span> <span>while</span> <span>running</span> <span>and</span> <span>not</span> <span>ordem_executada</span><span>:</span> <span>try</span><span>:</span> <span>current_time</span> <span>=</span> <span>datetime</span><span>.</span><span>now</span><span>()</span> <span># Define o horário alvo para as ordens </span> <span>target_time</span> <span>=</span> <span>current_time</span><span>.</span><span>replace</span><span>(</span><span>hour</span><span>=</span><span>execution_hour</span><span>,</span> <span>minute</span><span>=</span><span>execution_minute</span><span>,</span> <span>second</span><span>=</span><span>execution_second</span><span>,</span> <span>microsecond</span><span>=</span><span>0</span><span>)</span> <span>if</span> <span>current_time</span> <span><</span> <span>target_time</span><span>:</span> <span>sleep_time</span> <span>=</span> <span>(</span><span>target_time</span> <span>-</span> <span>current_time</span><span>).</span><span>total_seconds</span><span>()</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Aguardando até </span><span>{</span><span>target_time</span><span>.</span><span>strftime</span><span>(</span><span>'</span><span>%H</span><span>:</span><span>%</span><span>M</span><span>:</span><span>%</span><span>S</span><span>'</span><span>)</span><span>}</span><span> para enviar ordens...</span><span>"</span><span>)</span> <span>time</span><span>.</span><span>sleep</span><span>(</span><span>sleep_time</span><span>)</span> <span>current_candle</span> <span>=</span> <span>get_current_candle</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>)</span> <span>if</span> <span>current_candle</span> <span>is</span> <span>None</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Erro ao obter candle atual.</span><span>"</span><span>)</span> <span>continue</span> <span>symbol_info</span> <span>=</span> <span>get_symbol_info</span><span>(</span><span>symbol</span><span>)</span> <span>if</span> <span>symbol_info</span> <span>is</span> <span>None</span><span>:</span> <span>continue</span> <span>point</span> <span>=</span> <span>symbol_info</span><span>.</span><span>point</span> <span>digits</span> <span>=</span> <span>symbol_info</span><span>.</span><span>digits</span> <span>tick_size</span> <span>=</span> <span>symbol_info</span><span>.</span><span>trade_tick_size</span> <span>buy_price</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>current_candle</span><span>[</span><span>'</span><span>high</span><span>'</span><span>]</span> <span>+</span> <span>offset_pips_buy</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>sell_price</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>current_candle</span><span>[</span><span>'</span><span>low</span><span>'</span><span>]</span> <span>-</span> <span>offset_pips_sell</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>sl_buy</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>buy_price</span> <span>-</span> <span>sl_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>tp_buy</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>buy_price</span> <span>+</span> <span>tp_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>sl_sell</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>sell_price</span> <span>+</span> <span>sl_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>tp_sell</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>sell_price</span> <span>-</span> <span>tp_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_BUY_STOP</span><span>,</span> <span>lot</span><span>,</span> <span>buy_price</span><span>,</span> <span>sl_buy</span><span>,</span> <span>tp_buy</span><span>)</span> <span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_SELL_STOP</span><span>,</span> <span>lot</span><span>,</span> <span>sell_price</span><span>,</span> <span>sl_sell</span><span>,</span> <span>tp_sell</span><span>)</span> <span>ordem_executada</span> <span>=</span> <span>True</span> <span>shutdown_time</span> <span>=</span> <span>current_time</span><span>.</span><span>replace</span><span>(</span><span>hour</span><span>=</span><span>shutdown_hour</span><span>,</span> <span>minute</span><span>=</span><span>shutdown_minute</span><span>,</span> <span>second</span><span>=</span><span>shutdown_second</span><span>,</span> <span>microsecond</span><span>=</span><span>0</span><span>)</span> <span>while</span> <span>running</span> <span>and</span> <span>datetime</span><span>.</span><span>now</span><span>()</span> <span><</span> <span>shutdown_time</span><span>:</span> <span>time</span><span>.</span><span>sleep</span><span>(</span><span>1</span><span>)</span> <span>cancel_pending_orders</span><span>()</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Todas as ordens pendentes foram canceladas.</span><span>"</span><span>)</span> <span>time</span><span>.</span><span>sleep</span><span>(</span><span>60</span><span>)</span> <span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Erro no loop principal: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span> <span>time</span><span>.</span><span>sleep</span><span>(</span><span>1</span><span>)</span>def main_loop(): global running ordem_executada = False while running and not ordem_executada: try: current_time = datetime.now() # Define o horário alvo para as ordens target_time = current_time.replace(hour=execution_hour, minute=execution_minute, second=execution_second, microsecond=0) if current_time < target_time: sleep_time = (target_time - current_time).total_seconds() print(f"Aguardando até {target_time.strftime('%H:%M:%S')} para enviar ordens...") time.sleep(sleep_time) current_candle = get_current_candle(symbol, timeframe) if current_candle is None: print(f"[{datetime.now()}] Erro ao obter candle atual.") continue symbol_info = get_symbol_info(symbol) if symbol_info is None: continue point = symbol_info.point digits = symbol_info.digits tick_size = symbol_info.trade_tick_size buy_price = align_price_to_tick(round_price(current_candle['high'] + offset_pips_buy * point, digits), tick_size) sell_price = align_price_to_tick(round_price(current_candle['low'] - offset_pips_sell * point, digits), tick_size) sl_buy = align_price_to_tick(round_price(buy_price - sl_pips * point, digits), tick_size) tp_buy = align_price_to_tick(round_price(buy_price + tp_pips * point, digits), tick_size) sl_sell = align_price_to_tick(round_price(sell_price + sl_pips * point, digits), tick_size) tp_sell = align_price_to_tick(round_price(sell_price - tp_pips * point, digits), tick_size) send_order(symbol, mt5.ORDER_TYPE_BUY_STOP, lot, buy_price, sl_buy, tp_buy) send_order(symbol, mt5.ORDER_TYPE_SELL_STOP, lot, sell_price, sl_sell, tp_sell) ordem_executada = True shutdown_time = current_time.replace(hour=shutdown_hour, minute=shutdown_minute, second=shutdown_second, microsecond=0) while running and datetime.now() < shutdown_time: time.sleep(1) cancel_pending_orders() print(f"[{datetime.now()}] Todas as ordens pendentes foram canceladas.") time.sleep(60) except Exception as e: print(f"Erro no loop principal: {e}") time.sleep(1)
Enter fullscreen mode Exit fullscreen mode
- main_loop é a função central onde o código passa a maior parte do tempo, executando as operações de acordo com os horários definidos e verificando as condições para enviar ordens.
- O código fica aguardando até o horário
execution_hour
,execution_minute
, eexecution_second
para enviar as ordens. - Depois de enviar as ordens, ele aguarda até o horário de shutdown e então cancela as ordens pendentes.
- A função também verifica a conta de tempos em tempos, aguardando 1 minuto entre as verificações de saldo.
10. Execução Principal do Código
<span># Executa o loop principal </span><span>try</span><span>:</span><span>main_loop</span><span>()</span><span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Ocorreu um erro: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span><span>finally</span><span>:</span><span># Desconecta do MetaTrader 5 </span> <span>mt5</span><span>.</span><span>shutdown</span><span>()</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Desconectado do MetaTrader 5.</span><span>"</span><span>)</span><span># Executa o loop principal </span><span>try</span><span>:</span> <span>main_loop</span><span>()</span> <span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Ocorreu um erro: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span> <span>finally</span><span>:</span> <span># Desconecta do MetaTrader 5 </span> <span>mt5</span><span>.</span><span>shutdown</span><span>()</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Desconectado do MetaTrader 5.</span><span>"</span><span>)</span># Executa o loop principal try: main_loop() except Exception as e: print(f"Ocorreu um erro: {e}") finally: # Desconecta do MetaTrader 5 mt5.shutdown() print(f"[{datetime.now()}] Desconectado do MetaTrader 5.")
Enter fullscreen mode Exit fullscreen mode
Aqui, a função main_loop
é chamada. Caso ocorra algum erro, ele é capturado pela exceção except
, e a conexão com o MetaTrader é finalizada com mt5.shutdown()
.
Conclusão:
Este código é um exemplo de um Expert Advisor (EA) automatizado para o MetaTrader 5, que realiza operações de compra e venda com base no horário e nos preços dos candles. O programa se conecta ao Meta
<span>import</span> <span>MetaTrader5</span> <span>as</span> <span>mt5</span><span>import</span> <span>time</span><span>from</span> <span>datetime</span> <span>import</span> <span>datetime</span><span>import</span> <span>signal</span><span>import</span> <span>sys</span><span># Variável global para controlar a execução </span><span>running</span> <span>=</span> <span>True</span><span>def</span> <span>signal_handler</span><span>(</span><span>sig</span><span>,</span> <span>frame</span><span>):</span><span>global</span> <span>running</span><span>print</span><span>(</span><span>"</span><span>\n</span><span>Interrompendo o programa...</span><span>"</span><span>)</span><span>running</span> <span>=</span> <span>False</span><span># Configurar o manipulador de sinal para Ctrl+C </span><span>signal</span><span>.</span><span>signal</span><span>(</span><span>signal</span><span>.</span><span>SIGINT</span><span>,</span> <span>signal_handler</span><span>)</span><span># Variáveis de configuração do MetaTrader 5 </span><span>login</span> <span>=</span> <span>101108</span><span>password</span> <span>=</span> <span>"</span><span>Jesuse10!</span><span>"</span><span>server</span> <span>=</span> <span>"</span><span>EquitiBrokerageSC-Demo</span><span>"</span><span>mt5_path</span> <span>=</span> <span>r</span><span>"</span><span>C:\Program Files\Equiti Group MetaTrader 5 Terminal\terminal64.exe</span><span>"</span><span># Conecta ao MetaTrader 5 com as credenciais </span><span>print</span><span>(</span><span>"</span><span>Tentando conectar ao MetaTrader 5...</span><span>"</span><span>)</span><span>if</span> <span>not</span> <span>mt5</span><span>.</span><span>initialize</span><span>(</span><span>login</span><span>=</span><span>login</span><span>,</span> <span>password</span><span>=</span><span>password</span><span>,</span> <span>server</span><span>=</span><span>server</span><span>,</span> <span>path</span><span>=</span><span>mt5_path</span><span>):</span><span>print</span><span>(</span><span>"</span><span>Erro ao inicializar MT5. Verifique suas credenciais e tente novamente.</span><span>"</span><span>)</span><span>sys</span><span>.</span><span>exit</span><span>(</span><span>1</span><span>)</span><span>else</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Conectado ao MT5 na conta </span><span>{</span><span>login</span><span>}</span><span> com sucesso!</span><span>"</span><span>)</span><span># Defina as configurações </span><span>symbol</span> <span>=</span> <span>"</span><span>US30Roll</span><span>"</span><span>lot</span> <span>=</span> <span>40.00</span><span>sl_pips</span> <span>=</span> <span>2500</span><span>tp_pips</span> <span>=</span> <span>3500</span><span>offset_pips_buy</span> <span>=</span> <span>320</span> <span># Mantém 320 pipetes para buy stop </span><span>offset_pips_sell</span> <span>=</span> <span>80</span> <span># Altera para 50 pipetes para sell stop </span><span>timeframe</span> <span>=</span> <span>mt5</span><span>.</span><span>TIMEFRAME_M5</span> <span># Alterado para 5 minutos </span><span># Variável do horário específico (alterável facilmente) </span><span>execution_hour</span> <span>=</span> <span>11</span><span>execution_minute</span> <span>=</span> <span>29</span><span>execution_second</span> <span>=</span> <span>59</span><span># Variável do horário de desligamento (alterável facilmente) </span><span>shutdown_hour</span> <span>=</span> <span>11</span><span>shutdown_minute</span> <span>=</span> <span>30</span><span>shutdown_second</span> <span>=</span> <span>59</span><span># Função para obter informações do símbolo </span><span>def</span> <span>get_symbol_info</span><span>(</span><span>symbol</span><span>):</span><span>info</span> <span>=</span> <span>mt5</span><span>.</span><span>symbol_info</span><span>(</span><span>symbol</span><span>)</span><span>if</span> <span>info</span> <span>is</span> <span>None</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Falha ao obter informações do símbolo </span><span>{</span><span>symbol</span><span>}</span><span>"</span><span>)</span><span>return</span> <span>None</span><span>return</span> <span>info</span><span># Arredondar o preço de acordo com o número de dígitos </span><span>def</span> <span>round_price</span><span>(</span><span>price</span><span>,</span> <span>digits</span><span>):</span><span>return</span> <span>round</span><span>(</span><span>price</span><span>,</span> <span>digits</span><span>)</span><span># Alinhar o preço ao tamanho do tick </span><span>def</span> <span>align_price_to_tick</span><span>(</span><span>price</span><span>,</span> <span>tick_size</span><span>):</span><span>return</span> <span>round</span><span>(</span><span>price</span> <span>/</span> <span>tick_size</span><span>)</span> <span>*</span> <span>tick_size</span><span># Enviar a ordem de compra ou venda </span><span>def</span> <span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>order_type</span><span>,</span> <span>lot</span><span>,</span> <span>price</span><span>,</span> <span>sl</span><span>,</span> <span>tp</span><span>):</span><span>try</span><span>:</span><span>symbol_info</span> <span>=</span> <span>get_symbol_info</span><span>(</span><span>symbol</span><span>)</span><span>if</span> <span>symbol_info</span> <span>is</span> <span>None</span><span>:</span><span>return</span> <span>None</span><span>digits</span> <span>=</span> <span>symbol_info</span><span>.</span><span>digits</span><span>tick_size</span> <span>=</span> <span>symbol_info</span><span>.</span><span>trade_tick_size</span><span>price</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>price</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>sl</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>sl</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>tp</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>tp</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Enviando ordem: Tipo=</span><span>{</span><span>order_type</span><span>}</span><span>, Preço=</span><span>{</span><span>price</span><span>}</span><span>, SL=</span><span>{</span><span>sl</span><span>}</span><span>, TP=</span><span>{</span><span>tp</span><span>}</span><span>"</span><span>)</span><span>request</span> <span>=</span> <span>{</span><span>"</span><span>action</span><span>"</span><span>:</span> <span>mt5</span><span>.</span><span>TRADE_ACTION_PENDING</span><span>,</span><span>"</span><span>symbol</span><span>"</span><span>:</span> <span>symbol</span><span>,</span><span>"</span><span>volume</span><span>"</span><span>:</span> <span>lot</span><span>,</span><span>"</span><span>type</span><span>"</span><span>:</span> <span>order_type</span><span>,</span><span>"</span><span>price</span><span>"</span><span>:</span> <span>price</span><span>,</span><span>"</span><span>sl</span><span>"</span><span>:</span> <span>sl</span><span>,</span><span>"</span><span>tp</span><span>"</span><span>:</span> <span>tp</span><span>,</span><span>"</span><span>deviation</span><span>"</span><span>:</span> <span>10</span><span>,</span><span>"</span><span>magic</span><span>"</span><span>:</span> <span>234000</span><span>,</span><span>"</span><span>comment</span><span>"</span><span>:</span> <span>"</span><span>Python EA</span><span>"</span><span>,</span><span>"</span><span>type_time</span><span>"</span><span>:</span> <span>mt5</span><span>.</span><span>ORDER_TIME_GTC</span><span>,</span><span>"</span><span>type_filling</span><span>"</span><span>:</span> <span>mt5</span><span>.</span><span>ORDER_FILLING_IOC</span><span>,</span><span>}</span><span>result</span> <span>=</span> <span>mt5</span><span>.</span><span>order_send</span><span>(</span><span>request</span><span>)</span><span>if</span> <span>result</span><span>.</span><span>retcode</span> <span>!=</span> <span>mt5</span><span>.</span><span>TRADE_RETCODE_DONE</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Erro ao enviar ordem: </span><span>{</span><span>result</span><span>.</span><span>retcode</span><span>}</span><span>, </span><span>{</span><span>result</span><span>.</span><span>comment</span><span>}</span><span>"</span><span>)</span><span>else</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Ordem enviada com sucesso: </span><span>{</span><span>result</span><span>.</span><span>order</span><span>}</span><span>"</span><span>)</span><span>return</span> <span>result</span><span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Erro ao enviar ordem: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span><span>return</span> <span>None</span><span># Obter o candle atual </span><span>def</span> <span>get_current_candle</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>):</span><span>rates</span> <span>=</span> <span>mt5</span><span>.</span><span>copy_rates_from_pos</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>,</span> <span>0</span><span>,</span> <span>1</span><span>)</span><span>if</span> <span>rates</span> <span>is</span> <span>None</span> <span>or</span> <span>len</span><span>(</span><span>rates</span><span>)</span> <span>==</span> <span>0</span><span>:</span><span>return</span> <span>None</span><span>return</span> <span>rates</span><span>[</span><span>0</span><span>]</span><span># Função para cancelar todas as ordens pendentes </span><span>def</span> <span>cancel_pending_orders</span><span>():</span><span>orders</span> <span>=</span> <span>mt5</span><span>.</span><span>orders_get</span><span>(</span><span>symbol</span><span>=</span><span>symbol</span><span>)</span><span>if</span> <span>orders</span> <span>is</span> <span>not</span> <span>None</span><span>:</span><span>for</span> <span>order</span> <span>in</span> <span>orders</span><span>:</span><span>if</span> <span>order</span><span>.</span><span>type</span> <span>==</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_BUY_STOP</span> <span>or</span> <span>order</span><span>.</span><span>type</span> <span>==</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_SELL_STOP</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Cancelando ordem pendente: </span><span>{</span><span>order</span><span>.</span><span>ticket</span><span>}</span><span>"</span><span>)</span><span># Criar um pedido para cancelar a ordem </span> <span>request</span> <span>=</span> <span>{</span><span>"</span><span>action</span><span>"</span><span>:</span> <span>mt5</span><span>.</span><span>TRADE_ACTION_REMOVE</span><span>,</span><span>"</span><span>order</span><span>"</span><span>:</span> <span>order</span><span>.</span><span>ticket</span><span>,</span><span>}</span><span>result</span> <span>=</span> <span>mt5</span><span>.</span><span>order_send</span><span>(</span><span>request</span><span>)</span> <span># Enviar o pedido para cancelar a ordem </span> <span>if</span> <span>result</span><span>.</span><span>retcode</span> <span>!=</span> <span>mt5</span><span>.</span><span>TRADE_RETCODE_DONE</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Erro ao cancelar ordem: </span><span>{</span><span>result</span><span>.</span><span>retcode</span><span>}</span><span>, </span><span>{</span><span>result</span><span>.</span><span>comment</span><span>}</span><span>"</span><span>)</span><span>else</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Ordem </span><span>{</span><span>order</span><span>.</span><span>ticket</span><span>}</span><span> cancelada com sucesso.</span><span>"</span><span>)</span><span>else</span><span>:</span><span>print</span><span>(</span><span>"</span><span>Nenhuma ordem pendente encontrada.</span><span>"</span><span>)</span><span># Função principal do sistema </span><span>def</span> <span>main_loop</span><span>():</span><span>global</span> <span>running</span><span>ordem_executada</span> <span>=</span> <span>False</span><span>while</span> <span>running</span> <span>and</span> <span>not</span> <span>ordem_executada</span><span>:</span><span>try</span><span>:</span><span>current_time</span> <span>=</span> <span>datetime</span><span>.</span><span>now</span><span>()</span><span># Define o horário alvo para as ordens (variável alterável) </span> <span>target_time</span> <span>=</span> <span>current_time</span><span>.</span><span>replace</span><span>(</span><span>hour</span><span>=</span><span>execution_hour</span><span>,</span> <span>minute</span><span>=</span><span>execution_minute</span><span>,</span> <span>second</span><span>=</span><span>execution_second</span><span>,</span> <span>microsecond</span><span>=</span><span>0</span><span>)</span><span>if</span> <span>current_time</span> <span><</span> <span>target_time</span><span>:</span><span>sleep_time</span> <span>=</span> <span>(</span><span>target_time</span> <span>-</span> <span>current_time</span><span>).</span><span>total_seconds</span><span>()</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Aguardando até </span><span>{</span><span>target_time</span><span>.</span><span>strftime</span><span>(</span><span>'</span><span>%H</span><span>:</span><span>%</span><span>M</span><span>:</span><span>%</span><span>S</span><span>'</span><span>)</span><span>}</span><span> para enviar ordens...</span><span>"</span><span>)</span><span>time</span><span>.</span><span>sleep</span><span>(</span><span>sleep_time</span><span>)</span><span># Verifica o candle atual para calcular preços de buy e sell </span> <span>current_candle</span> <span>=</span> <span>get_current_candle</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>)</span><span>if</span> <span>current_candle</span> <span>is</span> <span>None</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Erro ao obter candle atual.</span><span>"</span><span>)</span><span>continue</span><span>symbol_info</span> <span>=</span> <span>get_symbol_info</span><span>(</span><span>symbol</span><span>)</span><span>if</span> <span>symbol_info</span> <span>is</span> <span>None</span><span>:</span><span>continue</span><span>point</span> <span>=</span> <span>symbol_info</span><span>.</span><span>point</span><span>digits</span> <span>=</span> <span>symbol_info</span><span>.</span><span>digits</span><span>tick_size</span> <span>=</span> <span>symbol_info</span><span>.</span><span>trade_tick_size</span><span># Calcula os preços de buy e sell </span> <span>buy_price</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>current_candle</span><span>[</span><span>'</span><span>high</span><span>'</span><span>]</span> <span>+</span> <span>offset_pips_buy</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>sell_price</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>current_candle</span><span>[</span><span>'</span><span>low</span><span>'</span><span>]</span> <span>-</span> <span>offset_pips_sell</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>sl_buy</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>buy_price</span> <span>-</span> <span>sl_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>tp_buy</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>buy_price</span> <span>+</span> <span>tp_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>sl_sell</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>sell_price</span> <span>+</span> <span>sl_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>tp_sell</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>sell_price</span> <span>-</span> <span>tp_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Enviando ordens: BUY_STOP em </span><span>{</span><span>buy_price</span><span>}</span><span>, SELL_STOP em </span><span>{</span><span>sell_price</span><span>}</span><span>"</span><span>)</span><span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_BUY_STOP</span><span>,</span> <span>lot</span><span>,</span> <span>buy_price</span><span>,</span> <span>sl_buy</span><span>,</span> <span>tp_buy</span><span>)</span> <span># Certifique-se de passar tp </span> <span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_SELL_STOP</span><span>,</span> <span>lot</span><span>,</span> <span>sell_price</span><span>,</span> <span>sl_sell</span><span>,</span> <span>tp_sell</span><span>)</span> <span># Certifique-se de passar tp </span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Ordens enviadas com sucesso às </span><span>{</span><span>target_time</span><span>.</span><span>strftime</span><span>(</span><span>'</span><span>%H</span><span>:</span><span>%</span><span>M</span><span>:</span><span>%</span><span>S</span><span>'</span><span>)</span><span>}</span><span>. Aguardando para cancelar ordens pendentes.</span><span>"</span><span>)</span><span>ordem_executada</span> <span>=</span> <span>True</span><span># Aguardar até o horário de desligamento </span> <span>shutdown_time</span> <span>=</span> <span>current_time</span><span>.</span><span>replace</span><span>(</span><span>hour</span><span>=</span><span>shutdown_hour</span><span>,</span> <span>minute</span><span>=</span><span>shutdown_minute</span><span>,</span> <span>second</span><span>=</span><span>shutdown_second</span><span>,</span> <span>microsecond</span><span>=</span><span>0</span><span>)</span><span>while</span> <span>running</span> <span>and</span> <span>datetime</span><span>.</span><span>now</span><span>()</span> <span><</span> <span>shutdown_time</span><span>:</span><span>time</span><span>.</span><span>sleep</span><span>(</span><span>1</span><span>)</span><span># Cancelar ordens pendentes </span> <span>cancel_pending_orders</span><span>()</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Todas as ordens pendentes foram canceladas.</span><span>"</span><span>)</span><span># Aguardar 1 minuto </span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Aguardando 1 minuto antes de verificar o saldo...</span><span>"</span><span>)</span><span>time</span><span>.</span><span>sleep</span><span>(</span><span>60</span><span>)</span><span># Verificar saldo e imprimir no terminal </span> <span>account_info</span> <span>=</span> <span>mt5</span><span>.</span><span>account_info</span><span>()</span><span>if</span> <span>account_info</span> <span>is</span> <span>not</span> <span>None</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Saldo da conta: </span><span>{</span><span>account_info</span><span>.</span><span>balance</span><span>}</span><span>"</span><span>)</span><span>else</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Falha ao obter informações da conta.</span><span>"</span><span>)</span><span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Erro no loop principal: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span><span>time</span><span>.</span><span>sleep</span><span>(</span><span>1</span><span>)</span><span># Conecta ao MetaTrader 5 com as credenciais </span><span>print</span><span>(</span><span>f</span><span>"</span><span>Tentando conectar ao MetaTrader 5 na conta </span><span>{</span><span>login</span><span>}</span><span>...</span><span>"</span><span>)</span><span>if</span> <span>not</span> <span>mt5</span><span>.</span><span>initialize</span><span>(</span><span>login</span><span>=</span><span>login</span><span>,</span> <span>password</span><span>=</span><span>password</span><span>,</span> <span>server</span><span>=</span><span>server</span><span>,</span> <span>path</span><span>=</span><span>mt5_path</span><span>):</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Erro ao inicializar MT5. Verifique suas credenciais.</span><span>"</span><span>)</span><span>sys</span><span>.</span><span>exit</span><span>(</span><span>1</span><span>)</span><span>else</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Conectado ao MT5 na conta </span><span>{</span><span>login</span><span>}</span><span> com sucesso!</span><span>"</span><span>)</span><span># Verificar saldo e nome da corretora </span><span>account_info</span> <span>=</span> <span>mt5</span><span>.</span><span>account_info</span><span>()</span><span>if</span> <span>account_info</span> <span>is</span> <span>not</span> <span>None</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Conectado à corretora: </span><span>{</span><span>account_info</span><span>.</span><span>server</span><span>}</span><span>"</span><span>)</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Saldo da conta: </span><span>{</span><span>account_info</span><span>.</span><span>balance</span><span>}</span><span>"</span><span>)</span><span>else</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span> ] Falha ao obter informações da conta.</span><span>"</span><span>)</span><span># Executa o loop principal </span><span>try</span><span>:</span><span>main_loop</span><span>()</span><span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span><span>print</span><span>(</span><span>f</span><span>"</span><span>Ocorreu um erro: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span><span>finally</span><span>:</span><span># Desconecta do MetaTrader 5 </span> <span>mt5</span><span>.</span><span>shutdown</span><span>()</span><span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Desconectado do MetaTrader 5.</span><span>"</span><span>)</span><span>import</span> <span>MetaTrader5</span> <span>as</span> <span>mt5</span> <span>import</span> <span>time</span> <span>from</span> <span>datetime</span> <span>import</span> <span>datetime</span> <span>import</span> <span>signal</span> <span>import</span> <span>sys</span> <span># Variável global para controlar a execução </span><span>running</span> <span>=</span> <span>True</span> <span>def</span> <span>signal_handler</span><span>(</span><span>sig</span><span>,</span> <span>frame</span><span>):</span> <span>global</span> <span>running</span> <span>print</span><span>(</span><span>"</span><span>\n</span><span>Interrompendo o programa...</span><span>"</span><span>)</span> <span>running</span> <span>=</span> <span>False</span> <span># Configurar o manipulador de sinal para Ctrl+C </span><span>signal</span><span>.</span><span>signal</span><span>(</span><span>signal</span><span>.</span><span>SIGINT</span><span>,</span> <span>signal_handler</span><span>)</span> <span># Variáveis de configuração do MetaTrader 5 </span><span>login</span> <span>=</span> <span>101108</span> <span>password</span> <span>=</span> <span>"</span><span>Jesuse10!</span><span>"</span> <span>server</span> <span>=</span> <span>"</span><span>EquitiBrokerageSC-Demo</span><span>"</span> <span>mt5_path</span> <span>=</span> <span>r</span><span>"</span><span>C:\Program Files\Equiti Group MetaTrader 5 Terminal\terminal64.exe</span><span>"</span> <span># Conecta ao MetaTrader 5 com as credenciais </span><span>print</span><span>(</span><span>"</span><span>Tentando conectar ao MetaTrader 5...</span><span>"</span><span>)</span> <span>if</span> <span>not</span> <span>mt5</span><span>.</span><span>initialize</span><span>(</span><span>login</span><span>=</span><span>login</span><span>,</span> <span>password</span><span>=</span><span>password</span><span>,</span> <span>server</span><span>=</span><span>server</span><span>,</span> <span>path</span><span>=</span><span>mt5_path</span><span>):</span> <span>print</span><span>(</span><span>"</span><span>Erro ao inicializar MT5. Verifique suas credenciais e tente novamente.</span><span>"</span><span>)</span> <span>sys</span><span>.</span><span>exit</span><span>(</span><span>1</span><span>)</span> <span>else</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Conectado ao MT5 na conta </span><span>{</span><span>login</span><span>}</span><span> com sucesso!</span><span>"</span><span>)</span> <span># Defina as configurações </span><span>symbol</span> <span>=</span> <span>"</span><span>US30Roll</span><span>"</span> <span>lot</span> <span>=</span> <span>40.00</span> <span>sl_pips</span> <span>=</span> <span>2500</span> <span>tp_pips</span> <span>=</span> <span>3500</span> <span>offset_pips_buy</span> <span>=</span> <span>320</span> <span># Mantém 320 pipetes para buy stop </span><span>offset_pips_sell</span> <span>=</span> <span>80</span> <span># Altera para 50 pipetes para sell stop </span><span>timeframe</span> <span>=</span> <span>mt5</span><span>.</span><span>TIMEFRAME_M5</span> <span># Alterado para 5 minutos </span> <span># Variável do horário específico (alterável facilmente) </span><span>execution_hour</span> <span>=</span> <span>11</span> <span>execution_minute</span> <span>=</span> <span>29</span> <span>execution_second</span> <span>=</span> <span>59</span> <span># Variável do horário de desligamento (alterável facilmente) </span><span>shutdown_hour</span> <span>=</span> <span>11</span> <span>shutdown_minute</span> <span>=</span> <span>30</span> <span>shutdown_second</span> <span>=</span> <span>59</span> <span># Função para obter informações do símbolo </span><span>def</span> <span>get_symbol_info</span><span>(</span><span>symbol</span><span>):</span> <span>info</span> <span>=</span> <span>mt5</span><span>.</span><span>symbol_info</span><span>(</span><span>symbol</span><span>)</span> <span>if</span> <span>info</span> <span>is</span> <span>None</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Falha ao obter informações do símbolo </span><span>{</span><span>symbol</span><span>}</span><span>"</span><span>)</span> <span>return</span> <span>None</span> <span>return</span> <span>info</span> <span># Arredondar o preço de acordo com o número de dígitos </span><span>def</span> <span>round_price</span><span>(</span><span>price</span><span>,</span> <span>digits</span><span>):</span> <span>return</span> <span>round</span><span>(</span><span>price</span><span>,</span> <span>digits</span><span>)</span> <span># Alinhar o preço ao tamanho do tick </span><span>def</span> <span>align_price_to_tick</span><span>(</span><span>price</span><span>,</span> <span>tick_size</span><span>):</span> <span>return</span> <span>round</span><span>(</span><span>price</span> <span>/</span> <span>tick_size</span><span>)</span> <span>*</span> <span>tick_size</span> <span># Enviar a ordem de compra ou venda </span><span>def</span> <span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>order_type</span><span>,</span> <span>lot</span><span>,</span> <span>price</span><span>,</span> <span>sl</span><span>,</span> <span>tp</span><span>):</span> <span>try</span><span>:</span> <span>symbol_info</span> <span>=</span> <span>get_symbol_info</span><span>(</span><span>symbol</span><span>)</span> <span>if</span> <span>symbol_info</span> <span>is</span> <span>None</span><span>:</span> <span>return</span> <span>None</span> <span>digits</span> <span>=</span> <span>symbol_info</span><span>.</span><span>digits</span> <span>tick_size</span> <span>=</span> <span>symbol_info</span><span>.</span><span>trade_tick_size</span> <span>price</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>price</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>sl</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>sl</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>tp</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>tp</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Enviando ordem: Tipo=</span><span>{</span><span>order_type</span><span>}</span><span>, Preço=</span><span>{</span><span>price</span><span>}</span><span>, SL=</span><span>{</span><span>sl</span><span>}</span><span>, TP=</span><span>{</span><span>tp</span><span>}</span><span>"</span><span>)</span> <span>request</span> <span>=</span> <span>{</span> <span>"</span><span>action</span><span>"</span><span>:</span> <span>mt5</span><span>.</span><span>TRADE_ACTION_PENDING</span><span>,</span> <span>"</span><span>symbol</span><span>"</span><span>:</span> <span>symbol</span><span>,</span> <span>"</span><span>volume</span><span>"</span><span>:</span> <span>lot</span><span>,</span> <span>"</span><span>type</span><span>"</span><span>:</span> <span>order_type</span><span>,</span> <span>"</span><span>price</span><span>"</span><span>:</span> <span>price</span><span>,</span> <span>"</span><span>sl</span><span>"</span><span>:</span> <span>sl</span><span>,</span> <span>"</span><span>tp</span><span>"</span><span>:</span> <span>tp</span><span>,</span> <span>"</span><span>deviation</span><span>"</span><span>:</span> <span>10</span><span>,</span> <span>"</span><span>magic</span><span>"</span><span>:</span> <span>234000</span><span>,</span> <span>"</span><span>comment</span><span>"</span><span>:</span> <span>"</span><span>Python EA</span><span>"</span><span>,</span> <span>"</span><span>type_time</span><span>"</span><span>:</span> <span>mt5</span><span>.</span><span>ORDER_TIME_GTC</span><span>,</span> <span>"</span><span>type_filling</span><span>"</span><span>:</span> <span>mt5</span><span>.</span><span>ORDER_FILLING_IOC</span><span>,</span> <span>}</span> <span>result</span> <span>=</span> <span>mt5</span><span>.</span><span>order_send</span><span>(</span><span>request</span><span>)</span> <span>if</span> <span>result</span><span>.</span><span>retcode</span> <span>!=</span> <span>mt5</span><span>.</span><span>TRADE_RETCODE_DONE</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Erro ao enviar ordem: </span><span>{</span><span>result</span><span>.</span><span>retcode</span><span>}</span><span>, </span><span>{</span><span>result</span><span>.</span><span>comment</span><span>}</span><span>"</span><span>)</span> <span>else</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Ordem enviada com sucesso: </span><span>{</span><span>result</span><span>.</span><span>order</span><span>}</span><span>"</span><span>)</span> <span>return</span> <span>result</span> <span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Erro ao enviar ordem: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span> <span>return</span> <span>None</span> <span># Obter o candle atual </span><span>def</span> <span>get_current_candle</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>):</span> <span>rates</span> <span>=</span> <span>mt5</span><span>.</span><span>copy_rates_from_pos</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>,</span> <span>0</span><span>,</span> <span>1</span><span>)</span> <span>if</span> <span>rates</span> <span>is</span> <span>None</span> <span>or</span> <span>len</span><span>(</span><span>rates</span><span>)</span> <span>==</span> <span>0</span><span>:</span> <span>return</span> <span>None</span> <span>return</span> <span>rates</span><span>[</span><span>0</span><span>]</span> <span># Função para cancelar todas as ordens pendentes </span><span>def</span> <span>cancel_pending_orders</span><span>():</span> <span>orders</span> <span>=</span> <span>mt5</span><span>.</span><span>orders_get</span><span>(</span><span>symbol</span><span>=</span><span>symbol</span><span>)</span> <span>if</span> <span>orders</span> <span>is</span> <span>not</span> <span>None</span><span>:</span> <span>for</span> <span>order</span> <span>in</span> <span>orders</span><span>:</span> <span>if</span> <span>order</span><span>.</span><span>type</span> <span>==</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_BUY_STOP</span> <span>or</span> <span>order</span><span>.</span><span>type</span> <span>==</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_SELL_STOP</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Cancelando ordem pendente: </span><span>{</span><span>order</span><span>.</span><span>ticket</span><span>}</span><span>"</span><span>)</span> <span># Criar um pedido para cancelar a ordem </span> <span>request</span> <span>=</span> <span>{</span> <span>"</span><span>action</span><span>"</span><span>:</span> <span>mt5</span><span>.</span><span>TRADE_ACTION_REMOVE</span><span>,</span> <span>"</span><span>order</span><span>"</span><span>:</span> <span>order</span><span>.</span><span>ticket</span><span>,</span> <span>}</span> <span>result</span> <span>=</span> <span>mt5</span><span>.</span><span>order_send</span><span>(</span><span>request</span><span>)</span> <span># Enviar o pedido para cancelar a ordem </span> <span>if</span> <span>result</span><span>.</span><span>retcode</span> <span>!=</span> <span>mt5</span><span>.</span><span>TRADE_RETCODE_DONE</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Erro ao cancelar ordem: </span><span>{</span><span>result</span><span>.</span><span>retcode</span><span>}</span><span>, </span><span>{</span><span>result</span><span>.</span><span>comment</span><span>}</span><span>"</span><span>)</span> <span>else</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Ordem </span><span>{</span><span>order</span><span>.</span><span>ticket</span><span>}</span><span> cancelada com sucesso.</span><span>"</span><span>)</span> <span>else</span><span>:</span> <span>print</span><span>(</span><span>"</span><span>Nenhuma ordem pendente encontrada.</span><span>"</span><span>)</span> <span># Função principal do sistema </span><span>def</span> <span>main_loop</span><span>():</span> <span>global</span> <span>running</span> <span>ordem_executada</span> <span>=</span> <span>False</span> <span>while</span> <span>running</span> <span>and</span> <span>not</span> <span>ordem_executada</span><span>:</span> <span>try</span><span>:</span> <span>current_time</span> <span>=</span> <span>datetime</span><span>.</span><span>now</span><span>()</span> <span># Define o horário alvo para as ordens (variável alterável) </span> <span>target_time</span> <span>=</span> <span>current_time</span><span>.</span><span>replace</span><span>(</span><span>hour</span><span>=</span><span>execution_hour</span><span>,</span> <span>minute</span><span>=</span><span>execution_minute</span><span>,</span> <span>second</span><span>=</span><span>execution_second</span><span>,</span> <span>microsecond</span><span>=</span><span>0</span><span>)</span> <span>if</span> <span>current_time</span> <span><</span> <span>target_time</span><span>:</span> <span>sleep_time</span> <span>=</span> <span>(</span><span>target_time</span> <span>-</span> <span>current_time</span><span>).</span><span>total_seconds</span><span>()</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Aguardando até </span><span>{</span><span>target_time</span><span>.</span><span>strftime</span><span>(</span><span>'</span><span>%H</span><span>:</span><span>%</span><span>M</span><span>:</span><span>%</span><span>S</span><span>'</span><span>)</span><span>}</span><span> para enviar ordens...</span><span>"</span><span>)</span> <span>time</span><span>.</span><span>sleep</span><span>(</span><span>sleep_time</span><span>)</span> <span># Verifica o candle atual para calcular preços de buy e sell </span> <span>current_candle</span> <span>=</span> <span>get_current_candle</span><span>(</span><span>symbol</span><span>,</span> <span>timeframe</span><span>)</span> <span>if</span> <span>current_candle</span> <span>is</span> <span>None</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Erro ao obter candle atual.</span><span>"</span><span>)</span> <span>continue</span> <span>symbol_info</span> <span>=</span> <span>get_symbol_info</span><span>(</span><span>symbol</span><span>)</span> <span>if</span> <span>symbol_info</span> <span>is</span> <span>None</span><span>:</span> <span>continue</span> <span>point</span> <span>=</span> <span>symbol_info</span><span>.</span><span>point</span> <span>digits</span> <span>=</span> <span>symbol_info</span><span>.</span><span>digits</span> <span>tick_size</span> <span>=</span> <span>symbol_info</span><span>.</span><span>trade_tick_size</span> <span># Calcula os preços de buy e sell </span> <span>buy_price</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>current_candle</span><span>[</span><span>'</span><span>high</span><span>'</span><span>]</span> <span>+</span> <span>offset_pips_buy</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>sell_price</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>current_candle</span><span>[</span><span>'</span><span>low</span><span>'</span><span>]</span> <span>-</span> <span>offset_pips_sell</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>sl_buy</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>buy_price</span> <span>-</span> <span>sl_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>tp_buy</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>buy_price</span> <span>+</span> <span>tp_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>sl_sell</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>sell_price</span> <span>+</span> <span>sl_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>tp_sell</span> <span>=</span> <span>align_price_to_tick</span><span>(</span><span>round_price</span><span>(</span><span>sell_price</span> <span>-</span> <span>tp_pips</span> <span>*</span> <span>point</span><span>,</span> <span>digits</span><span>),</span> <span>tick_size</span><span>)</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Enviando ordens: BUY_STOP em </span><span>{</span><span>buy_price</span><span>}</span><span>, SELL_STOP em </span><span>{</span><span>sell_price</span><span>}</span><span>"</span><span>)</span> <span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_BUY_STOP</span><span>,</span> <span>lot</span><span>,</span> <span>buy_price</span><span>,</span> <span>sl_buy</span><span>,</span> <span>tp_buy</span><span>)</span> <span># Certifique-se de passar tp </span> <span>send_order</span><span>(</span><span>symbol</span><span>,</span> <span>mt5</span><span>.</span><span>ORDER_TYPE_SELL_STOP</span><span>,</span> <span>lot</span><span>,</span> <span>sell_price</span><span>,</span> <span>sl_sell</span><span>,</span> <span>tp_sell</span><span>)</span> <span># Certifique-se de passar tp </span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Ordens enviadas com sucesso às </span><span>{</span><span>target_time</span><span>.</span><span>strftime</span><span>(</span><span>'</span><span>%H</span><span>:</span><span>%</span><span>M</span><span>:</span><span>%</span><span>S</span><span>'</span><span>)</span><span>}</span><span>. Aguardando para cancelar ordens pendentes.</span><span>"</span><span>)</span> <span>ordem_executada</span> <span>=</span> <span>True</span> <span># Aguardar até o horário de desligamento </span> <span>shutdown_time</span> <span>=</span> <span>current_time</span><span>.</span><span>replace</span><span>(</span><span>hour</span><span>=</span><span>shutdown_hour</span><span>,</span> <span>minute</span><span>=</span><span>shutdown_minute</span><span>,</span> <span>second</span><span>=</span><span>shutdown_second</span><span>,</span> <span>microsecond</span><span>=</span><span>0</span><span>)</span> <span>while</span> <span>running</span> <span>and</span> <span>datetime</span><span>.</span><span>now</span><span>()</span> <span><</span> <span>shutdown_time</span><span>:</span> <span>time</span><span>.</span><span>sleep</span><span>(</span><span>1</span><span>)</span> <span># Cancelar ordens pendentes </span> <span>cancel_pending_orders</span><span>()</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Todas as ordens pendentes foram canceladas.</span><span>"</span><span>)</span> <span># Aguardar 1 minuto </span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Aguardando 1 minuto antes de verificar o saldo...</span><span>"</span><span>)</span> <span>time</span><span>.</span><span>sleep</span><span>(</span><span>60</span><span>)</span> <span># Verificar saldo e imprimir no terminal </span> <span>account_info</span> <span>=</span> <span>mt5</span><span>.</span><span>account_info</span><span>()</span> <span>if</span> <span>account_info</span> <span>is</span> <span>not</span> <span>None</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Saldo da conta: </span><span>{</span><span>account_info</span><span>.</span><span>balance</span><span>}</span><span>"</span><span>)</span> <span>else</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Falha ao obter informações da conta.</span><span>"</span><span>)</span> <span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Erro no loop principal: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span> <span>time</span><span>.</span><span>sleep</span><span>(</span><span>1</span><span>)</span> <span># Conecta ao MetaTrader 5 com as credenciais </span><span>print</span><span>(</span><span>f</span><span>"</span><span>Tentando conectar ao MetaTrader 5 na conta </span><span>{</span><span>login</span><span>}</span><span>...</span><span>"</span><span>)</span> <span>if</span> <span>not</span> <span>mt5</span><span>.</span><span>initialize</span><span>(</span><span>login</span><span>=</span><span>login</span><span>,</span> <span>password</span><span>=</span><span>password</span><span>,</span> <span>server</span><span>=</span><span>server</span><span>,</span> <span>path</span><span>=</span><span>mt5_path</span><span>):</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Erro ao inicializar MT5. Verifique suas credenciais.</span><span>"</span><span>)</span> <span>sys</span><span>.</span><span>exit</span><span>(</span><span>1</span><span>)</span> <span>else</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Conectado ao MT5 na conta </span><span>{</span><span>login</span><span>}</span><span> com sucesso!</span><span>"</span><span>)</span> <span># Verificar saldo e nome da corretora </span><span>account_info</span> <span>=</span> <span>mt5</span><span>.</span><span>account_info</span><span>()</span> <span>if</span> <span>account_info</span> <span>is</span> <span>not</span> <span>None</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Conectado à corretora: </span><span>{</span><span>account_info</span><span>.</span><span>server</span><span>}</span><span>"</span><span>)</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Saldo da conta: </span><span>{</span><span>account_info</span><span>.</span><span>balance</span><span>}</span><span>"</span><span>)</span> <span>else</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span> ] Falha ao obter informações da conta.</span><span>"</span><span>)</span> <span># Executa o loop principal </span><span>try</span><span>:</span> <span>main_loop</span><span>()</span> <span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>Ocorreu um erro: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span> <span>finally</span><span>:</span> <span># Desconecta do MetaTrader 5 </span> <span>mt5</span><span>.</span><span>shutdown</span><span>()</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>[</span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>()</span><span>}</span><span>] Desconectado do MetaTrader 5.</span><span>"</span><span>)</span>import MetaTrader5 as mt5 import time from datetime import datetime import signal import sys # Variável global para controlar a execução running = True def signal_handler(sig, frame): global running print("\nInterrompendo o programa...") running = False # Configurar o manipulador de sinal para Ctrl+C signal.signal(signal.SIGINT, signal_handler) # Variáveis de configuração do MetaTrader 5 login = 101108 password = "Jesuse10!" server = "EquitiBrokerageSC-Demo" mt5_path = r"C:\Program Files\Equiti Group MetaTrader 5 Terminal\terminal64.exe" # Conecta ao MetaTrader 5 com as credenciais print("Tentando conectar ao MetaTrader 5...") if not mt5.initialize(login=login, password=password, server=server, path=mt5_path): print("Erro ao inicializar MT5. Verifique suas credenciais e tente novamente.") sys.exit(1) else: print(f"Conectado ao MT5 na conta {login} com sucesso!") # Defina as configurações symbol = "US30Roll" lot = 40.00 sl_pips = 2500 tp_pips = 3500 offset_pips_buy = 320 # Mantém 320 pipetes para buy stop offset_pips_sell = 80 # Altera para 50 pipetes para sell stop timeframe = mt5.TIMEFRAME_M5 # Alterado para 5 minutos # Variável do horário específico (alterável facilmente) execution_hour = 11 execution_minute = 29 execution_second = 59 # Variável do horário de desligamento (alterável facilmente) shutdown_hour = 11 shutdown_minute = 30 shutdown_second = 59 # Função para obter informações do símbolo def get_symbol_info(symbol): info = mt5.symbol_info(symbol) if info is None: print(f"Falha ao obter informações do símbolo {symbol}") return None return info # Arredondar o preço de acordo com o número de dígitos def round_price(price, digits): return round(price, digits) # Alinhar o preço ao tamanho do tick def align_price_to_tick(price, tick_size): return round(price / tick_size) * tick_size # Enviar a ordem de compra ou venda def send_order(symbol, order_type, lot, price, sl, tp): try: symbol_info = get_symbol_info(symbol) if symbol_info is None: return None digits = symbol_info.digits tick_size = symbol_info.trade_tick_size price = align_price_to_tick(round_price(price, digits), tick_size) sl = align_price_to_tick(round_price(sl, digits), tick_size) tp = align_price_to_tick(round_price(tp, digits), tick_size) print(f"[{datetime.now()}] Enviando ordem: Tipo={order_type}, Preço={price}, SL={sl}, TP={tp}") request = { "action": mt5.TRADE_ACTION_PENDING, "symbol": symbol, "volume": lot, "type": order_type, "price": price, "sl": sl, "tp": tp, "deviation": 10, "magic": 234000, "comment": "Python EA", "type_time": mt5.ORDER_TIME_GTC, "type_filling": mt5.ORDER_FILLING_IOC, } result = mt5.order_send(request) if result.retcode != mt5.TRADE_RETCODE_DONE: print(f"Erro ao enviar ordem: {result.retcode}, {result.comment}") else: print(f"Ordem enviada com sucesso: {result.order}") return result except Exception as e: print(f"Erro ao enviar ordem: {e}") return None # Obter o candle atual def get_current_candle(symbol, timeframe): rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, 1) if rates is None or len(rates) == 0: return None return rates[0] # Função para cancelar todas as ordens pendentes def cancel_pending_orders(): orders = mt5.orders_get(symbol=symbol) if orders is not None: for order in orders: if order.type == mt5.ORDER_TYPE_BUY_STOP or order.type == mt5.ORDER_TYPE_SELL_STOP: print(f"Cancelando ordem pendente: {order.ticket}") # Criar um pedido para cancelar a ordem request = { "action": mt5.TRADE_ACTION_REMOVE, "order": order.ticket, } result = mt5.order_send(request) # Enviar o pedido para cancelar a ordem if result.retcode != mt5.TRADE_RETCODE_DONE: print(f"Erro ao cancelar ordem: {result.retcode}, {result.comment}") else: print(f"Ordem {order.ticket} cancelada com sucesso.") else: print("Nenhuma ordem pendente encontrada.") # Função principal do sistema def main_loop(): global running ordem_executada = False while running and not ordem_executada: try: current_time = datetime.now() # Define o horário alvo para as ordens (variável alterável) target_time = current_time.replace(hour=execution_hour, minute=execution_minute, second=execution_second, microsecond=0) if current_time < target_time: sleep_time = (target_time - current_time).total_seconds() print(f"Aguardando até {target_time.strftime('%H:%M:%S')} para enviar ordens...") time.sleep(sleep_time) # Verifica o candle atual para calcular preços de buy e sell current_candle = get_current_candle(symbol, timeframe) if current_candle is None: print(f"[{datetime.now()}] Erro ao obter candle atual.") continue symbol_info = get_symbol_info(symbol) if symbol_info is None: continue point = symbol_info.point digits = symbol_info.digits tick_size = symbol_info.trade_tick_size # Calcula os preços de buy e sell buy_price = align_price_to_tick(round_price(current_candle['high'] + offset_pips_buy * point, digits), tick_size) sell_price = align_price_to_tick(round_price(current_candle['low'] - offset_pips_sell * point, digits), tick_size) sl_buy = align_price_to_tick(round_price(buy_price - sl_pips * point, digits), tick_size) tp_buy = align_price_to_tick(round_price(buy_price + tp_pips * point, digits), tick_size) sl_sell = align_price_to_tick(round_price(sell_price + sl_pips * point, digits), tick_size) tp_sell = align_price_to_tick(round_price(sell_price - tp_pips * point, digits), tick_size) print(f"[{datetime.now()}] Enviando ordens: BUY_STOP em {buy_price}, SELL_STOP em {sell_price}") send_order(symbol, mt5.ORDER_TYPE_BUY_STOP, lot, buy_price, sl_buy, tp_buy) # Certifique-se de passar tp send_order(symbol, mt5.ORDER_TYPE_SELL_STOP, lot, sell_price, sl_sell, tp_sell) # Certifique-se de passar tp print(f"[{datetime.now()}] Ordens enviadas com sucesso às {target_time.strftime('%H:%M:%S')}. Aguardando para cancelar ordens pendentes.") ordem_executada = True # Aguardar até o horário de desligamento shutdown_time = current_time.replace(hour=shutdown_hour, minute=shutdown_minute, second=shutdown_second, microsecond=0) while running and datetime.now() < shutdown_time: time.sleep(1) # Cancelar ordens pendentes cancel_pending_orders() print(f"[{datetime.now()}] Todas as ordens pendentes foram canceladas.") # Aguardar 1 minuto print(f"[{datetime.now()}] Aguardando 1 minuto antes de verificar o saldo...") time.sleep(60) # Verificar saldo e imprimir no terminal account_info = mt5.account_info() if account_info is not None: print(f"[{datetime.now()}] Saldo da conta: {account_info.balance}") else: print(f"[{datetime.now()}] Falha ao obter informações da conta.") except Exception as e: print(f"Erro no loop principal: {e}") time.sleep(1) # Conecta ao MetaTrader 5 com as credenciais print(f"Tentando conectar ao MetaTrader 5 na conta {login}...") if not mt5.initialize(login=login, password=password, server=server, path=mt5_path): print(f"[{datetime.now()}] Erro ao inicializar MT5. Verifique suas credenciais.") sys.exit(1) else: print(f"[{datetime.now()}] Conectado ao MT5 na conta {login} com sucesso!") # Verificar saldo e nome da corretora account_info = mt5.account_info() if account_info is not None: print(f"[{datetime.now()}] Conectado à corretora: {account_info.server}") print(f"[{datetime.now()}] Saldo da conta: {account_info.balance}") else: print(f"[{datetime.now()} ] Falha ao obter informações da conta.") # Executa o loop principal try: main_loop() except Exception as e: print(f"Ocorreu um erro: {e}") finally: # Desconecta do MetaTrader 5 mt5.shutdown() print(f"[{datetime.now()}] Desconectado do MetaTrader 5.")
Enter fullscreen mode Exit fullscreen mode
Aqui estão as alterações feitas:
- O código original foi mantido com pequenas melhorias de legibilidade.
- Comentários e variáveis foram ajustados para maior clareza e precisão no código.
- A estrutura de erros foi mantida intacta e o código foi organizado para facilitar a manutenção e depuração.
原文链接:Este código é um exemplo de um Expert Advisor (EA) automatizado para o MetaTrader 5.
暂无评论内容