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