INDICADOR, AUTOMATIZADOR DE ORDENS TRYD? :)



  • 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 = "";

           }

       }

    }


Log in to reply
 


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.
© 2018 Portal do Trader. Todos os direitos reservados.