Este código é um exemplo de um Expert Advisor (EA) automatizado para o MetaTrader 5.

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 sinal SIGINT (gerado pelo Ctrl+C) e altera o valor de running para False, 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, e execution_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:

  1. O código original foi mantido com pequenas melhorias de legibilidade.
  2. Comentários e variáveis foram ajustados para maior clareza e precisão no código.
  3. 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.

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
The greatest test of courage on earth is to bear defeat without losing heart.
世界上对勇气的最大考验是忍受失败而不丧失信心
评论 抢沙发

请登录后发表评论

    暂无评论内容