Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Não tão fácil de explicar
Você tem que enviar um evento para o gráfico offline que o "dirá" (a partir de seu indicador) que um novo tick é gerado e que ele deve executar as rotinas necessárias. Isso significa usar funções de baixo nível. A coisa toda pode parecer algo parecido com isto :
#import "user32.dll"
int GetParent(int hWnd);
#import
#define CHART_CMD_UPDATE_DATA 33324
void UpdateChartWindows()
{
int filePeriod = 1; // file period
string fileSymbol = "your offline symbol name";
string chartName = "your offline symbol chart full name";
string stringForName = " ";
//
//
//
//
//
int windowHandle = WindowHandle(fileSymbol,filePeriod);
if (windowHandle != 0)
{
windowHandle = GetParent(windowHandle);
windowHandle = GetWindow(windowHandle,GW_HWNDFIRST);
while (windowHandle != 0)
{
int len = GetWindowTextA(windowHandle,stringForName,80);
if (len > 0 && StringSubstr(stringForName,0,len) == chartName)
PostMessageA(windowHandle,WM_COMMAND,CHART_CMD_UPDATE_DATA,0);
windowHandle = GetWindow(windowHandle,GW_HWNDNEXT);
}
}
}
Obrigado, vou verificar isso. No entanto, eu acho o problema para o sendorder corretamente. Meu indicador cria um nome para o gráfico offline não padrão e as plataformas não o abrem por este motivo.
Obrigado por sua disponibilidade.
Ok, a questão para o gráfico off-line está em andamento.
Eu tenho outro problema.
Tenho que criar um indicador que calcule os volumes com regras específicas.
O que eu preciso é que toda vez que houver uma variação do tick, o indicador deve contar o comprimento do balanço.
Exemplo.
em Open candel, o valor do buffer é 0. Portanto, ele deve contar todo o tick feito antes de um retracement, mas o valor final retornado é o mais alto desde que a vela se fecha.
Depois, ele deve definir a cor do histograma liberado o movimento feito com o maior valor retornado do buffer.
Eu tento de maneira diferente, mas sem sucesso.
Heeeeelp ^^.
Obrigado.
Obrigado por todo o seu apoio. Estou aprendendo mais e com toda a sua ajuda eu conserto todo o meu pedido...MAS.
Eu tenho outro ^^.
Preciso engradar uma função vazia para lembrar e ela tem que ser a fusão deste dois códigos.
O primeiro encontra a última ordem aberta. e o segundo encontra o número da ordem aberta que tem o preço aberto mais alto.
Preciso fazer uma função para ter diretamente o número da ordem que tem o preço mais alto de ordem aberta.
Obrigado.
OrderSelect(i, SELECT_BY_POS);
if(OrderSymbol() == Symbol() && OrderType() == TYPE ) {
if(TYPE == OP_BUY) {
double OPrice = OrderOpenPrice();[/PHP]
[PHP]for(int e=0;e<OrdersTotal();e++) {
if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;
if(OrderSymbol() == Symbol() && OrderType() == TYPE) {
if(TYPE == OP_BUY) {
if(OrderOpenPrice()>test(OP_BUY) Hbuys++;
}
}
}
return(Hbuys);
}
Obrigado por todo o seu apoio. Estou aprendendo mais e com toda a sua ajuda eu conserto todo o meu pedido...MAS.
Eu tenho outro ^^.
Preciso engradar uma função vazia para lembrar e ela tem que ser a fusão destes dois códigos.
O primeiro encontra a última ordem aberta. e o segundo encontra o número da ordem aberta que tem o preço aberto mais alto.
Preciso fazer uma função para ter diretamente o número da ordem que tem o preço mais alto de ordem aberta.
Obrigado.
OrderSelect(i, SELECT_BY_POS);
if(OrderSymbol() == Symbol() && OrderType() == TYPE ) {
if(TYPE == OP_BUY) {
double OPrice = OrderOpenPrice();[/PHP]
if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;
if(OrderSymbol() == Symbol() && OrderType() == TYPE) {
if(TYPE == OP_BUY) {
if(OrderOpenPrice()>test(OP_BUY) Hbuys++;
}
}
}
return(Hbuys);
}
Eu cometi um erro no segundo código. Está certo.
[PHP]for(int e=0;e<OrdersTotal();e++) {
if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;
if(OrderSymbol() == Symbol() && OrderType() == TYPE) {
if(TYPE == OP_BUY) {
if(OrderOpenPrice()>OPrice Hbuys++;
}
}
}
devolução(Hbuys);
}
dasio
A função nula é uma função que não retorna nenhum valor. Se esse for o caso, então a única maneira razoável de fazer isso é usar alguma variável que será passada por referência à função (na minha experiência, usar variáveis de escopo global para esse fim é uma prática muito ruim - evita regras de codificação estruturadas e, em casos em que é preciso procurar o erro, é um pesadelo quando tais variáveis são usadas). É isso que você tinha em mente?
Eu cometi um erro no segundo código. Está certo.
if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;
if(OrderSymbol() == Symbol() && OrderType() == TYPE) {
if(TYPE == OP_BUY) {
if(OrderOpenPrice()>OPrice Hbuys++;
}
}
}
return(Hbuys);
}
A função dasiovoid é uma função que não retorna nenhum valor. Se esse for o caso, então a única maneira razoável de fazer isso é usar alguma variável que será passada por referência à função (na minha experiência, usar variáveis de escopo global para esse fim é uma prática muito ruim - evita regras de codificação estruturadas e, em casos em que é preciso procurar o erro, é um pesadelo quando tais variáveis são usadas). É isso que você tinha em mente?
Obrigado por sua resposta,
Preciso apenas do número de compras que têm maior ordem aberta e menor openorderm respeitar a última ordem de compra aberta.
devo usar o resultado como moltiplicador em uma função vois para alguma verificação.
Portanto, é muito mais simples recordar este registro quando solicitado. Talvez desta forma, para que eu possa recordá-lo simplesmente CalculateCurrentBuy(Símbolo())
int Hopen=0;
for(int i=0;i<OrdersTotal();i++) {
code here
}
}
return(Hopen);
}
grade de fuga?
{
if(Set.SELLSTOP && s.ticketP==0){
OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Ask-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}
if(Set.BUYSTOP && b.ticketP==0){
OrderSend(Symbol(),OP_BUYSTOP,Buy.Lots+i*Buy.Multiplier,Bid+i*(Trail.BUYSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}
}[/CODE]
I can set a grid using the above code but how do I get the Buy Grid and Sell grid grid to trail independently or as a set and retain the separate grid spacing? I have tried all sorts of things and must be missing something obvious. All I get is either all the pending orders move to the same level and then trail as a group or the pending orders start moving up and down with the price action.
[CODE] void TrailingOrders() {
if (Trail.BUYSTOP.Orders && OrderType()==OP_BUYSTOP) {
if (OrderOpenPrice()-Ask>(Trail.BUYSTOP.Orders.Distance)*myPoint) {
OrderModify(OrderTicket(),Ask+OrderOpenPrice()+(Trail.BUYSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Aqua);
}
}
if (Trail.SELLSTOP.Orders && OrderType()==OP_SELLSTOP) {
if (Bid-OrderOpenPrice()>(Trail.SELLSTOP.Orders.Distance)*myPoint) {
OrderModify(OrderTicket(),Bid-OrderOpenPrice()-(Trail.SELLSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Yellow);
}
}
}Este código irá rastrear 2 pedidos, mas como posso modificá-lo para rastrear mais? Assim que eu tentar configurar o código de rastreamento para vários níveis como o código da grade acima dele se transforma em custard.
Qualquer idéia seria bem-vinda.
Cumprimentos ao CJA
...
... cja
Eu tentei com o seguinte código e funciona bem (veja a figura de exemplo: diferentes etapas já aplicadas)
Não sabia o que são variáveis s.ticketP e b.ticketP para utilizá-lo da maneira que você pode ver no código
extern double Trail.BUYSTOP.Orders.Distance = 20;
extern int Stop.Order.Levels = 4;
extern double Sell.Lots = 0.1;
extern double Sell.Multiplier = 0.1;
extern double Buy.Lots = 0.1;
extern double Buy.Multiplier = 0.2;
extern bool Set.SELLSTOP = true;
extern bool Set.BUYSTOP = true;
int init()
{
return(0);
}
int start()
{
double myPoint=1; if (Digits==3 || Digits==5) myPoint=10; myPoint *= Point;
static int s.ticketP=0;
static int b.ticketP=0;
for(int i = 1; i < Stop.Order.Levels+1; i++)
{
if(Set.SELLSTOP && s.ticketP==0){ OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Bid-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}
if(Set.BUYSTOP && b.ticketP==0){ OrderSend(Symbol(),OP_BUYSTOP ,Buy.Lots+i *Buy.Multiplier ,Ask+i*(Trail.BUYSTOP.Orders.Distance)*myPoint ,0,0,0,0,0,0,CLR_NONE);}
}
s.ticketP=Stop.Order.Levels;
b.ticketP=Stop.Order.Levels;
return(0);
}
{
if(Set.SELLSTOP && s.ticketP==0){
OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Ask-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}
if(Set.BUYSTOP && b.ticketP==0){
OrderSend(Symbol(),OP_BUYSTOP,Buy.Lots+i*Buy.Multiplier,Bid+i*(Trail.BUYSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}
}[/CODE]
I can set a grid using the above code but how do I get the Buy Grid and Sell grid grid to trail independently or as a set and retain the separate grid spacing? I have tried all sorts of things and must be missing something obvious. All I get is either all the pending orders move to the same level and then trail as a group or the pending orders start moving up and down with the price action.
[CODE] void TrailingOrders() {
if (Trail.BUYSTOP.Orders && OrderType()==OP_BUYSTOP) {
if (OrderOpenPrice()-Ask>(Trail.BUYSTOP.Orders.Distance)*myPoint) {
OrderModify(OrderTicket(),Ask+OrderOpenPrice()+(Trail.BUYSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Aqua);
}
}
if (Trail.SELLSTOP.Orders && OrderType()==OP_SELLSTOP) {
if (Bid-OrderOpenPrice()>(Trail.SELLSTOP.Orders.Distance)*myPoint) {
OrderModify(OrderTicket(),Bid-OrderOpenPrice()-(Trail.SELLSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Yellow);
}
}
}Este código irá rastrear 2 pedidos, mas como posso modificá-lo para rastrear mais? Assim que eu tentar configurar o código de rastreamento para vários níveis, como o código de grade acima dele se transforma em creme de leite.
Qualquer idéia seria bem-vinda.
Cumprimentos à CJAGrelha de Reboque
cja
Eu tentei com o seguinte código e funciona bem (veja a figura de exemplo: diferentes etapas já aplicadas)
Não sabia o que são variáveis s.ticketP e b.ticketP para utilizá-lo da maneira que você pode ver no código
extern double Trail.BUYSTOP.Orders.Distance = 20;
extern int Stop.Order.Levels = 4;
extern double Sell.Lots = 0.1;
extern double Sell.Multiplier = 0.1;
extern double Buy.Lots = 0.1;
extern double Buy.Multiplier = 0.2;
extern bool Set.SELLSTOP = true;
extern bool Set.BUYSTOP = true;
int init()
{
return(0);
}
int start()
{
double myPoint=1; if (Digits==3 || Digits==5) myPoint=10; myPoint *= Point;
static int s.ticketP=0;
static int b.ticketP=0;
for(int i = 1; i < Stop.Order.Levels+1; i++)
{
if(Set.SELLSTOP && s.ticketP==0){ OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Bid-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}
if(Set.BUYSTOP && b.ticketP==0){ OrderSend(Symbol(),OP_BUYSTOP ,Buy.Lots+i *Buy.Multiplier ,Ask+i*(Trail.BUYSTOP.Orders.Distance)*myPoint ,0,0,0,0,0,0,CLR_NONE);}
}
s.ticketP=Stop.Order.Levels;
b.ticketP=Stop.Order.Levels;
return(0);
}
Oi mladen,
Obrigado por sua ajuda, porém posso não ter me feito muito claro em meu posto acima. Não tenho nenhum problema em estabelecer uma grade, pois o problema que tenho é o de seguir a grade sem perder a separação de pedidos.
s.ticketP & b.ticketP simplesmente se refere ao código de pedidos pendentes BUYSTOP & SELLSTOP usado em outro lugar na EA.
Cumprimentos à CJA
Grelha de Reboque
Oi mladen,
Obrigado por sua ajuda, porém posso não ter me feito muito claro em meu posto acima. Não tenho nenhum problema em estabelecer uma grade, pois o problema que tenho é o de seguir a grade sem perder a separação de pedidos.
s.ticketP & b.ticketP simplesmente se refere ao código de pedidos pendentes BUYSTOP & SELLSTOP usado em outro lugar na EA.
Cumprimentos à CJAOi mladen,
Alguma hora para dar uma olhada nisto?
Cumprimentos amigáveis CJA