Navigation

    Portal do Trader
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users

    INDICADOR, AUTOMATIZADOR DE ORDENS TRYD? :)

    Assuntos Gerais
    1
    1
    15
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      Daniel Lima 2 last edited by

      ALGUÉM AI SABE DIZER SE TEM UM INDICADOR OU AUTOMATIZADOR DE ORDENS PARA O TRYD QUE COMPRA E VENDA AUTOMATICAMENTE APOS CRUZAR 2 MÉDIAS MOVEIS ? PARECIDO COM OS ROBÔS DO MT5...JÁ PROCUREI EM TUDO QUER CANTO E NADA  :(    SÓ ACHEI ISSO QUE NÃO SEI USAR:  https://www.tryd.com.br/manual/HTML/scripts.htm?toc=0

      Envio de ordens por Cruzamento de Médias Móveis

       

      Neste exemplo, um processo que monitora os dados do papel "PETR4" analisa o seu histórico em busca de um cruzamento entre duas médias móveis

      •A primeira média móvel simples é de 3 dias.

      •A segunda média móvel simples é de 21 dias.

      Quando o processo detecta esse cruzamento, ele o interpreta para saber se deve enviar uma ordem de compra ou de venda.

      import stScript.process.api.*;

      import stScript.db.api.*;

       

      public class UserProcess extends Process {

         // Indicador de "Compra" ou "Venda".

        def side = "BUY";

       

         // Indica se a estratégia está liberada para realizar o envio de ordens ou não.

         // Sempre que uma ponta (compra, por exemplo) é enviada, essa flag é modificada

         // para false. Ela somente será true quando a confirmação de execução em relação

         // a essa ordem for recebida.

        def sendNext = true;

       

         // Número da última ordem enviada.

        def lastSentOrderId = "";

       

        void onStart() {

             // Monitorando o papel.

             requestUpdates( "PETR4" );

         }

       

        void onQuoteEvent( QuoteEvent event ) {

            def security = event.getSecurity();

       

             // Solicita os dados históricos do papel (1 minuto)

            def historicalData = requestHistoricalData(

             security.code(),

             HistoricalData.HistoryInterval.MINUTE01

             );

       

             // Obtém o objeto que realiza os cálculos do indicador

            def indicatorBuilder = getIndicatorBuilder();

       

            def ma3days = indicatorBuilder.MA( historicalData.close(), 3, IndicatorBuilder.ExtendedMAType.SMA );

            def ma21days = indicatorBuilder.MA( historicalData.close(), 21, IndicatorBuilder.ExtendedMAType.SMA );

       

            if ( ma3days.size() > 1 && ma21days.size() > 1 ) {

                def lastMa3daysValue = ma3days.value( ma3days.size() - 1 );

                def lastMa21daysValue = ma21days.value( ma21days.size() - 1 );

                def nextToLast3daysValue = ma3days.value( ma3days.size() - 2 );

                def nextToLast21daysValue = ma21days.value( ma21days.size() - 2 );

       

                def close = historicalData.close().value( historicalData.close().size() - 1 );

       

                if ( "BUY".equals( side ) ) {

                     // Quando a de 3 cruzar a de 21 para cima, então, COMPRA

                    if ( ( lastMa3daysValue > lastMa21daysValue )

                         && ( nextToLast3daysValue < nextToLast21daysValue ) ) {

                        def formatter = java.text.NumberFormat.getInstance();

                        def message = new StringBuilder()

                             .append( "Comprar " )

                             .append( security.code() )

                             .append( ".\n\n" )

                             .append( "MA de 3 cruzou MA de 21 para cima: " )

                             .append( formatter.format( lastMa3daysValue ) )

                             .append( " - " )

                             .append( formatter.format( lastMa21daysValue ) )

                             .toString();

       

                         // Envia um email em relação ao cruzamento

                         // Para enviar o e-mail, basta descomentar e

                         // configurar o seu email no lugar de:

                         // seu_email@domain.com

                         // sendMail(

                             //"seu_email@domain.com",

                             //"Cruzamento de Média Móvel" ,

                             //message

                             //);

       

                         // Loga uma mensagem de depuração em relação ao cruzamento

                         logMessage( "Cruzamento de Média Móvel \n" + message );

       

                        if ( ! sendNext ) {

                             logMessage( "Aguardando confirmação da ordem anterior" );

                            return;

                         }

       

                         // Envia a ordem

                        def response = sendBuyOrder( security.code(), 100, security.ask() );

       

                        if ( response.routed() ){

                             // Armazena o número da última ordem enviada

                             lastSentOrderId = response.getRoutedOrder().getOrderId();

       

                             // Indica que deve esperar pela confirmação de execução da ordem

                             sendNext = false;

       

                             // Loga uma mensagem de depuração em relação ao envio da ordem

                             logMessage( "Enviou ordem de compra número " + lastSentOrderId );

                         } else {

                             // Loga uma mensagem de depuração em relação ao erro no envio da ordem

                             logMessage( "Erro no envio da ordem de compra:\n" + response.getWsResponseXml() );

                         }

                     }

                 // Quando a de 21 cruzar a de 3 para cima, então, VENDE

                 } else if ( "SELL".equals( side ) ) {

                    if ( ( lastMa3daysValue < lastMa21daysValue )

                         && ( nextToLast3daysValue > nextToLast21daysValue ) ) {

                        def formatter = java.text.NumberFormat.getInstance();

                        def message = new StringBuilder()

                             .append( "Vender " )

                             .append( security.code() )

                             .append( ".\n\n" )

                             .append( "MA de 21 cruzou MA de 3 para cima: " )

                             .append( formatter.format( lastMa21daysValue ) )

                             .append( " - " )

                             .append( formatter.format( lastMa3daysValue ) )

                             .toString();

       

                         // Envia um email em relação ao cruzamento

                         // Para enviar o e-mail, basta descomentar e

                         // configurar o seu email no lugar de:

                         // seu_email@domain.com

                         //sendMail(

                             //"seu_email@domain.com",

                             //"Cruzamento de Média Móvel" ,

                             //message

                             //);

       

                         // Loga uma mensagem de depuração em relação ao cruzamento

                         logMessage( "Cruzamento de Média Móvel \n" + message );

       

                        if ( ! sendNext ) {

                             logMessage( "Aguardando confirmação da ordem anterior" );

                            return;

                         }

       

                         // Envia a ordem

                        def response = sendSellOrder( security.code(), 100, security.bid() );

       

                        if ( response.routed() ){

                             // Armazena o número da última ordem enviada

                             lastSentOrderId = response.getRoutedOrder().getOrderId();

       

                             // Indica que deve esperar pela confirmação de execução da ordem

                             sendNext = false;

       

                             // Loga uma mensagem de depuração em relação ao envio da ordem

                             logMessage( "Enviou ordem de venda número " + lastSentOrderId );

                         } else {

                             // Loga uma mensagem de depuração em relação ao erro no envio da ordem

                             logMessage( "Erro no envio da ordem de venda:\n" + response.getWsResponseXml() );

                         }

                     }

                 }

             }

         }

       

        void onOrderChangeEvent( OrderChangeEvent event ) {

            def order = event.getChangedOrder();

       

             logMessage( "Identificada modificação na ordem " + order.getOrderId() );

       

             // Só interessam as atualizações referentes à última ordem

            if ( ! lastSentOrderId.equals( order.getOrderId() ) ) {

                return;

             }

       

             // Se a última ordem foi executada, então libera a estratégia para continuar

             // (Somente considerando execução total)

            if ( order.getStatus().equals( Order.Status.FILLED ) ) {

                 logMessage( "Execução identificada na ordem " + order.getOrderId() );

                 // Libera a estratégia

                 sendNext = true;

       

                 // Troca o lado da estratégia

                 side = ( "BUY".equals( side ) ? "SELL" : "BUY" );

       

                 // Limpa o controle sobre a ultima ordem

                 lastSentOrderId = "";

             } else if ( order.getStatus().equals( Order.Status.CANCELED ) || order.getStatus().equals( Order.Status.REJECTED ) ) {

                 // Libera a estratégia para tentar realizar a mesma operação novamente

                 // pois, nesse caso, não será modificado o lado da estratégia

                 sendNext = true;

       

                 // Limpa o controle sobre a última ordem

                 lastSentOrderId = "";

             }

         }

      }

      1 Reply Last reply Reply Quote 0
      • First post
        Last post

      O Portal do Trader não se responsabiliza pelas informações e opiniões veiculadas neste fórum, sendo elas de autoria individual de cada participante. Vale ainda ressaltar que investimentos em mercado de renda variável possuem riscos, ganhos passados não garantem ganhos futuros, e a decisão final e responsabilidade sobre cada operação é de cada investidor, devendo ser tomada individualmente.
      © 2021 Portal do Trader. Todos os direitos reservados.