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